Vydanie sady kompilátorov LLVM 16.0

Po šiestich mesiacoch vývoja bolo predstavené vydanie projektu LLVM 16.0 - GCC-kompatibilný toolkit (kompilátory, optimalizátory a generátory kódu), ktorý kompiluje programy do stredného bitového kódu virtuálnych inštrukcií podobných RISC (nízkoúrovňový virtuálny stroj s viacúrovňový optimalizačný systém). Vygenerovaný pseudokód je možné previesť pomocou JIT kompilátora na strojové inštrukcie priamo v čase vykonávania programu.

Hlavné vylepšenia v Clang 16.0:

  • Predvolený štandard C++/ObjC++ je gnu++17 (predtým gnu++14), čo znamená, že funkcie C++17 s rozšíreniami GNU sú štandardne podporované. Ak chcete vrátiť predchádzajúce správanie, môžete použiť voľbu "-std=gnu++14".
  • Implementované pokročilé funkcie súvisiace so štandardom C++20:
    • Podmienečne triviálne špeciálne členské funkcie,
    • zachytenie štruktúrovaných väzieb vo funkciách lambda,
    • Operátor rovnosti vo vnútri výrazov,
    • Možnosť vynechať kľúčové slovo typename v niektorých kontextoch,
    • Platná agregovaná inicializácia v zátvorkách („Aggr(val1, val2)“).
  • Boli implementované funkcie definované v budúcom štandarde C++2b:
    • Je povolené umiestniť štítky na koniec zložených výrazov,
    • statický operátor(),
    • statický operátor[],
    • Je zabezpečená kompatibilita s typom char8_t,
    • Rozsah znakov povolených na použitie v "\N{...}" bol rozšírený
    • Pridaná možnosť používať premenné deklarované ako "static constexpr" vo funkciách deklarovaných ako constexpr.
  • Boli implementované funkcie definované v budúcom štandarde C C2x:
    • Ak chcete zakázať varovanie „-Wunused-label“, atribút „[[maybe_unused]]“ sa môže použiť na štítky
    • Je povolené umiestňovať štítky kdekoľvek v zložených výrazoch,
    • Pridané operátory typeof a typeof_unqual,
    • Nový typ nullptr_t a konštanta nullptr na definovanie ukazovateľov null, ktoré možno konvertovať na akýkoľvek typ ukazovateľa a predstavujú variant NULL, ktorý nie je viazaný na typy typu Integer a void*.
    • V režime C2x je povolené volanie makra va_start s premenlivým počtom argumentov (variadic).
  • V režimoch súladu C99, C11 a C17 predvolené možnosti „-Wimplicit-function-declaration“ a „-Wimplicit-int“ teraz namiesto varovania vytvárajú chybu.
  • Nepriame použitie "void *" (napr. "void func(void *p) { *p; }") v režime C++ teraz generuje chybu podobnú ISO C++, GCC, ICC a MSVC.
  • Zadanie bitových polí ako operandov inštrukcie (napr. "__asm ​​​​{ mov eax, s.bf }") v inline montážnych blokoch v štýle Microsoftu teraz generuje chybu.
  • Pridaná diagnostika prítomnosti rôznych štruktúr a spojení s rovnakými názvami v rôznych moduloch.
  • Rozšírili sa možnosti spojené s podporou OpenCL a OpenMP. Vylepšená diagnostika pre šablóny C++ používané v argumentoch jadra OpenCL. Vylepšená podpora blokovania radenia pre AMDGPU. Atribút nounwind je implicitne pridaný do všetkých funkcií. Vylepšená podpora pre vstavané funkcie.
  • Pridaná možnosť použiť premennú prostredia CLANG_CRASH_DIAGNOSTICS_DIR na definovanie adresára, do ktorého sa ukladajú údaje diagnostiky zrútenia.
  • Podpora Unicode bola aktualizovaná na špecifikáciu Unicode 15.0. Niektoré matematické symboly sú povolené v identifikátoroch, ako napríklad „₊“ (napr. „dvojité xₖ₊₁“).
  • Pridaná podpora pre načítanie viacerých konfiguračných súborov (najskôr sa načítajú predvolené konfiguračné súbory a potom tie, ktoré sú zadané pomocou príznaku „--config=“, ktorý je teraz možné zadať viackrát). Zmenené predvolené poradie načítania konfiguračných súborov: clang sa pokúsi načítať súbor ako prvý - .cfg, a ak sa nenájde, pokúsi sa načítať dva súbory .cfg a .cfg. Ak chcete predvolene zakázať načítanie konfiguračných súborov, bol pridaný príznak „--no-default-config“.
  • Na zabezpečenie opakovateľných zostavení je možné nahradiť aktuálne hodnoty dátumu a času v makrách __DATE__, __TIME__ a __TIMESTAMP__ časom uvedeným v premennej prostredia SOURCE_DATE_EPOCH.
  • Na kontrolu prítomnosti vstavaných funkcií (builtin), ktoré možno použiť v kontexte konštánt, bolo pridané makro „__has_constexpr_builtin“.
  • Pridaný nový príznak kompilácie "-fcoro-aligned-allocation" pre zarovnanú alokáciu rámca rutiny.
  • Príznak “-fstrict-flex-arrays=” implementuje podporu pre tretiu úroveň kontroly prvkov flexibilného poľa v štruktúrach (Flexible Array Members, pole neurčitej veľkosti na konci štruktúry). Na tretej úrovni sa ako flexibilné pole považuje iba veľkosť "[]" (napríklad "int b[]"), ale veľkosť "[0]" (napríklad "int b[0]") nie je.
  • Pridaný príznak "-fmodule-output", ktorý umožňuje jednofázový kompilačný model pre štandardné moduly C++.
  • Pridaný režim "-Rpass-analysis=stack-frame-layout", ktorý pomáha diagnostikovať problémy s rozložením rámca zásobníka.
  • Pridaný nový atribút __attribute__((target_version("cpu_features"))) a rozšírená funkčnosť atribútu __attribute__((target_clones("cpu_features1","cpu_features2",...))) na výber konkrétnych verzií funkcií poskytovaných AArch64 CPU.
  • Rozšírené diagnostické nástroje:
    • Pridané varovanie „-Wsingle-bit-bitfield-constant-conversion“ na zistenie implicitného skrátenia pri priraďovaní jedného bitovému poľu s jedným bitom so znamienkom.
    • Rozšírila sa diagnostika neinicializovaných premenných constexpr.
    • Pridané upozornenia „-Wcast-function-type-strict“ a „-Wincompatible-function-pointer-types-strict“ na identifikáciu potenciálnych problémov s pretypovaním typu funkcie.
    • Pridaná diagnostika pre používanie nesprávnych alebo rezervovaných názvov modulov v exportných blokoch.
    • Vylepšená detekcia chýbajúcich „automatických“ kľúčových slov v definíciách.
    • Implementácia varovania „-Winteger-overflow“ pridala kontroly na ďalšie situácie, ktoré vedú k pretečeniu.
  • Implementovaná podpora pre architektúru inštrukčnej sady LoongArch (-march=loongarch64 alebo -march=la464), ktorá sa používa v procesoroch Loongson 3 5000 a implementuje nový RISC ISA, podobný MIPS a RISC-V.

