Veröffentlichung des LLVM 11.0-Compiler-Sets

Nach sechs Monaten Entwicklungszeit eingereicht Projektfreigabe LLVM 11.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.

Die wichtigste Änderung in der neuen Version war die Aufnahme von Flansch, Frontend für die Fortran-Sprache. Flang unterstützt Fortran 2018, OpenMP 4.5 und OpenACC 3.0, die Entwicklung des Projekts ist jedoch noch nicht abgeschlossen und das Frontend beschränkt sich auf das Parsen und Überprüfen des Codes auf Korrektheit. Die Generierung von LLVM-Zwischencode wird noch nicht unterstützt. Um ausführbare Dateien zu generieren, wird kanonischer Code generiert und an einen externen Fortran-Compiler übergeben.

Verbesserungen in Clang 11.0:

  • Es wurde die Möglichkeit hinzugefügt, den abstrakten Syntaxbaum wiederherzustellen (AST) für fehlerhaften C++-Code, der zur Fehlerdiagnose verwendet werden kann und zusätzliche Informationen für externe Dienstprogramme wie clang-tidy und clangd bereitstellt. Die Funktion ist standardmäßig für C++-Code aktiviert und wird über die Optionen „-Xclang -f[no-]recovery-ast“ gesteuert.
  • Neue Diagnosemodi hinzugefügt:
    • „-Wpointer-to-int-cast“ ist eine Gruppe von Warnungen zum Umwandeln von Zeigern auf einen Ganzzahltyp int, der nicht alle möglichen Werte unterstützt.
    • „-Wuninitialized-const-reference“ – Warnung vor der Übergabe nicht initialisierter Variablen in Funktionsparametern, die Referenzargumente mit dem „const“-Attribut akzeptieren.
    • „-Wimplicit-const-int-float-conversion“ – standardmäßig aktivierte Warnung vor der impliziten Konvertierung einer realen Konstante in einen Ganzzahltyp.
  • Für die ARM-Plattform werden im Compiler integrierte C-Funktionen bereitgestellt (Eigenheiten), ersetzt durch effiziente Vektoranweisungen Arm v8.1-M MVE und CDE. Die verfügbaren Funktionen sind in den Headerdateien arm_mve.h und arm_cde.h definiert.
  • Добавлен eine Reihe erweiterter Ganzzahltypen _ExtInt(N), mit denen Sie Typen erstellen können, die keine Vielfachen von Zweierpotenzen sind, die auf FPGA/HLS effizient verarbeitet werden können. Beispielsweise, _ExtInt(7) definiert einen Integer-Typ bestehend aus 7 Bits.
  • Makros hinzugefügt, die die Unterstützung für integrierte C-Funktionen basierend auf ARM SVE-Anweisungen (Scalable Vector Extension) definieren:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Beispielsweise wird das Makro __ARM_FEATURE_SVE beim Generieren von AArch64-Code durch Festlegen der Befehlszeilenoption „-march=armv8-a+sve“ definiert.

  • Das Flag „-O“ wird jetzt mit dem Optimierungsmodus „-O1“ anstelle von „-O2“ identifiziert.
  • Neue Compiler-Flags hinzugefügt:
    • „-fstack-clash-protection“ – ermöglicht den Schutz vor Schnittpunkte von Stack und Heap.
    • „-ffp-Exception-Behavior={ignore,maytrap,strict}“ – ermöglicht Ihnen die Auswahl des Ausnahmebehandlungsmodus für Gleitkommazahlen.
    • „-ffp-model={precise,strict,fast}“ – Vereinfacht den Zugriff auf eine Reihe spezieller Optionen für Gleitkommazahlen.
    • „-fpch-codegen“ und „-fpch-debuginfo“ zum Generieren eines vorkompilierten Headers (PCH) mit separaten Objektdateien für Code und Debuginfo.
    • „-fsanitize-coverage-allowlist“ und „-fsanitize-coverage-blocklist“ zum Überprüfen der weißen und schwarzen Listen für Abdeckungstests.
    • „-mtls-size={12,24,32,48}“, um die TLS-Größe (Thread-Local Storage) auszuwählen.
    • „-menable-experimental-extension“ zum Aktivieren experimenteller RISC-V-Erweiterungen.
  • Der Standardmodus für C ist „-fno-common“, was auf einigen Plattformen einen effizienteren Zugriff auf globale Variablen ermöglicht.
  • Der Standardmodulcache wurde von /tmp in das Verzeichnis ~/.cache verschoben. Zum Überschreiben können Sie das Flag „-fmodules-cache-path=“ verwenden.
  • Der Standard-C-Sprachstandard wurde von gnu11 auf gnu17 aktualisiert.
  • Vorläufige Unterstützung für die GNU C-Erweiterung hinzugefügt.asm inline» um Assembler-Einsätze hinzuzufügen. Die Erweiterung wird noch analysiert, aber in keiner Weise bearbeitet.
  • Die mit der OpenCL- und CUDA-Unterstützung verbundenen Funktionen wurden erweitert. Unterstützung für OpenCL 2.0-Blockdiagnose hinzugefügt und neue OpenMP 5.0-Funktionen implementiert.
  • Option „IndentExternBlock“ zum Clang-Format-Dienstprogramm für die Ausrichtung innerhalb externer „C“- und externer „C++“-Blöcke hinzugefügt.
  • Der statische Analysator hat die Handhabung geerbter Konstruktoren in C++ verbessert. Neue Prüfungen hinzugefügt: alpha.core.C11Lock und alpha.fuchsia.Lock zur Prüfung auf Sperren, alpha.security.cert.pos.34c zur Erkennung unsicherer Verwendung von putenv, webkit.NoUncountedMemberChecker und webkit.RefCntblBaseVirtualDtor zur Erkennung von Problemen mit unzähligen Typen, Alpha .cplusplus .SmartPtr zur Prüfung auf Null-Smart-Pointer-Dereferenzierung.
  • Im Linter klirrend aufgeräumt hinzugefügt ein großer Teil der neuen Schecks.
  • Der Clangd-Caching-Server (Clang Server) hat die Leistung verbessert und neue Diagnosefunktionen hinzugefügt.

