LLVM 15.0 kompilatoru komplekta izlaišana

Pēc sešu mēnešu izstrādes tika prezentēts LLVM 15.0 projekta izlaidums - ar GCC saderīgs rīku komplekts (kompilatori, optimizētāji un kodu ģeneratori), kas apkopo programmas RISC līdzīgu virtuālo instrukciju starpposma bitkodā (zema līmeņa virtuālā mašīna ar daudzlīmeņu optimizācijas sistēma). Ģenerēto pseidokodu, izmantojot JIT kompilatoru, var pārvērst mašīnas instrukcijās tieši programmas izpildes laikā.

Galvenie Clang 15.0 uzlabojumi:

  • Sistēmām, kuru pamatā ir x86 arhitektūra, ir pievienots karodziņš “-fzero-call-used-regs”, kas nodrošina, ka visi funkcijā izmantotie CPU reģistri tiek atiestatīti uz nulli pirms funkcijas atgriešanas. Šī opcija ļauj aizsargāt pret informācijas noplūdi no funkcijām un par aptuveni 20% samazināt to bloku skaitu, kas piemēroti ROP (atgriešanās orientētās programmēšanas) sīkrīku veidošanai.
  • Realizēta C koda struktūru izvietošanas nejaušība atmiņā, kas apgrūtina datu izgūšanu no struktūrām ievainojamību ekspluatācijas gadījumā. Randomizācija tiek ieslēgta un izslēgta, izmantojot atribūtus randomize_layout un no_randomize_layout, un ir jāiestata sākums, izmantojot karogu "-frandomize-layout-seed" vai "-frandomize-layout-seed-file".
  • Pievienots karodziņš "-fstrict-flex-arrays=" ", ar kuru jūs varat kontrolēt elastīga masīva elementa robežas struktūrās (Flexible Array Members, nenoteikta izmēra masīvs struktūras beigās). Ja iestatīts uz 0 (noklusējums), pēdējais struktūras elements ar masīvu vienmēr tiek apstrādāts kā elastīgs masīvs, 1 — tikai izmēri [], [0] un [1] tiek apstrādāti kā elastīgs masīvs, 2 — tikai izmēri. [] un [0] tiek apstrādāti kā elastīgs masīvs.
  • Pievienots eksperimentāls atbalsts C veida valodai HLSL (augsta līmeņa ēnotāju valoda), ko izmanto DirectX ēnotāju rakstīšanai.
  • Pievienots "-Warray-parameter", lai brīdinātu par funkciju ignorēšanu ar nesaderīgām argumentu deklarācijām, kas saistītas ar fiksēta un mainīga garuma masīviem.
  • Uzlabota saderība ar MSVC. Pievienots atbalsts "#pragma funkcijai" (uzdod kompilatoram ģenerēt funkcijas izsaukumu, nevis iekļauto paplašināšanu) un "#pragma aloc_text" (definē sadaļas nosaukumu ar funkcijas kodu), kas nodrošināts MSVC. Pievienots atbalsts ar MSVC saderīgiem /JMC un /JMC karodziņiem.
  • Turpinās darbs pie nākotnes C2X un C++23 standartu atbalsta. C valodai ir ieviests: atribūts noreturn, atslēgvārdi false un true, tips _BitInt(N) veseliem skaitļiem ar noteiktu bitu dziļumu, *_WIDTH makro, u8 prefikss UTF-8 kodētām rakstzīmēm.

    Programmai C++ tiek realizēts: moduļu apvienošana, funkciju elementu ABI izolēšana, moduļu nelokālo mainīgo sakārtota dinamiska inicializācija, daudzdimensiju indeksu operatori, auto(x), neliterālie mainīgie, goto un etiķetes funkcijās, kas deklarētas kā constexpr. , norobežotas atsoļa secības, nosauktas atsoļa rakstzīmes.

  • Ar OpenCL un OpenMP atbalstu saistītās iespējas ir paplašinātas. Pievienots atbalsts OpenCL paplašinājumam cl_khr_subgroup_rotate.
  • X86 arhitektūrai ir pievienota aizsardzība pret procesoru ievainojamībām, ko izraisa spekulatīva instrukciju izpilde pēc beznosacījuma pārslēgšanās uz priekšu operācijām. Problēma rodas, apsteidzot instrukcijas, kas tiek apstrādātas tūlīt pēc atzarojuma instrukcijas atmiņā (SLS, Straight Line Speculation). Lai iespējotu aizsardzību, tiek piedāvāta opcija “-mharden-sls=[none|all|return|indirect-jmp]”.
  • Platformām, kas atbalsta SSE2 paplašinājumu, ir pievienots tips _Float16, kas tiek emulēts, izmantojot peldošo tipu, ja netiek atbalstīts AVX512-FP16 instrukcijas.
  • Pievienots "-m[no-]rdpru" karogs, lai kontrolētu RDPRU instrukcijas izmantošanu, atbalstīts sākot ar AMD Zen2 procesoriem.
  • Pievienots karodziņš "-mfunction-return=thunk-extern", lai aizsargātu pret RETBLEED ievainojamību, kas darbojas, pievienojot instrukciju secību, kas izslēdz netiešo atzaru spekulatīvā izpildes mehānisma iesaistīšanos.

Galvenie jauninājumi LLVM 15.0:

  • Pievienots atbalsts Cortex-M85 CPU, Armv9-A, Armv9.1-A un Armv9.2-A arhitektūrām, Armv8.1-M PACBTI-M paplašinājumiem.
  • Ir pievienota eksperimentāla DirectX aizmugursistēma, kas atbalsta DXIL (DirectX Intermediate Language) formātu, ko izmanto DirectX ēnotājiem. Aizmugursistēma ir iespējota, montāžas laikā norādot parametru “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX”.
  • Libc++ turpina ieviest jaunas C++20 un C++2b standartu funkcijas, tostarp tiek pabeigta “formāta” bibliotēkas ieviešana un piedāvātā “diapazonu” bibliotēkas eksperimentālā versija.
  • Uzlabotas aizmugursistēmas x86, PowerPC un RISC-V arhitektūrām.
  • Ir uzlabotas LLD linkera un LLDB atkļūdotāja iespējas.

Avots: opennet.ru

Pievieno komentāru