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