След малко повече от шест месеца разработка, стартирането на новата версия на проекта LLVM 16.0, версия, в която са въведени голям брой промени и подобрения.
За тези, които не са запознати с LLVM, трябва да знаете, че това е GCC съвместим компилатор (компилатори, оптимизатори и генератори на код), който компилира програми в RISC-подобен междинен биткод на виртуална инструкция (виртуална машина от ниско ниво с многостепенна система за оптимизация).
Генерираният псевдокод може да бъде преобразуван от JIT компилатора в машинни инструкции точно по време на изпълнение на програмата.
Основни нови функции на LLVM 16.0
В тази нова версия, която е представена, можем да намерим няколко важни подобрения в clang 16.0, от които се откроява стандартът C++/ObjC++ по подразбиране, който е настроен на gnu++17 (по-рано gnu++14), което предполага поддръжка на C++17 функции с GNU разширения по подразбиране. Използването на елементи, дефинирани в стандарта C++17, е разрешено в кода LLVM.
Друга от промените, които се открояват, е, че е добавен поддръжка за процесори 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",…))) за избор на конкретни версии на функции, предоставени от CPU AArch64 .
- Подобрени инструменти за диагностика:
- Добавено предупреждение "-Wsingle-bit-bitfield-constant-conversion" за улавяне на имплицитно отрязване при присвояване на едно към еднобитово битово поле със знак.
- Разширена диагностика за неинициализирани променливи constexpr.
- Добавени са предупреждения „-Wcast-function-type-strict“ и „-Wincompatible-function-pointer-types-strict“ за улавяне на потенциални проблеми при прехвърляне на типове функции.
Накрая Ако се интересувате да научите повече за това, можете да проверите подробностите в следваща връзка.