LLVM 16.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arendustööd esitleti projekti LLVM 16.0 väljalaset – GCC-ga ühilduvat tööriistakomplekti (kompilaatorid, optimeerijad ja koodigeneraatorid), mis kompileerib programmid RISC-laadsete virtuaalsete käskude vahepealsesse bitikoodi (madala tasemega virtuaalmasin mitmetasandiline optimeerimissüsteem). Loodud pseudokoodi saab JIT-kompilaatori abil teisendada masinakäskudeks vahetult programmi täitmise ajal.

Peamised täiustused versioonis Clang 16.0:

  • Vaikimisi C++/ObjC++ standard on gnu++17 (varem gnu++14), mis tähendab, et GNU laiendustega C++17 funktsioone toetatakse vaikimisi. Eelmise käitumise tagastamiseks võite kasutada suvandit "-std=gnu++14".
  • Rakendatud C++20 standardiga seotud lisafunktsioonid:
    • Tinglikult triviaalsed liikme erifunktsioonid,
    • struktureeritud sidemete hõivamine lambda funktsioonides,
    • Võrdsuse operaator avaldiste sees,
    • Võimalus mõnes kontekstis tüübinime märksõna välja jätta,
    • Sobiv koondkäivitamine sulgudes (“Aggr(val1, val2)”).
  • Rakendatud on tulevases C++2b standardis määratletud funktsioonid:
    • Liitavaldiste lõppu on lubatud panna silte,
    • staatiline operaator (),
    • staatiline operaator[],
    • Ühilduvus char8_t tüübiga on tagatud,
    • Kategoorias "\N{...}" kasutamiseks lubatud märkide valikut on laiendatud
    • Lisatud on võimalus kasutada muutujaid, mis on deklareeritud kui "staatiline constexpr", funktsioonides, mis on deklareeritud kui constexpr.
  • Rakendatud on tulevases C-standardis C2x määratletud funktsioonid:
    • Hoiatuse "-Wunused-label" keelamiseks on lubatud siltidele rakendada atribuuti "[[maybe_unused]]"
    • Silte on lubatud paigutada liitavaldistesse kõikjale,
    • lisatud operaatorite tüüp ja typeof_unqual,
    • Uut tüüpi nullptr_t ja nullptr-konstant null-osutite määratlemiseks, mida saab teisendada mis tahes tüüpi osutiteks ja mis esindavad NULL-i varianti, mis ei ole seotud täisarvu ja tühiste* tüüpidega.
    • C2x režiimis on va_start makro kutsumine muutuva arvu argumentidega (variadic) lubatud.
  • Vastavusrežiimides C99, C11 ja C17 tekitavad vaikevalikud "-Wimplicit-function-declaration" ja "-Wimplicit-int" hoiatuse asemel vea.
  • Kaudne "void *" (nt "void func(void *p) { *p; }") kasutamine C++ režiimis tekitab nüüd vea, mis sarnaneb ISO C++, GCC, ICC ja MSVC-ga.
  • Bitiväljade määramine käsuoperandidena (nt "__asm ​​​​{ mov eax, s.bf }") Microsofti stiilis sisestes montaažiplokkides tekitab nüüd vea.
  • Lisatud diagnostika erinevate struktuuride ja samade nimedega liitude olemasolu kohta erinevates moodulites.
  • Laiendatud on OpenCL-i ja OpenMP-toega seotud võimalusi. Täiustatud diagnostika OpenCL-i kerneli argumentides kasutatavate C++ mallide jaoks. Täiustatud AMDGPU järjekorraploki tugi. Atribuut nounwind lisatakse kaudselt kõikidele funktsioonidele. Täiustatud tugi sisseehitatud funktsioonidele.
  • Lisatud on võimalus kasutada keskkonnamuutujat CLANG_CRASH_DIAGNOSTICS_DIR, et määrata kataloog, kuhu krahhi diagnostika andmed salvestatakse.
  • Unicode'i tugi on värskendatud spetsifikatsioonile Unicode 15.0. Mõned matemaatilised sümbolid on identifikaatorites lubatud, näiteks "₊" (nt "double xₖ₊₁").
  • Lisatud tugi mitme konfiguratsioonifaili laadimiseks (kõigepealt laaditakse vaikimisi konfiguratsioonifailid ja seejärel need, mis on määratud lipuga "--config=", mida saab nüüd mitu korda määrata). Muutis konfiguratsioonifailide vaikelaadimise järjekorda: clang proovib faili esimesena laadida - .cfg ja kui seda ei leita, proovib see laadida kahte faili .cfg ja .cfg. Konfiguratsioonifailide vaikimisi laadimise keelamiseks on lisatud lipp "--no-default-config".
  • Korratavuse tagamiseks on võimalik praegused kuupäeva ja kellaaja väärtused makrodes __DATE__, __TIME__ ja __TIMESTAMP__ asendada keskkonnamuutujas SOURCE_DATE_EPOCH määratud ajaga.
  • Konstantide kontekstis kasutatavate sisseehitatud funktsioonide (builtin) olemasolu kontrollimiseks on lisatud makro “__has_constexpr_builtin”.
  • Joondatud korutiinikaadri eraldamiseks on lisatud uus koostamislipp "-fcoro-aligned-allocation".
  • Lipp "-fstrict-flex-arrays=" rakendab struktuuride paindlike massiivi elementide kolmanda taseme kontrollimise tuge (Flexible Array Members, määramata suurusega massiiv struktuuri lõpus). Kolmandal tasemel käsitletakse paindliku massiivina ainult suurust "[]" (näiteks "int b[]"), kuid suurust "[0]" (näiteks "int b[0]") ei ole.
  • Lisatud lipp "-fmodule-output", et võimaldada standardsete C++ moodulite ühefaasilist kompileerimismudelit.
  • Lisatud režiim "-Rpass-analysis=stack-frame-layout", mis aitab diagnoosida virnaraami paigutusega seotud probleeme.
  • Lisati uus atribuut __attribute__((target_version("cpu_features"))) ja laiendati atribuudi __attribute__((target_clones("cpu_features1","cpu_features2",...))) funktsionaalsust, et valida AArch64 pakutavate funktsioonide konkreetsed versioonid protsessorid.
  • Diagnostikatööriistad on laiendatud:
    • Lisatud hoiatus "-Wsingle-bit-bitfield-constant-conversion", et tuvastada ühebitise märgiga bitiväljale selle määramisel kaudne kärpimine.
    • Laiendatud on initsialiseerimata constexpr muutujate diagnostika.
    • Lisatud hoiatused "-Wcast-function-type-strict" ja "-Wincompatible-function-pointer-types-strict", et tuvastada võimalikud probleemid funktsiooni tüüpi ülekandmisel.
    • Lisatud diagnostika valede või reserveeritud moodulinimede kasutamiseks ekspordiplokkides.
    • Täiustatud definitsioonides puuduvate "automaatsete" märksõnade tuvastamine.
    • Hoiatuse "-Winteger-overflow" rakendamine on lisanud ülevooluni viivate täiendavate olukordade kontrollimise.
  • Rakendatud on LoongArchi käsukomplekti arhitektuuri tugi (-march=loongarch64 või -march=la464), mida kasutatakse Loongson 3 5000 protsessorites ja mis rakendab uut RISC ISA-t, sarnaselt MIPS-i ja RISC-V-ga.

