Nach einem Jahr der Entwicklung wurde die Veröffentlichung des freien Compilers GCC 13.1 bekannt gegeben, das erste signifikante Release in der neuen GCC 13.x-Serie. Gemäß dem neuen Versionsnummerierungsschema wurde Version 13.0 während der Entwicklungsphase verwendet, und kurz vor dem Release von GCC 13.1 wurde bereits der Entwicklungszweig GCC 14.0 abgezweigt, auf dessen Grundlage die nächste bedeutende Veröffentlichung GCC 14.1 entstehen wird.
Wesentliche Änderungen:
- In GCC wurde ein Frontend zur Erstellung von Programmen in der Programmiersprache Modula-2 aufgenommen. Die Kompilierung von Code, der den Dialekten PIM2, PIM3 und PIM4 sowie dem anerkannten ISO-Standard für diese Sprache entspricht, wird unterstützt.
- Im Quellbaum von GCC wurde ein Frontend mit einer Implementierung des Compilers für die Sprache Rust hinzugefügt, das vom Projekt gccrs (GCC Rust) entwickelt wurde. In seiner aktuellen Form wird das Frontend als experimentell markiert und ist standardmäßig deaktiviert. Nach der Fertigstellung des Frontends (die im nächsten Release erwartet wird) wird das reguläre GCC-Toolset zur Kompilierung von Programmen in Rust genutzt werden können, ohne dass der Compiler rustc, der auf den LLVM-Technologien basiert, installiert werden muss.
- Im Optimierungsmechanismus während der Link-Phase (LTO) wurde die Unterstützung für den Jobserver, der von GNU Make unterstützt wird, integriert, um die parallelisierte Ausführung von Builds in mehreren Threads zu optimieren. Im GCC wird der Jobserver verwendet, um die Arbeiten während der LTO-Optimierung im Kontext des gesamten Programms (WPA, Whole-program Analysis) zu parallelisieren. Für die Kommunikation mit dem Jobserver werden standardmäßig benannte Pipes verwendet (—jobserver-style=fifo).
- Im statischen Analyzer (-fanalyzer) wurden 20 neue Diagnoseprüfungen eingeführt, darunter «-Wanalyzer-out-of-bounds», «-Wanalyzer-allocation-size», «-Wanalyzer-deref-before-check», «-Wanalyzer-infinite-recursion», «-Wanalyzer-jump-through-null», «-Wanalyzer-va-list-leak».
- Die Möglichkeit, Diagnosen im SARIF-Format, das auf JSON basiert, auszugeben, wurde implementiert. Dieses neue Format kann verwendet werden, um Ergebnisse der statischen Analyse (GCC -fanalyzer) sowie Warnungen und Fehlerinformationen zu erhalten. Die Aktivierung erfolgt über die Option «-fdiagnostics-format=sarif-stderr|sarif-file|json-stderr|json|json-file», wobei Optionen mit «json» zu einer Ausgabe im speziellen GCC-JSON-Format führen.
- Einige Funktionen, die im C-Standard C23 definiert sind, wurden implementiert, darunter die Konstante nullptr zur Definition von Nullzeigern, die Vereinfachung der Verwendung von variadic-Argumentlisten, erweiterte Enumerationsmöglichkeiten, das noreturn-Attribut, die Erlaubnis zur Verwendung von constexpr und auto bei der Objekterstellung, die Operatoren typeof und typeof_unqual, neue Schlüsselwörter wie alignas, alignof, bool, false, static_assert, thread_local und true sowie die Möglichkeit, leere Klammern bei der Initialisierung anzugeben.
- Einige Funktionen, die im C++23-Standard definiert sind, wurden implementiert, darunter die Möglichkeit, Labels am Ende zusammengesetzter Ausdrücke zu platzieren, die Kompatibilität mit dem Typ char8_t, die Präprozessor-Direktive #warning, getrennte (\u{}, \o{}, \x{}) und benannte (‘\N{LATIN CAPITAL LETTER A}’) Escape-Sequenzen, static operator(), static operator[], Gleichheitsoperatoren innerhalb von Ausdrücken sowie die Ausnahme bestimmter Einschränkungen bei der Verwendung von constexpr und die Unterstützung von UTF-8 in Quelltexten.
- In libstdc++ wurde die experimentelle Unterstützung für die Standards C++20 und C++23 verbessert. Unter anderem wurde die Unterstützung für die Header-Datei und std::format hinzugefügt. Die Möglichkeiten der Header-Datei wurden erweitert, zusätzliche Gleitkommatypen eingeführt und die Header-Dateien sowie implementiert.
- Neue Funktionsattribute wurden hinzugefügt, um zu dokumentieren, dass ein Dateideskriptor in einer Ganzzahlvariablen übergeben wird: «__attribute__((fd_arg(N)))», «__attribute__((fd_arg_read(N)))» und «__attribute__((fd_arg_write(N)))». Diese Attribute können im statischen Analysator (-fanalyzer) verwendet werden, um unsachgemäßen Umgang mit Dateideskriptoren zu identifizieren.
- Ein neues Attribut «__attribute__((assume(EXPR)))» wurde hinzugefügt, mit dem dem Compiler mitgeteilt werden kann, dass ein Ausdruck wahr ist, wodurch der Compiler diesen Fakt ohne Berechnung des Ausdrucks verwenden kann.
- Es wurde das Flag «-fstrict-flex-arrays=[level]» hinzugefügt, um das Verhalten bei der Verarbeitung flexibler Array-Elemente in Strukturen auszuwählen (Flexible Array Members, ein Array unbestimmter Größe am Ende einer Struktur, z.B. «int b[]»).
- Das Flag "-Wenum-int-mismatch" wurde hinzugefügt, um Warnungen bei Diskrepanzen zwischen einem Enum-Typ und einem Ganzzahltyp auszugeben.
- Im Frontend für die Programmiersprache Fortran wurde die Unterstützung für die Finalisierung vollständig implementiert.
- Im Frontend für die Sprache Go wurde die Unterstützung für generische Funktionen und Typen hinzugefügt, die mit den Paketen für Go 1.18 kompatibel sind.
- Im Backend für die Architektur AArch64 wurde die Unterstützung für die CPUs Ampere-1A (ampere1a), Arm Cortex-A715 (cortex-a715), Arm Cortex-X1C (cortex-x1c), Arm Cortex-X3 (cortex-x3) und Arm Neoverse V2 (neoverse-v2) implementiert. Unterstützung für die Argumente "armv9.1-a", "armv9.2-a" und "armv9.3-a" wurde zur Option "-march=" hinzugefügt. Unterstützung für die CPU-Erweiterungen FEAT_LRCPC, FEAT_CSSC und FEAT_LSE2 wurde hinzugefügt.
- Im Backend für die ARM-Architektur wurde die Unterstützung für die CPUs STAR-MC1 (star-mc1), Arm Cortex-X1C (cortex-x1c) und Arm Cortex-M85 (cortex-m85) hinzugefügt.
- Im Backend für die x86-Architektur wurde die Unterstützung für die Prozessoren Intel Raptor Lake, Meteor Lake, Sierra Forest, Grand Ridge, Emerald Rapids, Granite Rapids sowie für die AMD Zen 4-Prozessoren (znver4) hinzugefügt. Die in den Intel-Prozessoren vorgeschlagenen Erweiterungen des Befehlssatzes AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT, CMPccXADD, AMX-FP16, PREFETCHI, RAO-INT und AMX-COMPLEX wurden implementiert. Für die Sprachen C und C++ wurden auf Systemen mit SSE2 der Typ __bf16 bereitgestellt.
- Im Backend der Code-Generierung für GPU AMD Radeon (GCN) wurde die Möglichkeit implementiert, AMD Instinct MI200 Beschleuniger zur Leistungssteigerung von OpenMP/OpenACC zu nutzen. Die Vektorisierung wurde durch SIMD-Befehle verbessert.
- Die Backend-Funktionen für die LoongArch-Plattform wurden erheblich erweitert.
- Im Backend für die RISC-V-Architektur wurde Unterstützung für die CPU T-Head’s XuanTie C906 (thead-c906) hinzugefügt. Unterstützung für vektorielle Prozessoren, die in der Spezifikation RISC-V Vector Extension Intrinsic 0.11 definiert sind, wurde implementiert. 30 Erweiterungen der RISC-V-Spezifikationen wurden hinzugefügt.
- Beim Erstellen von Shared Objects mit der Option „-shared“ wurde das Hinzufügen von Startcode nach der Hinzufügung der Umgebung für Fließkomma-Berechnungen eingestellt, wenn die Optimierungen „-Ofast“, „-ffast-math“ oder „-funsafe-math-optimizations“ aktiviert sind.
- Die Unterstützung für das Debugging-Format DWARF wurde fast in allen Konfigurationen implementiert.
- Die Option „-gz=zstd“ zur Kompression von Debugging-Informationen mit dem Zstandard-Algorithmus wurde hinzugefügt. Die Unterstützung des veralteten Modus zur Kompression von Debugging-Informationen „-gz=zlib-gnu“ wurde eingestellt.
- Die anfängliche Unterstützung von OpenMP 5.2 (Open Multi-Processing) wurde hinzugefügt, und die Implementierung der Standards OpenMP 5.0 und 5.1, die die API und Methoden zur Anwendung von paralleler Programmierung auf Mehrkern- und hybriden Systemen (CPU+GPU/DSP) mit gemeinsamem Speicher und Vektorblockierung (SIMD) definieren, wurde fortgesetzt.
- Die Unterstützung des veralteten Formats zur Speicherung von Debugging-Informationen „STABS“ (mit den Optionen -gstabs und -gxcoff) wurde eingestellt. Dieses Format wurde in den 1980er Jahren erstellt und im Debugger dbx verwendet.
- Die Unterstützung von Solaris 11.3 wurde als veraltet erklärt (der entsprechende Support-Code für diese Plattform wird in der nächsten Version entfernt).
Quelle: opennet.ru
