Izdaja zbirke prevajalnikov LLVM 15.0

Po šestih mesecih razvoja je bila predstavljena izdaja projekta LLVM 15.0 - kompleta orodij, združljivega z GCC (prevajalniki, optimizatorji in generatorji kode), ki prevaja programe v vmesno bitno kodo virtualnih ukazov, podobnih RISC (virtualni stroj nizke ravni z večnivojski optimizacijski sistem). Ustvarjeno psevdokodo je mogoče pretvoriti s pomočjo prevajalnika JIT v strojna navodila neposredno v času izvajanja programa.

Glavne izboljšave v Clang 15.0:

  • Za sisteme, ki temeljijo na arhitekturi x86, je bila dodana zastavica »-fzero-call-used-regs«, ki zagotavlja, da so vsi registri CPE, uporabljeni v funkciji, ponastavljeni na nič, preden vrnejo nadzor iz funkcije. Ta možnost vam omogoča zaščito pred uhajanjem informacij iz funkcij in zmanjšanje števila blokov, primernih za izdelavo pripomočkov ROP (povratno usmerjeno programiranje) v podvigih za približno 20 %.
  • Implementirana je randomizacija pomnilniške postavitve struktur za kodo C, kar otežuje pridobivanje podatkov iz struktur v primeru izkoriščanja ranljivosti. Naključno izbiranje se vklopi in izklopi z atributoma randomize_layout in no_randomize_layout ter zahteva nastavitev semena z uporabo zastavice "-frandomize-layout-seed" ali "-frandomize-layout-seed-file".
  • Dodana zastavica "-fstrict-flex-arrays=" «, s katerim lahko nadzirate meje za element fleksibilnega niza v strukturah (Flexible Array Members, niz nedoločene velikosti na koncu strukture). Ko je nastavljeno na 0 (privzeto), je zadnji element strukture z matriko vedno obdelan kot prilagodljiva matrika, 1 - samo velikosti [], [0] in [1] se obdelujejo kot prilagodljiva matrika, 2 - samo velikosti [] in [0] se obdelujeta kot prilagodljivo polje.
  • Dodana eksperimentalna podpora za C-podobni jezik HLSL (High-Level Shader Language), ki se uporablja v DirectX za pisanje senčil.
  • Dodan "-Warray-parameter" za opozorilo o preglasitvi funkcij z nezdružljivimi deklaracijami argumentov, povezanih z nizi s fiksno in spremenljivo dolžino.
  • Izboljšana združljivost z MSVC. Dodana podpora za "funkcijo #pragma" (naroči prevajalniku, naj ustvari klic funkcije namesto razširitve v vrstici) in "#pragma alloc_text" (določi ime razdelka s kodo funkcije), ki je na voljo v MSVC. Dodana podpora za zastavice /JMC in /JMC, združljive z MSVC.
  • Nadaljuje se delo za podporo prihodnjih standardov C2X in C++23. Za jezik C so implementirani: atribut noreturn, ključni besedi false in true, tip _BitInt(N) za cela števila z dano bitno globino, makri *_WIDTH, predpona u8 za kodirane znake UTF-8.

    Za C++ je implementirano naslednje: združevanje modulov, ABI izolacija funkcijskih članov, urejena dinamična inicializacija nelokalnih spremenljivk v modulih, večdimenzionalni indeksni operaterji, auto(x), neliteralne spremenljivke, goto in oznake v funkcijah, deklariranih kot constexpr , razmejena ubežna zaporedja, poimenovani ubežni znaki.

  • Zmogljivosti, povezane s podporo za OpenCL in OpenMP, so bile razširjene. Dodana podpora za razširitev OpenCL cl_khr_subgroup_rotate.
  • Za arhitekturo x86 je bila dodana zaščita pred ranljivostmi v procesorjih, ki jih povzroči špekulativno izvajanje navodil po operacijah brezpogojnega skoka naprej. Težava se pojavi zaradi vnaprejšnje obdelave navodil, ki takoj sledijo navodilu razvejanja v pomnilniku (SLS, Straight Line Speculation). Za omogočanje zaščite je predlagana možnost »-mharden-sls=[none|all|return|indirect-jmp]«.
  • Za platforme, ki podpirajo razširitev SSE2, je dodan tip _Float16, ki se emulira z uporabo tipa float v primeru pomanjkanja podpore za navodila AVX512-FP16.
  • Dodana zastavica "-m[no-]rdpru" za nadzor uporabe ukaza RDPRU, podprto od procesorjev AMD Zen2.
  • Dodana zastavica »-mfunction-return=thunk-extern« za zaščito pred ranljivostjo RETBLEED, ki deluje tako, da doda zaporedje navodil, ki izključuje vpletenost mehanizma špekulativnega izvajanja za posredne veje.

Ključne novosti v LLVM 15.0:

  • Dodana podpora za Cortex-M85 CPU, Armv9-A, Armv9.1-A in Armv9.2-A arhitekture, Armv8.1-M PACBTI-M razširitve.
  • Dodano je bilo poskusno zaledje za DirectX, ki podpira format DXIL (DirectX Intermediate Language), ki se uporablja za senčnike DirectX. Zaledje je omogočeno s podajanjem parametra »-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX« med sestavljanjem.
  • Libc++ nadaljuje z implementacijo novih funkcij standardov C++20 in C++2b, vključno z dokončanjem implementacije knjižnice »format« in predlagano poskusno različico knjižnice »ranges«.
  • Izboljšana ozadja za arhitekture x86, PowerPC in RISC-V.
  • Zmogljivosti povezovalnika LLD in razhroščevalnika LLDB so bile izboljšane.

Vir: opennet.ru

Dodaj komentar