Hat hónapnyi fejlesztés után megjelent az LLVM 22.1.0. Olyan eszközöket fejleszt (fordítóprogramokat, optimalizálókat és kódgenerátorokat), amelyek RISC-szerű virtuális utasítások (egy alacsony szintű virtuális gép többszintű optimalizáló rendszerrel) köztes bitkódjává fordítják a programokat. A generált pszeudokód gépi kóddá alakítható egy adott célplatformhoz, vagy egy just-in-time (JIT) fordító felhasználhatja gépi utasítások generálására közvetlenül a program végrehajtása során. Az LLVM technológiákra építve a projekt a Clang fordítót fejleszti, amely támogatja a C, C++ és Objective-C programozási nyelveket. A 18.x ágtól kezdve a projekt egy új verziószámozási sémára váltott, amely szerint a 0-s ("N.0") kiadást használják a fejlesztés során, az első stabil verziót pedig "N.1" számmal látják el.
A Clang 22 fejlesztései a következők:
- Hozzáadott támogatás a memória-elosztási tokenekhez (Allocation Tokens), amelyek egyedi azonosítóval jelölik meg a mallochoz hasonló függvények segítségével végrehajtott memória-elosztási műveleteket. Az elosztási tokenek lehetővé teszik a heap információk strukturálását, a memóriaszivárgás észlelésének egyszerűsítését, valamint az objektumok céljuk vagy módosítási mintáik szerinti csoportosítását (pl. a „forró” és a „hideg” adatok elkülönítése). Az engedélyezéséhez használja a „-fsanitize=alloc-token” jelzőt.
- A C nyelvhez kapcsolódó funkciók:
- Egy tervezetspecifikáció készült, amely meghatározza a „defer” késleltetett végrehajtási mechanizmust, lehetővé téve a műveletek végrehajtását, amikor az aktuális hatókör kilép. A „-fdefer-ts” jelző hozzáadva engedélyezte a „defer” támogatását.
- A beépített __builtin_stack_address() függvényt hozzáadtuk, amely a GCC hasonló függvényét tükrözi. Ez a függvény visszaadja a veremcímet, amely elválasztja a __builtin_stack_address() függvényt meghívó aktuális függvény és a későbbi meghívott függvények veremterületét.
- A jövőbeli C2y szabványhoz fejlesztés alatt álló képességek:
- Hozzáadott támogatás a névvel ellátott ciklusokhoz, amely lehetővé teszi a ciklusok és a switch utasítások elnevezését, amelyeket a break és continue utasításokban lehet megadni a kilépési ciklus explicit definiálásához. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // ugrás a CONT1-re continue outer; // ugrás a CONT2-re // CONT1 } // CONT2 }
- A beépített "__COUNTER__" makró implementációját, amely egyedi azonosítónevek generálására szolgál, kibővítették és beillesztették a szabványba. A makró hívásainak száma legfeljebb 2147483647 lehet; ennek a korlátnak a túllépése hibát generál.
- Eltávolítottuk a figyelmeztetést (-Wstatic-in-inline), amely statikus függvények vagy "külső inline"-ként deklarált függvényeken belüli változók használatakor jelentkezik.
- A C23 C szabványban meghatározott képességek:
- A float.h fejlécfájl mostantól támogatja az FLT_SNAN, DBL_SNAN és LDBL_SNAN makrókat, amelyek jelzett (számtani műveletekben kivételt okozó) NaN értékeket valósítanak meg float, double és long double típusoknál.
- Kijavítottunk egy hibát, amely miatt a különböző névtelen típusokat kompatibilisnek kezelte a rendszer ugyanazon fordítási egységen belül, ha ugyanazokkal a mezőkkel rendelkeztek.
- A függőségi vizsgálat során a hiányzó fejlécfájlok figyelmen kívül hagyására használt „-MG” jelző kiterjesztésre került az „#embed” direktívákra, és mostantól elnyomja a „fájl nem található” hibát, ha egy „#embed” direktívában megadott fájl hiányzik.
- C++-hoz kapcsolódó funkciók:
- A C++2c (C++26) specifikációban kidolgozott módon lehetőség nyílt strukturált kötések használatára a "constexpr" kontextusban. Ez azt jelenti, hogy a konstans kifejezésekre való hivatkozások mostantól maguk is lehetnek konstans kifejezések. Támogatás lett implementálva a tömbökhöz és az egyszerű struktúrákhoz (a tuple-k még nem támogatottak). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- A C++20 szabvány előírásainak megfelelően a megszorításokat mostantól szabványos formára konvertálják az ellenőrzés előtt, ami pontosabb diagnosztikai üzeneteket és a csak a koncepcióazonosítókban használt sablonargumentumokban előforduló helyettesítési hibák megfelelő kezelését teszi lehetővé.
- Hozzáadtunk egy beépített függvénycsaládot, a "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship"-t, hogy kiderítsük, hogy a "<", ">", "<=" és ">=" összehasonlító operátorok a "<=>" operátorból lettek-e szintetizálva.
- A „-Wincompatible-pointer-types” paramétert úgy módosították, hogy figyelmeztetés helyett hibát adjon ki. A korábbi viselkedéshez való visszatéréshez használja a „-Wno-error=incompatible-pointer-types” opciót.
- Hozzáadott beépített függvények: __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter és __builtin_dedup_pack. Például a builtin_dedup_pack lehetővé teszi a duplikált elemek eltávolítását egy típuslistából: a MyTypeList = TypeList<__builtin_dedup_pack használatával. …>; // az eredményül kapott típus TypeList lesz
- Az UBSan (-fsanitize=undefined -fsanitize-trap=undefined) használatával történő nem definiált viselkedés hibakeresésekor a hiba okára vonatkozó információk mostantól szerepelnek a generált hibakeresési információkban. A "-fsanitize-debug-trap-reasons" jelző hozzáadódott a hibainformációk részletességi szintjének meghatározásához. Beállítható "alap" értékre az általános leírásokhoz (pl. "Egész számok összeadása túlcsordult"), és "részletes" értékre a részletes információk megjelenítéséhez (pl. "előjeles egész számok összeadása túlcsordult az 'a + b'' inputban").
- Új fordítójelzők hozzáadva:
- „-f[no-]sanitize-debug-trap-reasons” – a kivételek okainak beágyazása a hibakeresési információkba „-fsanitize-trap” móddal történő fordításkor.
- A memória-allokációs tokenek kezeléséhez a következő paramétereket kell használni: „-fsanitize=alloc-token”, „-falloc-token-max”, „-fsanitize-alloc-token-fast-abi” és „-fsanitize-alloc-token-extended”.
- „-fmatrix-memory-layout” a mátrixtípusok memóriaelrendezésének vezérléséhez (pl. column-major az oszlop-fő típushoz, row-major a sor-fő típushoz).
- A függvények mostantól rendelkeznek egy "malloc_span" attribútummal, amely hasonló a malloc attribútumhoz, de olyan függvényekre vonatkozik, amelyek span-szerű struktúrákat adnak vissza, amelyek egy mutatót és egy mérettel rendelkező mezőt, vagy egy mutatót a blokk végére.
- Hozzáadva a "modular_format" attribútum, hogy dinamikusan kiválassza a printf függvény szükséges statikusan összekapcsolt implementációját a csatolás időpontjában.
- Bővítették a diagnosztikai és statikus elemző eszközöket, új ellenőrzéseket adtak hozzá (több tucat diagnosztikával kapcsolatos fejlesztés).
- További belső tulajdonságok kerültek az SSE, AVX és AVX512 kiterjesztésekhez az X86 háttérrendszerhez. Build módok kerültek hozzáadásra az Intel CPU-khoz a Wildcat Lake (-march=wildcatlake) és Nova Lake (-march=novalake) mikroarchitektúrák alapján.
- Az AArch64 backend mostantól támogatja az Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) és Arm C1-Ultra (c1-ultra) processzorokat. További beépített függvények kerültek hozzáadásra az FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] és FCVTA[US] utasításokhoz. A függvények többverziós (FMV) támogatása stabilizálódott. A felhasználók mostantól felülbírálhatják a különböző függvényverziók prioritását.
- Hozzáadott támogatás a LoongArch32 (LA32R, LA32S) architektúrához.
- Továbbfejlesztett háttérrendszerek ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly és PowerPC architektúrákhoz.
Forrás: opennet.ru