LLVM 16.0 peamised uuendused:

  • LLVM koodil on lubatud kasutada C++17 standardis määratletud elemente.
  • LLVM-i ehitamise keskkonnanõudeid on tõstetud. Ehitustööriistad peaksid nüüd toetama C++17 standardit, st. Ehitamiseks vajate vähemalt GCC 7.1, Clang 5.0, Apple Clang 10.0 või Visual Studio 2019 16.7.
  • AArch64 arhitektuuri taustaprogramm lisab tuge Cortex-A715, Cortex-X3 ja Neoverse V2 protsessoritele, RME MEC (mälu krüptimise kontekstid), Armv8.3 laienduste (kompleksnumber) ja funktsiooni mitme versiooni koostaja.
  • ARM-arhitektuuri taustaprogrammis on lõpetatud Armv2, Armv2A, Armv3 ja Armv3M sihtplatvormide tugi, mille puhul õige koodi genereerimine ei olnud garanteeritud. Lisatud on võimalus genereerida koodi kompleksarvudega töötamise juhiste jaoks.
  • X86 arhitektuuri taustaprogrammile on lisatud tugi käsukomplekti arhitektuuridele (ISA-dele) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Lisatud on RDMSRLIST, RMSRLIST ja WRMSRNS juhiste tugi. Rakendatud valikud "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" ja "-mcpu=grandridge".
  • Lisatud on LoongArchi platvormi ametlik tugi.
  • Täiustatud taustaprogrammid MIPS-i, PowerPC- ja RISC-V-arhitektuuride jaoks
  • LLDB silurile on lisatud tugi LoongArchi arhitektuuri 64-bitiste käivitatavate failide silumiseks. COFF-i silumissümbolite täiustatud käsitsemine. Pakutakse topelt-DLL-ide filtreerimist laaditud Windowsi moodulite loendis.
  • Libc++ teegis keskenduti põhitööle C++20 ja C++23 standardite uute funktsioonide toe juurutamisele.
  • LDD linker vähendab oluliselt linkimisaega, paralleelses aadresside ümberpaigutamise skannimise ja sektsiooni lähtestamise toimingud. Lisatud tugi sektsioonide tihendamiseks ZSTD algoritmi abil.

Allikas: opennet.ru

Lisa kommentaar