Release des LLVM Compiler Sets 11.0

Nach sechs Monaten Entwicklung wurde vorgestellt Projekt-Releases LLVM 11.0 — einer GCC-kompatiblen Toolchain (Compiler, Optimierer und Code-Generatoren), die Programme in einen Zwischen-Bitcode RISC-ähnlicher virtueller Instruktionen übersetzt (eine niedrigstufige virtuelle Maschine mit einem mehrschichtigen Optimierungssystem). Der generierte Pseudocode kann über einen JIT-Compiler direkt zur Ausführungszeit des Programms in Maschineninstruktionen umgewandelt werden.

Ein zentrales Merkmal der neuen Version ist die Integration von Flang, einem Frontend für die Programmiersprache Fortran. Flang unterstützt Fortran 2018, OpenMP 4.5 und OpenACC 3.0, jedoch ist die Entwicklung des Projekts noch nicht abgeschlossen, sodass das Frontend nur die Analyse des Codes und dessen Korrektheitsprüfung ermöglicht. Die Generierung von LLVM-Zwischenkod wird derzeit nicht unterstützt, und zur Erstellung ausführbarer Dateien wird kanonischer Code generiert, der an einen externen Fortran-Compiler übergeben wird.

Verbesserungen in Clang 11.0:

  • Die Möglichkeit zur Wiederherstellung des abstrakten Syntaxbaums wurde hinzugefügt (AST) für fehlerhaften C++-Code, der zur Vereinfachung der Fehlersuche verwendet werden kann und zusätzliche Informationen für externe Tools wie clang-tidy und clangd bereitstellt. Die Standard-Einstellung ist für C++-Code aktiviert und wird über die Optionen „-Xclang -f[no-]recovery-ast“ gesteuert.
  • Neue Diagnosemodi hinzugefügt:
    • „-Wpointer-to-int-cast“ — eine Gruppe von Warnungen über die Umwandlung von Zeigern in den Ganzzahltyp int, die nicht alle möglichen Werte aufnehmen können.
    • „-Wuninitialized-const-reference“ — Warnung über die Übergabe nicht initialisierter Variablen an Funktionsparameter, die Referenzargumente mit dem Attribut „const“ erwarten.
    • „-Wimplicit-const-int-float-conversion“ — Standardmäßig aktivierte Warnung über die implizite Umwandlung von Fließkommazahlen in Ganzzahlen.
  • Für die ARM-Plattform sind im Compiler eingebettete C-Funktionen verfügbar (Intrinsics), die durch effektive Vektorbefehle der Arm v8.1-M MVE und CDE ersetzt werden. Die verfügbaren Funktionen sind in den Header-Dateien arm_mve.h und arm_cde.h definiert.
  • Hinzugefügt eine Reihe erweiterter ganzzahliger Typen _ExtInt(N), die es ermöglichen, nicht potenzielle Zweier-Typen zu erstellen, die auf FPGA/HLS effizient verarbeitet werden können. Zum Beispiel, _ExtInt(7) definiert einen Ganzzahltyp, der aus 7 Bit besteht.
  • Makros wurden hinzugefügt, die die Unterstützung für integrierte C-Funktionen auf Basis der ARM SVE (Scalable Vector Extension)-Befehle festlegen:
    __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. Zum Beispiel wird das Makro __ARM_FEATURE_SVE bei der Codegenerierung für AArch64 mit der Optionen «-march=armv8-a+sve» definiert.
  • Das Flag «-O» wird jetzt mit dem Optimierungsmodus «-O1» anstelle von «-O2» gleichgesetzt.
  • Neue Compiler-Flags hinzugefügt:
    • «-fstack-clash-protection» – aktiviert den Schutz vor Überschneidung von Stack und Heap.
    • «-ffp-exception-behavior={ignore,maytrap,strict}» – erlaubt die Auswahl des Ausnahmebehandlungsmodus für Gleitkommazahlen.
    • «-ffp-model={precise,strict,fast}» – vereinfacht den Zugriff auf eine Reihe spezialisierter Optionen für Gleitkommazahlen.
    • «-fpch-codegen» und «-fpch-debuginfo» zur Generierung eines vorcompilierten Headers (PCH) mit separaten Objektdateien für Code und Debuginformationen.
    • «-fsanitize-coverage-allowlist» und «-fsanitize-coverage-blocklist» zur Überprüfung von weißen und schwarzen Listen beim Coverage-Testing.
    • «-mtls-size={12,24,32,48}» zur Auswahl der Größe des TLS (thread-local storage).
    • «-menable-experimental-extension» zur Aktivierung experimenteller Erweiterungen für RISC-V.
  • Standardmäßig wird für C der Modus „-fno-common“ verwendet, der den Zugriff auf globale Variablen auf einigen Plattformen effizienter macht.
  • Der Modulkatalog wurde standardmäßig von /tmp nach ~/ .cache verschoben. Zum Überschreiben können Sie das Flag „-fmodules-cache-path=” verwenden.
  • Der standardmäßig verwendete C-Standard wurde von gnu11 auf gnu17 aktualisiert.
  • Vorläufige Unterstützung für die GNU C-Erweiterung „asm inline“ wurde hinzugefügt, um Assembler-Inserts einzufügen. Die Erweiterung wird derzeit nur analysiert, aber nicht verarbeitet.
  • Die Möglichkeiten im Zusammenhang mit der Unterstützung von OpenCL und CUDA wurden erweitert. Die Unterstützung für die Diagnose von OpenCL 2.0-Blöcken und neue Funktionen von OpenMP 5.0 wurden implementiert.
  • In das Tool clang-format wurde die Option IndentExternBlock integriert, um die Ausrichtung innerhalb von externen Blöcken „C“ und „C++“ zu verbessern.
  • Im statischen Analysator wurde die Verarbeitung von geerbten Konstruktoren in C++ verbessert. Neue Prüfungen alpha.core.C11Lock und alpha.fuchsia.Lock wurden hinzugefügt, um die Sperrmechanismen zu überprüfen, alpha.security.cert.pos.34c zur Identifizierung unsicherer Verwendung von putenv, webkit.NoUncountedMemberChecker und webkit.RefCntblBaseVirtualDtor zur Aufdeckung von Problemen mit unzählbaren Typen sowie alpha.cplusplus.SmartPtr zur Überprüfung der Dereferenzierung von Null-Zeiger.
  • Im Linter clang-tidy hinzugefügt gibt es eine umfangreiche Sammlung neuer Prüfungen.
  • Im Caching-Server clangd (Clang Server) wurde die Leistung verbessert und neue Diagnosetools hinzugefügt.