Kľúčové inovácie v LLVM 16.0:

  • Kód LLVM môže používať prvky definované v štandarde C++17.
  • Požiadavky na životné prostredie pri budovaní LLVM boli zvýšené. Nástroje na zostavenie by teraz mali podporovať štandard C++17, t.j. Na zostavenie potrebujete aspoň GCC 7.1, Clang 5.0, Apple Clang 10.0 alebo Visual Studio 2019 16.7.
  • Backend pre architektúru AArch64 pridáva podporu pre CPU Cortex-A715, Cortex-X3 a Neoverse V2, assembler pre RME MEC (Memory Encryption Contexts), Armv8.3 rozšírenia (Complex Number) a Function Multi Versioning.
  • V backende pre architektúru ARM bola ukončená podpora pre cieľové platformy Armv2, Armv2A, Armv3 a Armv3M, pre ktoré nebolo zaručené vygenerovanie správneho kódu. Pridaná možnosť generovania kódu pre inštrukcie pre prácu s komplexnými číslami.
  • Backend pre architektúru X86 pridal podporu pre architektúry inštrukčných sád (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Pridaná podpora pre inštrukcie RDMSRLIST, RMSRLIST a WRMSRNS. Implementované možnosti "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" a "-mcpu=grandridge".
  • Pridaná oficiálna podpora pre platformu LoongArch.
  • Vylepšené backendy pre MIPS, PowerPC a RISC-V architektúry
  • Pridaná podpora pre ladenie 64-bitových spustiteľných súborov pre architektúru LoongArch do ladiaceho nástroja LLDB. Vylepšené spracovanie symbolov ladenia COFF. Poskytnuté filtrovanie duplicitných DLL v zozname načítaných modulov Windows.
  • V knižnici Libc++ bola hlavná práca zameraná na implementáciu podpory nových funkcií štandardov C++20 a C++23.
  • LDD linker výrazne skracuje čas spojenia paralelizáciou skenovania premiestnenia adries a inicializácie sekcií. Pridaná podpora pre kompresiu sekcií pomocou algoritmu ZSTD.

Zdroj: opennet.ru

Pridať komentár