LLVM 15.0 -kääntäjäpaketin julkaisu

Kuuden kuukauden kehitystyön jälkeen esiteltiin LLVM 15.0 -projektin julkaisu - GCC-yhteensopiva työkalupakki (kääntäjät, optimoijat ja koodigeneraattorit), joka kokoaa ohjelmat RISC-tyyppisten virtuaalisten käskyjen välibittikoodiksi (matalatason virtuaalikone, jossa on monitasoinen optimointijärjestelmä). Luotu pseudokoodi voidaan muuntaa JIT-kääntäjällä konekäskyiksi suoraan ohjelman suoritushetkellä.

Tärkeimmät parannukset Clang 15.0:ssa:

  • x86-arkkitehtuuriin perustuviin järjestelmiin on lisätty "-fzero-call-used-regs" -lippu, joka varmistaa, että kaikki funktiossa käytetyt CPU-rekisterit nollataan ennen ohjauksen palauttamista funktiosta. Tämän vaihtoehdon avulla voit suojautua toimintojen tietovuodolta ja vähentää ROP (Return-Oriented Programming) -gadgetien rakentamiseen soveltuvien lohkojen määrää hyväksikäytöissä noin 20 %.
  • C-koodin rakenteiden muistisijoittelun satunnaistaminen on toteutettu, mikä vaikeuttaa tietojen poimimista rakenteista haavoittuvuuksien hyödyntämisen yhteydessä. Satunnaistaminen otetaan käyttöön ja pois käytöstä randomize_layout- ja no_randomize_layout-attribuuttien avulla, ja se vaatii siemenen asettamisen "-frandomize-layout-seed"- tai "-frandomize-layout-seed-file"-lipulla.
  • Lisätty lippu "-fstrict-flex-arrays=" ", jolla voit hallita rakenteissa olevan joustavan taulukkoelementin rajoja (Flexible Array Members, määrittelemättömän kokoinen taulukko rakenteen lopussa). Kun arvo on 0 (oletus), rakenteen viimeinen elementti taulukon kanssa käsitellään aina joustavana taulukkona, 1 - vain koot [], [0] ja [1] käsitellään joustavana taulukkona, 2 - vain koot. [] ja [0] käsitellään joustavana taulukkona.
  • Lisätty kokeellinen tuki C-kaltaiselle kielelle HLSL (High-Level Shader Language), jota käytetään DirectX:ssä varjostimien kirjoittamiseen.
  • Lisätty "-Warray-parameter" varoittamaan funktioiden ohittamisesta yhteensopimattomilla argumenttimäärityksillä, jotka liittyvät kiinteän ja muuttuvan pituisiin taulukoihin.
  • Parannettu yhteensopivuus MSVC:n kanssa. Lisätty tuki MSVC:ssä toimitetuille "#pragma-funktiolle" (käyttää kääntäjää luomaan funktiokutsu inline-laajennuksen sijaan) ja "#pragma alloc_text" (määrittää osion nimen funktiokoodilla). Lisätty tuki MSVC-yhteensopiville /JMC- ja /JMC-lippuille.
  • Työ jatkuu tulevien C2X- ja C++23-standardien tukemiseksi. C-kielelle on toteutettu seuraavat: noreturn-attribuutti, avainsanat false ja true, _BitInt(N)-tyyppi tietyn bittisyvyyden kokonaisluvuille, *_WIDTH-makrot, u8-etuliite UTF-8-koodatuille merkeille.

    C++:ssa on toteutettu seuraavat: moduulien yhdistäminen, funktion jäsenten ABI-eristys, ei-paikallisten muuttujien järjestetty dynaaminen alustus moduuleissa, moniulotteiset indeksioperaattorit, auto(x), ei-kirjaimelliset muuttujat, goto ja otsikot funktioissa, jotka on ilmoitettu constexpr-muodossa. , erotetut erotussekvenssit, nimetyt escape-merkit.

  • OpenCL- ja OpenMP-tukeen liittyviä ominaisuuksia on laajennettu. Lisätty tuki OpenCL-laajennukselle cl_khr_subgroup_rotate.
  • X86-arkkitehtuuriin on lisätty suoja prosessorien haavoittuvuuksia vastaan, jotka johtuvat käskyjen spekulatiivisesta suorittamisesta ehdottomien eteenpäin hyppytoimintojen jälkeen. Ongelma johtuu käskyjen ennakoivasta käsittelystä välittömästi muistissa olevan haarakäskyn jälkeen (SLS, Straight Line Speculation). Suojauksen käyttöön ottamiseksi ehdotetaan vaihtoehtoa "-mharden-sls=[none|all|return|indirect-jmp]".
  • SSE2-laajennusta tukeville alustoille on lisätty _Float16-tyyppi, jota emuloidaan float-tyypin avulla, jos AVX512-FP16-ohjeita ei tueta.
  • Lisätty "-m[no-]rdpru" -lippu ohjaamaan RDPRU-käskyn käyttöä, tuettu alkaen AMD Zen2 -prosessoreista.
  • Lisätty "-mfunction-return=thunk-extern" -lippu suojaamaan RETBLEED-haavoittuvuudella, joka toimii lisäämällä komentosarjan, joka sulkee pois epäsuorien haarojen spekulatiivisen suoritusmekanismin osallistumisen.

Tärkeimmät innovaatiot LLVM 15.0:ssa:

  • Lisätty tuki Cortex-M85 CPU-, Armv9-A-, Armv9.1-A- ja Armv9.2-A-arkkitehtuureille, Armv8.1-M PACBTI-M -laajennuksille.
  • DirectX:lle on lisätty kokeellinen taustaohjelma, joka tukee DirectX-varjostimissa käytettävää DXIL-muotoa (DirectX Intermediate Language). Taustaohjelma otetaan käyttöön määrittämällä parametri "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" kokoonpanon aikana.
  • Libc++ jatkaa C++20- ja C++2b-standardien uusien ominaisuuksien käyttöönottoa, mukaan lukien "muoto"-kirjaston ja "alueet"-kirjaston ehdotetun kokeellisen version toteuttamisen loppuun saattaminen.
  • Parannetut taustaohjelmat x86-, PowerPC- ja RISC-V-arkkitehtuureille.
  • LLD-linkkerin ja LLDB-debuggerin ominaisuuksia on parannettu.

Lähde: opennet.ru

Lisää kommentti