Vydanie sady kompilátorov LLVM 15.0

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

Pridať komentár