Після шести місяців розробки представлений реліз проекту 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
