Реліз комплекту компіляторів LLVM 22

Після шести місяців розробки представлений реліз проекту LLVM 22.1.0, що розвиває інструментарій (компілятори, оптимізатори та генератори коду), що компілює програми в проміжний біткод RISC-подібних віртуальних інструкцій (низькорівнева віртуальна машина з багаторівневою системою оптимізацій). Сгенерований псевдокод може бути перетворений на машинний код для заданої цільової платформи або використаний JIT-компілятором для формування машинних інструкцій безпосередньо під час виконання програми. На базі технологій LLVM проектом розвивається компілятор Clang, який підтримує мови програмування C, C++ та Objective-C. Починаючи з гілки 18.x, проект перейшов на нову схему формування номерів версій, відповідно до якої нульовий випуск («N.0») використовується в процесі розробки, а перша стабільна версія забезпечується номером «N.1».

Серед покращень у Clang 22:

  • Додано підтримку токенів виділення пам'яті (Allocation Token) для маркування унікальним ідентифікатором операцій виділення пам'яті, що здійснюються за допомогою таких функцій, як malloc. Ідентифікатори дають можливість структурувати інформацію в купі (heap), спростити виявлення витоків у пам'яті та реалізувати угруповання об'єктів на основі призначення або характеру змін (наприклад, розділяти гарячі або холодні дані). Для включення слід використовувати прапор "-fsanitize=alloc-token".
  • Можливості, пов'язані з мовою С:
    • Реалізовано чернетку специфікації, яка визначає механізм відкладеного виконання «defer», що дає можливість виконати дії в момент виходу з поточної області видимості. Для включення підтримки "defer" доданий прапор "-fdefer-ts".
    • Додана вбудована функція __builtin_stack_address(), що повторює аналогічну функцію GCC. Функція повертає адресу в стеку, що розділяє область стека поточної функції, що викликала __builtin_stack_address(), і в подальшому функціями, що викликаються.
  • Можливості, що розвиваються для майбутнього стандарту C2y:
    • Додано підтримку іменованих циклів, що дозволяють присвоювати імена циклам та оператору switch, які можна вказувати в операторах break і continue для явного визначення циклу, з якого проводиться вихід. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // Перехід до CONT1 continue outer; // Перехід до CONT2 // CONT1} // CONT2}
    • Розширено та включено до стандарту реалізація вбудованого макросу «__COUNTER__», призначеного для генерації унікальних імен ідентифікаторів. Виставлено ліміт у 2147483647 викликів даного макросу, після перевищення якого буде виведено помилку.
    • Прибрано виведення попередження (-Wstatic-in-inline) при використанні статичних функцій або змінних усередині функцій, оголошених як "extern inline".
  • Можливості, визначені у Сі-стандарті C23:
    • У заголовний файл float.h додано підтримку макросів FLT_SNAN, DBL_SNAN і LDBL_SNAN, що реалізують сигнальні (викликають виняток при використанні в арифметичних операціях) значення NaN для типів float, double та long double.
    • Виправлено помилку, через яку різні неіменовані типи оброблялися як сумісні в межах однієї одиниці трансляції, якщо у них збігалися поля.
    • Прапор "-MG", що використовується для ігнорування відсутності заголовних файлів при скануванні залежностей, поширений на директиви "#embed" і тепер пригнічує виведення помилки "file not found" за відсутності файлу, вказаного в директиві "#embed".
  • Можливості, пов'язані з С++:
    • Додано розвивається у специфікації C++2с (C++26) можливість використання структурованих прив'язок (structured binding) у тих «constexpr», тобто. посилання на константні вирази тепер можуть бути константними висловлюваннями. Підтримка реалізована для масивів та простих структур (кортежі поки що не підтримуються). constexpr int arr[] = {1, 2}; constexpr auto[x, y] = arr;
    • Відповідно до вимоги стандарту C++20 забезпечено перетворення обмежень (constraints) у стандартну форму перед перевіркою їх виконання, що дозволяє видавати більш точні діагностичні повідомлення та правильно обробляти помилки підстановки в аргументах шаблону, які використовуються тільки в concept-ids.
    • Додано сімейство вбудованих функцій "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", що дозволяють дізнатися, чи були оператори порівняння "<", ">", "<=" і ">=" синтезовані з оператора "<=>".
    • Параметр "-Wincompatible-pointer-types" переведений на виведення помилки замість попередження. Для повернення старої поведінки слід використовувати опцію "-Wno-error=incompatible-pointer-types".
  • Додані вбудовані функції __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_elementwise_maxnumnum __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter та __builtin_dedup_pack. Наприклад, builtin_dedup_pack дозволяє видалити дублікати зі списку типів: using MyTypeList = TypeList<__builtin_dedup_pack …>; // результуючий тип буде TypeList
  • При налагодженні невизначеної поведінки через UBSan (-fsanitize=undefined -fsanitize-trap=undefined) забезпечено додавання в налагоджувальну інформацію, що генерується, відомостей про причини помилок. Для завдання рівня деталізації інформації про помилки доданий прапор "-fsanitize-debug-trap-reasons", який може приймати значення "basic" для загальних описів (наприклад, "Integer addition overflowed") і "detailed" для включення розгорнутої інформації (наприклад, "signed integer addition overflow in".
  • Додані нові прапори компілятора:
    • "-f[no-]sanitize-debug-trap-reasons" для управління вбудовуванням причин виникнення винятків (trap) у налагоджувальну інформацію при компіляції в режимі "-fsanitize-trap".
    • "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" та "-fsanitize-alloc-token-extended" для управління токенами виділення пам'яті.
    • -fmatrix-memory-layout для керування розміщенням у пам'яті матричних типів (наприклад, column-major - по стовпцях, row-major - по рядках).
  • Для функцій реалізований атрибут malloc_span, схожий на атрибут malloc, але застосовується до функцій, що повертає span-подібні структури, що містять покажчик і поле з розміром або покажчиком на кінець блоку.
  • Доданий атрибут "modular_format" для динамічного вибору необхідної статично зв'язується реалізації функції printf під час компонування.
  • Розширено засоби діагностики та статичного аналізу, додано нові перевірки (кілька десятків покращень, пов'язаних із діагностикою).
  • У бекенд для архітектури X86 додані додаткові вбудовані функції (Intrinsics) для розширень SSE, AVX та AVX512. Додані режими складання для CPU Intel на базі мікроархітектури Wildcat Lake (-march=wildcatlake) і Nova Lake (-march=novalake).
  • У бекенд для архітектури AArch64 додана підтримка процесорів Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) та Arm C1-Ultra (c1-ultra). Додані додаткові функції для інструкцій FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], FCVTA[US]. Стабілізовано підтримку FMV (Function Multi-Versioning). Користувачам надано можливість перевизначення пріоритету різних версій функцій.
  • Додано підтримку архітектури LoongArch32 (LA32R, LA32S).
  • Покращені бекенди для архітектур ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly та PowerPC.

Джерело: opennet.ru

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster