Po šiestich mesiacoch vývoja bolo predstavené vydanie projektu LLVM 13.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.
Vylepšenia v Clang 13.0:
- Implementovaná podpora pre garantované koncové volania (volanie podprogramu na samom konci funkcie, vytvorenie koncovej rekurzie, ak podprogram volá sám seba). Podpora pre zaručené koncové volania je poskytovaná atribútom "[[clang::musttail]]" v C++ a "__attribute__((musttail))" v C, ktorý sa používa v príkaze "return". Táto funkcia vám umožňuje implementovať optimalizácie nasadením kódu do plochej iterácie, aby sa ušetrila spotreba zásobníka.
- "using" deklarácie a rozšírenia clang poskytujú podporu pre definovanie atribútov v štýle C++ 11 pomocou formátu "[[]]".
- Pridaný príznak „-Wreserved-identifier“ na zobrazenie upozornenia, keď sú v kóde používateľa špecifikované vyhradené identifikátory.
- Pridané príznaky „-Wunused-but-set-parameter“ a „-Wunused-but-set-variable“ na zobrazenie upozornenia, ak je parameter alebo premenná nastavená, ale nepoužíva sa.
- Pridaný príznak "-Wnull-pointer-subtraction" na vydanie varovania, ak by kód mohol zaviesť nedefinované správanie v dôsledku použitia nulového ukazovateľa pri operáciách odčítania.
- Pridaný príznak "-fstack-usage" na generovanie dodatočného súboru ".su" pre každý súbor kódu, ktorý obsahuje informácie o veľkosti zásobníkov pre každú funkciu definovanú v spracovávanom súbore.
- Do statického analyzátora bol pridaný nový typ výstupu – „sarif-html“, ktorý vedie k súčasnému generovaniu reportov vo formátoch HTML a Sarif. Pridaná nová kontrola allocClassWithName. Pri zadaní možnosti „-analyzer-display-progress“ sa zobrazí čas analýzy každej funkcie. Inteligentný analyzátor ukazovateľa (alpha.cplusplus.SmartPtr) je takmer pripravený.
- Možnosti spojené s podporou OpenCL boli rozšírené. Pridaná podpora pre nové rozšírenia cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields a __cl_clang_non_portable_kernel_param_types. Implementácia špecifikácie OpenCL 3.0 pokračovala. Pre C sa štandardne používa špecifikácia OpenCL 1.2, pokiaľ nie je explicitne vybraná iná verzia. Pre C++ bola pridaná podpora pre súbory s príponou „.clcpp“.
- Bola implementovaná podpora smerníc transformácie slučiek („#pragma omp unrol“ a „#pragma omp tile“) definovaných v špecifikácii OpenMP 5.1.
- Do obslužného programu formátu clang boli pridané možnosti: SpacesInLineCommentPrefix na definovanie počtu medzier pred komentármi, IndentAccessModifiers, LambdaBodyIndentation a PPIndentWidth na riadenie zarovnania záznamov, výrazov lambda a direktív preprocesora. Rozšírili sa možnosti triedenia enumerácie hlavičkových súborov (SortIncludes). Pridaná podpora pre formátovanie súborov JSON.
- Veľká časť nových kontrol bola pridaná do linter clang-tidy.
Kľúčové inovácie v LLVM 13.0:
- Pridaná možnosť „-ehcontguard“ na použitie technológie CET (Windows Control-flow Enforcement Technology) na ochranu pred spustením exploitov vytvorených pomocou techník návratovo orientovaného programovania (ROP) vo fáze spracovania výnimiek.
- Projekt debuginfo-test bol premenovaný na cross-project-tests a je určený na testovanie komponentov z rôznych projektov, neobmedzuje sa len na informácie o ladení.
- Montážny systém poskytuje podporu pre budovanie niekoľkých distribúcií, napríklad jedna s nástrojmi a druhá s knižnicami pre vývojárov.
- V backende pre architektúru AArch64 je v assembleri implementovaná podpora pre rozšírenia Armv9-A RME (Realm Management Extension) a SME (Scalable Matrix Extension).
- Do backendu pre architektúru Hexagon bola pridaná podpora pre ISA V68/HVX.
- Backend x86 má vylepšenú podporu pre procesory AMD Zen 3.
- Pridaná podpora pre GFX1013 RDNA2 APU do backendu AMDGPU.
- Libc++ pokračuje v implementácii nových funkcií štandardov C++20 a C++2b, vrátane dokončenia knižnice „pojmov“. Pridaná podpora pre std::filesystem pre platformu Windows založenú na MinGW. Súbory hlavičky sú oddelené , A . Pridaná voľba zostavy LIBCXX_ENABLE_INCOMPLETE_FEATURES na zakázanie súborov hlavičiek s nie úplne implementovanou funkcionalitou.
- Rozšírili sa možnosti LLD linkera, v ktorom je implementovaná podpora Big-endian procesorov Aarch64 a Mach-O backend sa dostal do stavu, ktorý umožňuje prepojenie bežných programov. Zahrnuté vylepšenia potrebné na prepojenie Glibc pomocou LLD.
- Nástroj llvm-mca (Machine Code Analyzer) pridal podporu pre procesory, ktoré vykonávajú inštrukcie v poradí (in-order superskalar pipeline), ako napríklad ARM Cortex-A55.
- Ladiaci nástroj LLDB pre platformu AArch64 poskytuje plnú podporu pre autentifikáciu ukazovateľa, MTE (MemTag, rozšírenie Memory Tagging Extension) a SVE. Pridané príkazy, ktoré vám umožňujú viazať značky na každú operáciu alokácie pamäte a organizovať kontrolu ukazovateľa pri prístupe do pamäte, ktorá musí byť spojená so správnou značkou.
- Debugger LLDB a frontend pre jazyk Fortran - Flang boli pridané do binárnych zostáv generovaných projektom.
Zdroj: opennet.ru