Po šestih mesecih razvoja je bil izdan LLVM 22.1.0. Razvija orodja (prevajalnike, optimizatorje in generatorje kode), ki programe prevajajo v vmesno bitno kodo virtualnih ukazov, podobnih RISC (nizkonajnivojski virtualni stroj z večnivojskim optimizacijskim sistemom). Ustvarjeno psevdokoda se lahko pretvori v strojno kodo za dano ciljno platformo ali pa jo uporabi prevajalnik JIT (just-in-time) za generiranje strojnih ukazov neposredno med izvajanjem programa. Na podlagi tehnologij LLVM projekt razvija prevajalnik Clang, ki podpira programske jezike C, C++ in Objective-C. Začenši z vejo 18.x, je projekt prešel na novo shemo številčenja različic, po kateri se med razvojem uporablja izdaja 0 ("N.0"), prva stabilna različica pa je oštevilčena kot "N.1".
Med izboljšavami v Clang 22:
- Dodana je podpora za žetone za dodeljevanje pomnilnika (Allocation Tokens) za označevanje operacij dodeljevanja pomnilnika, izvedenih s funkcijami, kot je malloc, z enoličnim identifikatorjem. Žetoni za dodeljevanje omogočajo strukturiranje informacij o kopici, poenostavitev zaznavanja puščanja pomnilnika in omogočanje združevanja objektov glede na njihov namen ali vzorce spreminjanja (npr. ločevanje "vročih" od "hladnih" podatkov). Za omogočanje uporabite zastavico "-fsanitize=alloc-token".
- Funkcije, povezane z jezikom C:
- Implementiran je bil osnutek specifikacije, ki opredeljuje mehanizem odloženega izvajanja »defer«, ki omogoča izvajanje dejanj ob izstopu iz trenutnega obsega. Dodana je bila zastavica »-fdefer-ts«, ki omogoča podporo za »defer«.
- Dodana je bila vgrajena funkcija __builtin_stack_address(), ki zrcali podobno funkcijo v GCC. Ta funkcija vrne naslov sklada, ki ločuje območje sklada trenutne funkcije, ki je klicala __builtin_stack_address(), od naslednjih funkcij, ki jih kliče.
- Zmogljivosti, ki se razvijajo za prihodnji standard C2y:
- Dodana je podpora za poimenovane zanke, ki omogoča dodeljevanje imen zankam in stavkom switch, ki jih je mogoče določiti v stavkih break in continue, da se eksplicitno definira zanka, iz katere se izstopi. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // pojdi na CONT1 continue outer; // pojdi na CONT2 // CONT1 } // CONT2 }
- Implementacija vgrajenega makra »__COUNTER__«, zasnovanega za ustvarjanje enoličnih identifikatorskih imen, je bila razširjena in vključena v standard. Določena je bila omejitev 2147483647 klicev tega makra; preseganje te omejitve bo povzročilo napako.
- Odstranjeno opozorilo (-Wstatic-in-inline) pri uporabi statičnih funkcij ali spremenljivk znotraj funkcij, deklariranih kot "extern inline".
- Zmogljivosti, opredeljene v standardu C23 C:
- Datoteka glave float.h zdaj podpira makre FLT_SNAN, DBL_SNAN in LDBL_SNAN, ki implementirajo signalizirane (povzročijo izjemo pri uporabi v aritmetičnih operacijah) vrednosti NaN za tipe float, double in long double.
- Odpravljena je bila napaka, pri kateri so bili različni neimenovani tipi znotraj iste prevajalske enote obravnavani kot združljivi, če so imeli enaka polja.
- Zastavica »-MG«, ki se uporablja za prezrtje manjkajočih datotek glave med pregledovanjem odvisnosti, je bila razširjena na direktive »#embed« in zdaj preprečuje napako »datoteka ni najdena«, ko manjka datoteka, določena v direktivi »#embed«.
- Funkcije, povezane s C++:
- Dodana je bila možnost uporabe strukturiranih povezav v kontekstu »constexpr«, kot je bilo razvito v specifikaciji C++2c (C++26). To pomeni, da so lahko sklicevanja na konstantne izraze zdaj tudi sama konstantni izrazi. Izvedena je podpora za polja in preproste strukture (n-termine še niso podprte). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Kot zahteva standard C++20, se omejitve pred preverjanjem pretvorijo v standardno obliko, kar omogoča natančnejša diagnostična sporočila in pravilno obravnavo napak pri zamenjavi v argumentih predlog, ki se uporabljajo samo v konceptnih ID-jih.
- Dodana je bila družina vgrajenih funkcij "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", ki ugotavlja, ali so bili operatorji primerjave "<", ">", "<=" in ">=" sintetizirani iz operatorja "<=>".
- Parameter »-Wincompatible-pointer-types« je bil spremenjen tako, da namesto opozorila izpiše napako. Če želite povrniti prejšnje delovanje, uporabite možnost »-Wno-error=incompatible-pointer-types«.
- Dodane vgrajene funkcije __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 in __builtin_dedup_pack. Na primer, builtin_dedup_pack vam omogoča, da odstranite podvojene elemente s seznama tipov: z uporabo MyTypeList = TypeList<__builtin_dedup_pack …>; // nastali tip bo TypeList
- Pri odpravljanju napak nedefiniranega vedenja z UBSan (-fsanitize=undefined -fsanitize-trap=undefined) so informacije o vzroku napake zdaj vključene v ustvarjene informacije o napakah. Dodana je bila zastavica »-fsanitize-debug-trap-reasons«, ki določa raven podrobnosti informacij o napaki. Nastavite jo lahko na »osnovno« za splošne opise (npr. »Presipanje seštevanja celih števil«) in na »podrobno« za vključitev podrobnih informacij (npr. »Presipanje seštevanja predznačenih celih števil v 'a + b'«).
- Dodane nove zastavice prevajalnika:
- "-f[no-]sanitize-debug-trap-reasons" za nadzor, ali so razlogi za izjeme pri prevajanju z načinom "-fsanitize-trap" vdelani v informacije o odpravljanju napak.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" in "-fsanitize-alloc-token-extended" za upravljanje žetonov za dodeljevanje pomnilnika.
- "-fmatrix-memory-layout" za nadzor postavitve pomnilnika tipov matrik (npr. stolpec-glavni za stolpec-glavni, vrstica-glavna za vrstico-glavno).
- Funkcije imajo zdaj atribut »malloc_span«, podoben atributu malloc, vendar velja za funkcije, ki vračajo strukture, podobne razponu, ki vsebujejo kazalec in polje z velikostjo ali kazalec na konec bloka.
- Dodan je atribut "modular_format" za dinamično izbiro zahtevane statično povezane implementacije funkcije printf ob času povezave.
- Razširjena so bila orodja za diagnostiko in statično analizo, dodani so bili novi pregledi (več ducatov izboljšav, povezanih z diagnostiko).
- V ozadje X86 so bile dodane dodatne intrinzične funkcije za razširitve SSE, AVX in AVX512. Dodani so bili načini gradnje za Intelove procesorje, ki temeljijo na mikroarhitekturah Wildcat Lake (-march=wildcatlake) in Nova Lake (-march=novalake).
- Zaledni sistem AArch64 zdaj podpira procesorje Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) in Arm C1-Ultra (c1-ultra). Dodane so bile dodatne vgrajene funkcije za ukaze FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] in FCVTA[US]. Podpora za več različic funkcij (FMV) je bila stabilizirana. Uporabniki lahko zdaj preglasijo prioriteto različnih različic funkcij.
- Dodana podpora za arhitekturo LoongArch32 (LA32R, LA32S).
- Izboljšani zaledni sistemi za arhitekture ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly in PowerPC.
Vir: opennet.ru
