Vydání sady kompilátorů LLVM 15.0

Po šesti měsících vývoje je představeno vydání projektu LLVM 15.0 - GCC kompatibilní toolkit (kompilátory, optimalizátory a generátory kódu), který kompiluje programy do středního bitového kódu virtuálních instrukcí podobných RISC (nízkoúrovňový virtuální stroj s víceúrovňový optimalizační systém). Vygenerovaný pseudokód je možné převést JIT kompilátorem na strojové instrukce přímo v době provádění programu.

Hlavní vylepšení v Clang 15.0:

  • U systémů založených na architektuře x86 byl přidán příznak „-fzero-call-used-regs“, který zajišťuje, že všechny registry CPU použité ve funkci jsou resetovány na nulu, než funkce vrátí řízení. Tato možnost vám umožňuje chránit se před únikem informací z funkcí a snížit počet bloků vhodných pro vytváření gadgetů ROP (Return-Oriented Programming) v exploitech přibližně o 20 %.
  • Byla implementována randomizace paměťového umístění struktur pro C kód, což komplikuje extrakci dat ze struktur v případě zneužití zranitelností. Randomizace se zapíná a vypíná pomocí atributů randomize_layout a no_randomize_layout a vyžaduje nastavení semene pomocí příznaku "-frandomize-layout-seed" nebo "-frandomize-layout-seed-file".
  • Přidán příznak "-fstrict-flex-arrays=" ", pomocí kterého můžete ovládat hranice pro flexibilní prvek pole ve strukturách (Flexible Array Members, pole neurčité velikosti na konci struktury). Při nastavení na 0 (výchozí) je poslední prvek struktury s polem vždy zpracován jako flexibilní pole, 1 - pouze velikosti [], [0] a [1] jsou zpracovány jako flexibilní pole, 2 - pouze velikosti [] a [0] jsou zpracovány jako flexibilní pole.
  • Přidána experimentální podpora pro jazyk podobný C HLSL (High-Level Shader Language), používaný v DirectX pro psaní shaderů.
  • Přidán "-Warray-parameter" pro varování před přepisujícími funkcemi s nekompatibilními deklaracemi argumentů spojenými s poli s pevnou a proměnnou délkou.
  • Vylepšená kompatibilita s MSVC. Přidána podpora pro "#pragma function" (instruuje kompilátor, aby generoval volání funkce namísto inline expanze) a "#pragma alloc_text" (definuje název sekce s kódem funkce) poskytované v MSVC. Přidána podpora pro příznaky /JMC a /JMC kompatibilní s MSVC.
  • Pokračuje práce na podpoře budoucích standardů C2X a C++23. Pro jazyk C jsou implementovány následující: atribut noreturn, klíčová slova false a true, typ _BitInt(N) pro celá čísla dané bitové hloubky, makra *_WIDTH, prefix u8 pro znaky kódované UTF-8.

    Pro C++ jsou implementovány: slučování modulů, ABI izolace členů funkcí, uspořádaná dynamická inicializace nelokálních proměnných v modulech, operátory vícerozměrných indexů, auto(x), neliterální proměnné, goto a návěští ve funkcích deklarovaných jako constexpr , oddělené sekvence escape, pojmenované znaky escape.

  • Možnosti spojené s podporou OpenCL a OpenMP byly rozšířeny. Přidána podpora pro rozšíření OpenCL cl_khr_subgroup_rotate.
  • Pro architekturu x86 byla přidána ochrana proti zranitelnostem procesorů způsobeným spekulativním prováděním instrukcí po operacích nepodmíněných skoků vpřed. Problém nastává z důvodu preemptivního zpracování instrukcí bezprostředně následujících po instrukci větve v paměti (SLS, Straight Line Speculation). Pro aktivaci ochrany je navržena volba “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Pro platformy, které podporují rozšíření SSE2, byl přidán typ _Float16, který je emulován pomocí typu float v případě chybějící podpory instrukcí AVX512-FP16.
  • Přidán příznak "-m[no-]rdpru" pro ovládání použití instrukce RDPRU, podporované počínaje procesory AMD Zen2.
  • Přidán příznak "-mfunction-return=thunk-extern" na ochranu před zranitelností RETBLEED, která funguje přidáním sekvence instrukcí, která vylučuje zapojení mechanismu spekulativního provádění pro nepřímé větve.

Klíčové inovace v LLVM 15.0:

  • Přidána podpora pro CPU Cortex-M85, architektury Armv9-A, Armv9.1-A a Armv9.2-A, rozšíření Armv8.1-M PACBTI-M.
  • Byl přidán experimentální backend pro DirectX, který podporuje formát DXIL (DirectX Intermediate Language) používaný pro DirectX shadery. Backend se aktivuje zadáním parametru „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX“ během sestavování.
  • Libc++ pokračuje v implementaci nových funkcí standardů C++20 a C++2b, včetně dokončení implementace knihovny „formát“ a navržené experimentální verze knihovny „rozsahy“.
  • Vylepšené backendy pro architektury x86, PowerPC a RISC-V.
  • Schopnosti LLD linkeru a LLDB debuggeru byly vylepšeny.

Zdroj: opennet.ru

Přidat komentář