Po šiestich mesiacoch vývoja bolo predstavené vydanie projektu LLVM 15.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.
Hlavné vylepšenia v Clang 15.0:
- Pre systémy založené na architektúre x86 bol pridaný príznak „-fzero-call-used-regs“, ktorý zaisťuje, že všetky registre CPU používané vo funkcii sú vynulované pred vrátením kontroly z funkcie. Táto možnosť vám umožňuje chrániť sa pred únikom informácií z funkcií a znížiť počet blokov vhodných na vytváranie modulov ROP (Return-Oriented Programming) v exploitoch približne o 20 %.
- Bola implementovaná randomizácia pamäťového umiestnenia štruktúr pre C kód, čo komplikuje extrakciu dát zo štruktúr v prípade zneužitia zraniteľností. Randomizácia sa zapína a vypína pomocou atribútov randomize_layout a no_randomize_layout a vyžaduje nastavenie zdroja pomocou príznaku „-frandomize-layout-seed“ alebo „-frandomize-layout-seed-file“.
- Pridaný príznak "-fstrict-flex-arrays=" ", pomocou ktorého môžete ovládať hranice pre flexibilný prvok poľa v štruktúrach (Flexible Array Members, pole neurčitej veľkosti na konci štruktúry). Pri nastavení na 0 (predvolené) sa posledný prvok štruktúry s poľom vždy spracuje ako flexibilné pole, 1 - ako flexibilné pole sa spracujú iba veľkosti [], [0] a [1], 2 - iba veľkosti [] a [0] sú spracované ako flexibilné pole.
- Pridaná experimentálna podpora pre jazyk podobný C HLSL (High-Level Shader Language), ktorý sa používa v DirectX na písanie shaderov.
- Pridaný "-Warray-parameter" na varovanie pred prepisujúcimi funkciami s nekompatibilnými deklaráciami argumentov spojených s poliami s pevnou a premenlivou dĺžkou.
- Vylepšená kompatibilita s MSVC. Pridaná podpora pre "#pragma function" (inštruuje kompilátor, aby vygeneroval volanie funkcie namiesto inline expanzie) a "#pragma alloc_text" (definuje názov sekcie s kódom funkcie) poskytované v MSVC. Pridaná podpora pre príznaky /JMC a /JMC kompatibilné s MSVC.
- Pokračuje práca na podpore budúcich štandardov C2X a C++23. Pre jazyk C sú implementované nasledovné: atribút noreturn, kľúčové slová false a true, typ _BitInt(N) pre celé čísla danej bitovej hĺbky, makrá *_WIDTH, predpona u8 pre znaky kódované UTF-8.
Pre C++ sú implementované: zlúčenie modulov, ABI izolácia členov funkcií, usporiadaná dynamická inicializácia nelokálnych premenných v moduloch, operátory multidimenzionálneho indexu, auto(x), neliterálne premenné, goto a návestia vo funkciách deklarovaných ako constexpr , oddelené sekvencie escape, pomenované znaky escape.
- Rozšírili sa možnosti spojené s podporou OpenCL a OpenMP. Pridaná podpora pre rozšírenie OpenCL cl_khr_subgroup_rotate.
- Pre architektúru x86 bola pridaná ochrana proti zraniteľnostiam v procesoroch spôsobených špekulatívnym vykonávaním inštrukcií po operáciách bezpodmienečného skoku vpred. Problém nastáva z dôvodu preemptívneho spracovania inštrukcií bezprostredne nasledujúcich za inštrukciou vetvenia v pamäti (SLS, Straight Line Speculation). Na aktiváciu ochrany sa navrhuje možnosť „-mharden-sls=[none|all|return|indirect-jmp]“.
- Pre platformy, ktoré podporujú rozšírenie SSE2, bol pridaný typ _Float16, ktorý je emulovaný pomocou typu float v prípade absencie podpory inštrukcií AVX512-FP16.
- Pridaný príznak „-m[no-]rdpru“ na ovládanie použitia inštrukcie RDPRU, podporovaný počnúc procesormi AMD Zen2.
- Pridaný príznak "-mfunction-return=thunk-extern" na ochranu pred zraniteľnosťou RETBLEED, ktorý funguje pridaním sekvencie inštrukcií, ktoré vylučujú zapojenie mechanizmu špekulatívneho vykonávania pre nepriame vetvy.
Kľúčové inovácie v LLVM 15.0:
- Pridaná podpora pre CPU Cortex-M85, architektúry Armv9-A, Armv9.1-A a Armv9.2-A, rozšírenia Armv8.1-M PACBTI-M.
- Bol pridaný experimentálny backend pre DirectX, ktorý podporuje formát DXIL (DirectX Intermediate Language) používaný pre DirectX shadery. Backend sa aktivuje zadaním parametra „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX“ počas zostavovania.
- Libc++ pokračuje v implementácii nových funkcií štandardov C++20 a C++2b, vrátane dokončenia implementácie knižnice „formát“ a navrhovanej experimentálnej verzie knižnice „rozsahov“.
- Vylepšené backendy pre architektúry x86, PowerPC a RISC-V.
- Schopnosti LLD linkera a LLDB debuggera boli vylepšené.
Zdroj: opennet.ru