Nach sechsmonatiger Entwicklungszeit wurde LLVM 22.1.0 veröffentlicht. Es entwickelt Werkzeuge (Compiler, Optimierer und Codegeneratoren), die Programme in Zwischencode aus RISC-ähnlichen virtuellen Befehlen kompilieren (eine Low-Level-Virtual-Machine mit einem mehrstufigen Optimierungssystem). Der generierte Pseudocode kann in Maschinencode für eine bestimmte Zielplattform umgewandelt oder von einem Just-in-Time-Compiler (JIT) verwendet werden, um während der Programmausführung direkt Maschinenbefehle zu generieren. Basierend auf LLVM-Technologien entwickelt das Projekt den Clang-Compiler, der die Programmiersprachen C, C++ und Objective-C unterstützt. Ab dem 18.x-Zweig verwendet das Projekt ein neues Versionsnummerierungsschema: Während der Entwicklung wird die Version 0 („N.0“) verwendet, die erste stabile Version erhält die Nummer „N.1“.
Zu den Verbesserungen in Clang 22 gehören:
- Es wurde die Unterstützung für Speicherzuweisungstoken (Allocation Tokens) hinzugefügt, um Speicherzuweisungsoperationen, die mit Funktionen wie malloc durchgeführt werden, mit einer eindeutigen Kennung zu versehen. Allocation Tokens ermöglichen die Strukturierung von Heap-Informationen, vereinfachen die Erkennung von Speicherlecks und ermöglichen die Gruppierung von Objekten basierend auf ihrem Zweck oder ihren Änderungsmustern (z. B. die Trennung von „heißen“ und „kalten“ Daten). Zur Aktivierung verwenden Sie das Flag „-fsanitize=alloc-token“.
- Merkmale der Programmiersprache C:
- Ein Entwurf der Spezifikation, der den Mechanismus für verzögerte Ausführung („defer“) definiert, wurde implementiert. Dadurch können Aktionen ausgeführt werden, wenn der aktuelle Gültigkeitsbereich verlassen wird. Das Flag „-fdefer-ts“ wurde hinzugefügt, um die Unterstützung für „defer“ zu aktivieren.
- Die integrierte Funktion `__builtin_stack_address()` wurde hinzugefügt und entspricht der entsprechenden Funktion in GCC. Diese Funktion gibt die Stackadresse zurück, die den Stackbereich der aktuellen Funktion, die `__builtin_stack_address()` aufgerufen hat, von den nachfolgenden Funktionen trennt, die sie aufruft.
- Für den zukünftigen C2y-Standard werden folgende Funktionen entwickelt:
- Es wurde Unterstützung für benannte Schleifen hinzugefügt. Dadurch können Sie Schleifen und switch-Anweisungen Namen zuweisen, die in break- und continue-Anweisungen angegeben werden können, um die Schleife, aus der sie verlassen werden sollen, explizit zu definieren. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // gehe zu CONT1 continue outer; // gehe zu CONT2 // CONT1 } // CONT2 }
- Die Implementierung des integrierten Makros „__COUNTER__“, das zur Generierung eindeutiger Kennungsnamen dient, wurde erweitert und in den Standard aufgenommen. Es wurde ein Limit von 2147483647 Aufrufen dieses Makros festgelegt; wird dieses Limit überschritten, tritt ein Fehler auf.
- Die Warnung (-Wstatic-in-inline) beim Verwenden statischer Funktionen oder Variablen innerhalb von Funktionen, die als "extern inline" deklariert sind, wurde entfernt.
- Im C23 C-Standard definierte Funktionen:
- Die Header-Datei float.h unterstützt nun die Makros FLT_SNAN, DBL_SNAN und LDBL_SNAN, welche signalisierte (bei Verwendung in arithmetischen Operationen eine Ausnahme auslösende) NaN-Werte für die Datentypen float, double und long double implementieren.
- Es wurde ein Fehler behoben, bei dem verschiedene unbenannte Typen innerhalb derselben Übersetzungseinheit als kompatibel behandelt wurden, wenn sie die gleichen Felder hatten.
- Die Option "-MG", die dazu dient, fehlende Header-Dateien während der Abhängigkeitsprüfung zu ignorieren, wurde auf "#embed"-Direktiven erweitert und unterdrückt nun den Fehler "Datei nicht gefunden", wenn eine in einer "#embed"-Direktive angegebene Datei fehlt.
- C++-bezogene Funktionen:
- Die Möglichkeit, strukturierte Bindungen im Kontext von „constexpr“ zu verwenden, wie in der C++2c-Spezifikation (C++26) entwickelt, wurde hinzugefügt. Dies bedeutet, dass Verweise auf konstante Ausdrücke nun selbst konstante Ausdrücke sein können. Unterstützung ist für Arrays und einfache Strukturen implementiert (Tupel werden noch nicht unterstützt). `constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;`
- Gemäß dem C++20-Standard werden Einschränkungen nun vor der Überprüfung in die Standardform konvertiert, was genauere Diagnosemeldungen und eine korrekte Behandlung von Ersetzungsfehlern in Template-Argumenten ermöglicht, die nur in Konzept-IDs verwendet werden.
- Es wurde eine Familie von eingebauten Funktionen hinzugefügt: "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", um herauszufinden, ob die Vergleichsoperatoren "<", "">", "<="", und "">=" aus dem Operator "<=>" synthetisiert wurden.
- Der Parameter „-Wincompatible-pointer-types“ wurde geändert und gibt nun einen Fehler anstelle einer Warnung aus. Um zum vorherigen Verhalten zurückzukehren, verwenden Sie die Option „-Wno-error=incompatible-pointer-types“.
- Es wurden die integrierten Funktionen `__builtin_bswapg`, `__builtin_elementwise_ldexp`, `__builtin_elementwise_fshl`, `__builtin_elementwise_fshr`, `__builtin_elementwise_minnumnum`, `__builtin_elementwise_maxnumnum`, `__builtin_masked_load`, `__builtin_masked_expand_load`, `__builtin_masked_store`, `__builtin_masked_compress_store`, `__builtin_masked_gather`, `__builtin_masked_scatter` und `__builtin_dedup_pack` hinzugefügt. Mit `__builtin_dedup_pack` lassen sich beispielsweise Duplikate aus einer Liste von Typen entfernen: `using MyTypeList = TypeList<__builtin_dedup_pack>` …>; // Der resultierende Typ ist TypeList
- Beim Debuggen von undefiniertem Verhalten mit UBSan (-fsanitize=undefined -fsanitize-trap=undefined) werden nun Fehlerursacheninformationen in die generierten Debug-Informationen aufgenommen. Mit dem Flag „-fsanitize-debug-trap-reasons“ lässt sich der Detaillierungsgrad der Fehlerinformationen festlegen. Es kann auf „basic“ für allgemeine Beschreibungen (z. B. „Überlauf bei der Addition von Ganzzahlen“) und auf „detailed“ für detaillierte Informationen (z. B. „Überlauf bei der Addition von vorzeichenbehafteten Ganzzahlen in 'a + b'“) gesetzt werden.
- Neue Compiler-Flags hinzugefügt:
- Mit der Option "-f[no-]sanitize-debug-trap-reasons" kann gesteuert werden, ob die Gründe für Ausnahmebehandlungen in die Debug-Informationen eingebettet werden, wenn mit dem Modus "-fsanitize-trap" kompiliert wird.
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", und "-fsanitize-alloc-token-extended" zur Verwaltung von Speicherzuweisungstoken.
- "-fmatrix-memory-layout" zur Steuerung des Speicherlayouts von Matrixtypen (z. B. column-major für spaltenorientierte Speicherung, row-major für zeilenorientierte Speicherung).
- Funktionen verfügen nun über ein "malloc_span"-Attribut, das dem malloc-Attribut ähnelt, aber auf Funktionen anwendbar ist, die span-ähnliche Strukturen zurückgeben, welche einen Zeiger und ein Feld mit der Größe oder einen Zeiger auf das Ende des Blocks enthalten.
- Das Attribut "modular_format" wurde hinzugefügt, um die benötigte statisch verknüpfte Implementierung der printf-Funktion zur Linkzeit dynamisch auszuwählen.
- Die Diagnose- und statischen Analysewerkzeuge wurden erweitert, neue Prüfungen wurden hinzugefügt (mehrere Dutzend Verbesserungen im Bereich der Diagnose).
- Dem x86-Backend wurden zusätzliche intrinsische Funktionen für die SSE-, AVX- und AVX512-Erweiterungen hinzugefügt. Außerdem wurden Build-Modi für Intel-CPUs basierend auf den Mikroarchitekturen Wildcat Lake (-march=wildcatlake) und Nova Lake (-march=novalake) implementiert.
- Das AArch64-Backend unterstützt nun die Prozessoren Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) und Arm C1-Ultra (c1-ultra) von Ampere Computing. Zusätzliche integrierte Funktionen wurden für die Befehle FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] und FCVTA[US] hinzugefügt. Die Unterstützung für Funktions-Multiversionierung (FMV) wurde stabilisiert. Benutzer können nun die Priorität verschiedener Funktionsversionen überschreiben.
- Unterstützung für die LoongArch32 (LA32R, LA32S)-Architektur hinzugefügt.
- Verbesserte Backends für ARM-, AMDGPU-, RISC-V-, LoongArch64-, MIPS-, WebAssembly- und PowerPC-Architekturen.
Source: opennet.ru
