Hat hónapos fejlesztés után bemutatták az LLVM 13.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.
Fejlesztések a Clang 13.0-ban:
- Megvalósított támogatás a garantált véghívásokhoz (egy függvény legvégén egy szubrutin hívása, farokrekurzió kialakítása, ha az alprogram önmagát hívja). A garantált tail hívások támogatását a "[[clang::musttail]]" attribútum biztosítja C++-ban és "__attribute__((musttail))" C-ben, a "return" utasításban használatos. A funkció lehetővé teszi az optimalizálás megvalósítását a kód sima iterációba történő telepítésével a veremfelhasználás csökkentése érdekében.
- A "using" deklarációk és a Clang kiterjesztések támogatják a C++11 stílusú attribútumok meghatározását a "[[]]" formátum használatával.
- Hozzáadott "-Wreserved-identifier" jelző, amely figyelmeztetést jelenít meg, ha fenntartott azonosítók vannak megadva a felhasználói kódban.
- Hozzáadott "-Wunused-but-set-parameter" és "-Wunused-but-set-variable" jelzők, amelyek figyelmeztetést jelenítenek meg, ha egy paraméter vagy változó be van állítva, de nincs használatban.
- Hozzáadott "-Wnull-pointer-subtraction" jelző, amely figyelmeztetést ad ki, ha a kód definiálatlan viselkedést idézhet elő a nullmutató használata miatt a kivonási műveletekben.
- Az "-fstack-usage" jelző hozzáadása minden kódfájlhoz egy további ".su" fájlt generál, amely információkat tartalmaz a feldolgozás alatt álló fájlban definiált egyes funkciók veremkockáinak méretéről.
- A statikus elemzőhöz egy új kimeneti típus került - „sarif-html”, amely a jelentések egyidejű generálásához vezet HTML és Sarif formátumban. Új allocClassWithName ellenőrzés hozzáadva. Az „-analyzer-display-progress” opció megadásakor az egyes funkciók elemzési ideje megjelenik. Az intelligens mutatóelemző (alpha.cplusplus.SmartPtr) majdnem készen áll.
- Az OpenCL-támogatáshoz kapcsolódó képességek bővültek. Támogatás hozzáadva a cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields és __cl_clang_non_portable_kernel_param_types új bővítményekhez. Az OpenCL 3.0 specifikáció megvalósítása folytatódott. A C esetében alapértelmezés szerint az OpenCL 1.2 specifikáció használatos, hacsak nincs kifejezetten kiválasztva egy másik verzió. A C++ esetében a „.clcpp” kiterjesztésű fájlok támogatása hozzáadásra került.
- Az OpenMP 5.1 specifikációban meghatározott huroktranszformációs direktívák („#pragma omp unrol” és „#pragma omp tile”) támogatása megtörtént.
- Hozzáadott opciók a clang-formátum segédprogramhoz: SpacesInLineCommentPrefix a megjegyzések előtti szóközök számának meghatározásához, IndentAccessModifiers, LambdaBodyIndentation és PPIndentWidth a bejegyzések, lambda-kifejezések és előfeldolgozó direktívák igazításának vezérléséhez. Bővültek a fejlécfájlok felsorolásának (SortIncludes) rendezési lehetőségei. Hozzáadott támogatás a JSON-fájlok formázásához.
- Az új ellenőrzések nagy része hozzáadásra került, hogy csikorogjon.
Az LLVM 13.0 legfontosabb újításai:
- Hozzáadtuk az „-ehcontguard” opciót a CET (Windows Control-flow Enforcement Technology) technológiájának használatához a Return-Oriented Programming (ROP) technikákkal épített kizsákmányolások elleni védelem érdekében a kivételkezelési szakaszban.
- A debuginfo-teszt projektet projektközi tesztekre keresztelték át, és a különböző projektekből származó összetevők tesztelésére szolgál, nem korlátozódik a hibakeresési információkra.
- Az összeállítási rendszer több disztribúció felépítését is támogatja, például az egyik segédprogramokkal, a másik pedig könyvtárakkal a fejlesztők számára.
- Az AArch64 architektúra háttérprogramjában az Armv9-A RME (Realm Management Extension) és SME (Scalable Matrix Extension) bővítmények támogatása az assemblerben van megvalósítva.
- Az ISA V68/HVX támogatása hozzáadásra került a Hexagon architektúra háttérrendszeréhez.
- Az x86 háttérrendszer továbbfejlesztette az AMD Zen 3 processzorok támogatását.
- GFX1013 RDNA2 APU támogatás hozzáadva az AMDGPU háttérrendszerhez.
- A Libc++ folytatja a C++20 és C++2b szabványok új funkcióinak bevezetését, beleértve a „fogalmak” könyvtár befejezését. Az std::fájlrendszer támogatása hozzáadva a MinGW-alapú Windows platformhoz. Az , az és a fejlécek el vannak választva. A LIBCXX_ENABLE_INCOMPLETE_FEATURES összeállítási opció hozzáadva a fejlécfájlok letiltásához a nem teljesen megvalósított funkciókkal.
- Bővültek az LLD linker képességei, melyben a Big-endian Aarch64 processzorok támogatása valósul meg, illetve a Mach-O backend olyan állapotba került, amely lehetővé teszi a normál programok összekapcsolását. A Glibc LLD használatával történő összekapcsolásához szükséges fejlesztéseket tartalmazza.
- Az llvm-mca (Machine Code Analyzer) segédprogram támogatja az utasításokat sorrendben végrehajtó processzorokat (sorrendben lévő szuperskaláris folyamat), mint például az ARM Cortex-A55.
- Az AArch64 platformhoz készült LLDB hibakereső teljes mértékben támogatja a Pointer Authentication, az MTE (MemTag, Memory Tagging Extension) és az SVE regisztereket. Hozzáadott parancsok, amelyek lehetővé teszik címkék kötését az egyes memóriafoglalási műveletekhez, és a mutató ellenőrzésének megszervezését a memória elérésekor, amelyet a megfelelő címkéhez kell társítani.
- Az LLDB debugger és a Fortran nyelv - Flang frontendje hozzáadásra került a projekt által generált bináris összeállításokhoz.
Forrás: opennet.ru