Utgivelse av LLVM 15.0-kompilatorpakken

Etter seks måneders utvikling ble utgivelsen av LLVM 15.0-prosjektet presentert - et GCC-kompatibelt verktøysett (kompilatorer, optimerere og kodegeneratorer) som kompilerer programmer til mellombitkode av RISC-lignende virtuelle instruksjoner (en virtuell maskin på lavt nivå med en optimeringssystem på flere nivåer). Den genererte pseudokoden kan konverteres ved hjelp av en JIT-kompilator til maskininstruksjoner direkte på tidspunktet for programkjøring.

Store forbedringer i Clang 15.0:

  • For systemer basert på x86-arkitektur er flagget "-fzero-call-used-regs" lagt til, som sikrer at alle CPU-registre som brukes i funksjonen tilbakestilles til null før kontroll returneres fra funksjonen. Dette alternativet lar deg beskytte mot informasjonslekkasje fra funksjoner og redusere antall blokker som er egnet for å bygge ROP (Return-Oriented Programming) gadgets i utnyttelser med omtrent 20 %.
  • Randomisering av minneplassering av strukturer for C-kode er implementert, noe som kompliserer utvinning av data fra strukturer ved utnyttelse av sårbarheter. Randomisering slås av og på ved hjelp av attributtene randomize_layout og no_randomize_layout, og krever at du setter et seed ved å bruke flagget "-frandomize-layout-seed" eller "-frandomize-layout-seed-file".
  • Lagt til flagget "-fstrict-flex-arrays=" ", som du kan kontrollere grensene for et fleksibelt matriseelement i strukturer (Flexible Array Members, en matrise med ubestemt størrelse på slutten av strukturen). Når satt til 0 (standard), blir det siste elementet i strukturen med en matrise alltid behandlet som en fleksibel matrise, 1 - kun størrelser [], [0] og [1] behandles som en fleksibel matrise, 2 - kun størrelser [] og [0] behandles som en fleksibel matrise.
  • Lagt til eksperimentell støtte for det C-lignende språket HLSL (High-Level Shader Language), brukt i DirectX for å skrive shaders.
  • Lagt til "-Warray-parameter" for å advare om overstyrende funksjoner med inkompatible argumentdeklarasjoner assosiert med matriser med fast og variabel lengde.
  • Forbedret kompatibilitet med MSVC. Lagt til støtte for "#pragma-funksjon" (instruerer kompilatoren til å generere et funksjonskall i stedet for innebygd utvidelse) og "#pragma alloc_text" (definerer navnet på seksjonen med funksjonskoden) gitt i MSVC. Lagt til støtte for MSVC-kompatible /JMC- og /JMC-flagg.
  • Arbeidet fortsetter med å støtte fremtidige C2X- og C++23-standarder. For C-språket er følgende implementert: noreturn-attributtet, nøkkelordene false og true, _BitInt(N)-typen for heltall med en gitt bitdybde, *_WIDTH-makroer, u8-prefikset for UTF-8-kodede tegn.

    For C++ er følgende implementert: modulsammenslåing, ABI-isolering av funksjonsmedlemmer, bestilt dynamisk initialisering av ikke-lokale variabler i moduler, flerdimensjonale indeksoperatorer, auto(x), ikke-litterale variabler, goto og etiketter i funksjoner deklarert som constexpr , avgrensede escape-sekvenser, navngitte escape-tegn.

  • Mulighetene knyttet til OpenCL- og OpenMP-støtte er utvidet. Lagt til støtte for OpenCL-utvidelsen cl_khr_subgroup_rotate.
  • For x86-arkitekturen er det lagt til beskyttelse mot sårbarheter i prosessorer forårsaket av spekulativ utførelse av instruksjoner etter ubetingede foroverhoppoperasjoner. Problemet oppstår på grunn av forebyggende behandling av instruksjoner umiddelbart etter greninstruksjonen i minnet (SLS, Straight Line Speculation). For å aktivere beskyttelse, foreslås alternativet "-mharden-sls=[none|alle|return|indirect-jmp]".
  • For plattformer som støtter SSE2-utvidelsen er _Float16-typen lagt til, som emuleres ved bruk av float-typen i tilfelle manglende støtte for AVX512-FP16-instruksjoner.
  • Lagt til "-m[no-]rdpru"-flagg for å kontrollere bruken av RDPRU-instruksjonen, støttet fra og med AMD Zen2-prosessorer.
  • Lagt til "-mfunction-return=thunk-extern"-flagget for å beskytte mot RETBLEED-sårbarheten, som fungerer ved å legge til en sekvens av instruksjoner som utelukker involvering av den spekulative utførelsesmekanismen for indirekte grener.

Nøkkelinnovasjoner i LLVM 15.0:

  • Lagt til støtte for Cortex-M85 CPU, Armv9-A, Armv9.1-A og Armv9.2-A arkitekturer, Armv8.1-M PACBTI-M utvidelser.
  • En eksperimentell backend for DirectX er lagt til som støtter DXIL-formatet (DirectX Intermediate Language) som brukes for DirectX shaders. Backend aktiveres ved å spesifisere parameteren "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" under montering.
  • Libc++ fortsetter å implementere nye funksjoner i C++20- og C++2b-standardene, inkludert fullføringen av implementeringen av "format"-biblioteket og den foreslåtte eksperimentelle versjonen av "ranges"-biblioteket.
  • Forbedrede backends for x86-, PowerPC- og RISC-V-arkitekturer.
  • Mulighetene til LLD-linkeren og LLDB-feilsøkeren har blitt forbedret.

Kilde: opennet.ru

Legg til en kommentar