Izdanje LLVM 15.0 kompajlerskog paketa

Nakon šest mjeseci razvoja, predstavljeno je izdanje LLVM 15.0 projekta - GCC-kompatibilnog kompleta alata (kompajleri, optimizatori i generatori koda) koji kompajlira programe u srednji bit kod RISC-ovih virtualnih instrukcija (virtuelna mašina niskog nivoa sa sistem optimizacije na više nivoa). Generisani pseudokod se može konvertovati pomoću JIT kompajlera u mašinske instrukcije direktno u vreme izvršavanja programa.

Glavna poboljšanja u Clang 15.0:

  • Za sisteme bazirane na x86 arhitekturi, dodata je zastavica “-fzero-call-used-regs”, koja osigurava da se svi registri CPU-a koji se koriste u funkciji resetuju na nulu prije vraćanja kontrole iz funkcije. Ova opcija vam omogućava da zaštitite od curenja informacija iz funkcija i smanjite broj blokova pogodnih za pravljenje ROP (Programiranje orijentirano na povratak) gadgeta u eksploatacijama za približno 20%.
  • Implementirana je nasumična raspodjela memorijskih struktura za C kod, što otežava ekstrakciju podataka iz struktura u slučaju eksploatacije ranjivosti. Randomizacija se uključuje i isključuje pomoću atributa randomize_layout i no_randomize_layout, i zahtijeva postavljanje zadatka pomoću zastavice "-frandomize-layout-seed" ili "-frandomize-layout-seed-file".
  • Dodata oznaka "-fstrict-flex-arrays=" ", pomoću kojih možete kontrolirati granice za element fleksibilnog niza u strukturama (Flexible Array Members, niz neodređene veličine na kraju strukture). Kada je postavljeno na 0 (podrazumevano), posljednji element strukture s nizom se uvijek obrađuje kao fleksibilan niz, 1 - samo veličine [], [0] i [1] se obrađuju kao fleksibilni niz, 2 - samo veličine [] i [0] se obrađuju kao fleksibilni niz.
  • Dodata eksperimentalna podrška za jezik sličan C HLSL (High-Level Shader Language), koji se koristi u DirectX-u za pisanje shadera.
  • Dodan "-Warray-parametar" za upozorenje o nadjačavanju funkcija s nekompatibilnim deklaracijama argumenata povezanih s nizovima fiksne i promjenjive dužine.
  • Poboljšana kompatibilnost sa MSVC. Dodata podrška za "#pragma funkciju" (nalaže kompajleru da generiše poziv funkcije umesto inline ekspanzije) i "#pragma alloc_text" (definiše ime sekcije sa kodom funkcije) obezbeđeno u MSVC-u. Dodata podrška za MSVC-kompatibilne /JMC i /JMC zastavice.
  • Nastavlja se rad na podršci budućim C2X i C++23 standardima. Za jezik C implementirano je sljedeće: atribut noreturn, ključne riječi false i true, tip _BitInt(N) za cijele brojeve date dubine bita, *_WIDTH makroi, u8 prefiks za UTF-8 kodirane znakove.

    Za C++ je implementirano sljedeće: spajanje modula, ABI izolacija članova funkcije, uređena dinamička inicijalizacija nelokalnih varijabli u modulima, multidimenzionalni indeksni operatori, auto(x), neliteralne varijable, goto i oznake u funkcijama deklariranim kao constexpr , razgraničene izlazne sekvence, imenovani izlazni znakovi.

  • Mogućnosti povezane sa podrškom za OpenCL i OpenMP su proširene. Dodata podrška za OpenCL ekstenziju cl_khr_subgroup_rotate.
  • Za arhitekturu x86, dodata je zaštita od ranjivosti u procesorima uzrokovanih spekulativnim izvršavanjem instrukcija nakon bezuslovnih operacija skoka naprijed. Problem se javlja zbog preventivne obrade instrukcija neposredno nakon instrukcije grananja u memoriji (SLS, Straight Line Speculation). Da bi se omogućila zaštita, predlaže se opcija “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Za platforme koje podržavaju ekstenziju SSE2, dodat je tip _Float16, koji se emulira pomoću tipa float u slučaju nedostatka podrške za AVX512-FP16 instrukcije.
  • Dodata "-m[no-]rdpru" zastavica za kontrolu upotrebe RDPRU instrukcije, podržana počevši od AMD Zen2 procesora.
  • Dodata je oznaka "-mfunction-return=thunk-extern" za zaštitu od ranjivosti RETBLEED, koja radi dodavanjem niza instrukcija koje isključuju uključivanje mehanizma spekulativnog izvršenja za indirektne grane.

Ključne inovacije u LLVM 15.0:

  • Dodata podrška za Cortex-M85 CPU, Armv9-A, Armv9.1-A i Armv9.2-A arhitekture, Armv8.1-M PACBTI-M ekstenzije.
  • Dodan je eksperimentalni backend za DirectX koji podržava DXIL (DirectX Intermediate Language) format koji se koristi za DirectX shadere. Pozadina je omogućena specificiranjem parametra “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” tokom sastavljanja.
  • Libc++ nastavlja sa implementacijom novih karakteristika standarda C++20 i C++2b, uključujući završetak implementacije biblioteke "format" i predloženu eksperimentalnu verziju biblioteke "opseg".
  • Poboljšana pozadina za x86, PowerPC i RISC-V arhitekture.
  • Mogućnosti LLD linkera i LLDB debuggera su poboljšane.

izvor: opennet.ru

Dodajte komentar