LLVM 15.0 kompilaatorikomplekti väljalase

Pärast kuuekuulist arendustööd esitleti projekti LLVM 15.0 väljalaset – GCC-ga ühilduvat tööriistakomplekti (kompilaatorid, optimeerijad ja koodigeneraatorid), mis kompileerib programmid RISC-laadsete virtuaalsete käskude vahepealsesse bitikoodi (madala tasemega virtuaalmasin mitmetasandiline optimeerimissüsteem). Loodud pseudokoodi saab JIT-kompilaatori abil teisendada masinakäskudeks vahetult programmi täitmise ajal.

Peamised täiustused versioonis Clang 15.0:

  • Süsteemidele, mis põhinevad x86 arhitektuuril, on lisatud lipp “-fzero-call-used-regs”, mis tagab, et kõik funktsioonis kasutatavad CPU registrid lähtestatakse enne funktsioonilt juhtimise tagastamist nulli. See suvand võimaldab teil kaitsta funktsioonide teabelekke eest ja vähendada ROP (Return-Oriented Programming) vidinate ehitamiseks sobivate plokkide arvu exploitides umbes 20%.
  • Rakendatud on C-koodi struktuuride mälupaigutuse randomiseerimine, mis raskendab turvaaukude ärakasutamise korral struktuuridest andmete väljavõtmist. Juhusliku muutmise sisse- ja väljalülitamiseks kasutatakse atribuute randomize_layout ja no_randomize_layout ning see nõuab seemne määramist lipu "-frandomize-layout-seed" või "-frandomize-layout-seed-file" abil.
  • Lisatud lipp "-fstrict-flex-arrays=" ", millega saate juhtida struktuuride paindliku massiivi elemendi piire (Flexible Array Members, määramata suurusega massiiv struktuuri lõpus). Kui väärtuseks on määratud 0 (vaikimisi), töödeldakse massiiviga struktuuri viimast elementi alati paindliku massiivina, 1 – ainult suurusi [], [0] ja [1] töödeldakse paindliku massiivina, 2 – ainult suurusi. [] ja [0] töödeldakse paindliku massiivina.
  • Lisatud eksperimentaalne tugi C-laadsele keelele HLSL (High-Level Shader Language), mida kasutatakse DirectX-is varjutajate kirjutamiseks.
  • Lisatud "-Warray-parameter", mis hoiatab fikseeritud ja muutuva pikkusega massiividega seotud mitteühilduvate argumentide deklaratsioonidega funktsioonide alistamise eest.
  • Täiustatud ühilduvus MSVC-ga. Lisatud on MSVC-s pakutav toetus "#pragma funktsioonile" (käsustab kompilaatorit sisemise laienduse asemel funktsioonikutset genereerima) ja "#pragma alloc_text" (määratleb jaotise nime koos funktsioonikoodiga). Lisatud tugi MSVC-ga ühilduvatele /JMC ja /JMC lippudele.
  • Töö jätkub tulevaste C2X ja C++23 standardite toetamiseks. C-keele puhul rakendatakse järgmist: atribuut noreturn, märksõnad false ja true, _BitInt(N) tüüp antud bitisügavusega täisarvude jaoks, *_WIDTH makrod, u8 eesliide UTF-8 kodeeritud märkide jaoks.

    C++ puhul rakendatakse järgmist: moodulite ühendamine, funktsiooniliikmete ABI isoleerimine, mittelokaalsete muutujate järjestatud dünaamiline lähtestamine moodulites, mitmemõõtmelised indeksioperaatorid, auto(x), mitteliteraalsed muutujad, goto ja sildid funktsioonides, mis on deklareeritud kui constexpr. , piiritletud paojärjed, nimega paomärgid.

  • Laiendatud on OpenCL-i ja OpenMP-toega seotud võimalusi. Lisati tugi OpenCL-i laiendile cl_khr_subgroup_rotate.
  • X86 arhitektuuri jaoks on lisatud kaitse protsessorite haavatavuste vastu, mis on põhjustatud käskude spekulatiivsest täitmisest pärast tingimusteta edasiliikumise toiminguid. Probleem ilmneb käskude ennetava töötlemise tõttu, mis järgneb vahetult mälus olevale harukäsule (SLS, Straight Line Speculation). Kaitse lubamiseks pakutakse valikut "-mharden-sls=[none|all|return|indirect-jmp]".
  • SSE2 laiendust toetavate platvormide jaoks on lisatud tüüp _Float16, mida AVX512-FP16 juhiste toe puudumise korral emuleeritakse float-tüübi abil.
  • Lisatud lipp "-m[no-]rdpru", et juhtida RDPRU juhiste kasutamist, toetatud alates AMD Zen2 protsessoritest.
  • Lisatud on lipp "-mfunction-return=thunk-extern", et kaitsta RETBLEED-i haavatavuse eest, mis toimib, lisades juhiste jada, mis välistab kaudsete harude spekulatiivse täitmismehhanismi kaasamise.

LLVM 15.0 peamised uuendused:

  • Lisatud on Cortex-M85 protsessori, Armv9-A, Armv9.1-A ja Armv9.2-A arhitektuuride tugi, Armv8.1-M PACBTI-M laiendused.
  • Lisatud on DirectX-i eksperimentaalne taustaprogramm, mis toetab DirectX-i varjutajate jaoks kasutatavat DXIL-vormingut (DirectX Intermediate Language). Taustaprogramm on lubatud, määrates kokkupaneku ajal parameetri "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".
  • Libc++ jätkab C++20 ja C++2b standardite uute funktsioonide juurutamist, sealhulgas vorminguteegi ja pakutud teegi „vahemikud” eksperimentaalse versiooni juurutamise lõpuleviimist.
  • Täiustatud taustaprogrammid x86, PowerPC ja RISC-V arhitektuuridele.
  • LLD linkeri ja LLDB siluri võimalusi on täiustatud.

Allikas: opennet.ru

Lisa kommentaar