Алты айлык иштеп чыгуудан кийин, LLVM 22.1.0 чыгарылды. Ал программаларды RISC сыяктуу виртуалдык көрсөтмөлөрдүн (көп деңгээлдүү оптималдаштыруу системасы бар төмөнкү деңгээлдеги виртуалдык машина) ортоңку биткодуна компиляциялоочу куралдарды (компиляторлор, оптималдаштыргычтар жана код генераторлору) иштеп чыгат. Түзүлгөн псевдокод берилген максаттуу платформа үчүн машиналык кодго айландырылышы же программаны аткаруу учурунда машиналык көрсөтмөлөрдү түз түзүү үчүн "just-in-time" (JIT) компилятору тарабынан колдонулушу мүмкүн. LLVM технологияларына негизделген долбоор C, C++ жана Objective-C программалоо тилдерин колдогон Clang компиляторун иштеп чыгууда. 18.x бутагынан баштап, долбоор жаңы версияны номерлөө схемасына өттү, ага ылайык, иштеп чыгуу учурунда 0 чыгарылышы ("N.0") колдонулат жана биринчи туруктуу версия "N.1" деп номерленет.
Clang 22 жакшыртуулары төмөнкүлөрдү камтыйт:
- malloc сыяктуу функцияларды колдонуу менен аткарылган эстутумду бөлүштүрүү операцияларын уникалдуу идентификатор менен белгилөө үчүн эстутумду бөлүштүрүү токендерине (Allocation Tokens) колдоо кошулду. Бөлүштүрүү токендери үймөк маалыматын түзүмдөөгө, эстутумдун агып кетишин аныктоону жөнөкөйлөштүрүүгө жана объектилерди алардын максатына же өзгөртүү үлгүлөрүнө жараша топтоштурууга мүмкүндүк берет (мисалы, "ысык" маалыматтарды "муздак" маалыматтардан бөлүү). Иштетүү үчүн, "-fsanitize=alloc-token" желегин колдонуңуз.
- Си тилине байланыштуу өзгөчөлүктөр:
- "Кийинкиге калтыруу" боюнча кийинкиге калтыруу аткаруу механизмин аныктаган долбоордук спецификация ишке ашырылды, бул учурдагы чөйрөдөн чыкканда аракеттерди аткарууга мүмкүндүк берет. "Кийинкиге калтыруу" колдоосун иштетүү үчүн "-fdefer-ts" желеги кошулду.
- GCCдеги ушул сыяктуу функцияны чагылдырган __builtin_stack_address() камтылган функциясы кошулду. Бул функция __builtin_stack_address() деп аталган учурдагы функциянын жана андан кийинки чакырылган функциялардын стек аймагын бөлүп турган стек дарегин кайтарып берет.
- Келечектеги C2y стандарты үчүн иштелип жаткан мүмкүнчүлүктөр:
- Аталган циклдерди колдоо кошулду, ал циклдерге жана switch операторлоруна аттарды дайындоого мүмкүндүк берет, аларды break жана continue операторлорунда көрсөтүүгө болот, бул циклден чыгууну так аныктоо үчүн колдонулат. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // go to CONT1 continue outer; // go to CONT2 // CONT1 } // CONT2 }
- Уникалдуу идентификатор аттарын түзүү үчүн иштелип чыккан орнотулган "__COUNTER__" макросун ишке ашыруу кеңейтилип, стандартка киргизилген. Бул макрого 2147483647 чакыруу чеги коюлган; бул чектен ашып кетүү катага алып келет.
- "extern inline" деп жарыяланган функциялардын ичиндеги статикалык функцияларды же өзгөрмөлөрдү колдонууда эскертүү (-Wstatic-in-line) алынып салынды.
- C23 C стандартында аныкталган мүмкүнчүлүктөр:
- float.h баш файлы эми FLT_SNAN, DBL_SNAN жана LDBL_SNAN макросторун колдойт, алар float, double жана long double түрлөрү үчүн сигналдаштырылган (арифметикалык амалдарда колдонулганда өзгөчө кырдаалды жаратуучу) NaN маанилерин ишке ашырат.
- Эгерде алардын талаалары бирдей болсо, бир эле котормо бирдигинин ичинде ар кандай аталбаган түрлөрү шайкеш катары каралып калган ката оңдолду.
- Көз карандылыкты сканерлөө учурунда жок болгон баш файлдарды этибарга албоо үчүн колдонулган "-MG" желеги "#embed" директиваларына чейин кеңейтилген жана эми "#embed" директивасында көрсөтүлгөн файл жок болгондо "файл табылбады" катасын басат.
- C++ менен байланышкан өзгөчөлүктөр:
- C++2c (C++26) спецификациясында иштелип чыккандай, "constexpr" контекстинде структураланган байланыштарды колдонуу мүмкүнчүлүгү кошулду. Бул туруктуу туюнтмаларга шилтемелер эми өздөрү туруктуу туюнтмалар боло аларын билдирет. Колдоо массивдер жана жөнөкөй структуралар үчүн ишке ашырылат (кортедждер азырынча колдоого алынбайт). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20 стандартынын талабына ылайык, чектөөлөр эми текшерилерден мурун стандарттык формага айландырылат, бул диагностикалык билдирүүлөрдү тактоого жана концепт-иддеринде гана колдонулган шаблон аргументтериндеги алмаштыруу каталарын туура иштетүүгө мүмкүндүк берет.
- Салыштыруу операторлору "<", ">", "<=" жана ">=" "<=>" операторунан синтезделгенин билүү үчүн "__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_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter жана __builtin_dedup_pack сыяктуу орнотулган функциялар кошулду. Мисалы, builtin_dedup_pack сизге түрлөрүнүн тизмесинен кайталангандарды алып салууга мүмкүндүк берет: MyTypeList = TypeList<__builtin_dedup_pack колдонуу менен …>; // натыйжасында пайда болгон түрү TypeList болот
- UBSan менен аныкталбаган жүрүм-турумду оңдоодо (-fsanitize=undefined -fsanitize-trap=undefined), катанын себеби жөнүндө маалымат эми түзүлгөн мүчүлүштүктөрдү оңдоо маалыматына кошулат. Ката жөнүндө маалыматтагы деталдардын деңгээлин көрсөтүү үчүн "-fsanitize-debug-trap-reasons" желеги кошулду. Аны жалпы сүрөттөөлөр үчүн "негизги" деп коюуга болот (мисалы, "Бүтүн сан кошуу ашып кетти") жана деталдуу маалыматты камтуу үчүн "деталдуу" деп коюуга болот (мисалы, "'a + b' ичиндеги кол коюлган бүтүн сан кошуу ашып кетти").
- Жаңы компилятордун желектери кошулду:
- "-f[no-]sanitize-debug-trap-reasons" функциясы "-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 атрибутуна окшош "malloc_span" атрибутуна ээ, бирок ал көрсөткүчтү жана талааны камтыган span сыяктуу түзүмдөрдү блоктун аягына же көрсөткүчкө кайтарган функцияларга тиешелүү.
- Байланыш учурунда printf функциясынын талап кылынган статикалык байланыштырылган ишке ашыруусун динамикалык түрдө тандоо үчүн "modular_format" атрибуту кошулду.
- Диагностикалык жана статикалык талдоо куралдары кеңейтилди, жаңы текшерүүлөр кошулду (диагностикалык жактан бир нече ондогон жакшыртуулар).
- X86 серверине SSE, AVX жана AVX512 кеңейтүүлөрү үчүн кошумча ички элементтер кошулду. Wildcat Lake (-march=wildcatlake) жана Nova Lake (-march=novalake) микроархитектураларына негизделген Intel CPUлары үчүн куруу режимдери кошулду.
- 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) колдоо турукташтырылды. Колдонуучулар эми ар кандай функциялардын версияларынын артыкчылыгын жокко чыгара алышат.
- LoongArch32 (LA32R, LA32S) архитектурасын колдоо кошулду.
- ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly жана PowerPC архитектуралары үчүн жакшыртылган бэкенддер.
Source: opennet.ru
