Udgivelse af LLVM 15.0 compiler suite

Efter seks måneders udvikling blev udgivelsen af ​​LLVM 15.0-projektet præsenteret - et GCC-kompatibelt værktøjssæt (kompilatorer, optimeringsværktøjer og kodegeneratorer), der kompilerer programmer til mellembitkode af RISC-lignende virtuelle instruktioner (en virtuel maskine på lavt niveau med en optimeringssystem på flere niveauer). Den genererede pseudokode kan konverteres ved hjælp af en JIT-kompiler til maskininstruktioner direkte på tidspunktet for programudførelse.

Større forbedringer i Clang 15.0:

  • For systemer baseret på x86-arkitekturen er flaget "-fzero-call-used-regs" tilføjet, som sikrer, at alle CPU-registre, der bruges i funktionen, nulstilles, før kontrollen returneres fra funktionen. Denne mulighed giver dig mulighed for at beskytte mod informationslækage fra funktioner og reducere antallet af blokke, der er egnede til at bygge ROP (Return-Oriented Programming) gadgets i exploits med cirka 20%.
  • Der er implementeret randomisering af hukommelsesplacering af strukturer til C-kode, hvilket komplicerer udtræk af data fra strukturer i tilfælde af udnyttelse af sårbarheder. Randomisering slås til og fra ved hjælp af attributterne randomize_layout og no_randomize_layout, og kræver, at du indstiller et seed ved hjælp af flaget "-frandomize-layout-seed" eller "-frandomize-layout-seed-file".
  • Tilføjet "-fstrict-flex-arrays=" flag ", hvormed du kan styre grænserne for et fleksibelt array-element i strukturer (Flexible Array Members, et array af ubestemt størrelse i slutningen af ​​strukturen). Når den er sat til 0 (standard), behandles det sidste element i strukturen med et array altid som et fleksibelt array, 1 - kun størrelser [], [0] og [1] behandles som et fleksibelt array, 2 - kun størrelser [] og [0] behandles som et fleksibelt array.
  • Tilføjet eksperimentel støtte til det C-lignende sprog HLSL (High-Level Shader Language), der bruges i DirectX til at skrive shaders.
  • Tilføjet "-Warray-parameter" for at advare om tilsidesættelse af funktioner med inkompatible argumenterklæringer forbundet med arrays med fast og variabel længde.
  • Forbedret kompatibilitet med MSVC. Tilføjet understøttelse af "#pragma-funktion" (instruerer compileren til at generere et funktionskald i stedet for inline-udvidelse) og "#pragma alloc_text" (definerer navnet på sektionen med funktionskoden), der leveres i MSVC. Tilføjet understøttelse af MSVC-kompatible /JMC- og /JMC-flag.
  • Arbejdet fortsætter med at understøtte fremtidige C2X- og C++23-standarder. For C-sproget er følgende implementeret: noreturn-attributten, nøgleordene false og true, _BitInt(N)-typen for heltal af en given bitdybde, *_WIDTH-makroer, u8-præfikset for UTF-8-kodede tegn.

    For C++ er følgende implementeret: modulfletning, ABI-isolering af funktionsmedlemmer, ordnet dynamisk initialisering af ikke-lokale variable i moduler, multidimensionelle indeksoperatorer, auto(x), ikke-bogstavelige variabler, goto og etiketter i funktioner erklæret som constexpr , afgrænsede escape-sekvenser, navngivne escape-tegn.

  • Mulighederne forbundet med OpenCL og OpenMP support er blevet udvidet. Tilføjet understøttelse af OpenCL-udvidelsen cl_khr_subgroup_rotate.
  • For x86-arkitekturen er der tilføjet beskyttelse mod sårbarheder i processorer forårsaget af spekulativ udførelse af instruktioner efter ubetingede fremadspringsoperationer. Problemet opstår på grund af forebyggende behandling af instruktioner umiddelbart efter greninstruktionen i hukommelsen (SLS, Straight Line Speculation). For at aktivere beskyttelse foreslås indstillingen "-mharden-sls=[none|alle|return|indirect-jmp]".
  • For platforme, der understøtter SSE2-udvidelsen, er typen _Float16 blevet tilføjet, som emuleres ved hjælp af float-typen i tilfælde af manglende understøttelse af AVX512-FP16 instruktioner.
  • Tilføjet "-m[no-]rdpru" flag for at kontrollere brugen af ​​RDPRU-instruktionen, understøttet startende med AMD Zen2-processorer.
  • Tilføjet flaget "-mfunction-return=thunk-extern" for at beskytte mod RETBLEED-sårbarheden, som virker ved at tilføje en sekvens af instruktioner, der udelukker involvering af den spekulative eksekveringsmekanisme for indirekte grene.

Vigtigste innovationer i LLVM 15.0:

  • Tilføjet understøttelse af Cortex-M85 CPU, Armv9-A, Armv9.1-A og Armv9.2-A arkitekturer, Armv8.1-M PACBTI-M udvidelser.
  • En eksperimentel backend til DirectX er blevet tilføjet, der understøtter DXIL (DirectX Intermediate Language) formatet, der bruges til DirectX shaders. Backend aktiveres ved at angive parameteren "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" under assemblering.
  • Libc++ fortsætter med at implementere nye funktioner i C++20- og C++2b-standarderne, herunder færdiggørelsen af ​​implementeringen af ​​"format"-biblioteket og den foreslåede eksperimentelle version af "ranges"-biblioteket.
  • Forbedrede backends til x86, PowerPC og RISC-V arkitekturer.
  • LLD-linkerens og LLDB-debuggerens muligheder er blevet forbedret.

Kilde: opennet.ru

Tilføj en kommentar