Release av LLVM 15.0-kompilatorpaketet

Efter sex månaders utveckling presenterades lanseringen av LLVM 15.0-projektet - en GCC-kompatibel verktygslåda (kompilatorer, optimerare och kodgeneratorer) som kompilerar program till mellanliggande bitkod av RISC-liknande virtuella instruktioner (en virtuell maskin på låg nivå med en optimeringssystem på flera nivåer). Den genererade pseudokoden kan konverteras med hjälp av en JIT-kompilator till maskininstruktioner direkt vid tidpunkten för programexekveringen.

Stora förbättringar i Clang 15.0:

  • För system baserade på x86-arkitekturen har flaggan "-fzero-call-used-regs" lagts till, vilket säkerställer att alla CPU-register som används i funktionen återställs till noll innan kontrollen returneras från funktionen. Det här alternativet låter dig skydda mot informationsläckage från funktioner och minska antalet block som är lämpliga för att bygga ROP (Return-Oriented Programming)-prylar i exploateringar med cirka 20 %.
  • Randomisering av minnesplacering av strukturer för C-kod har implementerats, vilket komplicerar utvinningen av data från strukturer vid exploatering av sårbarheter. Randomisering slås på och av med attributen randomize_layout och no_randomize_layout, och kräver att man ställer in ett frö med flaggan "-frandomize-layout-seed" eller "-randomize-layout-seed-file".
  • Lade till flaggan "-fstrict-flex-arrays=" ", med vilken du kan styra gränserna för ett flexibelt arrayelement i strukturer (Flexible Array Members, en array av obestämd storlek i slutet av strukturen). När den är inställd på 0 (standard), bearbetas det sista elementet i strukturen med en array alltid som en flexibel array, 1 - endast storlekarna [], [0] och [1] bearbetas som en flexibel array, 2 - endast storlekar [] och [0] behandlas som en flexibel array.
  • Lade till experimentellt stöd för det C-liknande språket HLSL (High-Level Shader Language), som används i DirectX för att skriva shaders.
  • Lade till "-Warray-parameter" för att varna för åsidosättande av funktioner med inkompatibla argumentdeklarationer associerade med arrayer med fast och variabel längd.
  • Förbättrad kompatibilitet med MSVC. Lade till stöd för "#pragma function" (instruerar kompilatorn att generera ett funktionsanrop istället för inline expansion) och "#pragma alloc_text" (definierar namnet på avsnittet med funktionskoden) som tillhandahålls i MSVC. Tillagt stöd för MSVC-kompatibla /JMC- och /JMC-flaggor.
  • Arbetet fortsätter för att stödja framtida C2X- och C++23-standarder. För C-språket implementeras följande: noreturn-attributet, nyckelorden false och true, _BitInt(N)-typen för heltal med ett givet bitdjup, *_WIDTH-makron, u8-prefixet för UTF-8-kodade tecken.

    För C++ implementeras följande: modulsammanslagning, ABI-isolering av funktionsmedlemmar, beordrad dynamisk initiering av icke-lokala variabler i moduler, multidimensionella indexoperatorer, auto(x), icke-literala variabler, goto och etiketter i funktioner som deklareras som constexpr , avgränsade escape-sekvenser, namngivna escape-tecken.

  • Möjligheterna förknippade med OpenCL- och OpenMP-stöd har utökats. Lade till stöd för OpenCL-tillägget cl_khr_subgroup_rotate.
  • För x86-arkitekturen har skydd lagts till mot sårbarheter i processorer orsakade av spekulativ exekvering av instruktioner efter ovillkorliga framåthoppningsoperationer. Problemet uppstår på grund av förebyggande bearbetning av instruktioner omedelbart efter greninstruktionen i minnet (SLS, Straight Line Speculation). För att aktivera skyddet föreslås alternativet "-mharden-sls=[inget|alla|return|indirekt-jmp]".
  • För plattformar som stöder SSE2-tillägget har typen _Float16 lagts till, som emuleras med float-typen vid brist på stöd för AVX512-FP16-instruktioner.
  • Lade till "-m[no-]rdpru"-flaggan för att kontrollera användningen av RDPRU-instruktionen, som stöds från och med AMD Zen2-processorer.
  • Lade till flaggan "-mfunction-return=thunk-extern" för att skydda mot RETBLEED-sårbarheten, som fungerar genom att lägga till en sekvens av instruktioner som utesluter inblandning av den spekulativa exekveringsmekanismen för indirekta grenar.

Viktiga innovationer i LLVM 15.0:

  • Lade till stöd för Cortex-M85 CPU, Armv9-A, Armv9.1-A och Armv9.2-A arkitekturer, Armv8.1-M PACBTI-M tillägg.
  • En experimentell backend för DirectX har lagts till som stöder formatet DXIL (DirectX Intermediate Language) som används för DirectX shaders. Backend aktiveras genom att ange parametern "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" under montering.
  • Libc++ fortsätter att implementera nya funktioner i C++20- och C++2b-standarderna, inklusive slutförandet av implementeringen av "format"-biblioteket och den föreslagna experimentella versionen av "ranges"-biblioteket.
  • Förbättrade backends för x86, PowerPC och RISC-V arkitekturer.
  • Möjligheterna för LLD-linkern och LLDB-debuggern har förbättrats.

Källa: opennet.ru

Lägg en kommentar