Pärast kuuekuulist arendust on avaldatud LLVM 22.1.0. See arendab tööriistu (kompilaatoreid, optimeerijaid ja koodigeneraatoreid), mis kompileerivad programme RISC-laadsete virtuaalsete käskude vahepealseks bitikoodiks (madala taseme virtuaalmasin mitmetasandilise optimeerimissüsteemiga). Genereeritud pseudokoodi saab teisendada masinkoodiks antud sihtplatvormi jaoks või kasutada seda just-in-time (JIT) kompilaatori poolt masinkäskude genereerimiseks otse programmi täitmise ajal. LLVM-tehnoloogiatele tuginedes arendab projekt Clangi kompilaatorit, mis toetab programmeerimiskeeli C, C++ ja Objective-C. Alates 18.x harust läks projekt üle uuele versioonide nummerdamisskeemile, mille kohaselt arenduse ajal kasutatakse versiooni 0 ("N.0") ja esimene stabiilne versioon on nummerdatud "N.1".
Clang 22 täiustused hõlmavad järgmist:
- Lisatud mälu eraldamise tunnuste (Allocation Tokens) tugi, et märkida funktsioonide (nt malloc) abil teostatud mälu eraldamise toiminguid unikaalse identifikaatoriga. Jaotustunnused võimaldavad struktureerida kuhjainfot, lihtsustada mälulekke tuvastamist ja lubada objektide rühmitamist nende eesmärgi või muutmismustrite alusel (nt eraldades "kuumad" andmed "külmadest" andmetest). Lubamiseks kasutage lippu "-fsanitize=alloc-token".
- C-keelega seotud omadused:
- Edasilükatud täitmise mehhanismi "defer" määratleva spetsifikatsiooni mustandiversioon on rakendatud, võimaldades toimingute täitmist praeguse ulatuse lõppemisel. Edasilükamise toe lubamiseks on lisatud lipp "-fdefer-ts".
- Lisatud on sisseehitatud funktsioon __builtin_stack_address(), mis peegeldab sarnast funktsiooni GCC-s. See funktsioon tagastab pinu aadressi, mis eraldab praeguse funktsiooni, mis kutsus välja __builtin_stack_address() funktsiooni, ja järgnevate funktsioonide pinu ala.
- Tulevase C2y standardi jaoks arendatavad võimalused:
- Lisatud nimega tsüklite tugi, mis võimaldab määrata tsüklitele ja switch-lausetele nimesid, mida saab määrata break- ja continue-lausetes, et selgelt määratleda tsükkel, millest väljutakse. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // mine CONT1-le continue outer; // mine CONT2-le // CONT1 } // CONT2 }
- Sisseehitatud makro "__COUNTER__" rakendamist, mis on loodud unikaalsete identifikaatorite nimede genereerimiseks, on laiendatud ja standardisse lisatud. Sellele makrole on seatud piirang 2147483647 kõnele; selle piiri ületamine tekitab vea.
- Eemaldas hoiatuse (-Wstatic-in-inline), mis kuvatakse staatiliste funktsioonide või muutujate kasutamisel funktsioonide sees, mis on deklareeritud kui "extern inline".
- C23 C standardis määratletud võimalused:
- Päisefail float.h toetab nüüd makrosid FLT_SNAN, DBL_SNAN ja LDBL_SNAN, mis rakendavad signaalitud (aritmeetilistes tehtes erandi tekitavaid) NaN-väärtusi float-, double- ja long double-tüüpide jaoks.
- Parandatud viga, mille korral erinevaid nimetuid tüüpe käsitleti samas tõlkeüksuses ühilduvatena, kui neil olid samad väljad.
- Sõltuvuste skaneerimise ajal puuduvate päisefailide ignoreerimiseks kasutatavat lippu "-MG" on laiendatud ka "#embed" direktiividele ja see nüüd välistab vea "faili ei leitud", kui "#embed" direktiivis määratud fail puudub.
- C++-ga seotud funktsioonid:
- Nagu C++2c (C++26) spetsifikatsioonis välja töötatud, on lisatud võimalus kasutada struktureeritud seoseid kontekstis "constexpr". See tähendab, et viited konstantsetele avaldistele saavad nüüd ise olla konstantsed avaldised. Rakendatud on tugi massiividele ja lihtsatele struktuuridele (tuple'eid veel ei toetata). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Nagu C++20 standard nõuab, teisendatakse piirangud nüüd enne kontrollimist standardvormi, mis võimaldab täpsemaid diagnostilisi teateid ja asendusvigade õiget käsitlemist malliargumentides, mida kasutatakse ainult kontseptsiooni ID-des.
- Lisatud sisseehitatud funktsioonide perekond "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", et teha kindlaks, kas võrdlusoperaatorid "<", ">", "<=" ja ">=" sünteesiti operaatorist "<=>".
- Parameetrit "-Wincompatible-pointer-types" on muudetud nii, et see kuvab hoiatuse asemel veateate. Eelmise käitumise taastamiseks kasutage valikut "-Wno-error=incompatible-pointer-types".
- Lisatud sisseehitatud funktsioonid __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 ja __builtin_dedup_pack. Näiteks võimaldab builtin_dedup_pack eemaldada tüüpide loendist duplikaate: kasutades MyTypeList = TypeList<__builtin_dedup_pack …>; // tulemuseks on TypeList
- UBSaniga (-fsanitize=undefined -fsanitize-trap=undefined) määratlemata käitumise silumisel lisatakse nüüd genereeritud silumisteabesse vea põhjuse teave. Lisatud on lipp "-fsanitize-debug-trap-reasons", et määrata veateabe detailsuse tase. Selle saab üldiste kirjelduste jaoks määrata väärtuseks "basic" (nt "täisarvude liitmine ületäitus") ja üksikasjaliku teabe lisamiseks väärtuseks "detailed" (nt "märgistatud täisarvude liitmine ületäitus 'a + b'").
- Lisatud uued kompilaatori lipud:
- "-f[no-]sanitize-debug-trap-reasons", et määrata, kas erandite lõksu põhjused lisatakse silumisteabesse "-fsanitize-trap" režiimiga kompileerimisel.
- Mälu eraldamise lubade haldamiseks on käsud "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" ja "-fsanitize-alloc-token-extended".
- "-fmatrix-memory-layout" maatriksitüüpide mälupaigutuse juhtimiseks (nt column-major veeru-põhitüübi jaoks, row-major rea-põhitüübi jaoks).
- Funktsioonidel on nüüd atribuut "malloc_span", mis sarnaneb atribuudiga malloc, kuid kehtib funktsioonide kohta, mis tagastavad span-tüüpi struktuure, mis sisaldavad pointerit ja välja suurusega või pointerit ploki lõppu.
- Lisatud atribuut "modular_format", et valida dünaamiliselt printf-funktsiooni nõutav staatiliselt lingitud implementatsioon lingi ajal.
- Diagnostilise ja staatilise analüüsi tööriistu on laiendatud, lisatud on uusi kontrolle (mitu tosinat diagnostikaga seotud täiustust).
- X86 taustaprogrammile on lisatud täiendavad SSE, AVX ja AVX512 laienduste omadused. Lisatud on ehitusrežiimid Inteli protsessoritele, mis põhinevad Wildcat Lake'i (-march=wildcatlake) ja Nova Lake'i (-march=novalake) mikroarhitektuuridel.
- AArch64 taustsüsteem toetab nüüd Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) ja Arm C1-Ultra (c1-ultra) protsessoreid. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] ja FCVTA[US] käskudele on lisatud täiendavaid sisseehitatud funktsioone. Funktsioonide mitmeversioonilisuse (FMV) tugi on stabiliseeritud. Kasutajad saavad nüüd erinevate funktsiooniversioonide prioriteeti tühistada.
- Lisatud tugi LoongArch32 (LA32R, LA32S) arhitektuurile.
- Täiustatud taustaprogrammid ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly ja PowerPC arhitektuuridele.
Allikas: opennet.ru
