Nach sechs Monaten Entwicklung wird die Version 22.1.0 des LLVM-Projekts veröffentlicht, die Tools (Compiler, Optimierer und Code-Generatoren) bereitstellt, die Programme in intermediate Bitcode für RISC-ähnliche virtuelle Instruktionen (eine niedrigstufige virtuelle Maschine mit einem mehrstufigen Optimierungssystem) kompilieren. Der generierte Pseudocode kann in Maschinencode für eine bestimmte Zielplattform umgewandelt oder von einem JIT-Compiler verwendet werden, um Maschinenausführungsanweisungen direkt zur Laufzeit des Programms zu erzeugen. Auf der Basis der LLVM-Technologien 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 der Nullrelease („N.0“) während der Entwicklung verwendet wird und die erste stabile Version die Nummer „N.1“ erhält.
Zu den Verbesserungen in Clang 22 gehören:
- Unterstützung für Speicherauslastungstoken (Allocation Token) hinzugefügt, um Speicherzuweisungsoperationen, die über Funktionen wie malloc durchgeführt werden, mit einer eindeutigen Kennung zu kennzeichnen. Die Identifikatoren ermöglichen es, die Informationen im Speicher (Heap) zu strukturieren, das Erkennen von Speicherlecks zu erleichtern und die Gruppierung von Objekten basierend auf ihrer Zuordnung oder Art der Änderungen zu realisieren (z. B. „heiße“ oder „kalte“ Daten zu trennen). Zur Aktivierung sollte das Flag „-fsanitize=alloc-token“ verwendet werden.
- C-bezogene Funktionen:
- Ein Entwurf der Spezifikation, die den Mechanismus der verzögerten Ausführung „defer“ definiert, wurde implementiert, was die Ausführung von Aktionen beim Verlassen des aktuellen Gültigkeitsbereichs ermöglicht. Zur Aktivierung der Unterstützung für „defer“ wurde das Flag „-fdefer-ts“ hinzugefügt.
- Die eingebaute Funktion __builtin_stack_address() wurde hinzugefügt, die der ähnlichen Funktion in GCC entspricht. Die Funktion gibt die Adresse im Stack zurück, die den Bereich des Stacks der aktuellen Funktion, die __builtin_stack_address() aufgerufen hat, und den anschließend aufgerufenen Funktionen trennt.
- Funktionen, die für den zukünftigen Standard C2y entwickelt werden:
- Die Unterstützung für benannte Schleifen wurde hinzugefügt, die es ermöglichen, Schleifen und den switch-Befehl benennen zu können. Diese Namen können in den break- und continue-Anweisungen verwendet werden, um explizit die Schleife zu kennzeichnen, aus der ausgegangen wird. outer: for (int i = 0; i < IK; ++i) { for (int j = 0; j < JK; ++j) { continue; // Übergang zu CONT1 continue outer; // Übergang zu CONT2 // CONT1 } // CONT2 }
- Die Implementierung des eingebauten Makros „__COUNTER__“ wurde erweitert und in den Standard aufgenommen. Dieses Makro dient zur Erzeugung einzigartiger Namen für Bezeichner. Es wurde eine Grenze von 2147483647 Aufrufen dieses Makros festgelegt, nach deren Überschreitung ein Fehler ausgegeben wird.
- Die Ausgabe der Warnung (-Wstatic-in-inline) wurde entfernt, wenn statische Funktionen oder Variablen innerhalb von als „extern inline“ deklarierten Funktionen verwendet werden.
- Funktionen, die im C-Standard von C23 definiert sind:
- Die Unterstützung der Makros FLT_SNAN, DBL_SNAN und LDBL_SNAN, die signalisierende (eine Ausnahme bei Verwendung in arithmetischen Operationen auslösende) NaN-Werte für die Typen float, double und long double implementieren, wurde zur Header-Datei float.h hinzugefügt.
- Ein Fehler wurde behoben, durch den verschiedene unbenannte Typen innerhalb einer Übersetzungseinheit als kompatibel behandelt wurden, wenn ihre Felder übereinstimmten.
- Das Flag '-MG', das verwendet wird, um das Fehlen von Header-Dateien beim Scannen von Abhängigkeiten zu ignorieren, wurde auf die Direktiven '#embed' ausgeweitet und unterdrückt nun die Fehlermeldung 'Datei nicht gefunden', wenn die in der Direktive '#embed' angegebene Datei fehlt.
- Funktionen im Zusammenhang mit C++:
- Eine in der C++2c (C++26) -Spezifikation eingeführte Funktion ermöglicht die Verwendung von strukturierten Bindungen im Kontext von 'constexpr', d.h. Referenzen auf konstante Ausdrücke können nun selbst konstante Ausdrücke sein. Die Unterstützung wurde für Arrays und einfache Strukturen implementiert (Tuples werden derzeit nicht unterstützt). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- Gemäß den Anforderungen des C++20-Standards wird die Umwandlung der Einschränkungen (constraints) vor der Überprüfung auf ihre Erfüllung in eine Standardform sichergestellt, was genauere Diagnosemeldungen ermöglicht und die Fehlerbehandlung bei der Substitution von Argumenten in Konzept-IDs korrekt behandelt.
- Eine Familie von eingebauten Funktionen "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" wurde hinzugefügt, die es ermöglicht zu überprüfen, ob die Vergleichsoperatoren "", "=" aus dem Operator "" synthetisiert wurden.
- Der Parameter "-Wincompatible-pointer-types" gibt nun einen Fehler aus statt einer Warnung. Um das alte Verhalten wiederherzustellen, sollte die Option "-Wno-error=incompatible-pointer-types" verwendet werden.
- Eingebaute 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 wurden hinzugefügt. Zum Beispiel ermöglicht builtin_dedup_pack das Entfernen von Duplikaten aus einer Typliste: using MyTypeList = TypeList<__builtin_dedup_pack...>; // Der resultierende Typ wird TypeList sein.
- Bei der Fehlersuche bei undefiniertem Verhalten mittels UBSan (-fsanitize=undefined -fsanitize-trap=undefined) wird sichergestellt, dass die generierten Debug-Infos Informationen über die Ursachen von Fehlern enthalten. Um die Detailgenauigkeit der Fehlermeldungen anzupassen, wurde die Option „-fsanitize-debug-trap-reasons“ hinzugefügt, die den Wert „basic“ für allgemeine Beschreibungen (z. B. „Integer Addition übergelaufen“) und „detailed“ für detaillierte Informationen (z. B. „Überlauf bei der Addition von signed integers in ‚a + b'“) annehmen kann.
- Neue Compiler-Flags hinzugefügt:
- „-f[no-]sanitize-debug-trap-reasons“ zur Steuerung der Einbettung von Ausnahmeursachen (trap) in die Debug-Informationen beim Kompilieren im Modus „-fsanitize-trap“.
- „-fsanitize=alloc-token“, „-falloc-token-max“, „-fsanitize-alloc-token-fast-abi“ und „-fsanitize-alloc-token-extended“ zur Verwaltung von Speicherzuweisungstokens.
- „-fmatrix-memory-layout“ zur Steuerung der Platzierung von Matrizen-Typen im Speicher (z. B. column-major — spaltenweise, row-major — zeilenweise).
- Für Funktionen wurde das Attribut „malloc_span“ eingeführt, das ähnlich wie das Attribut malloc ist, aber für Funktionen verwendet wird, die span-ähnliche Strukturen zurückgeben, die einen Pointer und ein Größen- oder Endpointerfeld enthalten.
- Das Attribut «modular_format» wurde hinzugefügt, um während der Kompilierung die erforderliche statisch gebundene Implementierung der printf-Funktion dynamisch auszuwählen.
- Die Diagnose- und statischen Analysewerkzeuge wurden erweitert, neue Prüfungen hinzugefügt (mehrere Dutzend Verbesserungen im Bereich Diagnose).
- Zusätzliche integrierte Funktionen (Intrinsics) für die SSE-, AVX- und AVX512-Erweiterungen wurden zum Backend für die X86-Architektur hinzugefügt. Es wurden Build-Modi für Intel-CPUs basierend auf den Mikroarchitekturen Wildcat Lake (-march=wildcatlake) und Nova Lake (-march=novalake) hinzugefügt.
- Die Unterstützung für Prozessoren von Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) und Arm C1-Ultra (c1-ultra) wurde zum Backend für die AArch64-Architektur hinzugefügt. Es wurden zusätzliche integrierte Funktionen für die Befehle FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] und FCVTA[US] hinzugefügt. Die Unterstützung für FMV (Function Multi-Versioning) wurde stabilisiert. Benutzern wurde die Möglichkeit gegeben, die Priorität verschiedener Funktionsversionen zu überschreiben.
- Die Unterstützung für die LoongArch32-Architektur (LA32R, LA32S) wurde hinzugefügt.
- Die Backends für die Architekturen ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly und PowerPC wurden verbessert.
Quelle: opennet.ru
