Վեց ամսվա մշակումից հետո թողարկվել է LLVM 22.1.0-ը։ Այն մշակում է գործիքներ (կոմպիլյատորներ, օպտիմիզատորներ և կոդի գեներատորներ), որոնք կոմպիլացնում են ծրագրերը RISC-անման վիրտուալ հրահանգների միջանկյալ բիթկոդի մեջ (ցածր մակարդակի վիրտուալ մեքենա՝ բազմամակարդակ օպտիմիզացման համակարգով)։ Ստեղծված կեղծ կոդը կարող է փոխակերպվել տվյալ թիրախային հարթակի համար նախատեսված մեքենայական կոդի կամ օգտագործվել ժամանակին (JIT) կոմպիլյատորի կողմից՝ ծրագրի կատարման ընթացքում անմիջապես մեքենայական հրահանգներ ստեղծելու համար։ LLVM տեխնոլոգիաների հիման վրա նախագիծը մշակում է Clang կոմպիլյատորը, որը աջակցում է C, C++ և Objective-C ծրագրավորման լեզուներին։ Սկսած 18.x ճյուղից՝ նախագիծը անցել է նոր տարբերակի համարակալման սխեմայի, որի համաձայն մշակման ընթացքում օգտագործվում է 0 թողարկումը («N.0»), իսկ առաջին կայուն տարբերակը համարակալվում է «N.1»։
Clang 22-ի բարելավումները ներառում են.
- Ավելացվել է հիշողության բաշխման տոկենների (Allocation Tokens) աջակցություն՝ malloc-ի նման ֆունկցիաների միջոցով կատարված հիշողության բաշխման գործողությունները եզակի նույնականացուցիչով նշելու համար: Բաշխման տոկենները թույլ են տալիս կառուցվածքավորել կույտի տեղեկատվությունը, պարզեցնել հիշողության արտահոսքի հայտնաբերումը և հնարավորություն տալ խմբավորել օբյեկտները՝ հիմնվելով դրանց նպատակի կամ փոփոխման օրինաչափությունների վրա (օրինակ՝ «տաք» տվյալները «սառը» տվյալներից առանձնացնելը): Միացնելու համար օգտագործեք «-fsanitize=alloc-token» դրոշը:
- C լեզվի հետ կապված առանձնահատկությունները՝
- «Հետաձգված» հետաձգված կատարման մեխանիզմը սահմանող նախագծի սպեցիֆիկացիա է ներդրվել, որը թույլ է տալիս կատարել գործողություններ, երբ ընթացիկ շրջանակը փակվում է: Ավելացվել է «-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), երբ օգտագործվում են ստատիկ ֆունկցիաներ կամ փոփոխականներ որպես «արտաքին inline» հայտարարված ֆունկցիաների ներսում։
- C23 C ստանդարտում սահմանված հնարավորությունները՝
- Float.h վերնագրի ֆայլն այժմ աջակցում է FLT_SNAN, DBL_SNAN և LDBL_SNAN մակրոները, որոնք իրականացնում են signaled (թվաբանական գործողություններում օգտագործելիս բացառություն առաջացնելով) NaN արժեքներ float, double և long double տիպերի համար։
- Ուղղվել է մի սխալ, որի պատճառով տարբեր անանուն տեսակները համարվում էին համատեղելի նույն թարգմանչական միավորի շրջանակներում, եթե դրանք ունեին նույն դաշտերը։
- Կախվածությունների սկանավորման ընթացքում բացակայող վերնագրերի ֆայլերը անտեսելու համար օգտագործվող «-MG» դրոշը տարածվել է «#embed» դիրեկտիվների վրա և այժմ ճնշում է «ֆայլը չի գտնվել» սխալը, երբ «#embed» դիրեկտիվում նշված ֆայլը բացակայում է։
- C++-ի հետ կապված առանձնահատկություններ՝
- Ավելացվել է կառուցվածքային կապեր օգտագործելու հնարավորությունը «constexpr» համատեքստում, ինչպես մշակվել է C++2c (C++26) սպեցիֆիկացիայում: Սա նշանակում է, որ հաստատուն արտահայտություններին հղումները այժմ կարող են իրենք լինել հաստատուն արտահայտություններ: Աջակցություն է իրականացվում զանգվածների և պարզ կառուցվածքների համար (տյուպլները դեռևս չեն աջակցվում): 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» դրոշակը՝ սխալի տեղեկատվության մանրամասնության մակարդակը նշելու համար: Այն կարող է սահմանվել «հիմնական»՝ ընդհանուր նկարագրությունների համար (օրինակ՝ «ամբողջ թվերի գումարումը գերազանցվել է») և «մանրամասն»՝ մանրամասն տեղեկատվություն ներառելու համար (օրինակ՝ «signed integer gum overflow in '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՝ column-major-ի համար, row-major՝ row-major-ի համար):
- Ֆունկցիաներն այժմ ունեն "malloc_span" ատրիբուտ, որը նման է malloc ատրիբուտին, բայց կիրառելի է այն ֆունկցիաների համար, որոնք վերադարձնում են span-անման կառուցվածքներ, որոնք պարունակում են ցուցիչ և դաշտ՝ չափսով կամ ցուցիչով դեպի բլոկի վերջը։
- Ավելացվել է "modular_format" ատրիբուտը` կապի պահին printf ֆունկցիայի անհրաժեշտ ստատիկորեն կապված իրականացումը դինամիկ կերպով ընտրելու համար։
- Ախտորոշիչ և ստատիկ վերլուծության գործիքները ընդլայնվել են, ավելացվել են նոր ստուգումներ (մի քանի տասնյակ ախտորոշիչ բարելավումներ):
- X86 ներքին պրոցեսորին ավելացվել են SSE, AVX և AVX512 ընդլայնումների համար լրացուցիչ ներքին բաղադրիչներ: Wildcat Lake (-march=wildcatlake) և Nova Lake (-march=novalake) միկրոճարտարապետականների վրա հիմնված Intel պրոցեսորների համար ավելացվել են կառուցման ռեժիմներ:
- 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) ճարտարապետության աջակցությունը։
- Բարելավված backend-ներ ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly և PowerPC ճարտարապետությունների համար։
Source: opennet.ru
