Izdanje paketa prevoditelja LLVM 15.0

Nakon šest mjeseci razvoja, predstavljeno je izdanje projekta LLVM 15.0 - GCC-kompatibilnog skupa alata (kompilatori, optimizatori i generatori koda) koji kompajlira programe u međubitni kod virtualnih instrukcija sličnih RISC-u (virtualni stroj niske razine s višerazinski optimizacijski sustav). Generirani pseudokod može se pretvoriti pomoću JIT kompajlera u strojne instrukcije izravno u trenutku izvođenja programa.

Glavna poboljšanja u Clangu 15.0:

  • Za sustave koji se temelje na arhitekturi x86, dodana je oznaka “-fzero-call-used-regs” koja osigurava da se svi CPU registri korišteni u funkciji ponište na nulu prije vraćanja kontrole iz funkcije. Ova vam opcija omogućuje zaštitu od curenja informacija iz funkcija i smanjenje broja blokova prikladnih za izradu ROP (Return-Oriented Programming) gadgeta u eksploatacijama za približno 20%.
  • Implementirana je randomizacija memorijskog smještaja struktura za C kod, što komplicira ekstrakciju podataka iz struktura u slučaju iskorištavanja ranjivosti. Randomizacija se uključuje i isključuje pomoću atributa randomize_layout i no_randomize_layout i zahtijeva postavljanje početne vrijednosti pomoću oznake "-frandomize-layout-seed" ili "-frandomize-layout-seed-file".
  • Dodana je zastavica "-fstrict-flex-arrays=", pomoću koje možete kontrolirati granice za fleksibilni element niza u strukturama (Flexible Array Members, niz neodređene veličine na kraju strukture). Kada je postavljeno na 0 (zadano), posljednji element strukture s nizom uvijek se obrađuje kao fleksibilni niz, 1 - samo veličine [], [0] i [1] obrađuju se kao fleksibilni niz, 2 - samo veličine [] i [0] se obrađuju kao fleksibilni niz.
  • Dodana je eksperimentalna podrška za jezik sličan C-u HLSL (High-Level Shader Language), koji se koristi u DirectX-u za pisanje shadera.
  • Dodan je "-Warray-parameter" za upozorenje o nadjačavanju funkcija s nekompatibilnim deklaracijama argumenata povezanih s nizovima fiksne i promjenjive duljine.
  • Poboljšana kompatibilnost s MSVC-om. Dodana je podrška za "#pragma function" (nalaže kompajleru da generira poziv funkcije umjesto inline ekspanzije) i "#pragma alloc_text" (definira naziv odjeljka s kodom funkcije) koji se nalazi u MSVC-u. Dodana podrška za /JMC i /JMC oznake kompatibilne s MSVC-om.
  • Nastavlja se rad na podržavanju budućih standarda C2X i C++23. Za jezik C implementirano je sljedeće: atribut noreturn, ključne riječi false i true, tip _BitInt(N) za cijele brojeve zadane dubine bita, makronaredbe *_WIDTH, prefiks u8 za UTF-8 kodirane znakove.

    Za C++ implementirano je sljedeće: spajanje modula, ABI izolacija funkcijskih članova, uređena dinamička inicijalizacija nelokalnih varijabli u modulima, višedimenzionalni operatori indeksa, auto(x), neliteralne varijable, goto i oznake u funkcijama deklariranim kao constexpr , razgraničene escape sekvence, imenovane escape znakove.

  • Proširene su mogućnosti povezane s podrškom za OpenCL i OpenMP. Dodana podrška za OpenCL proširenje cl_khr_subgroup_rotate.
  • Za x86 arhitekturu, dodana je zaštita od ranjivosti u procesorima uzrokovane spekulativnim izvršavanjem instrukcija nakon bezuvjetnih operacija skoka naprijed. Problem se javlja zbog pre-emptive obrade instrukcija neposredno nakon instrukcije grananja u memoriji (SLS, Straight Line Speculation). Kako bi se omogućila zaštita, predlaže se opcija “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Za platforme koje podržavaju ekstenziju SSE2, dodan je tip _Float16 koji se emulira korištenjem tipa float u slučaju nedostatka podrške za upute AVX512-FP16.
  • Dodana zastavica "-m[no-]rdpru" za kontrolu upotrebe instrukcije RDPRU, podržana počevši od AMD Zen2 procesora.
  • Dodana je zastavica "-mfunction-return=thunk-extern" za zaštitu od ranjivosti RETBLEED, koja radi dodavanjem niza instrukcija koje isključuju uključenost spekulativnog mehanizma izvršenja za neizravna grananja.

Ključne inovacije u LLVM 15.0:

  • Dodana podrška za Cortex-M85 CPU, Armv9-A, Armv9.1-A i Armv9.2-A arhitekture, Armv8.1-M PACBTI-M proširenja.
  • Dodan je eksperimentalni backend za DirectX koji podržava format DXIL (DirectX Intermediate Language) koji se koristi za DirectX shadere. Pozadina je omogućena određivanjem parametra “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” tijekom sklapanja.
  • Libc++ nastavlja implementirati nove značajke standarda C++20 i C++2b, uključujući dovršetak implementacije biblioteke "format" i predloženu eksperimentalnu verziju biblioteke "rasponi".
  • Poboljšana pozadina za x86, PowerPC i RISC-V arhitekture.
  • Poboljšane su mogućnosti LLD povezivača i LLDB programa za ispravljanje pogrešaka.

Izvor: opennet.ru

Dodajte komentar