Пасля шасці месяцаў распрацоўкі прадстаўлены рэліз праекта 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
