Veröffentlichung des LLVM 13.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit wurde die Veröffentlichung des LLVM 13.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.

Verbesserungen in Clang 13.0:

  • Unterstützung für garantierte Tail-Aufrufe implementiert (Aufruf einer Subroutine ganz am Ende einer Funktion, Bildung einer Tail-Rekursion, wenn sich die Subroutine selbst aufruft). Unterstützung für garantierte Tail-Aufrufe wird durch das Attribut „[[clang::musttail]]“ in C++ und „__attribute__((musttail))“ in C bereitgestellt, das in einer „return“-Anweisung verwendet wird. Mit dieser Funktion können Sie Optimierungen implementieren, indem Sie Code in einer flachen Iteration bereitstellen, um den Stapelverbrauch zu senken.
  • „using“-Deklarationen und Clang-Erweiterungen bieten Unterstützung für die Definition von Attributen im C++11-Stil unter Verwendung des „[[]]“-Formats.
  • Das Flag „-Wreserved-identifier“ wurde hinzugefügt, um eine Warnung anzuzeigen, wenn Sie reservierte Bezeichner im Benutzercode angeben.
  • Die Flags „-Wunused-but-set-parameter“ und „-Wunused-but-set-variable“ wurden hinzugefügt, um eine Warnung anzuzeigen, wenn ein Parameter oder eine Variable gesetzt, aber nicht verwendet wird.
  • Flag „-Wnull-pointer-subtraction“ hinzugefügt, um eine Warnung auszugeben, wenn der Code aufgrund der Verwendung eines Nullzeigers in Subtraktionsoperationen zu undefiniertem Verhalten führen könnte.
  • Das Flag „-fstack-usage“ wurde hinzugefügt, um für jede Codedatei eine zusätzliche „.su“-Datei zu generieren, die Informationen über die Größe der Stapelrahmen für jede in der verarbeiteten Datei definierte Funktion enthält.
  • Dem statischen Analysator wurde ein neuer Ausgabetyp hinzugefügt – „sarif-html“, der zur gleichzeitigen Generierung von Berichten im HTML- und Sarif-Format führt. Neue allocClassWithName-Prüfung hinzugefügt. Bei Angabe der Option „-analyzer-display-progress“ wird die Analysezeit jeder Funktion angezeigt. Der Smart-Pointer-Analysator (alpha.cplusplus.SmartPtr) ist fast fertig.
  • Die mit der OpenCL-Unterstützung verbundenen Funktionen wurden erweitert. Unterstützung für neue Erweiterungen cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields und __cl_clang_non_portable_kernel_param_types hinzugefügt. Die Implementierung der OpenCL 3.0-Spezifikation wurde fortgesetzt. Für C wird standardmäßig die OpenCL 1.2-Spezifikation verwendet, sofern nicht explizit eine andere Version ausgewählt wird. Für C++ wurde Unterstützung für Dateien mit der Erweiterung „.clcpp“ hinzugefügt.
  • Unterstützung für Schleifentransformationsanweisungen („#pragma omp unrol“ und „#pragma omp Tile“), die in der OpenMP 5.1-Spezifikation definiert sind, wurde implementiert.
  • Dem Clang-Format-Dienstprogramm wurden Optionen hinzugefügt: SpacesInLineCommentPrefix zum Definieren der Anzahl der Leerzeichen vor Kommentaren, IndentAccessModifiers, LambdaBodyIndentation und PPIndentWidth zum Steuern der Ausrichtung von Einträgen, Lambda-Ausdrücken und Präprozessoranweisungen. Die Möglichkeiten zur Sortierung der Aufzählung von Header-Dateien (SortIncludes) wurden erweitert. Unterstützung für die Formatierung von JSON-Dateien hinzugefügt.
  • Eine große Anzahl neuer Schecks wurde zu Linter Clang-Tidy hinzugefügt.

Wichtige Neuerungen in LLVM 13.0:

  • Die Option „-ehcontguard“ wurde hinzugefügt, um mithilfe der CET-Technologie (Windows Control-Flow Enforcement Technology) vor der Ausführung von Exploits zu schützen, die mithilfe von ROP-Techniken (Return-Oriented Programming) in der Ausnahmebehandlungsphase erstellt wurden.
  • Das Projekt „debuginfo-test“ wurde in „cross-project-tests“ umbenannt und dient zum Testen von Komponenten aus verschiedenen Projekten und ist nicht auf Debugging-Informationen beschränkt.
  • Das Assemblersystem bietet Unterstützung für die Erstellung mehrerer Distributionen, beispielsweise eine mit Dienstprogrammen und die andere mit Bibliotheken für Entwickler.
  • Im Backend für die AArch64-Architektur ist im Assembler die Unterstützung der Armv9-A-Erweiterungen RME (Realm Management Extension) und SME (Scalable Matrix Extension) implementiert.
  • Dem Backend für die Hexagon-Architektur wurde Unterstützung für ISA V68/HVX hinzugefügt.
  • Das x86-Backend bietet eine verbesserte Unterstützung für AMD Zen 3-Prozessoren.
  • Unterstützung für GFX1013 RDNA2 APU zum AMDGPU-Backend hinzugefügt.
  • Libc++ implementiert weiterhin neue Funktionen der C++20- und C++2b-Standards, einschließlich der Vervollständigung der „Concepts“-Bibliothek. Unterstützung für std::filesystem für die MinGW-basierte Windows-Plattform hinzugefügt. Header-Dateien getrennt , Und . Build-Option LIBCXX_ENABLE_INCOMPLETE_FEATURES hinzugefügt, um Header-Dateien mit nicht vollständig implementierter Funktionalität zu deaktivieren.
  • Die Fähigkeiten des LLD-Linkers wurden erweitert, indem die Unterstützung für Big-Endian-Aarch64-Prozessoren implementiert wurde und das Mach-O-Backend in einen Zustand gebracht wurde, der die Verknüpfung regulärer Programme ermöglicht. Enthaltene Verbesserungen, die zum Verknüpfen von Glibc mithilfe von LLD erforderlich sind.
  • Das Dienstprogramm llvm-mca (Machine Code Analyzer) hat Unterstützung für Prozessoren hinzugefügt, die Anweisungen der Reihe nach ausführen (superskalare Pipeline in der richtigen Reihenfolge), wie z. B. den ARM Cortex-A55.
  • Der LLDB-Debugger für die AArch64-Plattform bietet vollständige Unterstützung für Zeigerauthentifizierung, MTE (MemTag, Memory Tagging Extension) und SVE-Register. Es wurden Befehle hinzugefügt, mit denen Sie Tags an jede Speicherzuweisungsoperation binden und beim Zugriff auf den Speicher eine Überprüfung des Zeigers organisieren können, der dem richtigen Tag zugeordnet sein muss.
  • Der LLDB-Debugger und das Frontend für die Fortran-Sprache – Flang – wurden zu den vom Projekt generierten Binärassemblys hinzugefügt.

Source: opennet.ru

Kommentar hinzufügen