Nach sechs Monaten Entwicklung wurde das Release von LLVM 16.0 vorgestellt – einem GCC-kompatiblen Werkzeug (Compiler, Optimierer und Code-Generatoren), das Programme in intermediatem Bitcode RISC-ähnlicher virtueller Instruktionen kompiliert (eine Low-Level-Virtual-Machine mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann durch einen JIT-Compiler in Maschineninstruktionen zum Zeitpunkt der Programmausführung umgewandelt werden.
Die wichtigsten Verbesserungen in Clang 16.0:
- Der standardmäßig verwendete C++/ObjC++ Standard wurde auf gnu++17 festgelegt (zuvor wurde gnu++14 verwendet), was bedeutet, dass die Funktionen von C++17 mit GNU-Erweiterungen standardmäßig unterstützt werden. Zur Wiederherstellung des vorherigen Verhaltens kann die Option „-std=gnu++14“ verwendet werden.
- Erweiterte Funktionen im Zusammenhang mit dem C++20 Standard wurden implementiert:
- Bedingt triviale spezielle Memberfunktionen,
- Einfangen von strukturierten Bindungen in Lambda-Funktionen,
- Gleichheitsoperatoren innerhalb von Ausdrücken,
- Die Möglichkeit, das Schlüsselwort typename in bestimmten Kontexten wegzulassen,
- Erlaubnis zur aggregierten Initialisierung in Klammern („Aggr(val1, val2)“).
- Funktionen, die im zukünftigen Standard C++2b definiert sind, wurden implementiert:
- Das Setzen von Labels am Ende komplexer Ausdrücke ist erlaubt.
- static operator()
- static operator[]
- Kompatibilität mit dem Typ char8_t wurde gewährleistet.
- Die Palette der in '\N{…}' verwendbaren Zeichen wurde erweitert.
- Es wurde ermöglicht, in als constexpr deklarierten Funktionen Variablen zu verwenden, die als 'static constexpr' deklariert sind.
- Funktionen, die im zukünftigen C-Standard C2x definiert sind, wurden implementiert:
- Zur Deaktivierung der Warnung '-Wunused-label' ist die Anwendung des Attributs '[[maybe_unused]]' auf Labels erlaubt.
- Das Setzen von Labels an beliebigen Stellen innerhalb komplexer Ausdrücke ist erlaubt.
- Die Operatoren typeof und typeof_unqual wurden hinzugefügt.
- Ein neuer Typ nullptr_t und die Konstante nullptr zur Definition von null-Zeigern wurden eingeführt, die in jeden Zeigertyp konvertiert werden können und eine NULL-Variante darstellen, die nicht an Ganzzahltypen und den Typ void* gebunden ist.
- Im C2x-Modus ist der Aufruf des Makros va_start mit einer variablen Anzahl von Argumenten (variadic) erlaubt.
- In den Konformitätsmodi C99, C11 und C17 führen die Optionen '-Wimplicit-function-declaration' und '-Wimplicit-int' standardmäßig nun zu einem Fehlerausgabe anstelle einer Warnung.
- Die indirekte Verwendung von «void *» (zum Beispiel «void func(void *p) { *p; }») im C++-Modus führt jetzt zu einem Fehler, ähnlich wie bei ISO C++, GCC, ICC und MSVC.
- Die Angabe von Bitfeldern als Operanden in Inline-Assembler-Blöcken (zum Beispiel «__asm { mov eax, s.bf }») im Microsoft-Stil führt jetzt zu einem Fehler.
- Eine Diagnose wurde hinzugefügt, um unterschiedliche Strukturen und Vereinigungen mit identischen Namen in verschiedenen Modulen zu erkennen.
- Die Unterstützung für OpenCL und OpenMP wurde erweitert. Die Diagnose von C++-Templates, die in den Argumenten von OpenCL-Kernen verwendet werden, wurde verbessert. Die Unterstützung für die Substitutionsblock-Warteschlange für AMDGPU wurde optimiert. Allen Funktionen wurde implizit das Attribut nounwind hinzugefügt. Die Unterstützung für eingebaute Funktionen wurde verbessert.
- Die Verwendung der Umgebungsvariable CLANG_CRASH_DIAGNOSTICS_DIR zur Festlegung des Verzeichnisses, in dem die Diagnosedaten über Abstürze gespeichert werden, wurde eingeführt.
- Die Unterstützung für Unicode wurde auf die Unicode-Spezifikation 15.0 aktualisiert. Die Verwendung bestimmter mathematischer Symbole in Identifikatoren ist erlaubt, wie zum Beispiel «₊» (zum Beispiel «double xₖ₊₁»).
- Unterstützung für das Hochladen mehrerer Konfigurationsdateien hinzugefügt (zunächst werden die Standardkonfigurationsdateien geladen, gefolgt von den über das Flag „—config=“ angegebenen, welches jetzt mehrfach verwendet werden kann). Die Reihenfolge des Ladens der Standardkonfigurationsdateien wurde geändert: clang versucht zuerst, die Datei -.cfg zu laden. Wenn diese nicht gefunden wird, versucht es, die Dateien .cfg und .cfg zu laden. Um das Laden der Standardkonfigurationsdateien zu deaktivieren, wurde das Flag „—no-default-config“ hinzugefügt.
- Um wiederholbare Builds zu gewährleisten, wurde die Möglichkeit hinzugefügt, die Werte des aktuellen Datums und der Uhrzeit in den Makros __DATE__, __TIME__ und __TIMESTAMP__ durch die Zeit zu ersetzen, die in der Umgebungsvariable SOURCE_DATE_EPOCH festgelegt ist.
- Ein Makro „__has_constexpr_builtin“ wurde hinzugefügt, um das Vorhandensein von eingebauten Funktionen (built-in), die im Kontext von Konstanten verwendet werden können, zu überprüfen.
- Ein neues Kompilierungsflag „-fcoro-aligned-allocation“ für die ausgerichtete Verteilung von Koroutinen-Frames wurde hinzugefügt.
- Im Flag '-fstrict-flex-arrays=' wird die Unterstützung für die dritte Ebene der Überprüfung flexibler Array-Elemente in Strukturen (Flexible Array Members, ein Array variabler Größe am Ende der Struktur) implementiert. In der dritten Ebene wird nur die Größe '[]' (z. B. 'int b[]') als flexibles Array behandelt, während die Größe '[0]' (z. B. 'int b[0]') nicht berücksichtigt wird.
- Das Flag '-fmodule-output' wurde hinzugefügt, um ein einstufiges Kompilierungsmodell für Standard-C++-Module zu aktivieren.
- Der Modus '-Rpass-analysis=stack-frame-layout' wurde hinzugefügt, um Probleme mit der Anordnung von Stack-Frames zu diagnostizieren.
- Ein neues Attribut __attribute__((target_version('cpu_features'))) wurde eingeführt, und die Funktionalität des Attributs __attribute__((target_clones('cpu_features1','cpu_features2',…))) wurde erweitert, um bestimmte Versionen von Funktionen bereitzustellen, die von der CPU AArch64 angeboten werden.
- Die Diagnosetools wurden erweitert:
- Die Warnung '-Wsingle-bit-bitfield-constant-conversion' wurde hinzugefügt, um implizite Abschneidungen beim Zuweisen von 1 zu einem eindimensionalen, signierten Bitfeld zu identifizieren.
- Die Diagnostik für nicht initialisierte constexpr-Variablen wurde erweitert.
- Die Warnungen '-Wcast-function-type-strict' und '-Wincompatible-function-pointer-types-strict' wurden hinzugefügt, um potenzielle Probleme bei der Typumwandlung von Funktionen zu erkennen.
- Die Diagnose für die Verwendung ungültiger oder reservierter Modulnamen in Exportblöcken wurde hinzugefügt.
- Die Erkennung fehlender "auto"-Schlüsselwörter in Definitionen wurde verbessert.
- Zusätzliche Prüfungen wurden in der Warnung "-Winteger-overflow" implementiert, um zusätzliche Situationen zu erfassen, die zu Überläufen führen.
- Die Unterstützung der LoongArch-Befehlssatzarchitektur (-march=loongarch64 oder -march=la464) wurde implementiert, die in den Loongson 3 5000-Prozessoren verwendet wird und eine neue RISC-ISA bietet, die MIPS und RISC-V ähnlich ist.
Hauptneuerungen in LLVM 16.0:
- Im LLVM-Code ist die Verwendung von Elementen, die im C++17-Standard definiert sind, erlaubt.
- Die Anforderungen an die Build-Umgebung für LLVM wurden erhöht. Das Build-Toolset muss nun den C++17-Standard unterstützen, d.h. für den Build werden mindestens GCC 7.1, Clang 5.0, Apple Clang 10.0 oder Visual Studio 2019 16.7 benötigt.
- Im Backend für die AArch64-Architektur wurde die Unterstützung für die CPUs Cortex-A715, Cortex-X3 und Neoverse V2, Assembler für RME MEC (Memory Encryption Contexts), Armv8.3-Erweiterungen (Complex Number) und Multi-Versionierung (Function Multi Versioning) hinzugefügt.
- Im Backend für die ARM-Architektur wurde die Unterstützung für die Zielplattformen Armv2, Armv2A, Armv3 und Armv3M eingestellt, da die korrekte Codegenerierung für diese nicht gewährleistet werden konnte. Es wurde die Möglichkeit hinzugefügt, Code für Operationen mit komplexen Zahlen zu generieren.
- Im Backend für die X86-Architektur wurde die Unterstützung für die Befehlssatzarchitekturen (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8 und AVX-NE-CONVERT hinzugefügt. Die Unterstützung für die Anweisungen RDMSRLIST, RMSRLIST und WRMSRNS wurde implementiert. Optionen wie „-mcpu=raptorlake“, „-mcpu=meteorlake“, „-mcpu=emeraldrapids“, „-mcpu=sierraforest“, „-mcpu=graniterapids“ und „-mcpu=grandridge“ wurden realisiert.
- Offizielle Unterstützung für die LoongArch-Plattform wurde hinzugefügt.
- Die Backends für die Architekturen MIPS, PowerPC und RISC-V wurden verbessert.
- Im Debugger LLDB wurde die Unterstützung für das Debugging von 64-Bit-Executable-Dateien für die LoongArch-Architektur hinzugefügt. Die Verarbeitung von Debug-Symbolen im COFF-Format wurde verbessert. Doppelungen von DLLs in der Liste der geladenen Windows-Module werden herausgefiltert.
- In der Bibliothek Libc++ lag der Schwerpunkt auf der Implementierung der Unterstützung für die neuen Funktionen der C++20- und C++23-Standards.
- Im LDD-Compiler wurde die Bindungszeit erheblich durch die Parallelisierung der Scanning-Operationen, der Adressverschiebungen und der Initialisierung von Abschnitten verkürzt. Unterstützung für die Komprimierung von Abschnitten mit dem ZSTD-Algorithmus wurde hinzugefügt.
Quelle: opennet.ru
