Na ses maande se ontwikkeling is LLVM 22.1.0 vrygestel. Dit ontwikkel gereedskap (samestellers, optimeerders en kodegenerators) wat programme in intermediêre bitkode van RISC-agtige virtuele instruksies (’n laevlak-virtuele masjien met ’n multivlak-optimaliseringstelsel) saamstel. Die gegenereerde pseudokode kan omgeskakel word na masjienkode vir ’n gegewe teikenplatform of deur ’n net-tyds (JIT) samesteller gebruik word om masjieninstruksies direk tydens programuitvoering te genereer. Gebaseer op LLVM-tegnologieë, ontwikkel die projek die Clang-samesteller, wat die C-, C++- en Objective-C-programmeertale ondersteun. Beginnende met die 18.x-tak, het die projek oorgeskakel na ’n nuwe weergawenommeringskema, waarvolgens weergawe 0 ("N.0") tydens ontwikkeling gebruik word, en die eerste stabiele weergawe genommer word as "N.1".
Verbeterings in Clang 22 sluit in:
- Ondersteuning vir geheuetoewysingstokens (Allocation Tokens) is bygevoeg vir die merk van geheuetoewysingsbewerkings wat uitgevoer word met behulp van funksies soos malloc met 'n unieke identifiseerder. Toewysingstokens maak voorsiening vir die strukturering van hoopinligting, die vereenvoudiging van geheuelek-opsporing, en die moontlikheid om voorwerpe te groepeer gebaseer op hul doel of wysigingspatrone (bv. die skeiding van "warm" van "koue" data). Om dit te aktiveer, gebruik die "-fsanitize=alloc-token" vlag.
- Kenmerke wat verband hou met die C-taal:
- 'n Konsepspesifikasie wat die "defer" uitgestelde uitvoeringsmeganisme definieer, is geïmplementeer, wat toelaat dat aksies uitgevoer word wanneer die huidige omvang beëindig word. Die "-fdefer-ts"-vlag is bygevoeg om "defer"-ondersteuning moontlik te maak.
- Die ingeboude funksie __builtin_stack_address() is bygevoeg, wat die soortgelyke funksie in GCC weerspieël. Hierdie funksie gee die stapeladres terug wat die stapelarea van die huidige funksie wat __builtin_stack_address() aangeroep het, skei en daaropvolgende funksies wat dit aanroep.
- Vermoëns wat ontwikkel word vir die toekomstige C2y-standaard:
- Ondersteuning vir benoemde lusse is bygevoeg, wat jou toelaat om name aan lusse en skakelaarstellings toe te ken, wat in break- en continue-stellings gespesifiseer kan word om die lus waaruit jy wil verlaat eksplisiet te definieer. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // gaan na CONT1 continue outer; // gaan na CONT2 // CONT1 } // CONT2 }
- Die implementering van die ingeboude "__COUNTER__" makro, ontwerp om unieke identifiseerdername te genereer, is uitgebrei en in die standaard ingesluit. 'n Limiet van 2147483647 oproepe na hierdie makro is gestel; oorskryding van hierdie limiet sal 'n fout genereer.
- Waarskuwing (-Wstatic-in-inline) is verwyder wanneer statiese funksies of veranderlikes binne funksies gebruik word wat as "ekstern inline" verklaar is.
- Vermoëns gedefinieer in die C23 C-standaard:
- Die float.h-koplêer ondersteun nou die FLT_SNAN-, DBL_SNAN- en LDBL_SNAN-makros, wat gesignaleerde (wat 'n uitsondering veroorsaak wanneer dit in rekenkundige bewerkings gebruik word) NaN-waardes vir float-, double- en long double-tipes implementeer.
- 'n Fout is reggestel waar verskillende naamlose tipes as versoenbaar binne dieselfde vertaaleenheid behandel is as hulle dieselfde velde gehad het.
- Die "-MG"-vlag wat gebruik word om ontbrekende koplêers tydens afhanklikheidsskandering te ignoreer, is uitgebrei na "#embed"-opdragte en onderdruk nou die "lêer nie gevind nie"-fout wanneer 'n lêer wat in 'n "#embed"-opdrag gespesifiseer is, ontbreek.
- C++ verwante kenmerke:
- Die vermoë om gestruktureerde bindings in die "constexpr"-konteks te gebruik, soos ontwikkel in die C++2c (C++26)-spesifikasie, is bygevoeg. Dit beteken dat verwysings na konstante uitdrukkings nou self konstante uitdrukkings kan wees. Ondersteuning word geïmplementeer vir skikkings en eenvoudige strukture (tuples word nog nie ondersteun nie). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Soos vereis deur die C++20-standaard, word beperkings nou na standaardvorm omgeskakel voordat dit nagegaan word, wat meer akkurate diagnostiese boodskappe en behoorlike hantering van vervangingsfoute in sjabloonargumente wat slegs in konsep-ID's gebruik word, moontlik maak.
- Het 'n familie van ingeboude funksies "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" bygevoeg om uit te vind of die vergelykingsoperateurs "<", ">", "<=" en ">=" gesintetiseer is vanaf die "<=>" operateur.
- Die parameter "-Wincompatible-pointer-types" is verander om 'n fout in plaas van 'n waarskuwing uit te voer. Om terug te keer na die vorige gedrag, gebruik die opsie "-Wno-error=incompatible-pointer-types".
- Ingeboude funksies bygevoeg: __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, en __builtin_dedup_pack. Byvoorbeeld, builtin_dedup_pack laat jou toe om duplikate uit 'n lys tipes te verwyder: gebruik MyTypeList = TypeList<__builtin_dedup_pack …>; // die resulterende tipe sal Tipelys wees
- Wanneer ongedefinieerde gedrag met UBSan ontfout word (-fsanitize=undefined -fsanitize-trap=undefined), word foutoorsaakinligting nou ingesluit in die gegenereerde ontfoutingsinligting. Die "-fsanitize-debug-trap-reasons"-vlag is bygevoeg om die vlak van detail in foutinligting te spesifiseer. Dit kan op "basies" gestel word vir algemene beskrywings (bv. "Heelgetaloptelling oorloop") en "gedetailleerd" om gedetailleerde inligting in te sluit (bv. "getekende heelgetaloptelling oorloop in 'a + b'").
- Bygevoeg nuwe samesteller vlae:
- "-f[no-]sanitize-debug-trap-reasons" om te beheer of uitsonderingslokvalredes in ontfoutingsinligting ingebed is wanneer dit met "-fsanitize-trap" modus saamgestel word.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", en "-fsanitize-alloc-token-extended" om geheuetoewysingstokens te bestuur.
- "-fmatrix-memory-layout" om die geheue-uitleg van matrikstipes te beheer (bv. kolom-hoof vir kolom-hoof, ry-hoof vir ry-hoof).
- Funksies het nou 'n "malloc_span"-attribuut, soortgelyk aan die malloc-attribuut, maar van toepassing op funksies wat span-agtige strukture teruggee wat 'n wyser en 'n veld met die grootte of 'n wyser na die einde van die blok bevat.
- Het die "modular_format"-attribuut bygevoeg om die vereiste staties gekoppelde implementering van die printf-funksie dinamies te kies tydens skakeltyd.
- Diagnostiese en statiese analise-instrumente is uitgebrei, nuwe kontroles is bygevoeg (verskeie dosyn diagnosties-verwante verbeterings).
- Bykomende intrinsieke eienskappe vir die SSE-, AVX- en AVX512-uitbreidings is by die X86-agterkant gevoeg. Boumodusse is bygevoeg vir Intel-SVE's gebaseer op die Wildcat Lake (-march=wildcatlake) en Nova Lake (-march=novalake) mikroargitekture.
- Die AArch64-agterkant ondersteun nou die Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium), en Arm C1-Ultra (c1-ultra) verwerkers. Bykomende ingeboude funksies is bygevoeg vir die FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], en FCVTA[US] instruksies. Funksie Multi-Versioning (FMV) ondersteuning is gestabiliseer. Gebruikers kan nou die prioriteit van verskillende funksieweergawes ignoreer.
- Ondersteuning vir LoongArch32 (LA32R, LA32S) argitektuur is bygevoeg.
- Verbeterde backends vir ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- en PowerPC-argitekture.
Bron: opennet.ru
