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.
Belangrijkste verbeteringen in Clang 15.0:
- Voor x86-systemen is de vlag "-fzero-call-used-regs" toegevoegd. Deze zorgt ervoor dat alle CPU-registers die in een functie worden gebruikt, op nul worden gezet voordat de functie de controle teruggeeft. Deze optie beschermt tegen informatielekken vanuit functies en vermindert het aantal blokken dat geschikt is voor het construeren van ROP-gadgets (Return-Oriented Programming) in exploits met ongeveer 20%.
- Randomisatie van de structuurlayout in C-code geïmplementeerd, waardoor het moeilijker wordt om gegevens uit structuren te extraheren in geval van misbruik. Randomisatie wordt in- en uitgeschakeld met de attributen randomize_layout en no_randomize_layout, en vereist het instellen van een seed met de vlag "-frandomize-layout-seed" of "-frandomize-layout-seed-file".
- Vlag "-fstrict-flex-arrays= toegevoegd ", waarmee de grenzen voor een flexibel array-element in structuren kunnen worden bepaald (Flexible Array Members, een array van ongedefinieerde grootte aan het einde van de structuur). Wanneer ingesteld op 0 (standaard), wordt het laatste element van de structuur met een array altijd behandeld als een flexibele array, 1 - alleen de grootten [], [0] en [1] worden behandeld als een flexibele array, 2 - alleen de grootten [] en [0] worden behandeld als een flexibele array.
- Experimentele ondersteuning toegevoegd voor de C-achtige taal HLSL (High-Level Shader Language), die in DirectX wordt gebruikt voor het schrijven van shaders.
- Optie "-Warray-parameter" toegevoegd die waarschuwt voor het opnieuw definiëren van functies met incompatibele declaraties van argumenten gerelateerd aan arrays met vaste en variabele lengte.
- Verbeterde compatibiliteit met MSVC. Ondersteuning toegevoegd voor "#pragma function" (geeft de compiler opdracht 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 de MSVC-compatibele flags /JMC en /JMC.
- Er werd verder gewerkt aan ondersteuning voor toekomstige C2X- en C++23-standaarden. Voor de C-taal werden de volgende functies geïmplementeerd: het noreturn-attribuut, de trefwoorden false en true, het type _BitInt(N) voor gehele getallen met een bepaalde bitdiepte, de *_WIDTH-macro's en het prefix u8 voor UTF-8-gecodeerde tekens.
Voor C++ zijn de volgende geïmplementeerd: het samenvoegen van modules, ABI-isolatie van functie-leden, geordende dynamische initialisatie van niet-lokale variabelen in modules, multidimensionale indexoperatoren, auto(x), niet-letterlijke variabelen, goto en labels in functies die zijn gedeclareerd als constexpr, escape-reeksen met scheidingstekens, benoemde escape-tekens.
- Uitgebreide mogelijkheden met betrekking tot OpenCL- en OpenMP-ondersteuning. Ondersteuning toegevoegd voor de OpenCL-extensie cl_khr_subgroup_rotate.
- Voor de x86-architectuur is bescherming toegevoegd tegen kwetsbaarheden in processors die worden veroorzaakt door speculatieve uitvoering van instructies na onvoorwaardelijke directe jumpbewerkingen. Het probleem treedt op door de anticiperende verwerking van instructies die direct na de jumpinstructie in het geheugen volgen (SLS, Straight Line Speculation). De optie "-mharden-sls=[none|all|return|indirect-jmp]" wordt voorgesteld om bescherming in te schakelen.
- Voor platforms die de SSE2-extensie ondersteunen, is het type _Float16 toegevoegd. Dit type wordt geëmuleerd met behulp van het type float bij afwezigheid van ondersteuning voor AVX512-FP16-instructies.
- De vlag "-m[no-]rdpru" is toegevoegd om het gebruik van de RDPRU-instructie te beheren die wordt ondersteund sinds AMD Zen2-processors.
- De vlag "-mfunction-return=thunk-extern" is toegevoegd ter bescherming tegen de RETBLEED-kwetsbaarheid. Deze werkt door een reeks instructies toe te voegen die de betrokkenheid van het speculatieve uitvoeringsmechanisme voor indirecte sprongen elimineert.
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 de parameter "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX" op te geven tijdens de assembly.
- Libc++ blijft nieuwe functies van de C++20- en C++2b-standaarden implementeren, waaronder het voltooien van de implementatie van de "format"-bibliotheek en het aanbieden van een experimentele versie van de "ranges"-bibliotheek.
- Verbeterde back-ends voor x86-, PowerPC- en RISC-V-architecturen.
- De mogelijkheden van de LLD-linker en de LLDB-debugger zijn uitgebreid.
Bron: opennet.ru
