Release des LLVM Compiler-Set 21

Nach sechsmonatiger Entwicklung wird die Version 21.1.0 des LLVM-Projekts veröffentlicht, das Tools (Compiler, Optimierer und Code-Generatoren) entwickelt, die Programme in einen Zwischen-Bitcode für RISC-ähnliche virtuelle Instruktionen kompilieren (eine Low-Level-virtuelle Maschine mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann in Maschinencode für die angegebene Zielplattform umgewandelt oder von einem JIT-Compiler verwendet werden, um Maschinencodes direkt während der Programmausführung zu erzeugen. Basierend auf der LLVM-Technologie wird der Compiler Clang entwickelt, der die Programmiersprachen C, C++ und Objective-C unterstützt. Ab der Version 18.x hat das Projekt auf ein neues Schema zur Vergabe von Versionsnummern umgestellt, bei dem die Nullversion („N.0“) im Entwicklungsprozess verwendet wird und die erste stabile Version mit der Nummer „N.1“ versehen wird.

Zu den Verbesserungen in Clang 21 gehören:

  • Funktionen im Zusammenhang mit C++:
    • Analog zu GCC wurde die Möglichkeit implementiert, konstante Ausdrücke in durch die Direktive «asm» definierten Assembler-Einfügungen zu verwenden: int foo() { asm((std::string_view("nop")) ::: (std::string_view("memory"))); }
    • Erweiterte Ausdrücke für «new» und «delete» hinzugefügt, die das Argument «std::type_identity» unterstützen, über das Informationen zum Typ des Objekts angegeben werden können, für das Speicher zugewiesen oder freigegeben wird.
    • Die Möglichkeit zur Berechnung von Lambda-Funktionen, die strukturierte Bindungen (structured binding) erfassen, im Compile-Zeit-Kontext eines konstanten Ausdrucks wurde hinzugefügt.
  • Funktionen im Zusammenhang mit dem zukünftigen C++2c-Standard (C++26):
    • Der strukturierte Bindungen wurde die Möglichkeit hinzugefügt, die Syntax "..." zur Angabe von Packungen (pack) zu verwenden, die die verbleibende Anzahl von Elementen aus der zuweisbaren Sequenz erfassen. auto [x,y,z] = f(); // in die Variablen x, y, z werden drei Elemente gespeichert, die von f() zurückgegeben wurden. auto […xs] = f(); // in das Paket xs werden alle Elemente gespeichert, die von f() zurückgegeben wurden. auto [x, …rest] = f(); // In x wird das erste Element und in rest die übrigen gespeichert. auto [x, y, …rest] = f(); // In x wird das erste Element, in y das zweite und in rest das dritte gespeichert. auto [x, …rest, z] = f(); // in x das erste, in rest das zweite und in z das dritte.
    • Die Unterstützung für die "triviale Relokation" von Typen (Trivial Relocatability) wurde hinzugefügt, was es ermöglicht, Bewegungen von Objekten eines bestimmten Typs durch deren Klonen im Speicher zu optimieren, ohne Konstruktoren oder Destruktoren aufzurufen. Für Klassen wurden die Eigenschaften memberwise_trivially_relocatable und memberwise_replaceable implementiert, und für die niedrigstufige Relokation eines oder mehrerer Objekte wurden die Funktionen trivially_relocate_at und trivially_relocate hinzugefügt.
    • Die Möglichkeit der Anwendung von strukturiertem Binding als Bedingung in den if- und switch-Anweisungen ist hinzugefügt worden.
    • Die Unterstützung für das Anheften der main-Funktion an ein globales Modul und für die Definition der main-Funktion in benannten Modulen wurde implementiert.
  • Funktionen, die für den zukünftigen Standard C2y entwickelt werden:
    • Unbestimmtes Verhalten bei der Verwendung von Ausdrücken mit dem Typ void in bestimmten Kontexten, beispielsweise «(void)(void)1;», wurde behoben.
    • Es ist nun erlaubt, eine Quellcodedatei nicht mit einem Zeilenumbruchzeichen zu beenden.
    • Neue Präfixe für octale Literale — 0o und 0O — sowie octale und hexadezimale Escape-Sequenzen «\o{…}» und «\x{…}» hinzugefügt. Die Unterstützung für octale Literale 0xxx ist als veraltet gekennzeichnet. 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 die Variante des Makros „countof“ definiert, das über „_Countof“ implementiert ist.
  • Funktionen, die im C-Standard von C23 definiert sind:
    • Es ist erlaubt, Tag-Typen (struct, union, enum) innerhalb eines Übersetzungsblocks zu überschreiben, solange die erneuten Definitionen strukturell äquivalent sind (d.h. die gleiche Anzahl an Mitgliedern, identische Typen und Namen der Tags aufweisen).
    • Die Nutzung von variadischen Listen wurde vereinfacht. Es ist erlaubt, einen einzelnen variadischen Parameter im Typnamen zu verwenden.
    • Die mit GCC kompatible eingebaute Funktion „__builtin_c23_va_start()“ wurde hinzugefügt, um das Diagnoseverhalten für das Makro va_start() im C23-Modus zu verbessern.
  • Im Kompatibilitätsmodus mit dem MSVC-Compiler ist die Verwendung des inline-Spezifizierers bei der Typdefinition über typedef erlaubt, z.B. „typedef int inline Foo(int);“
  • Der Qualifikator „restrict“ darf für Typen von Arrays mit Zeiger-Elementen verwendet werden.
  • Neue Compiler-Warnungen:
    • „-Wdefault-const-init-var“ und „-Wdefault-const-init-field“ – Identifizierung von mit dem const-Attribut gekennzeichneten Variablen und Feldern, die ohne explizite Initialisierung definiert sind.
    • «-Wimplicit-void-ptr-cast» — wird bei einer impliziten Umwandlung von „void*“ in einen anderen Zeigertyp ausgegeben.
    • «-Wc++-keyword» — wird bei der Verwendung von „C++“-Schlüsselwörtern als Bezeichner in „C“ ausgegeben.
    • «-Wc++-hidden-decl» — erkennt die Verwendung von Tagtypen, die in „C“ sichtbar, aber in „C++“ aufgrund von Sichtbarkeitsbeschränkungen nicht sichtbar sind.
    • «-Wimplicit-int-enum-cast» — erkennt implizite Umwandlungen in C-Code von ganzzahligen Typen in Enumerationen, die mit „C++“ nicht kompatibel sind.
    • «-Wtentative-definition-compat» — diagnostiziert vorläufige Definitionen in „C“ mit mehreren Definitionen, die mit „C++“ nicht kompatibel sind.
    • «-Wunterminated-string-initialization» und «-Wc++-unterminated-string-initialization» — erkennen Situationen der Initialisierung aus einem Stringliteral, in denen der nullterminierende Separator nicht erhalten werden kann. Für Felder und Variablen im C-Code, die kein abschließendes Nullzeichen erfordern, wurde das Attribut „nonstring“ hinzugefügt.
    • «-Wjump-misses-init» — diagnostiziert Sprünge durch goto oder switch/case, die die Initialisierung einer lokalen Variablen überspringen.
    • «-Wundef-true» — warnt vor der Verwendung des Werts „true“ im C-Präprozessor ohne Definition.
    • «-Wnrvo» — Diagnose fehlender NRVO (Named Return Value Optimization).
  • Neue Compiler-Flags:
    • «-fprofile-continuous» — Aktivierung der kontinuierlichen Profilsynchronisation in eine Datei.
    • «-ftime-report-json» — Ausgabe von Informationen zur Kompilierungszeit im JSON-Format.
    • «-ignore-pch» — Deaktivierung vorkompilierter Header.
    • «-fthinlto-distributor» und «-Xthinlto-distributor» — für die Anwendung von DTLTO (Integrated Distributed ThinLTO).
    • «-static-libclosure» — für das statische Verlinken von Runtime-Erweiterungen für Blocks auf der Windows-Plattform.
  • Die Diagnose- und statischen Analysewerkzeuge wurden erweitert, mit über einhundert neuen Verbesserungen in der Diagnostik.
  • Die Backends für die Architekturen ARM, Aarch64, AMDGPU, x86, RISC-V, LoongArch, MIPS und PowerPC wurden verbessert. Das Backend für RISC-V hat experimentelle Unterstützung für den Assembler für [[https://llvm.org/docs/RISCVUsage.html Qualcomm uC, Andes und SiFive Erweiterungen hinzugefügt.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Servern | ProHoster