Lansarea suitei de compilare LLVM 15.0

După șase luni de dezvoltare, a fost prezentată lansarea proiectului LLVM 15.0 - un set de instrumente compatibil GCC (compilatoare, optimizatoare și generatoare de cod) care comilează programele în coduri de biți intermediare ale instrucțiunilor virtuale asemănătoare RISC (o mașină virtuală de nivel scăzut cu un sistem de optimizare pe mai multe niveluri). Pseudocodul generat poate fi convertit folosind un compilator JIT în instrucțiuni de mașină direct în momentul execuției programului.

Îmbunătățiri majore în Clang 15.0:

  • Pentru sistemele bazate pe arhitectura x86, a fost adăugat indicatorul „-fzero-call-used-regs”, care asigură că toate registrele CPU utilizate în funcție sunt resetate la zero înainte de a reveni controlul de la funcție. Această opțiune vă permite să vă protejați împotriva scurgerii de informații din funcții și să reduceți numărul de blocuri potrivite pentru construirea gadgeturilor ROP (Return-Oriented Programming) în exploit-uri cu aproximativ 20%.
  • A fost implementată randomizarea plasării în memorie a structurilor pentru codul C, ceea ce complică extragerea datelor din structuri în cazul exploatării vulnerabilităților. Randomizarea este activată și dezactivată utilizând atributele randomize_layout și no_randomize_layout și necesită setarea unei semințe utilizând marcajul „-frandomize-layout-seed” sau „-frandomize-layout-seed-file”.
  • S-a adăugat steag „-fstrict-flex-arrays=" ", cu care puteți controla limitele pentru un element de matrice flexibil în structuri (Flexible Array Members, o matrice de dimensiune nedefinită la sfârșitul structurii). Când este setat la 0 (implicit), ultimul element al structurii cu o matrice este întotdeauna procesat ca o matrice flexibilă, 1 - numai dimensiunile [], [0] și [1] sunt procesate ca o matrice flexibilă, 2 - numai dimensiunile [] și [0] sunt procesate ca o matrice flexibilă.
  • S-a adăugat suport experimental pentru limbajul asemănător C HLSL (High-Level Shader Language), folosit în DirectX pentru scrierea shaderelor.
  • S-a adăugat „-Warray-parameter” pentru a avertiza asupra suprascrierii funcțiilor cu declarații de argumente incompatibile asociate cu matrice de lungime fixă ​​și variabilă.
  • Compatibilitate îmbunătățită cu MSVC. S-a adăugat suport pentru „funcția #pragma” (instruiește compilatorului să genereze un apel de funcție în loc de extindere în linie) și „#pragma alloc_text” (definește numele secțiunii cu codul funcției) furnizate în MSVC. S-a adăugat suport pentru steaguri /JMC și /JMC compatibile cu MSVC.
  • Lucrările continuă să susțină viitoarele standarde C2X și C++23. Pentru limbajul C sunt implementate următoarele: atributul noreturn, cuvintele cheie false și true, tipul _BitInt(N) pentru numere întregi cu o adâncime de biți dată, macrocomenzi *_WIDTH, prefixul u8 pentru caracterele codificate UTF-8.

    Pentru C++ sunt implementate următoarele: fuziunea modulelor, izolarea ABI a membrilor funcției, inițializarea dinamică ordonată a variabilelor non-locale în module, operatori de index multidimensional, auto(x), variabile non-literale, goto și etichete în funcțiile declarate ca constexpr , secvențe de escape delimitate, caractere de escape denumite.

  • Capacitățile asociate cu suportul OpenCL și OpenMP au fost extinse. S-a adăugat suport pentru extensia OpenCL cl_khr_subgroup_rotate.
  • Pentru arhitectura x86, a fost adăugată protecție împotriva vulnerabilităților procesoarelor cauzate de execuția speculativă a instrucțiunilor după operațiuni necondiționate de salt înainte. Problema apare din cauza procesării preventive a instrucțiunilor imediat după instrucțiunea de ramificare din memorie (SLS, Straight Line Speculation). Pentru a activa protecția, este propusă opțiunea „-mharden-sls=[none|all|return|indirect-jmp]”.
  • Pentru platformele care acceptă extensia SSE2, a fost adăugat tipul _Float16, care este emulat folosind tipul float în cazul lipsei suportului pentru instrucțiunile AVX512-FP16.
  • S-a adăugat flag „-m[no-]rdpru” pentru a controla utilizarea instrucțiunii RDPRU, acceptată începând cu procesoarele AMD Zen2.
  • S-a adăugat indicatorul „-mfunction-return=thunk-extern” pentru a proteja împotriva vulnerabilității RETBLEED, care funcționează prin adăugarea unei secvențe de instrucțiuni care exclude implicarea mecanismului de execuție speculativă pentru ramurile indirecte.

Inovații cheie în LLVM 15.0:

  • S-a adăugat suport pentru CPU Cortex-M85, arhitecturi Armv9-A, Armv9.1-A și Armv9.2-A, extensii Armv8.1-M PACBTI-M.
  • A fost adăugat un backend experimental pentru DirectX care acceptă formatul DXIL (DirectX Intermediate Language) utilizat pentru shadere DirectX. Backend-ul este activat prin specificarea parametrului „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” în timpul asamblarii.
  • Libc++ continuă să implementeze noi caracteristici ale standardelor C++20 și C++2b, inclusiv finalizarea implementării bibliotecii „format” și versiunea experimentală propusă a bibliotecii „interval”.
  • Backend-uri îmbunătățite pentru arhitecturile x86, PowerPC și RISC-V.
  • Capacitățile linker-ului LLD și ale depanatorului LLDB au fost îmbunătățite.

Sursa: opennet.ru

Adauga un comentariu