Haupt- Innovationen LLVM 11.0:

  • Das Build-System wurde auf die Verwendung von Python 3 umgestellt. Wenn Python 3 nicht verfügbar ist, ist ein Rollback auf die Verwendung von Python 2 möglich.
  • Das Frontend mit dem Compiler für die Go-Sprache (llgo) ist von der Veröffentlichung ausgeschlossen, die in Zukunft möglicherweise umstrukturiert wird.
  • Das Attribut „vector-function-abi-variant“ wurde zur Zwischendarstellung (IR) hinzugefügt, um die Zuordnung zwischen Skalar- und Vektorfunktionen zur Vektorisierung von Aufrufen zu beschreiben. Von llvm::VectorType gibt es zwei separate Vektortypen: llvm::FixedVectorType und llvm::ScalableVectorType.
  • Verzweigungen basierend auf udef-Werten und die Übergabe von undef-Werten an Standardbibliotheksfunktionen werden als undefiniertes Verhalten erkannt. IN
    memset/memcpy/memmove erlaubt die Übergabe von Undef-Zeigern, wenn der Parameter mit der Größe jedoch Null ist.

  • LLJIT hat Unterstützung für die Durchführung statischer Initialisierungen über die Methoden LLJIT::initialize und LLJIT::deinitialize hinzugefügt. Die Möglichkeit, statische Bibliotheken mithilfe der Klasse StaticLibraryDefinitionGenerator zu JITDylib hinzuzufügen, wurde implementiert. C-API für hinzugefügt ORCv2 (API zum Erstellen von JIT-Compilern).
  • Dem Backend für die AArch64-Architektur wurde Unterstützung für Cortex-A34-, Cortex-A77-, Cortex-A78- und Cortex-X1-Prozessoren hinzugefügt. Implementierte ARMv8.2-BF16 (BFloat16) und ARMv8.6-A-Erweiterungen, einschließlich RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors Virtualization) und ARMv8.0-DGH (Hinweis zur Datenerfassung). Es besteht die Möglichkeit, Code für integrierte Funktionsbindungen an SVE-Vektoranweisungen zu generieren.
  • Dem Backend für die ARM-Architektur wurde Unterstützung für Cortex-M55-, Cortex-A77-, Cortex-A78- und Cortex-X1-Prozessoren hinzugefügt. Erweiterungen implementiert
    Armv8.6-A Matrix Multiply und RMv8.2-AA32BF16 BFloat16.

  • Dem Backend für die PowerPC-Architektur wurde Unterstützung für die Codegenerierung für POWER10-Prozessoren hinzugefügt. Die Schleifenoptimierungen wurden erweitert und die Gleitkommaunterstützung verbessert.
  • Das Backend für die RISC-V-Architektur ermöglicht die Annahme von Patches, die experimentelle erweiterte Befehlssätze unterstützen, die noch nicht offiziell genehmigt wurden.
  • Das Backend für die AVR-Architektur wurde von der experimentellen Kategorie in die stabile Kategorie überführt und ist in der Basisdistribution enthalten.
  • Das Backend für x86-Architektur unterstützt Intel AMX- und TSXLDTRK-Anweisungen. Zusätzlicher Schutz vor Angriffen LVI (Load Value Injection) und implementiert außerdem einen allgemeinen Mechanismus zur Unterdrückung von Nebeneffekten bei spekulativer Ausführung, um Angriffe zu blockieren, die durch spekulative Ausführung von Vorgängen auf der CPU verursacht werden.
  • Im Backend für die SystemZ-Architektur wurde Unterstützung für MemorySanitizer und LeakSanitizer hinzugefügt.
  • Unterstützung für Header-Dateien mit mathematischen Konstanten zu Libc++ hinzugefügt .
  • Erweitert LLD-Linker-Funktionen. Verbesserte Unterstützung für das ELF-Format, einschließlich der hinzugefügten Optionen „--lto-emit-asm“, „--lto-whole-program-visibility“, „-print-archive-stats“, „-shuffle-sections“, „ -thinlto- single-module", "-unique", "-rosegment", "-threads=N". Option „--time-trace“ hinzugefügt, um den Trace in einer Datei zu speichern, die dann über die chrome://tracing-Schnittstelle in Chrome analysiert werden kann.

Source: opennet.ru

Kommentar hinzufügen