Veröffentlichung des LLVM 9.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit eingereicht Projektfreigabe LLVM 9.0 – GCC-kompatible Tools (Compiler, Optimierer und Codegeneratoren), die Programme in Zwischenbitcode von RISC-ähnlichen virtuellen Anweisungen kompilieren (virtuelle Maschine auf niedriger Ebene mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann direkt zum Zeitpunkt der Programmausführung mit einem JIT-Compiler in Maschinenanweisungen umgewandelt werden.

Zu den neuen Funktionen von LLVM 9.0 gehören die Entfernung des experimentellen Design-Tags von der Ziel-RISC-V-Plattform, C++-Unterstützung für OpenCL, die Möglichkeit, ein Programm in dynamisch geladene Teile in LLD aufzuteilen, und die Implementierung des „asm gehe zu", wird im Linux-Kernel-Code verwendet. libc++ fügte Unterstützung für WASI (WebAssembly System Interface) hinzu, und LLD fügte anfängliche Unterstützung für die dynamische Verknüpfung von WebAssembly hinzu.

Verbesserungen in Clang 9.0:

  • Hinzugefügt von Implementierung des GCC-spezifischen Ausdrucks „asm gehe zu„, wodurch Sie von einem Assembler-Inline-Block zu einem Label im C-Code wechseln können. Diese Funktion ist erforderlich, um den Linux-Kernel im Modus „CONFIG_JUMP_LABEL=y“ mit Clang auf Systemen mit x86_64-Architektur zu erstellen. Unter Berücksichtigung der in früheren Versionen hinzugefügten Änderungen kann der Linux-Kernel jetzt in Clang für die x86_64-Architektur erstellt werden (zuvor wurde nur die Erstellung für die Architekturen arm, aarch64, ppc32, ppc64le und mips unterstützt). Darüber hinaus wurden Android- und ChromeOS-Projekte bereits auf die Verwendung von Clang für die Kernel-Erstellung umgestellt, und Google testet Clang als Hauptplattform für die Kernel-Erstellung für seine Linux-Produktionssysteme. Zukünftig können weitere LLVM-Komponenten im Kernel-Build-Prozess verwendet werden, darunter LLD, llvm-objcopy, llvm-ar, llvm-nm und llvm-objdump;
  • Experimentelle Unterstützung für die Verwendung von C++17 in OpenCL hinzugefügt. Zu den spezifischen Funktionen gehören die Unterstützung von Adressraumattributen, das Blockieren der Adressraumkonvertierung durch Typumwandlungsoperatoren, die Bereitstellung von Vektortypen wie in OpenCL für C, das Vorhandensein spezifischer OpenCL-Typen für Bilder, Ereignisse, Kanäle usw.
  • Neue Compiler-Flags „-ftime-trace“ und „-ftime-trace-granularity=N“ hinzugefügt, um einen Bericht über die Ausführungszeit verschiedener Phasen des Frontends (Analyse, Initialisierung) und Backends (Optimierungsphasen) zu erstellen. Der Bericht wird im JSON-Format gespeichert, kompatibel mit chrome://tracing und speedscope.app;
  • Verarbeitung des Spezifizierers „__declspec(allocator)“ und Generierung begleitender Debuginformationen hinzugefügt, mit denen Sie den Speicherverbrauch in der Visual Studio-Umgebung überwachen können;
  • Für die Sprache C wurde Unterstützung für das Makro „__FILE_NAME__“ hinzugefügt, das dem Makro „__FILE__“ ähnelt, aber nur den Dateinamen ohne den vollständigen Pfad enthält;
  • C++ hat die Unterstützung für Adressraumattribute erweitert, um verschiedene C++-Funktionen abzudecken, darunter Parameter- und Argumentmuster, Referenztypen, Rückschlüsse auf Rückgabetypen, Objekte, automatisch generierte Funktionen, integrierte Operatoren und mehr.
  • Die mit der Unterstützung von OpenCL, OpenMP und CUDA verbundenen Funktionen wurden erweitert. Dazu gehört die anfängliche Unterstützung für die implizite Einbindung integrierter OpenCL-Funktionen (das Flag „-fdeclare-opencl-builtins“ wurde hinzugefügt), die Implementierung der cl_arm_integer_dot_product-Erweiterung und die Erweiterung der Diagnosetools;
  • Die Arbeit des statischen Analysators wurde verbessert und eine Dokumentation zur Durchführung statischer Analysen wurde hinzugefügt. Flags hinzugefügt, um verfügbare Checker-Module und unterstützte Optionen anzuzeigen („-analyzer-checker[-option]-help“, „-analyzer-checker[-option]-help-alpha“ und „-analyzer-checker[-option]-help „-Entwickler“). Flag „-analyzer-werror“ hinzugefügt, um Warnungen als Fehler zu behandeln.
    Neue Verifizierungsmodi hinzugefügt:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling zur Identifizierung unsicherer Praktiken für die Arbeit mit Puffern;
    • osx.MIGChecker zur Suche nach Verstößen gegen MIG-Aufrufregeln (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast, um falsche XNU-Libkern-Objektkonvertierungen zu finden;
    • apiModeling.llvm mit einer Reihe von Modellierungsprüffunktionen zur Erkennung von Fehlern in der LLVM-Codebasis;
    • Stabilisierter Code zum Überprüfen nicht initialisierter C++-Objekte (UninitializedObject im Paket optin.cplusplus);
  • Das Dienstprogramm clang-format hat Unterstützung für die Formatierung von Code in der C#-Sprache hinzugefügt und bietet Unterstützung für den von Microsoft verwendeten Codeformatierungsstil;
  • clang-cl, eine alternative Befehlszeilenschnittstelle, die Kompatibilität auf Optionsebene mit dem in Visual Studio enthaltenen cl.exe-Compiler bietet, verfügt über Heuristiken, um nicht vorhandene Dateien als Befehlszeilenoptionen zu behandeln und eine entsprechende Warnung anzuzeigen (z. B. beim Ausführen von „clang-cl /diagnostic :caret /c test.cc“);
  • Ein großer Teil der neuen Prüfungen wurde zu Linter Clang-Tidy hinzugefügt, einschließlich zusätzlicher Prüfungen speziell für die OpenMP-API;
  • Erweitert Serverfunktionen klirrend (Clang Server), in dem der Indexerstellungsmodus im Hintergrund standardmäßig aktiviert ist, wurde Unterstützung für kontextbezogene Aktionen mit Code hinzugefügt (Variablenabruf, Erweiterung von Auto- und Makrodefinitionen, Konvertierung von maskierten Zeichenfolgen in nicht maskierte Zeichenfolgen), die Möglichkeit zur Anzeige Warnungen von Clang-tidy, erweiterte Diagnose von Fehlern in Header-Dateien und die Möglichkeit hinzugefügt, Informationen über die Typhierarchie anzuzeigen;

Haupt- Innovationen LLVM 9.0:

  • Dem LLD-Linker wurde eine experimentelle Partitionierungsfunktion hinzugefügt, mit der Sie ein Programm in mehrere Teile aufteilen können, die sich jeweils in einer separaten ELF-Datei befinden. Mit dieser Funktion können Sie den Hauptteil des Programms starten, der bei Bedarf während des Betriebs andere Komponenten lädt (z. B. können Sie den integrierten PDF-Viewer in eine separate Datei aufteilen, die nur geladen wird, wenn der Benutzer die PDF-Datei öffnet). Datei).

    LLD-Linker gebracht in einen Zustand, der zum Binden des Linux-Kernels für die Architekturen arm32_7, arm64, ppc64le und x86_64 geeignet ist.
    Neue Optionen „-“ (Ausgabe an stdout), „-[no-]allow-shlib-undefiniert“, „-undefiniert-glob“, „-nmagic“, „-omagic“, „-dependent-library“, „ - z ifunc-noplt“ und „-z common-page-size“. Für die AArch64-Architektur wurde Unterstützung für BTI- (Branch Target Indicator) und PAC- (Pointer Authentication Code) Anweisungen hinzugefügt. Die Unterstützung für MIPS-, RISC-V- und PowerPC-Plattformen wurde deutlich verbessert. Erste Unterstützung für dynamische Verknüpfungen für WebAssembly hinzugefügt;

  • In libc++ umgesetzt Funktionen ssize, std::is_constant_evaluated, std::midpoint und std::lerp, Methoden „front“ und „back“ wurden zu std::span hinzugefügt, Attribute der Typen std::is_unbounded_array und std::is_bounded_array wurden hinzugefügt , Standardfunktionen wurden erweitert: :atomic. Die Unterstützung für GCC 4.9 wurde eingestellt (kann mit GCC 5.1 und neueren Versionen verwendet werden). Unterstützung hinzugefügt WAR ICH (WebAssembly System Interface, eine Schnittstelle zur Verwendung von WebAssembly außerhalb des Browsers);
  • Neue Optimierungen wurden hinzugefügt. In einigen Situationen wurde die Konvertierung von Memcmp-Aufrufen in bcmp aktiviert. Auslassen der Bereichsprüfung für Sprungtabellen implementiert, in denen niedrigere Schalterblöcke nicht erreichbar sind oder wenn Anweisungen nicht verwendet werden, beispielsweise beim Aufrufen von Funktionen vom Typ void;
  • Das Backend für die RISC-V-Architektur wurde stabilisiert, die nicht mehr als experimentell positioniert ist und standardmäßig erstellt wird. Bietet vollständige Codegenerierungsunterstützung für RV32I- und RV64I-Befehlssatzvarianten mit MAFDC-Erweiterungen;
  • An den Backends für X86-, AArch64-, ARM-, SystemZ-, MIPS-, AMDGPU- und PowerPC-Architekturen wurden zahlreiche Verbesserungen vorgenommen. Zum Beispiel für Architektur
    AArch64 fügte Unterstützung für SVE2- (Scalable Vector Extension 2) und MTE-Anweisungen (Memory Tagging Extensions) hinzu; im ARM-Backend wurde Unterstützung für die Armv8.1-M-Architektur und die MVE-Erweiterung (M-Profile Vector Extension) hinzugefügt. Dem AMDGPU-Backend wurde Unterstützung für die GFX10 (Navi)-Architektur hinzugefügt, Funktionsaufruffunktionen sind standardmäßig aktiviert und ein kombinierter Durchgang ist aktiviert DPP (Datenparallele Grundelemente).

  • Der LLDB-Debugger verfügt jetzt über eine Farbhervorhebung für Backtraces und bietet zusätzliche Unterstützung für die Blöcke DWARF4 debug_types und DWARF5 debug_info.
  • Den Dienstprogrammen llvm-objcopy und llvm-strip wurde Unterstützung für Objekt- und ausführbare Dateien im COFF-Format hinzugefügt.

Source: opennet.ru

Kommentar hinzufügen