Az LLVM 16.0 fordítócsomag kiadása

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

Hozzászólás