Lëshimi i paketës së përpiluesit LLVM 15.0

Pas gjashtë muajsh zhvillimi, prezantohet publikimi i projektit LLVM 15.0 - një paketë veglash e pajtueshme me GCC (përpiluesit, optimizuesit dhe gjeneruesit e kodeve) që përpilon programet në një bitkod të ndërmjetëm të udhëzimeve virtuale të ngjashme me RISC (një makinë virtuale e nivelit të ulët me një sistem optimizimi me shumë nivele). Pseudokodi i gjeneruar mund të konvertohet nga përpiluesi JIT në udhëzime të makinës pikërisht në momentin e ekzekutimit të programit.

Përmirësime të mëdha në Clang 15.0:

  • Për sistemet e bazuara në arkitekturën x86, është shtuar flamuri "-fzero-call-used-regs", i cili siguron që të gjithë regjistrat e CPU-së të përdorur në funksion të rivendosen në zero përpara se të kthejnë kontrollin nga funksioni. Ky opsion ju lejon të mbroni kundër rrjedhjes së informacionit nga funksionet dhe të zvogëloni numrin e blloqeve të përshtatshme për ndërtimin e pajisjeve ROP (Programimi i Orientuar në Kthim) në shfrytëzime me afërsisht 20%.
  • Është zbatuar randomizimi i vendosjes së memories së strukturave për kodin C, i cili ndërlikon nxjerrjen e të dhënave nga strukturat në rast të shfrytëzimit të dobësive. Randomizimi aktivizohet dhe çaktivizohet duke përdorur atributet randomize_layout dhe no_randomize_layout dhe kërkon vendosjen e një seed duke përdorur flamurin "-frandomize-layout-seed" ose "-frandomize-layout-seed-file".
  • U shtua flamuri "-fstrict-flex-arrays=" ", me të cilin mund të kontrolloni kufijtë për një element të grupit fleksibël në struktura (Flexible Array Members, një grup me madhësi të pacaktuar në fund të strukturës). Kur vendoset në 0 (parazgjedhja), elementi i fundit i strukturës me një grup përpunohet gjithmonë si një grup fleksibël, 1 - vetëm madhësitë [], [0] dhe [1] përpunohen si një grup fleksibël, 2 - vetëm madhësitë [] dhe [0] përpunohen si një grup fleksibël.
  • U shtua mbështetje eksperimentale për gjuhën e ngjashme me C-në HLSL (High-Level Shader Language), e përdorur në DirectX për të shkruar shader.
  • U shtua "-Parametri i Warray" për të paralajmëruar për funksionet mbizotëruese me deklarata të papajtueshme të argumenteve të lidhura me vargje me gjatësi fikse dhe të ndryshueshme.
  • Përputhshmëri e përmirësuar me MSVC. Mbështetje e shtuar për "funksionin #pragma" (udhëzon përpiluesin të gjenerojë një thirrje funksioni në vend të zgjerimit inline) dhe "#pragma alloc_text" (përcakton emrin e seksionit me kodin e funksionit) të ofruar në MSVC. Mbështetje e shtuar për flamujt /JMC dhe /JMC të pajtueshëm me MSVC.
  • Puna vazhdon për të mbështetur standardet e ardhshme C2X dhe C++23. Për gjuhën C zbatohen këto: atributi noreturn, fjalët kyçe false dhe true, lloji _BitInt(N) për numrat e plotë të një thellësie të caktuar biti, makrotë *_WIDTH, prefiksi u8 për karakteret e koduara UTF-8.

    Për C++, zbatohen këto: bashkimi i moduleve, izolimi ABI i anëtarëve të funksionit, inicializimi dinamik i urdhëruar i ndryshoreve jolokale në module, operatorët e indeksit shumëdimensional, auto(x), variablat jo-literale, goto dhe etiketat në funksionet e deklaruara si constexpr , kufizoi sekuencat e arratisjes, të emërtuara karaktere arratisjeje.

  • Aftësitë që lidhen me mbështetjen e OpenCL dhe OpenMP janë zgjeruar. Mbështetje e shtuar për shtesën OpenCL cl_khr_subgroup_rotate.
  • Për arkitekturën x86, është shtuar mbrojtja kundër dobësive në procesorë të shkaktuar nga ekzekutimi spekulativ i udhëzimeve pas operacioneve të pakushtëzuara të kërcimit përpara. Problemi ndodh për shkak të përpunimit parandalues ​​të udhëzimeve menjëherë pas udhëzimit të degës në memorie (SLS, Spekulimi i Linjës së Drejtë). Për të mundësuar mbrojtjen, propozohet opsioni "-mharden-sls=[none|të gjitha|kthimi|indirekt-jmp]".
  • Për platformat që mbështesin shtrirjen SSE2, është shtuar lloji _Float16, i cili imitohet duke përdorur llojin float në rast të mungesës së mbështetjes për udhëzimet AVX512-FP16.
  • U shtua flamuri "-m[no-]rdpru" për të kontrolluar përdorimin e udhëzimit RDPRU, i mbështetur duke filluar me procesorët AMD Zen2.
  • U shtua flamuri "-mfunction-return=thunk-extern" për të mbrojtur kundër cenueshmërisë RETBLEED, i cili funksionon duke shtuar një sekuencë udhëzimesh që përjashton përfshirjen e mekanizmit të ekzekutimit spekulativ për degët indirekte.

Risitë kryesore në LLVM 15.0:

  • Mbështetje e shtuar për arkitekturat Cortex-M85 CPU, Armv9-A, Armv9.1-A dhe Armv9.2-A, shtesat Armv8.1-M PACBTI-M.
  • Është shtuar një backend eksperimental për DirectX që mbështet formatin DXIL (DirectX Intermediate Language) i përdorur për shaders DirectX. Backend-i aktivizohet duke specifikuar parametrin "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" gjatë montimit.
  • Libc++ vazhdon të zbatojë veçori të reja të standardeve C++20 dhe C++2b, duke përfshirë përfundimin e zbatimit të bibliotekës “format” dhe versionin eksperimental të propozuar të bibliotekës “ranges”.
  • Mbështetje të përmirësuara për arkitekturat x86, PowerPC dhe RISC-V.
  • Aftësitë e lidhësit LLD dhe korrigjuesit LLDB janë përmirësuar.

Burimi: opennet.ru

Shto një koment