Hat hónapos fejlesztés után bemutatták az LLVM 16.0 projekt kiadását - egy GCC-kompatibilis eszközkészletet (fordítók, optimalizálók és kódgenerátorok), amely a programokat RISC-szerű virtuális utasítások köztes bitkódjává fordítja (alacsony szintű virtuális gép többszintű optimalizáló rendszer). A generált pszeudokód JIT fordító segítségével gépi utasításokká konvertálható közvetlenül a program végrehajtása során.
Főbb fejlesztések a Clang 16.0-ban:
- Az alapértelmezett C++/ObjC++ szabvány a gnu++17 (korábban gnu++14), ami azt jelenti, hogy a GNU kiterjesztésű C++17 funkciók alapértelmezés szerint támogatottak. Az előző viselkedés visszaállításához használja a "-std=gnu++14" opciót.
- A C++20 szabvánnyal kapcsolatos speciális funkciók megvalósítása:
- Feltételesen triviális speciális tagfunkciók,
- strukturált kötések rögzítése lambda függvényekben,
- egyenlőség operátor kifejezéseken belül,
- Lehetőség a typename kulcsszó elhagyására bizonyos kontextusokban,
- Érvényes összesített inicializálás zárójelben („Aggr(érték1, érték2)”).
- A jövőbeni C++2b szabványban meghatározott funkciók megvalósításra kerültek:
- Az összetett kifejezések végére címkéket lehet elhelyezni,
- statikus operátor(),
- statikus operátor[],
- A char8_t típussal való kompatibilitás biztosított,
- A "\N{...}" karakterek tartománya kibővült
- Hozzáadtuk a „static constexpr”-ként deklarált változók használatát a constexpr-ként deklarált függvényekben.
- A jövőbeni C-standard C2x-ben meghatározott funkciókat megvalósították:
- A "-Wunused-label" figyelmeztetés letiltásához a "[[maybe_unused]]" attribútum alkalmazható a címkékre
- Az összetett kifejezéseken belül bárhol elhelyezhető címkék,
- Hozzáadott typeof és typeof_unqual operátorok,
- Egy új típusú nullptr_t és egy nullptr konstans nullmutatók meghatározásához, amelyek bármilyen mutatótípusra konvertálhatók, és a NULL olyan változatát képviselik, amely nem kötődik egész és void* típusokhoz.
- C2x módban a va_start makró meghívása változó számú (variadic) argumentummal megengedett.
- A C99, C11 és C17 megfelelőségi módokban az alapértelmezett "-Wimplicit-function-declaration" és "-Wimplicit-int" opciók figyelmeztetés helyett hibát jeleznek.
- A "void *" közvetett használata (pl. "void func(void *p) { *p; }") C++ módban most hibát generál, hasonlóan az ISO C++-hoz, GCC-hez, ICC-hez és MSVC-hez.
- Ha bitmezőket ad meg utasítás-operandusként (pl. "__asm { mov eax, s.bf }") a Microsoft-stílusú soron belüli összeállítási blokkokban, most hibát generál.
- Hozzáadott diagnosztika a különböző modulokban lévő, azonos nevű szerkezetek és egységek jelenlétéhez.
- Kibővültek az OpenCL és OpenMP támogatáshoz kapcsolódó képességek. Továbbfejlesztett diagnosztika az OpenCL kernel argumentumokban használt C++ sablonokhoz. Továbbfejlesztett sorblokk-támogatás az AMDGPU-hoz. A nounwind attribútum implicit módon minden függvényhez hozzáadódik. Továbbfejlesztett támogatás a beépített funkciókhoz.
- Hozzáadtuk a CLANG_CRASH_DIAGNOSTICS_DIR környezeti változó használatának lehetőségét az összeomlási diagnosztikai adatok mentési könyvtárának meghatározásához.
- A Unicode támogatás a Unicode 15.0 specifikációra frissült. Néhány matematikai szimbólum megengedett az azonosítókban, például a „₊” (pl. „double xₖ₊₁”).
- Hozzáadott támogatás több konfigurációs fájl betöltéséhez (először az alapértelmezett konfigurációs fájlok töltődnek be, majd a „--config=” jelzővel megadottak, amelyek mostantól többször is megadhatók). Módosult a konfigurációs fájlok alapértelmezett betöltési sorrendje: a clang először a fájlt próbálja betölteni - .cfg, és ha nem találja, akkor két fájlt próbál betölteni .cfg és .cfg. A konfigurációs fájlok alapértelmezés szerinti betöltésének letiltásához a „--no-default-config” jelző hozzáadásra került.
- Az ismételhető összeállítások biztosítása érdekében a __DATE__, __TIME__ és __TIMESTAMP__ makrók aktuális dátum- és időértékei lecserélhetők a SOURCE_DATE_EPOCH környezeti változóban megadott időre.
- A konstansokkal összefüggésben használható beépített függvények (builtin) meglétének ellenőrzésére a „__has_constexpr_builtin” makrót hozzáadtuk.
- Új "-fcoro-aligned-allocation" fordítási jelző hozzáadva az igazított korutin-keret kiosztásához.
- Az „-fstrict-flex-arrays=” jelző a rugalmas tömbelemek harmadik szintű ellenőrzésének támogatását valósítja meg a struktúrákban (Flexible Array Members, határozatlan méretű tömb a struktúra végén). A harmadik szinten csak a "[]" méretet (például "int b[]") kezeli rugalmas tömbként, de a "[0]" méretet (például "int b[0]") nem.
- Hozzáadott "-fmodule-output" jelző, amely lehetővé teszi az egyfázisú fordítási modellt a szabványos C++ modulokhoz.
- "-Rpass-analysis=stack-frame-layout" mód hozzáadva a verem keretelrendezésével kapcsolatos problémák diagnosztizálásához.
- Új __attribute__((target_version("cpu_features"))) attribútum hozzáadása és a __attribute__((target_clones("cpu_features1","cpu_features2",...))) attribútum funkcionalitása az AArch64 által biztosított szolgáltatások bizonyos verzióinak kiválasztásához CPU-k.
- Bővült a diagnosztikai eszközök:
- A „-Wsingle-bit-bitfield-constant-conversion” figyelmeztetés hozzáadva az implicit csonkítás észleléséhez, amikor egy bites előjelű bitmezőhöz rendelünk egyet.
- Az inicializálatlan constexpr változók diagnosztikája kibővült.
- "-Wcast-function-type-strict" és "-Wincompatibilis-function-pointer-types-strict" figyelmeztetések hozzáadva a funkciótípus-öntéssel kapcsolatos lehetséges problémák azonosításához.
- Diagnosztika hozzáadva a helytelen vagy fenntartott modulnevek exportblokkokban történő használatához.
- A hiányzó „auto” kulcsszavak jobb észlelése a definíciókban.
- A "-Winteger-overflow" figyelmeztetés megvalósítása további ellenőrzéseket adott a túlcsorduláshoz vezető további helyzetekre.
- A Loongson 64 464 processzorokban használt LoongArch utasításkészlet architektúra (-march=loongarch3 vagy -march=la5000) támogatása, amely az új RISC ISA-t valósítja meg, hasonlóan a MIPS-hez és a RISC-V-hez.
Az LLVM 16.0 legfontosabb újításai:
- Az LLVM kód használhatja a C++17 szabványban meghatározott elemeket.
- Az LLVM építésére vonatkozó környezetvédelmi követelmények megemelkedtek. A build eszközöknek most már támogatniuk kell a C++17 szabványt, azaz. Az építéshez legalább GCC 7.1, Clang 5.0, Apple Clang 10.0 vagy Visual Studio 2019 16.7 szükséges.
- Az AArch64 architektúra háttérrendszere támogatja a Cortex-A715, Cortex-X3 és Neoverse V2 CPU-kat, az RME MEC (Memory Encryption Contexts) összeszerelőt, az Armv8.3 bővítményeket (komplex szám) és a Function Multi Versioning.
- Az ARM architektúra háttérprogramjában megszűnt az Armv2, Armv2A, Armv3 és Armv3M célplatformok támogatása, amelyekhez nem volt garantált a megfelelő kód generálása. Hozzáadtuk a kód generálásának lehetőségét a komplex számokkal való munkavégzésre vonatkozó utasításokhoz.
- Az X86 architektúra háttérrendszere kiegészítette az AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT utasításkészlet-architektúrák (ISA-k) támogatását. Hozzáadott támogatás az RDMSRLIST, RMSRLIST és WRMSRNS utasításokhoz. Megvalósított opciók: "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" és "-mcpu=grandridge".
- Hivatalos támogatás hozzáadva a LoongArch platformhoz.
- Továbbfejlesztett háttérrendszerek MIPS, PowerPC és RISC-V architektúrákhoz
- Támogatás hozzáadva a 64 bites végrehajtható fájlok hibakereséséhez a LoongArch architektúrához az LLDB hibakeresőhöz. A COFF hibakeresési szimbólumok továbbfejlesztett kezelése. Biztosított a duplikált DLL-ek szűrése a betöltött Windows-modulok listájában.
- A Libc++ könyvtárban a fő munka a C++20 és C++23 szabványok új funkcióinak támogatására irányult.
- Az LDD linker jelentősen csökkenti a kapcsolódási időt a címáthelyezési szkennelés és a szakasz inicializálási műveletek párhuzamosításával. Támogatás hozzáadva a szakasztömörítéshez a ZSTD algoritmus használatával.
Forrás: opennet.ru