LLVM 15.0 konpiladore-multzoaren kaleratzea

Sei hilabeteko garapenaren ondoren, LLVM 15.0 proiektuaren oharra aurkezten da: GCC-rekin bateragarria den tresna-kit bat (konpilatzaileak, optimizatzaileak eta kode-sorgailuak) programak RISC moduko instrukzio birtualen bitarteko bitkode batean konpilatzen dituena (maila baxuko makina birtuala duena). maila anitzeko optimizazio sistema). Sortutako sasi-kodea JIT konpilatzaileak makinaren instrukzioetan bihur dezake programa exekutatzen den unean bertan.

Hobekuntza nagusiak Clang 15.0-n:

  • x86 arkitekturan oinarritutako sistemetan, "-fzero-call-used-regs" bandera gehitu da, funtzioan erabiltzen diren CPU erregistro guztiak zerora berrezartzen direla funtzioaren kontrola itzuli aurretik. Aukera honek funtzioen informazio-isurietatik babesteko aukera ematen du eta ustiapenetan ROP (Return-Oriented Programming) tramankuluak eraikitzeko egokiak diren blokeen kopurua % 20 gutxi gorabehera murrizten du.
  • C koderako egituren memoria-kokatzearen aleatorizazioa ezarri da, eta horrek zaildu egiten du egituretatik datuak ateratzea ahuleziak ustiatzeko kasuan. Ausazko banaketa aktibatu eta desaktibatzen da randomize_layout eta no_randomize_layout atributuak erabiliz, eta "-frandomize-layout-seed" edo "-frandomize-layout-seed-file" marka erabiliz hazia ezarri behar da.
  • "-fstrict-flex-arrays=" bandera gehitu da ", eta horrekin egituretako array-elementu malgu baten mugak kontrola ditzakezu (Flexible Array Members, egituraren amaieran tamaina mugagabeko array bat). 0 moduan ezartzen denean (lehenetsia), matrizea duen egituraren azken elementua beti matrize malgu gisa prozesatzen da, 1 - [], [0] eta [1] tamainak soilik prozesatzen dira matrize malgu gisa, 2 - tamainak soilik [] eta [0] array malgu baten moduan prozesatzen dira.
  • HLSL (High-Level Shader Language) euskarri esperimentala gehitu da, DirectX-en itzalak idazteko erabiltzen dena.
  • "-Warray-parameter" gehitu da luzera finkoko eta aldakorreko matrizeekin lotutako argumentu-adierazpen bateraezinak dituzten funtzioak gainidazteaz ohartarazteko.
  • MSVC-rekin bateragarritasun hobetua. MSVC-n emandako "#pragma funtzioa" (konpilatzaileari lineako hedapenaren ordez funtzio dei bat sortzeko agintzen dio) eta "#pragma alloc_text" (atalaren izena funtzio-kodearekin definitzen du) laguntza gehitu da. MSVC-rekin bateragarriak diren /JMC eta /JMC banderen euskarria gehitu da.
  • Lanak etorkizuneko C2X eta C++23 estandarrak onartzen jarraitzen du. C hizkuntzarako, hauek inplementatzen dira: noreturn atributua, false eta true gako-hitzak, _BitInt(N) mota bit-sakonera jakin bateko zenbaki osoetarako, *_WIDTH makroak, UTF-8 kodetutako karaktereentzako u8 aurrizkia.

    C++-rako, hauek inplementatzen dira: moduluen bateratzea, funtzio kideen ABI isolatzea, tokiko aldagaiak ez diren moduluen hasierako dinamiko ordenatua, indize-operadore dimentsio anitzekoak, auto(x), aldagai ez-literalak, goto eta etiketak constexpr gisa deklaratutako funtzioetan. , mugatutako ihes-sekuentziak, izenpeko ihes-karaktereak.

  • OpenCL eta OpenMP laguntzarekin lotutako gaitasunak zabaldu dira. OpenCL luzapenerako euskarria gehitu da cl_khr_subgroup_rotate.
  • x86 arkitekturari dagokionez, prozesadoreetako ahultasunen aurkako babesa gehitu da jarraibideen exekuzio espekulatiboak baldintzarik gabeko aurreranzko salto eragiketen ondoren. Arazoa gertatzen da memorian adar-instrukzioa (SLS, Straight Line Speculation) jarraian berehala jarraian dauden instrukzioak prozesatzeari esker. Babesa gaitzeko, "-mharden-sls=[none|all|return|indirect-jmp]" aukera proposatzen da.
  • SSE2 luzapena onartzen duten plataformetarako, _Float16 mota gehitu da, AVX512-FP16 argibideetarako laguntzarik ez dagoenean float mota erabiliz emulatzen dena.
  • "-m[no-]rdpru" bandera gehitu da RDPRU instrukzioaren erabilera kontrolatzeko, AMD Zen2 prozesadoreekin hasita onartzen da.
  • "-mfunction-return=thunk-extern" bandera gehitu da RETBLEED ahultasunetik babesteko, zeharkako adarretarako espekulazio-mekanismoaren inplikazioa baztertzen duen instrukzio-sekuentzia bat gehituz funtzionatzen duena.

LLVM 15.0-ko berrikuntza nagusiak:

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A eta Armv9.2-A arkitekturak, Armv8.1-M PACBTI-M luzapenetarako euskarria gehitu da.
  • DirectX-rako backend esperimental bat gehitu da, DirectX itzalgailuetarako erabiltzen den DXIL (DirectX Intermediate Language) formatua onartzen duena. Backend-a gaitzen da muntatzean "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" parametroa zehaztuz.
  • Libc++-k C++20 eta C++2b estandarren ezaugarri berriak ezartzen jarraitzen du, besteak beste, "formatua" liburutegiaren inplementazioa eta "barrutiak" liburutegiaren bertsio esperimentala proposatuta.
  • Backend hobetuak x86, PowerPC eta RISC-V arkitekturetarako.
  • LLD estekatzailearen eta LLDB araztearen gaitasunak hobetu dira.

Iturria: opennet.ru

Gehitu iruzkin berria