Nei seis moannen ûntwikkeling is LLVM 22.1.0 útbrocht. It ûntwikkelt ark (kompilers, optimalisers en koadegenerators) dy't programma's kompilearje yn tuskenlizzende bitkoade fan RISC-achtige firtuele ynstruksjes (in leechnivo firtuele masine mei in multi-level optimalisaasjesysteem). De generearre pseudokoade kin wurde omset yn masinekoade foar in bepaald doelplatfoarm of brûkt wurde troch in just-in-time (JIT) compiler om masine-ynstruksjes direkt te generearjen tidens programma-útfiering. Op basis fan LLVM-technologyen ûntwikkelt it projekt de Clang-compiler, dy't de programmeartalen C, C++ en Objective-C stipet. Begjinnende mei de 18.x-tûke is it projekt oerskeakele nei in nij ferzjenûmeringsskema, neffens hokker release 0 ("N.0") brûkt wurdt tidens ûntwikkeling, en de earste stabile ferzje nûmere wurdt "N.1".
Under de ferbetterings yn Clang 22:
- Stipe tafoege foar ûnthâldallokaasjetokens (Allocation Tokens) foar it markearjen fan ûnthâldallokaasjeoperaasjes útfierd mei funksjes lykas malloc mei in unike identifier. Allokaasjetokens meitsje it mooglik om heapynformaasje te strukturearjen, it deteksje fan ûnthâldlek te ferienfâldigjen en it groepearjen fan objekten mooglik te meitsjen op basis fan har doel of modifikaasjepatroanen (bygelyks it skieden fan "hjitte" fan "kâlde" gegevens). Om it yn te skeakeljen, brûk de flagge "-fsanitize=alloc-token".
- Funksjes relatearre oan de C-taal:
- In konseptspesifikaasje dy't it útstelde útfieringsmeganisme "defer" definiearret, is ymplementearre, wêrtroch aksjes útfierd wurde kinne as it hjoeddeiske berik ôfslút. De flagge "-fdefer-ts" is tafoege om stipe foar "defer" mooglik te meitsjen.
- De ynboude funksje __builtin_stack_address() is tafoege, en spegelet de ferlykbere funksje yn GCC. Dizze funksje jout it stackadres werom dat it stackgebiet fan 'e hjoeddeiske funksje dy't __builtin_stack_address() opropt skiedt en de folgjende funksjes dy't it opropt.
- Mooglikheden dy't ûntwikkele wurde foar de takomstige C2y-standert:
- Stipe tafoege foar neamde loops, wêrtroch jo nammen kinne tawize oan loops en switch-statements, dy't kinne wurde oantsjutte yn break- en continue-statements om eksplisyt te definiearjen hokker loop jo moatte ferlitte. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // gean nei CONT1 continue outer; // gean nei CONT2 // CONT1 } // CONT2 }
- De ymplemintaasje fan 'e ynboude "__COUNTER__" makro, ûntworpen om unike identifikaammen te generearjen, is útwreide en opnommen yn 'e standert. In limyt fan 2147483647 oprop nei dizze makro is ynsteld; it oerskriden fan dizze limyt sil in flater generearje.
- Warskôging (-Wstatic-in-inline) fuorthelle by it brûken fan statyske funksjes of fariabelen binnen funksjes dy't deklarearre binne as "extern inline".
- Mooglikheden definiearre yn 'e C23 C-standert:
- It float.h-headerbestân stipet no de FLT_SNAN-, DBL_SNAN- en LDBL_SNAN-makro's, dy't sinjalearre (wat in útsûndering feroarsaket by gebrûk yn rekkenkundige operaasjes) NaN-wearden ymplementearje foar float-, double- en long double-typen.
- In bug oplost wêrby't ferskate ûnbeneamde typen as kompatibel waarden behannele binnen deselde oersettingsienheid as se deselde fjilden hiene.
- De flagge "-MG" dy't brûkt wurdt om ûntbrekkende headerbestannen te negearjen by it scannen fan ôfhinklikheden is útwreide nei "#embed"-rjochtlinen en ûnderdrukt no de flater "bestân net fûn" as in bestân dat oantsjutte is yn in "#embed"-rjochtline ûntbrekt.
- C++ relatearre funksjes:
- De mooglikheid om strukturearre biningen te brûken yn 'e "constexpr"-kontekst, lykas ûntwikkele yn 'e C++2c (C++26)-spesifikaasje, is tafoege. Dit betsjut dat ferwizings nei konstante útdrukkingen no sels konstante útdrukkingen wêze kinne. Stipe is ymplementearre foar arrays en ienfâldige struktueren (tuples wurde noch net stipe). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Lykas fereaske troch de C++20-standert, wurde beheiningen no omset nei standertfoarm foardat se kontrolearre wurde, wêrtroch krektere diagnostykberjochten en juste ôfhanneling fan ferfangingsfouten yn sjabloanarguminten dy't allinich brûkt wurde yn konsept-ID's mooglik binne.
- In famylje fan ynboude funksjes "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" tafoege om út te finen oft de fergelikingsoperators "<", ">", "<=", en ">=" synthetisearre binne út 'e operator "<=>".
- De parameter "-Wincompatible-pointer-types" is feroare om in flater út te jaan ynstee fan in warskôging. Om werom te gean nei it foarige gedrach, brûk de opsje "-Wno-error=incompatible-pointer-types".
- Ynboude funksjes tafoege __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. Bygelyks, mei builtin_dedup_pack kinne jo duplikaten fuortsmite út in list mei typen: mei MyTypeList = TypeList<__builtin_dedup_pack …>; // it resultearjende type sil TypeList wêze
- By it debuggen fan ûndefiniearre gedrach mei UBSan (-fsanitize=undefined -fsanitize-trap=undefined), wurdt ynformaasje oer de oarsaak fan flaters no opnommen yn 'e generearre debug-ynformaasje. De flagge "-fsanitize-debug-trap-reasons" is tafoege om it detailnivo yn flaterynformaasje oan te jaan. It kin ynsteld wurde op "basis" foar algemiene beskriuwingen (bygelyks "Integer addition overflowed") en "detailed" om detaillearre ynformaasje op te nimmen (bygelyks "signed integer addition overflow yn 'a + b'").
- Nije kompilerflaggen tafoege:
- "-f[no-]sanitize-debug-trap-reasons" om te kontrolearjen oft útsûnderingsfalle-redenen ynbêde binne yn debug-ynformaasje by it kompilearjen mei "-fsanitize-trap" modus.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", en "-fsanitize-alloc-token-extended" om ûnthâldallokaasjetokens te behearjen.
- "-fmatrix-memory-layout" om de ûnthâldlayout fan matrikstypen te kontrolearjen (bygelyks kolom-haad foar kolom-haad, rige-haad foar rige-haad).
- Funksjes hawwe no in "malloc_span" attribút, fergelykber mei it malloc-attribút, mar fan tapassing op funksjes dy't span-achtige struktueren weromjaan dy't in oanwizer en in fjild mei de grutte of in oanwizer nei de ein fan it blok befetsje.
- It attribút "modular_format" tafoege om dynamysk de fereaske statysk keppele ymplemintaasje fan 'e printf-funksje te selektearjen op it momint fan keppeling.
- Diagnostyske en statyske analyse-ark binne útwreide, nije kontrôles binne tafoege (ferskate tsientallen diagnostyk-relatearre ferbetterings).
- Ekstra yntrinsyken foar de SSE-, AVX- en AVX512-útwreidings binne tafoege oan 'e X86-backend. Boumodi binne tafoege foar Intel CPU's basearre op 'e Wildcat Lake (-march=wildcatlake) en Nova Lake (-march=novalake) mikroarsjitektueren.
- De AArch64-backend stipet no de 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) prosessors. Ekstra ynboude funksjes binne tafoege foar de FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], en FCVTA[US] ynstruksjes. Stipe foar Function Multi-Versioning (FMV) is stabilisearre. Brûkers kinne no de prioriteit fan ferskate funksjeferzjes oerskriuwe.
- Stipe tafoege foar LoongArch32 (LA32R, LA32S) arsjitektuer.
- Ferbettere backends foar ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- en PowerPC-arsjitektueren.
Boarne: opennet.ru
