Veröffentlichung des LLVM 15.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit wurde die Veröffentlichung des LLVM 15.0-Projekts vorgestellt – ein GCC-kompatibles Toolkit (Compiler, Optimierer und Codegeneratoren), das Programme in Zwischenbitcode von RISC-ähnlichen virtuellen Anweisungen kompiliert (eine virtuelle Maschine auf niedriger Ebene mit a mehrstufiges Optimierungssystem). Der generierte Pseudocode kann direkt zum Zeitpunkt der Programmausführung mit einem JIT-Compiler in Maschinenanweisungen umgewandelt werden.

Wesentliche Verbesserungen in Clang 15.0:

  • Für Systeme, die auf der x86-Architektur basieren, wurde das Flag „-fzero-call-used-regs“ hinzugefügt, das sicherstellt, dass alle in der Funktion verwendeten CPU-Register auf Null zurückgesetzt werden, bevor die Steuerung von der Funktion zurückgegeben wird. Mit dieser Option können Sie sich vor Informationslecks aus Funktionen schützen und die Anzahl der Blöcke, die zum Erstellen von ROP-Gadgets (Return-Oriented Programming) in Exploits geeignet sind, um etwa 20 % reduzieren.
  • Es wurde eine Randomisierung der Speicherplatzierung von Strukturen für C-Code implementiert, was die Extraktion von Daten aus Strukturen im Falle der Ausnutzung von Schwachstellen erschwert. Die Randomisierung wird mithilfe der Attribute „randomize_layout“ und „no_randomize_layout“ aktiviert und deaktiviert und erfordert das Setzen eines Startwerts mithilfe der Flags „-frandomize-layout-seed“ oder „-frandomize-layout-seed-file“.
  • Flag „-fstrict-flex-arrays=" hinzugefügt ", mit dem Sie die Grenzen für ein flexibles Array-Element in Strukturen steuern können (Flexible Array Members, ein Array unbestimmter Größe am Ende der Struktur). Bei Einstellung auf 0 (Standard) wird das letzte Element der Struktur mit einem Array immer als flexibles Array verarbeitet, 1 – nur die Größen [], [0] und [1] werden als flexibles Array verarbeitet, 2 – nur Größen [] und [0] werden wie ein flexibles Array verarbeitet.
  • Experimentelle Unterstützung für die C-ähnliche Sprache HLSL (High-Level Shader Language) hinzugefügt, die in DirectX zum Schreiben von Shader verwendet wird.
  • „-Warray-parameter“ hinzugefügt, um vor dem Überschreiben von Funktionen mit inkompatiblen Argumentdeklarationen zu warnen, die mit Arrays fester und variabler Länge verknüpft sind.
  • Verbesserte Kompatibilität mit MSVC. Unterstützung für „#pragma function“ (weist den Compiler an, einen Funktionsaufruf anstelle einer Inline-Erweiterung zu generieren) und „#pragma alloc_text“ (definiert den Namen des Abschnitts mit dem Funktionscode) hinzugefügt, die in MSVC bereitgestellt werden. Unterstützung für MSVC-kompatible /JMC- und /JMC-Flags hinzugefügt.
  • Die Arbeit an der Unterstützung zukünftiger C2X- und C++23-Standards wird fortgesetzt. Für die Sprache C sind Folgendes implementiert: das noreturn-Attribut, die Schlüsselwörter false und true, der Typ _BitInt(N) für Ganzzahlen einer bestimmten Bittiefe, *_WIDTH-Makros, das u8-Präfix für UTF-8-codierte Zeichen.

    Für C++ ist Folgendes implementiert: Modulzusammenführung, ABI-Isolierung von Funktionsmitgliedern, geordnete dynamische Initialisierung nicht-lokaler Variablen in Modulen, mehrdimensionale Indexoperatoren, auto(x), nicht-literale Variablen, goto und Labels in als constexpr deklarierten Funktionen , durch Trennzeichen getrennte Escape-Sequenzen, benannte Escape-Zeichen.

  • Die mit der OpenCL- und OpenMP-Unterstützung verbundenen Funktionen wurden erweitert. Unterstützung für die OpenCL-Erweiterung cl_khr_subgroup_rotate hinzugefügt.
  • Für die x86-Architektur wurde ein Schutz gegen Schwachstellen in Prozessoren hinzugefügt, die durch die spekulative Ausführung von Anweisungen nach bedingungslosen Vorwärtssprungoperationen verursacht werden. Das Problem tritt aufgrund der präventiven Verarbeitung von Anweisungen auf, die unmittelbar auf die Verzweigungsanweisung im Speicher folgen (SLS, Straight Line Speculation). Um den Schutz zu aktivieren, wird die Option „-mharden-sls=[none|all|return|indirect-jmp]“ vorgeschlagen.
  • Für Plattformen, die die SSE2-Erweiterung unterstützen, wurde der Typ _Float16 hinzugefügt, der bei fehlender Unterstützung für AVX512-FP16-Anweisungen mithilfe des Float-Typs emuliert wird.
  • Flag „-m[no-]rdpru“ hinzugefügt, um die Verwendung des RDPRU-Befehls zu steuern, unterstützt ab AMD Zen2-Prozessoren.
  • Zum Schutz vor der RETBLEED-Schwachstelle wurde das Flag „-mfunction-return=thunk-extern“ hinzugefügt, das durch das Hinzufügen einer Befehlsfolge funktioniert, die die Beteiligung des spekulativen Ausführungsmechanismus für indirekte Verzweigungen ausschließt.

Wichtige Neuerungen in LLVM 15.0:

  • Unterstützung für Cortex-M85-CPU, Armv9-A-, Armv9.1-A- und Armv9.2-A-Architekturen sowie Armv8.1-M PACBTI-M-Erweiterungen hinzugefügt.
  • Es wurde ein experimentelles Backend für DirectX hinzugefügt, das das für DirectX-Shader verwendete DXIL-Format (DirectX Intermediate Language) unterstützt. Das Backend wird durch Angabe des Parameters „-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX“ während der Montage aktiviert.
  • Libc++ implementiert weiterhin neue Funktionen der Standards C++20 und C++2b, einschließlich der Fertigstellung der Implementierung der „Format“-Bibliothek und der vorgeschlagenen experimentellen Version der „Ranges“-Bibliothek.
  • Verbesserte Backends für x86-, PowerPC- und RISC-V-Architekturen.
  • Die Funktionen des LLD-Linkers und des LLDB-Debuggers wurden erweitert.

Source: opennet.ru

Kommentar hinzufügen