Nach sechs Monaten Entwicklungszeit wird die Projektversion LLVM 21.1.0 vorgestellt. Sie entwickelt Tools (Compiler, Optimierer und Codegeneratoren), die Programme in Zwischenbitcode aus RISC-ähnlichen virtuellen Anweisungen (Low-Level-Virtual Machine mit mehrstufigem Optimierungssystem) kompilieren. Der generierte Pseudocode kann in Maschinencode für eine bestimmte Zielplattform konvertiert oder von einem JIT-Compiler verwendet werden, um Maschinenanweisungen direkt während der Programmausführung zu bilden. Basierend auf LLVM-Technologien entwickelt das Projekt den Clang-Compiler, der die Programmiersprachen C, C++ und Objective-C unterstützt. Beginnend mit dem 18.x-Zweig wechselte das Projekt zu einem neuen Schema zur Generierung von Versionsnummern, wonach während des Entwicklungsprozesses die Nullversion („N.0“) verwendet wird und die erste stabile Version mit der Nummer „N.1“ ausgeliefert wird.
Zu den Verbesserungen in Clang 21 gehören:
- C++-bezogene Funktionen:
- In Analogie zu GCC wurde die Möglichkeit implementiert, konstante Ausdrücke in Assembler-Einfügungen zu verwenden, die durch die Direktive „asm“ definiert sind: int foo() { asm((std::string_view(“nop”)) ::: (std::string_view(“memory”))); }
- Erweiterte Varianten der Ausdrücke „new“ und „delete“ hinzugefügt, die das Argument „std::type_identity“ unterstützen “, über die Sie Informationen zum Objekttyp angeben können, für den Speicher zugewiesen oder freigegeben wird.
- Die Möglichkeit zur Auswertung von Lambda-Funktionen, die strukturierte Bindungen erfassen, wurde zur Kompilierzeit im Kontext eines konstanten Ausdrucks hinzugefügt.
- Funktionen im Zusammenhang mit dem kommenden C++2c-Standard (C++26):
- Strukturierte Bindungen unterstützen jetzt die Syntax „…“, um Pakete anzugeben, die die verbleibende Anzahl von Elementen in der Zuweisungssequenz erfassen. auto [x,y,z] = f(); // Die Variablen x, y, z enthalten die drei von f() zurückgegebenen Elemente. auto […xs] = f(); // Das Paket xs enthält alle von f() zurückgegebenen Elemente. auto [x, …rest] = f(); // x enthält das erste Element und rest den Rest. auto [x, y, …rest] = f(); // x enthält das erste Element, y das zweite und rest das dritte. auto [x, …rest, z] = f(); // x enthält das erste, rest das zweite und z das dritte.
- Unterstützung für „Trivial Relocatability“ von Typen hinzugefügt. Dies ermöglicht die Optimierung der Bewegung von Objekten eines bestimmten Typs durch Klonen im Speicher ohne Aufruf von Konstruktoren oder Destruktoren. Die Eigenschaften memberwise_trivially_relocatable und memberwise_replaceable wurden für Klassen implementiert, und die Funktionen trivially_relocate_at und trivially_relocate wurden für die Low-Level-Bewegung eines oder mehrerer Objekte hinzugefügt.
- Möglichkeit, strukturierte Bindungen als Bedingung in if- und switch-Anweisungen zu verwenden.
- Unterstützung für das Anhängen der Hauptfunktion an ein globales Modul und das Definieren der Hauptfunktion in benannten Modulen implementiert.
- Für den zukünftigen C2y-Standard werden folgende Funktionen entwickelt:
- Undefiniertes Verhalten bei der Verwendung von Void-Ausdrücken in einigen Kontexten behoben, z. B. „(void)(void)1;“.
- Es ist zulässig, eine Quellcodedatei nicht mit einem Zeilenumbruchzeichen zu beenden.
- Neue Präfixe für Oktalliterale hinzugefügt – 0o und 0O sowie oktale und hexadezimale Escape-Sequenzen „\o{…}“ und „\x{…}“. Die Unterstützung für Oktalliterale 0xxx ist veraltet. Zum Beispiel „0o123“ und „\o{123}“ anstelle von „0123“.
- Der Operator „_Countof“ wurde hinzugefügt, um die Anzahl der Elemente in einem Array zu bestimmen. Außerdem wurde die Header-Datei „stdcountof.h“ hinzugefügt, die eine Variante des über „_Countof“ implementierten Makros „countof“ definiert.
- Im C23 C-Standard definierte Funktionen:
- Es ist zulässig, Tag-Typen (Struct, Union, Enum) innerhalb derselben Übersetzungseinheit neu zu definieren, wenn die wiederholten Definitionen strukturell gleichwertig sind (gleiche Anzahl von Mitgliedern, gleiche Typen und Tag-Namen).
- Vereinfachte Verwendung von variadischen Listen. Die Verwendung eines einzelnen variadischen Parameters in einem Typnamen ist zulässig.
- GCC-kompatibles integriertes „__builtin_c23_va_start()“ hinzugefügt, um das Diagnoseverhalten für das Makro va_start() im C23-Modus zu verbessern.
- Im Kompatibilitätsmodus des MSVC-Compilers ist der Inline-Spezifizierer zulässig, wenn ein Funktionstyp über typedef deklariert wird, z. B. „typedef int inline Foo(int);“
- Der Qualifizierer „restrict“ ist für Array-Typen mit Zeigerelementen zulässig.
- Neue Compilerwarnungen:
- „-Wdefault-const-init-var“ und „-Wdefault-const-init-field“ – identifizieren const-markierte Variablen und Felder, die ohne explizite Initialisierung definiert sind.
- „-Wimplicit-void-ptr-cast“ – Ausgabe, wenn eine implizite Konvertierung vom Typ „void*“ in einen anderen Zeigertyp erfolgt.
- „-Wc++-keyword“ – Ausgabe bei Verwendung von „C++“-Schlüsselwörtern als Bezeichner in „C“.
- „-Wc++-hidden-decl“ – erkennt die Verwendung von Tag-Typen, die in „C“ sichtbar sind, in „C++“ jedoch aufgrund von Gültigkeitsbereichsbeschränkungen nicht.
- „-Wimplicit-int-enum-cast“ – erkennt implizite Konvertierungen im C-Code von Integer-Typen in Enumerationstypen, die mit „C++“ nicht kompatibel sind.
- „-Wtentative-definition-compat“ – Diagnose für vorläufige Definitionen in C mit mehreren Definitionen, die mit C++ nicht kompatibel sind.
- „-Wunterminated-string-initialization“ und „-Wc++-unterminated-string-initialization“ – erkennen Initialisierungssituationen aus einem Stringliteral, in denen der Trenner mit dem Nullcode nicht beibehalten werden kann. Das Attribut „nonstring“ wurde hinzugefügt, um Felder und Variablen im C-Code zu markieren, die kein abschließendes Nullzeichen erfordern.
- „-Wjump-misses-init“ – Diagnose eines Sprungs durch goto oder switch/case, der die Initialisierung einer lokalen Variable überspringt.
- „-Wundef-true“ – Warnt vor der Verwendung des Werts „true“ im C-Präprozessor, ohne ihn zu definieren.
- „-Wnrvo“ – Diagnose von verpassten NRVO (Named Return Value Optimization).
- Neue Compiler-Flags:
- „-fprofile-continuous“ – ermöglicht die kontinuierliche Synchronisierung des Profils mit der Datei.
- „-ftime-report-json“ – gibt Informationen zur Kompilierungszeit im JSON-Format aus.
- „-ignore-pch“ – vorkompilierte Header deaktivieren.
- „-fthinlto-distributor“ und „-Xthinlto-distributor“ – zur Verwendung von DTLTO (Integrated Distributed ThinLTO).
- "-static-libclosure" - zum statischen Verlinken der Blocks-Laufzeiterweiterung auf der Plattform Windows.
- Erweiterte Diagnose- und statische Analysetools, neue Prüfungen hinzugefügt (mehr als hundert diagnosebezogene Verbesserungen).
- Verbesserte Backends für ARM-, Aarch64-, AMDGPU-, x86-, RISC-V-, LoongArch-, MIPS- und PowerPC-Architekturen. Dem RISC-V-Backend wurde experimentelle Assembler-Unterstützung für Qualcomm uC-, Andes- und SiFive-Erweiterungen hinzugefügt.
Source: opennet.ru