Haupt Neuheiten LLVM 11.0:

  • Das Build-System wurde auf die Nutzung von Python 3 umgestellt. Falls Python 3 nicht verfügbar ist, wurde die Möglichkeit implementiert, auf Python 2 zurückzugreifen.
  • Die Frontend-Implementierung des Compilers für die Programmiersprache Go (llgo) wurde aus der Veröffentlichung entfernt, könnte jedoch in Zukunft restrukturiert werden.
  • Im Intermediate Representation (IR) wurde das Attribut vector-function-abi-variant hinzugefügt, um das Mapping zwischen skalar und vektoriellen Funktionen für die Vektorisierung von Aufrufen zu beschreiben. Aus llvm::VectorType wurden zwei separate Vektor-Typen hervorgehoben: llvm::FixedVectorType und llvm::ScalableVectorType.
  • Das Verhalten von Verzweigungen auf Basis von udef-Werten und die Übergabe von undef-Werten an Funktionen der Standardbibliothek wurden als unbestimmtes Verhalten anerkannt. In
    memset/memcpy/memmove ist die Übergabe von undef-Zeigern erlaubt, jedoch nur, wenn der Parameter mit der Größe null ist.
  • LLJIT unterstützt nun die Ausführung von statischen Initialisierungen über die Methoden LLJIT::initialize und LLJIT::deinitialize. Es wurde die Möglichkeit implementiert, statische Bibliotheken zu JITDylib mithilfe der Klasse StaticLibraryDefinitionGenerator hinzuzufügen. Ein C API wurde hinzugefügt für ORCv2 (API zur Erstellung von JIT-Compilern).
  • Im Backend für die Architektur AArch64 wurde die Unterstützung für die Prozessoren Cortex-A34, Cortex-A77, Cortex-A78 und Cortex-X1 hinzugefügt. Es wurden ARMv8.2-BF16 (BFloat16) und ARMv8.6-A Erweiterungen implementiert, einschließlich RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors Virtualization) und ARMv8.0-DGH (Data Gathering Hint). Die Generierung von Code für eingebaute Wrapper-Funktionen zu Vektor-Operationen SVE wurde ermöglicht.
  • Im Backend für die Architektur ARM wurde die Unterstützung für die Prozessoren Cortex-M55, Cortex-A77, Cortex-A78 und Cortex-X1 hinzugefügt. Es wurden die Erweiterungen
    Armv8.6-A Matrix Multiply und RMv8.2-AA32BF16 BFloat16 implementiert.
  • Im Backend für die PowerPC-Architektur wurde die Unterstützung für die Codegenerierung für POWER10-Prozessoren hinzugefügt. Die Schleifenoptimierungen wurden erweitert und die Unterstützung für Gleitkommaoperationen verbessert.
  • Im Backend für die RISC-V-Architektur ist die Annahme von Patches mit Unterstützung für experimentelle, noch nicht offiziell genehmigte Befehlssatzerweiterungen erlaubt worden.
  • Das Backend für die AVR-Architektur wurde aus der Kategorie experimentell in stabil umgewandelt und ist nun im Basispaket enthalten.
  • Im Backend für die x86-Architektur wurde die Unterstützung für Intel AMX- und TSXLDTRK-Instruktionen implementiert. Es wurde ein Schutz gegen Angriffe (Load Value Injection) hinzugefügt, ebenso wie ein gemeinsamer Mechanismus zur Unterdrückung von Spekulationsausführungsnebenwirkungen, um Angriffe, die durch spekulative Ausführung von Operationen in der CPU ausgelöst werden, zu blockieren. LVI Im Backend für die SystemZ-Architektur wurde die Unterstützung für MemorySanitizer und LeakSanitizer hinzugefügt.
  • In Libc++ wurde die Unterstützung für die Header-Datei mit mathematischen Konstanten hinzugefügt.
  • In Libc++ wurde die Unterstützung für Headerdateien mit mathematischen Konstanten hinzugefügt <numbers>.
  • Erweitert Die Möglichkeiten des LLD-Linkers wurden erweitert. Verbesserte Unterstützung für das ELF-Format, einschließlich der Optionen „—lto-emit-asm“, „—lto-whole-program-visibility“, „—print-archive-stats“, „—shuffle-sections“, „—thinlto-single-module“, „—unique“, „—rosegment“, „—threads=N“. Die Option „—time-trace“ wurde hinzugefügt, um die Trace-Daten in eine Datei zu speichern, die dann über die Schnittstelle chrome://tracing in Chrome analysiert werden kann.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster