Nakon šest mjeseci razvoja, objavljen je LLVM 22.1.0. Razvija alate (kompajlere, optimizatore i generatore koda) koji kompajliraju programe u međubitni kod virtuelnih instrukcija sličnih RISC-u (virtuelna mašina niskog nivoa sa sistemom optimizacije na više nivoa). Generisani pseudokod može se pretvoriti u mašinski kod za datu ciljnu platformu ili ga može koristiti JIT (just-in-time) kompajler za generisanje mašinskih instrukcija direktno tokom izvršavanja programa. Na osnovu LLVM tehnologija, projekat razvija Clang kompajler, koji podržava programske jezike C, C++ i Objective-C. Počevši od grane 18.x, projekat je prešao na novu shemu numerisanja verzija, prema kojoj se tokom razvoja koristi izdanje 0 ("N.0"), a prva stabilna verzija je numerisana kao "N.1".
Među poboljšanjima u Clang 22:
- Dodana je podrška za tokene za alokaciju memorije (Allocation Tokens) za označavanje operacija alokacije memorije izvršenih pomoću funkcija kao što je malloc s jedinstvenim identifikatorom. Tokeni za alokaciju omogućavaju strukturiranje informacija o heapu, pojednostavljuju otkrivanje curenja memorije i omogućavaju grupiranje objekata na osnovu njihove namjene ili obrazaca modifikacije (npr. odvajanje "vrućih" od "hladnih" podataka). Da biste omogućili, koristite zastavicu "-fsanitize=alloc-token".
- Karakteristike povezane s C jezikom:
- Implementiran je nacrt specifikacije koja definira mehanizam odgođenog izvršavanja "defer", omogućavajući izvršavanje radnji kada trenutni opseg izađe iz zadate zone. Dodana je zastavica "-fdefer-ts" kako bi se omogućila podrška za "defer".
- Dodana je ugrađena funkcija __builtin_stack_address(), koja je kopija slične funkcije u GCC-u. Ova funkcija vraća adresu steka, odvajajući područje steka trenutne funkcije koja je pozvala __builtin_stack_address() od narednih funkcija koje ona poziva.
- Mogućnosti koje se razvijaju za budući C2y standard:
- Dodata je podrška za imenovane petlje, koja vam omogućava 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đenog makroa "__COUNTER__", dizajniranog za generiranje jedinstvenih identifikatora, proširena je i uključena u standard. Postavljeno je ograničenje od 2147483647 poziva ovog makroa; prekoračenje ovog ograničenja generirat će greš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 C23 C standardu:
- Zaglavna datoteka float.h sada podržava makroe FLT_SNAN, DBL_SNAN i LDBL_SNAN, koji implementiraju signalizirane (izazove izuzetak 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 prevodilačke jedinice ako su imali ista polja.
- Zastavica "-MG" koja se koristi za ignorisanje nedostajućih zaglavnih datoteka tokom skeniranja zavisnosti proširena je na direktive "#embed" i sada potiskuje grešku "datoteka nije pronađena" kada nedostaje datoteka navedena u direktivi "#embed".
- Funkcije povezane s C++-om:
- Dodana je mogućnost korištenja strukturiranih povezivanja 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 je propisano standardom C++20, ograničenja se sada pretvaraju u standardni oblik prije provjere, što omogućava preciznije dijagnostičke poruke i pravilno rukovanje greškama zamjene u argumentima predložaka koji se koriste samo u konceptualnim ID-ovima.
- Dodana je porodica ugrađenih funkcija "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" kako bi se utvrdilo da li su operatori poređenja "<", ">", "<=" i ">=" sintetizovani iz operatora "<=>".
- Parametar "-Wincompatible-pointer-types" je promijenjen tako da ispisuje grešku umjesto upozorenja. Da biste se vratili na prethodno ponašanje, koristite 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 vam omogućava uklanjanje duplikata sa liste tipova: korištenjem MyTypeList = TypeList<__builtin_dedup_pack …>; // rezultirajući tip će biti TypeList
- Prilikom otklanjanja grešaka nedefiniranog ponašanja pomoću UBSan-a (-fsanitize=undefined -fsanitize-trap=undefined), informacije o uzroku greške su sada uključene u generirane informacije o otklanjanju grešaka. Dodana je zastavica "-fsanitize-debug-trap-reasons" kako bi se odredio nivo detalja u informacijama o grešci. Može se postaviti na "osnovno" za opće opise (npr. "Prelijevanje sabiranja cijelih brojeva") i "detaljno" za uključivanje detaljnih informacija (npr. "prelijevanje sabiranja predznačenih cijelih brojeva u 'a + b'").
- Dodane nove zastavice kompajlera:
- "-f[no-]sanitize-debug-trap-reasons" za kontrolu da li su razlozi zamki izuzetaka ugrađeni u informacije o debugiranju 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 matričnih tipova (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 span-u 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 desetina poboljšanja vezanih za dijagnostiku).
- Dodatne intrinzične funkcije za SSE, AVX i AVX512 ekstenzije su dodane u X86 backend. Dodani su i modovi izgradnje za Intel CPU-e zasnovane 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 promijeniti prioritet različitih verzija funkcija.
- Dodata je podrška za LoongArch32 (LA32R, LA32S) arhitekturu.
- Poboljšani backendovi za ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly i PowerPC arhitekture.
izvor: opennet.ru
