Пасля шасці месяцаў распрацоўкі прадстаўлены рэліз праекта LLVM 16.0 – GCC-сумяшчальнага інструментара (кампілятары, аптымізатары і генератары кода), які кампілюе праграмы ў прамежкавы біткод RISC-падобных віртуальных інструкцый (нізкаўзроўневая віртуальная машына з шматузроўневай сістэмай оптимитый. Згенераваны псеўдакод можа быць пераўтвораны пры дапамозе JIT-кампілятара ў машынныя інструкцыі непасрэдна ў момант выканання праграмы.
Асноўныя паляпшэнні ў Clang 16.0:
- Ужывальны па змаўчанні стандарт C++/ObjC++ выстаўлены ў gnu++17 (раней ужываўся gnu++14), што мае на ўвазе падтрымку па змаўчанні магчымасцяў C++17 з пашырэннямі GNU. Для вяртання ранейшых паводзін можна выкарыстоўваць опцыю "-std=gnu++14".
- Рэалізаваны пашыраныя магчымасці, звязаныя са стандартам C++20:
- Умоўна-трывіяльныя спецыяльныя функцыі-члены,
- захоп структураваных прывязак у лямбда-функцыях,
- Аператар роўнасці ўнутры выразаў,
- Магчымасць не паказваць ключавое слова typename у некаторых кантэкстах,
- Дапушчальнасць агрэгаванай ініцыялізацыі ў дужках («Aggr(val1, val2)»).
- Рэалізаваны магчымасці, вызначаныя ў будучым стандарце C++2b:
- Дазволена размяшчэнне пазнак у канцы састаўных выразаў,
- static operator(),
- static operator[],
- Забяспечана сумяшчальнасць з тыпам char8_t,
- Пашыраны спектр сімвалаў, дапушчальных для выкарыстання ў "\N{…}",
- Дададзена магчымасць выкарыстання зменных, абвешчаных як "static constexpr", у функцыях, абвешчаных як constexpr.
- Рэалізаваны магчымасці, вызначаныя ў будучыні Сі-стандарце C2x:
- Для адключэння папярэджання "-Wunused-label" дазволена прымяненне атрыбута "[[maybe_unused]]" да метак,
- Дазволена размяшчэнне пазнак у любых месцах усярэдзіне складовых выразаў,
- Дададзены аператары typeof і typeof_unqual,
- Новы тып nullptr_t і канстанта nullptr для вызначэння нулявых паказальнікаў, якая можа канвертавацца ў любы тып паказальнікаў і ўяўляць варыянт NULL, не прывязаны да цэлалікавых тыпаў і тыпу void*.
- У рэжыме C2x дазволены выклік макраса va_start з пераменным лікам аргументаў (variadic).
- У рэжымах адпаведнасці стандартам C99, C11 і C17 опцыі "-Wimplicit-function-declaration" і "-Wimplicit-int" па змаўчанні зараз прыводзяць да высновы памылкі замест папярэджання.
- Ускоснае выкарыстанне "void *" (напрыклад, "void func(void *p) {*p;}") у рэжыме C++ зараз прыводзіць да генерацыі памылкі, па аналогіі з ISO C++, GCC, ICC і MSVC.
- Указанне бітавых палёў у якасці аперанд інструкцый (напрыклад, "__asm {mov eax, s.bf}") у асэмблерных inline-блоках у стылі Microsoft зараз прыводзіць да генерацыі памылкі.
- Дададзена дыягностыка наяўнасці адрозных структур і аб'яднанняў з аднолькавымі імёнамі ў розных модулях.
- Пашыраны магчымасці, звязаныя з падтрымкай OpenCL і OpenMP. Палепшана дыягностыка шаблонаў C++, выкарыстоўваных у аргументах ядра OpenCL. Палепшана падтрымка блока падстаноўкі ў чаргу для AMDGPU. Да ўсіх функцый няяўна дададзены атрыбут nounwind. Палепшана падтрымка ўбудаваных функцый.
- Дана магчымасць выкарыстання зменнай асяроддзя CLANG_CRASH_DIAGNOSTICS_DIR для вызначэння каталога, у які захоўваюцца дыягнастычныя дадзеныя аб аварыйных завяршэннях.
- Падтрымка Unicode абноўлена да спецыфікацыі Unicode 15.0. Дазволена ўжыванне некаторых матэматычных сімвалаў у ідэнтыфікатарах, такіх як «₊» (, напрыклад «double xₖ₊₁»).
- Дададзена падтрымка загрузкі некалькіх файлаў канфігурацыі (спачатку загружаюцца файлы канфігурацыі па змаўчанні, а затым зададзеныя праз сцяг «—config=», які зараз можна ўказваць некалькі разоў). Зменены парадак загрузкі файлаў канфігурацыі па змаўчанні: clang спачатку спрабуе загрузіць файл - .cfg, а калі ён не знойдзены спрабуе загрузіць два файлы .cfg і .cfg. Для адключэння загрузкі файлаў канфігурацыі па змаўчанні дададзены сцяг "-no-default-config".
- Для забеспячэння паўтаральных зборак прадстаўлена магчымасць замены значэнняў бягучай даты і часу ў макрасах __DATE__, __TIME__ і __TIMESTAMP__ на час, зададзены ў зменнай асяроддзі SOURCE_DATE_EPOCH.
- Для праверкі наяўнасці ўбудаваных функцый (builtin), якія могуць быць скарыстаны ў кантэксце канстант, дададзены макрас «__has_constexpr_builtin».
- Дададзены новы сцяг кампіляцыі "-fcoro-aligned-allocation" для выраўнаванага размеркавання кадраў супраграм.
- У сцягу -fstrict-flex-arrays= рэалізаваная падтрымка трэцяга ўзроўня праверкі гнуткага элемента-масіва ў структурах (Flexible Array Members, масіў нявызначанага памеру ў канцы структуры). На трэцім узроўні толькі памер "[]" (напрыклад, "int b[]") апрацоўваецца як гнуткі масіў, а памер "[0]" (напрыклад, "int b[0]") - не.
- Дададзены сцяг "-fmodule-output" для ўключэння аднафазнай мадэлі кампіляцыі стандартных модуляў C++.
- Дададзены рэжым "-Rpass-analysis=stack-frame-layout", які дазваляе дыягнаставаць праблемы з раскладной сткавых кадраў.
- Дададзены новы атрыбут __attribute__((target_version("cpu_features"))) і пашырана функцыянальнасць атрыбута __attribute__((target_clones("cpu_features1","cpu_features2",…))) для выбару пэўных версій функцый, якія прадстаўляюцца CPU AArch
- Пашыраны сродкі дыягностыкі:
- Дададзена папярэджанне "-Wsingle-bit-bitfield-constant-conversion" для вызначэння няяўнага ўсячэння пры прысваенні адзінкі аднаразраднаму знакаваму бітаваму полю.
- Пашыраная дыягностыка неініцыялізаваных constexpr-пераменных.
- Дададзеныя папярэджанні "-Wcast-function-type-strict" і "-Wincompatible-function-pointer-types-strict" для выяўлення патэнцыйных праблем пры прывядзенні тыпаў функцый.
- Дададзена дыягностыка выкарыстання некарэктных або зарэзерваваных імёнаў модуляў у блоках экспарту.
- Палепшана выяўленне прапушчаных ключавых слоў "auto" у вызначэннях.
- У рэалізацыі папярэджання "-Winteger-overflow" дабаўлены праверкі дадатковых сітуацый, якія прыводзяць да перапаўненняў.
- Рэалізаваная падтрымка архітэктуры набору каманд LoongArch (-march=loongarch64 ці -march=la464), якая ўжываецца ў працэсарах Loongson 3 5000 і рэалізуе новы RISC ISA, падобны на MIPS і RISC-V.
Асноўныя навіны LLVM 16.0:
- У кодзе LLVM дазволенае выкарыстанне элементаў, вызначаных у стандарце C++17.
- Павышаны патрабаванні да асяроддзя для зборкі LLVM. Зборачны інструментар зараз павінен падтрымліваць стандарт C++17, г.зн. для зборкі неабходны як мінімум GCC 7.1, Clang 5.0, Apple Clang 10.0 ці Visual Studio 2019 16.7/XNUMX.
- У бэкенд для архітэктуры AArch64 дададзеная падтрымка CPU Cortex-A715, Cortex-X3 і Neoverse V2, асэмблера для RME MEC (Memory Encryption Contexts), пашырэнняў Armv8.3 (Complex Number) і мултыверсіянавання (Function Multi Versioning).
- У бэкендзе для архітэктуры ARM спынена падтрымка мэтавых платформаў Armv2, Armv2A, Armv3 і Armv3M, генерацыя карэктнага кода для якіх не гарантавалася. Дададзена магчымасць генерацыі кода для інструкцый працы з комплекснымі лікамі.
- У бэкенд для архітэктуры X86 дададзеная падтрымка архітэктур набору каманд (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Дададзена падтрымка інструкцый RDMSRLIST, RMSRLIST і WRMSRNS. Рэалізаваны опцыі "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" і "-mcpu=grandridge".
- Дададзена афіцыйная падтрымка платформы LoongArch.
- Палепшаны бэкэнды для архітэктур MIPS, PowerPC і RISC-V
- У адладчык LLDB дададзена падтрымка адладкі 64-разрадных выкананых файлаў для архітэктуры LoongArch. Палепшана апрацоўка адладачных сімвалаў COFF. Забяспечана адсяванне дублікатаў DLL у спісе загружаных Windows-модуляў.
- У бібліятэцы Libc++ асноўная праца была засяроджана на рэалізацыі падтрымкі новых магчымасцяў стандартаў C++20 і C++23.
- У кампаноўніку LDD значна скарочаны час звязвання за кошт распаралельвання аперацый сканавання перасоўванняў адрасоў і ініцыялізацыі секцый. Дададзена падтрымка сціску секцый з выкарыстаннем алгарытму ZSTD.
Крыніца: opennet.ru