Nakon šest mjeseci razvoja, objavljen je LLVM 22.1.0. Razvija alate (kompilatore, optimizatore i generatore koda) koji kompajliraju programe u međubitni kod virtualnih instrukcija sličnih RISC-u (virtualni stroj niske razine s višerazinskim sustavom optimizacije). Generirani pseudokod može se pretvoriti u strojni kod za danu ciljnu platformu ili ga može koristiti JIT (just-in-time) kompajler za generiranje strojnih instrukcija izravno tijekom izvršavanja programa. Na temelju LLVM tehnologija, projekt razvija Clang kompajler, koji podržava programske jezike C, C++ i Objective-C. Počevši od grane 18.x, projekt je prešao na novu shemu numeriranja verzija, prema kojoj se tijekom razvoja koristi izdanje 0 ("N.0"), a prva stabilna verzija je numerirana kao "N.1".
Među poboljšanjima u Clangu 22:
- Dodana je podrška za tokene za alokaciju memorije (Allocation Tokens) za označavanje operacija alokacije memorije koje se izvode pomoću funkcija poput malloc s jedinstvenim identifikatorom. Tokeni za alokaciju omogućuju strukturiranje informacija o hrpi, pojednostavljuju otkrivanje curenja memorije i omogućuju grupiranje objekata na temelju njihove namjene ili obrazaca modifikacije (npr. odvajanje "vrućih" od "hladnih" podataka). Za omogućavanje upotrijebite zastavicu "-fsanitize=alloc-token".
- Značajke povezane s C jezikom:
- Implementiran je nacrt specifikacije koji definira mehanizam odgođenog izvršavanja "defer", omogućujući izvršavanje radnji kada trenutni opseg izađe. Dodana je zastavica "-fdefer-ts" kako bi se omogućila podrška za "defer".
- Dodana je ugrađena funkcija __builtin_stack_address(), koja odražava sličnu funkciju u GCC-u. Ova funkcija vraća adresu stoga odvajajući područje stoga trenutne funkcije koja je pozvala __builtin_stack_address() od sljedećih funkcija koje poziva.
- Mogućnosti koje se razvijaju za budući C2y standard:
- Dodana je podrška za imenovane petlje koja vam omogućuje dodjeljivanje imena petljama i switch naredbama, koje se mogu specificirati u break i continue naredbama kako bi se eksplicitno definirala petlja iz koje se izlazi. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // idi na CONT1 continue outer; // idi na CONT2 // CONT1 } // CONT2 }
- Implementacija ugrađene makronaredbe "__COUNTER__", dizajnirane za generiranje jedinstvenih identifikatora, proširena je i uključena u standard. Postavljeno je ograničenje od 2147483647 poziva ove makronaredbe; prekoračenje ovog ograničenja generirat će pogrešku.
- Uklonjeno je upozorenje (-Wstatic-in-inline) pri korištenju statičkih funkcija ili varijabli unutar funkcija deklariranih kao "extern inline".
- Mogućnosti definirane u standardu C23 C:
- Zaglavna datoteka float.h sada podržava makroe FLT_SNAN, DBL_SNAN i LDBL_SNAN, koji implementiraju signalizirane (uzrokujući iznimku kada se koriste u aritmetičkim operacijama) NaN vrijednosti za tipove float, double i long double.
- Ispravljena je greška gdje su različiti neimenovani tipovi tretirani kao kompatibilni unutar iste jedinice prijevoda ako su imali ista polja.
- Zastavica "-MG" koja se koristi za ignoriranje nedostajućih datoteka zaglavlja tijekom skeniranja ovisnosti proširena je na direktive "#embed" i sada potiskuje grešku "datoteka nije pronađena" kada nedostaje datoteka navedena u direktivi "#embed".
- Značajke povezane s C++-om:
- Dodana je mogućnost korištenja strukturiranih vezanja u kontekstu "constexpr", kako je razvijeno u specifikaciji C++2c (C++26). To znači da reference na konstantne izraze sada mogu same biti konstantni izrazi. Implementirana je podrška za nizove i jednostavne strukture (torke još nisu podržane). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Kako zahtijeva standard C++20, ograničenja se sada pretvaraju u standardni oblik prije provjere, što omogućuje točnije dijagnostičke poruke i pravilno rukovanje pogreškama zamjene u argumentima predložaka koji se koriste samo u konceptnim ID-ovima.
- Dodana je obitelj ugrađenih funkcija "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" kako bi se utvrdilo jesu li operatori usporedbe "<", ">", "<=" i ">=" sintetizirani iz operatora "<=>".
- Parametar "-Wincompatible-pointer-types" je promijenjen tako da ispisuje grešku umjesto upozorenja. Za povratak na prethodno ponašanje upotrijebite opciju "-Wno-error=incompatible-pointer-types".
- Dodane su ugrađene 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 i __builtin_dedup_pack. Na primjer, builtin_dedup_pack omogućuje vam uklanjanje duplikata s popisa tipova: korištenjem MyTypeList = TypeList<__builtin_dedup_pack …>; // rezultirajući tip će biti TypeList
- Prilikom otklanjanja pogrešaka nedefiniranog ponašanja s UBSan-om (-fsanitize=undefined -fsanitize-trap=undefined), informacije o uzroku pogreške sada su uključene u generirane informacije o otklanjanju pogrešaka. Dodana je zastavica "-fsanitize-debug-trap-reasons" za određivanje razine detalja u informacijama o pogrešci. Može se postaviti na "osnovno" za opće opise (npr. "Zbrajanje cijelih brojeva prekoračeno") i "detaljno" za uključivanje detaljnih informacija (npr. "zbrajanje predznačenih cijelih brojeva prekoračeno u 'a + b'").
- Dodane su nove oznake prevoditelja:
- "-f[no-]sanitize-debug-trap-reasons" za kontrolu jesu li razlozi zadržavanja iznimaka ugrađeni u informacije o otklanjanju pogrešaka prilikom kompajliranja s načinom rada "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" i "-fsanitize-alloc-token-extended" za upravljanje tokenima za alokaciju memorije.
- "-fmatrix-memory-layout" za kontrolu rasporeda memorije tipova matrica (npr. column-major za column-major, row-major za row-major).
- Funkcije sada imaju atribut "malloc_span", sličan atributu malloc, ali primjenjiv na funkcije koje vraćaju strukture slične rasponu koje sadrže pokazivač i polje s veličinom ili pokazivač na kraj bloka.
- Dodan je atribut "modular_format" za dinamički odabir potrebne statički povezane implementacije funkcije printf prilikom povezivanja.
- Alati za dijagnostiku i statičku analizu su prošireni, dodane su nove provjere (nekoliko desetaka poboljšanja vezanih uz dijagnostiku).
- Dodatne intrinzične značajke za SSE, AVX i AVX512 ekstenzije dodane su u X86 backend. Dodani su načini izgradnje za Intelove procesore temeljene na mikroarhitekturama Wildcat Lake (-march=wildcatlake) i Nova Lake (-march=novalake).
- AArch64 backend sada podržava procesore Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) i Arm C1-Ultra (c1-ultra). Dodane su dodatne ugrađene funkcije za instrukcije FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] i FCVTA[US]. Podrška za više verzija funkcija (FMV) je stabilizirana. Korisnici sada mogu nadjačati prioritet različitih verzija funkcija.
- Dodana je podrška za arhitekturu LoongArch32 (LA32R, LA32S).
- Poboljšani backendovi za ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly i PowerPC arhitekture.
Izvor: opennet.ru
