Nach sechs Monaten Entwicklung wurde die Version 13.0 des LLVM-Projekts vorgestellt – ein GCC-kompatibles Toolset (Compiler, Optimierer und Codegeneratoren), das Programme in einen Zwischencode für RISC-ähnliche virtuelle Instruktionen übersetzt (eine Low-Level-Virtual-Machine mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann zur Laufzeit durch einen JIT-Compiler in Maschineninstruktionen umgewandelt werden.
Verbesserungen in Clang 13.0:
- Die Unterstützung für garantierte Tail-Calls wurde implementiert (Funktionsaufruf am Ende einer Funktion, der Tail-Rekursion erzeugt, falls die Funktion sich selbst aufruft). Die Unterstützung für garantierte Tail-Calls wird mit dem Attribut „[[clang::musttail]]“ in C++ und „__attribute__((musttail))“ in C bereitgestellt, das im Ausdruck „return“ verwendet wird. Diese Möglichkeit ermöglicht Optimierungen durch das Entfalten des Codes in eine flache Iteration zur Einsparung von Stapelspeicher.
- In den „using“-Deklarationen und Extensions von Clang wurde die Unterstützung für die Definition von Attributen im C++11-Stil unter Verwendung des Formats „[[]]“ implementiert.
- Das Flag "-Wreserved-identifier" wurde hinzugefügt, um eine Warnung auszugeben, wenn im Benutzercode reservierte Bezeichner verwendet werden.
- Die Flags "-Wunused-but-set-parameter" und "-Wunused-but-set-variable" wurden hinzugefügt, um eine Warnung auszugeben, wenn Parameter oder Variablen gesetzt, aber nicht verwendet werden.
- Das Flag "-Wnull-pointer-subtraction" wurde hinzugefügt, um eine Warnung auszugeben, wenn im Code möglicherweise undefiniertes Verhalten durch die Verwendung eines Nullzeigers in Subtraktionsoperationen auftreten kann.
- Das Flag "-fstack-usage" wurde hinzugefügt, um für jede Datei mit Code eine zusätzliche Datei " .su " zu generieren, die Informationen über die Größe der Stackrahmen für jede im verarbeiteten Datei definierte Funktion enthält.
- Im statischen Analyzer wurde ein neuer Ausgabetyp - "sarif-html" - hinzugefügt, der die Erstellung von Berichten gleichzeitig in den Formaten HTML und Sarif ermöglicht. Eine neue Überprüfung (allocClassWithName) wurde hinzugefügt. Bei der Angabe der Option "-analyzer-display-progress" wird die Analysezeit jeder Funktion ausgegeben. Der Analyzer für intelligente Zeiger (alpha.cplusplus.SmartPtr) ist fast einsatzbereit.
- Die Möglichkeiten zur Unterstützung von OpenCL wurden erweitert. Neu hinzugefügte Erweiterungen sind cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields und __cl_clang_non_portable_kernel_param_types. Die Umsetzung der OpenCL 3.0-Spezifikation wurde fortgesetzt. Für C wird standardmäßig die OpenCL 1.2-Spezifikation verwendet, es sei denn, eine andere Version wird ausdrücklich ausgewählt. Für C++ wurde die Unterstützung für Dateien mit der Erweiterung „.clcpp“ hinzugefügt.
- Die Unterstützung für Transformationsdirektiven von Schleifen („#pragma omp unrol“ und „#pragma omp tile“), die in der OpenMP 5.1-Spezifikation definiert sind, wurde implementiert.
- Das Tool clang-format wurde um Optionen erweitert: SpacesInLineCommentPrefix zur Definition der Anzahl der Leerzeichen vor Kommentaren, IndentAccessModifiers, LambdaBodyIndentation und PPIndentWidth zur Steuerung der Ausrichtung von Einträgen, Lambda-Ausdrücken und Präprozessor-Direktiven. Die Möglichkeiten zur Sortierung von Header-Datei-Imports (SortIncludes) wurden erweitert. Unterstützung fürs Formatieren von JSON-Dateien wurde hinzugefügt.
- Im Linter clang-tidy wurde eine große Anzahl neuer Prüfungen hinzugefügt.
Die wichtigsten Neuerungen in LLVM 13.0:
- Die Option „-ehcontguard“ wurde hinzugefügt, um die CET-Technologie (Windows Control-flow Enforcement Technology) zum Schutz bei der Ausnahmebehandlung vor Exploits, die mithilfe von Rücksprung-orientierter Programmierung (ROP, Return-Oriented Programming) erstellt wurden, zu verwenden.
- Das Projekt debuginfo-test wurde in cross-project-tests umbenannt und ist für das Testen von Komponenten aus verschiedenen Projekten ausgelegt, ohne auf Debugging-Informationen beschränkt zu sein.
- Das Build-System unterstützt den Aufbau mehrerer Distributionen, beispielsweise eine mit Werkzeugen und eine andere mit Bibliotheken für Entwickler.
- Im Backend für die AArch64-Architektur wurde die Unterstützung für die Armv9-A RME (Realm Management Extension) und SME (Scalable Matrix Extension) im Assembler implementiert.
- Im Backend für die Hexagon-Architektur wurde die Unterstützung für die ISA V68/HVX hinzugefügt.
- Im Backend für die x86-Architektur wurde die Unterstützung für AMD Zen 3-Prozessoren verbessert.
- Im AMDGPU-Backend wurde die Unterstützung für APU GFX1013 RDNA2 hinzugefügt.
- In Libc++ wurden die neuen Funktionen der Standards C++20 und C++2b weiter implementiert, einschließlich der Fertigstellung der "concepts"-Bibliothek. Für die Windows-Plattform auf Basis von MinGW wurde die Unterstützung für std::filesystem hinzugefügt. Die Header-Dateien , und wurden getrennt. Eine Build-Option LIBCXX_ENABLE_INCOMPLETE_FEATURES wurde hinzugefügt, um Header-Dateien mit nicht vollständig implementierter Funktionalität zu deaktivieren.
- Die Funktionen des Linkers LLD wurden erweitert, wobei die Unterstützung für Big-endian-Prozessoren Aarch64 implementiert wurde, und der Mach-O-Backend wurde auf einen Stand gebracht, der das Linken von regulären Programmen ermöglicht. Es wurden Verbesserungen integriert, die für das Linken von Glibc mit LLD erforderlich sind.
- In das Tool llvm-mca (Machine Code Analyzer) wurde die Unterstützung für Prozessoren integriert, die Anweisungen in der Reihenfolge ausführen (in-order superscalar pipeline), wie zum Beispiel den ARM Cortex-A55.
- Im LLDB-Debugger für die AArch64-Plattform ist vollständige Unterstützung für Pointer Authentication, den MTE-Mechanismus (Memory Tagging Extension) und die SVE-Register implementiert. Es wurden Befehle hinzugefügt, die es ermöglichen, Tags mit jeder Speicherzuweisung zu verknüpfen und bei Speicherzugriffen eine Überprüfung des Pointers durchzuführen, der mit dem entsprechenden Tag verknüpft sein muss.
- In die vom Projekt erzeugten Binär-Builds wurden der LLDB-Debugger und das Frontend für die Programmiersprache Fortran — Flang — aufgenommen.
Quelle: opennet.ru
