Після трохи більше шести місяців розробки, запуск нова версія проекту LLVM 16.0, версія, в якій реалізовано велику кількість змін і покращень.
Для тих, хто не знайомий з LLVM, ви повинні знати, що це є компілятором, сумісним з GCC (компілятори, оптимізатори та генератори коду), який компілює програми у RISC-подібний проміжний біт-код віртуальної інструкції (низькорівнева віртуальна машина з багаторівневою системою оптимізації).
Згенерований псевдокод може бути перетворений JIT-компілятором у машинні інструкції просто під час виконання програми.
Основні нові можливості LLVM 16.0
У цій представленій новій версії ми можемо знайти кілька важливих покращень в clang 16.0, з яких виділяється стандарт C++/ObjC++ за замовчуванням, який встановлено значення gnu++17 (раніше gnu++14), який передбачає підтримку функцій C++17 із розширеннями GNU за замовчуванням. У коді LLVM дозволено використання елементів, визначених у стандарті C++17.
Ще одна зміна, яка виділяється, полягає в тому, що вона була додана підтримка процесорів Cortex-A715, Cortex-X3 і Neoverse V2, Armv8.3 розширення та багатоверсійні функції для серверної частини AArch64.
La сумісність платформи Armv2, Armv2A, Armv3 і Armv3M припинено у серверній частині архітектури ARM, для якої не гарантувалося правильне створення коду. Додано можливість генерувати код інструкцій для роботи з комплексними числами та додано підтримка архітектур наборів інструкцій (ISA) AMX-FP16, CMPCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT до серверної частини X86.
Крім того, підвищено вимоги до побудови LLVM, Крім того, збірка тепер має бути сумісною зі стандартом C++17, тобто для збірки потрібна принаймні GCC 7.1, Clang 5.0, Apple Clang 10.0 або Visual Studio 2019 16.7.
З іншого боку, це також підкреслює покращені серверні модулі для архітектур MIPS, PowerPC і RISC-V, а також підтримку налагодження 64-розрядних виконуваних файлів для архітектури LoongArch у налагоджувачі LLDB і покращену обробку символів налагодження COFF.
З інших змін що виділяються:
- У бібліотеці Libc++ основна робота була зосереджена на реалізації підтримки нових можливостей стандартів C++20 і C++23.
- Час зв’язку було значно скорочено в компонувальнику LDD завдяки розпаралелюванню сканування переміщення адреси та операцій ініціалізації розділу. Додано підтримку стиснення розділів за допомогою алгоритму ZSTD.
- Також виділено розширені функції, реалізовані за допомогою стандарту C++20.
- захоплення структурованих посилань у лямбда-функціях.
- Оператор рівності у виразах.
- Можливість не вказувати ключове слово typename у деяких контекстах,
- Дозволеність ініціалізації додано між дужками ("Aggr(val1, val2)").
- Реалізовані функції, визначені в майбутньому стандарті C++2b.
- Підтримується тип char8_t,
- Розширено діапазон символів, дозволених для використання в "\N{…}",
- Додано можливість використовувати змінні, оголошені як "static constexpr", у функціях, оголошених як constexpr.
- Реалізовані функції, визначені в майбутньому стандарті C2x C:
- Додано підтримку для завантаження кількох файлів конфігурації (спочатку завантажуються файли конфігурації за замовчуванням, а потім ті, що вказані за допомогою прапорця «–config=», який тепер можна вказувати кілька разів).
- Змінено порядок завантаження файлів конфігурації за замовчуванням: clang намагається завантажити файл першим - .cfg, і якщо він не може його знайти, він намагається завантажити два файли .cfg і .cfg.
- Додано новий прапор збірки "-fcoro-aligned-allocation" для стандартного розповсюдження з вирівнюванням кадрів.
- Додано прапорець «-fmodule-output», щоб увімкнути модель однофазної збірки стандартних модулів C++.
- Додано режим «-Rpass-analysis=stack-frame-layout» для діагностики проблем із макетом стекового кадру.
- Додано новий атрибут __attribute__((target_version("cpu_features")))) і розширено функціональні можливості атрибута __attribute__((target_clones("cpu_features1″,"cpu_features2",…))) для вибору певних версій функцій, наданих ЦП AArch64 .
- Розширені засоби діагностики:
- Додано попередження "-Wsingle-bit-bitfield-constant-conversion", щоб перехопити неявне скорочення під час призначення однобітовому бітовому полю зі знаком.
- Розширена діагностика для неініціалізованих змінних constexpr.
- Додано попередження «-Wcast-function-type-strict» і «-Wincompatible-function-pointer-types-strict», щоб виявити можливі проблеми під час приведення типів функцій.
В кінці кінців Якщо вам цікаво дізнатись більше про це, Ви можете перевірити деталі в наступне посилання.