Vrijgave van de LLVM 15.0-compilersuite

Na zes maanden ontwikkeling werd de release van het LLVM 15.0-project gepresenteerd: een GCC-compatibele toolkit (compilers, optimizers en codegenerators) die programma's compileert in tussenliggende bitcode van RISC-achtige virtuele instructies (een virtuele machine op laag niveau met een optimalisatiesysteem op meerdere niveaus). De gegenereerde pseudocode kan met behulp van een JIT-compiler direct tijdens de programma-uitvoering in machine-instructies worden omgezet.

Belangrijke verbeteringen in Clang 15.0:

  • Voor systemen gebaseerd op de x86-architectuur is de vlag “-fzero-call-used-regs” toegevoegd, die ervoor zorgt dat alle CPU-registers die in de functie worden gebruikt, op nul worden gezet voordat de besturing van de functie wordt teruggegeven. Met deze optie kunt u zich beschermen tegen het lekken van informatie uit functies en kunt u het aantal blokken dat geschikt is voor het bouwen van ROP-gadgets (Return-Oriented Programming) bij exploits met ongeveer 20% verminderen.
  • Randomisatie van geheugenplaatsing van structuren voor C-code is geïmplementeerd, wat de extractie van gegevens uit structuren bemoeilijkt in het geval van misbruik van kwetsbaarheden. Randomisatie wordt in- en uitgeschakeld met behulp van de attributen randomize_layout en no_randomize_layout, en vereist het instellen van een Seed met behulp van de vlag "-frandomize-layout-seed" of "-frandomize-layout-seed-file".
  • Vlag "-fstrict-flex-arrays=" toegevoegd ", waarmee u de grenzen voor een flexibel array-element in structuren kunt bepalen (Flexible Array Members, een array van onbepaalde grootte aan het einde van de structuur). Indien ingesteld op 0 (standaard), wordt het laatste element van de structuur met een array altijd verwerkt als een flexibele array, 1 - alleen de maten [], [0] en [1] worden verwerkt als een flexibele array, 2 - alleen de maten [] en [0] worden verwerkt als een flexibele array.
  • Experimentele ondersteuning toegevoegd voor de C-achtige taal HLSL (High-Level Shader Language), gebruikt in DirectX voor het schrijven van shaders.
  • "-Warray-parameter" toegevoegd om te waarschuwen voor het overschrijven van functies met incompatibele argumentdeclaraties die zijn gekoppeld aan arrays met vaste en variabele lengte.
  • Verbeterde compatibiliteit met MSVC. Ondersteuning toegevoegd voor "#pragma function" (instrueert de compiler om een ​​functieaanroep te genereren in plaats van inline-uitbreiding) en "#pragma alloc_text" (definieert de naam van de sectie met de functiecode) in MSVC. Ondersteuning toegevoegd voor MSVC-compatibele /JMC- en /JMC-vlaggen.
  • Er wordt verder gewerkt aan de ondersteuning van toekomstige C2X- en C++23-standaarden. Voor de C-taal zijn het volgende geïmplementeerd: het noreturn-attribuut, de trefwoorden false en true, het _BitInt(N)-type voor gehele getallen met een bepaalde bitdiepte, *_WIDTH-macro's, het u8-voorvoegsel voor UTF-8-gecodeerde tekens.

    Voor C++ is het volgende geïmplementeerd: het samenvoegen van modules, ABI-isolatie van functieleden, geordende dynamische initialisatie van niet-lokale variabelen in modules, multidimensionale indexoperatoren, auto(x), niet-letterlijke variabelen, goto en labels in functies gedeclareerd als constexpr , afgebakende ontsnappingssequenties, benoemde ontsnappingstekens.

  • De mogelijkheden die verband houden met OpenCL- en OpenMP-ondersteuning zijn uitgebreid. Ondersteuning toegevoegd voor de OpenCL-extensie cl_khr_subgroup_rotate.
  • Voor de x86-architectuur is bescherming toegevoegd tegen kwetsbaarheden in processors veroorzaakt door speculatieve uitvoering van instructies na onvoorwaardelijke voorwaartse sprongoperaties. Het probleem treedt op vanwege de preventieve verwerking van instructies die onmiddellijk volgen op de vertakkingsinstructie in het geheugen (SLS, Straight Line Speculation). Om bescherming mogelijk te maken, wordt de optie “-mharden-sls=[none|all|return|indirect-jmp]” voorgesteld.
  • Voor platforms die de SSE2-extensie ondersteunen, is het type _Float16 toegevoegd, dat wordt geëmuleerd met behulp van het float-type in het geval van gebrek aan ondersteuning voor AVX512-FP16-instructies.
  • Vlag "-m[no-]rdpru" toegevoegd om het gebruik van de RDPRU-instructie te controleren, ondersteund vanaf AMD Zen2-processors.
  • De vlag "-mfunction-return=thunk-extern" is toegevoegd ter bescherming tegen de RETBLEED-kwetsbaarheid, die werkt door een reeks instructies toe te voegen die de betrokkenheid van het speculatieve uitvoeringsmechanisme voor indirecte vertakkingen uitsluit.

Belangrijkste innovaties in LLVM 15.0:

  • Ondersteuning toegevoegd voor Cortex-M85 CPU, Armv9-A, Armv9.1-A en Armv9.2-A architecturen, Armv8.1-M PACBTI-M-extensies.
  • Er is een experimentele backend voor DirectX toegevoegd die het DXIL-formaat (DirectX Intermediate Language) ondersteunt dat wordt gebruikt voor DirectX-shaders. De backend wordt ingeschakeld door tijdens de montage de parameter “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” op te geven.
  • Libc++ blijft nieuwe functies van de C++20- en C++2b-standaarden implementeren, waaronder de voltooiing van de implementatie van de “format”-bibliotheek en de voorgestelde experimentele versie van de “ranges”-bibliotheek.
  • Verbeterde backends voor x86-, PowerPC- en RISC-V-architecturen.
  • De mogelijkheden van de LLD-linker en de LLDB-debugger zijn verbeterd.

Bron: opennet.ru

Voeg een reactie