Nach einem Jahr Entwicklung wurde die kostenlose GCC-Compilersuite GCC 15.1 veröffentlicht, die erste Hauptversion im neuen GCC 15.x-Zweig. Gemäß dem Release-Nummerierungsschema wurde während der Entwicklung die Version 15.0 verwendet und kurz vor der Veröffentlichung von GCC 15.1 wurde bereits ein Zweig von GCC 16.0 geforkt, der die Grundlage für das nächste Hauptrelease GCC 16.1 bilden wird.
Wichtigste Änderungen:
- Beim Kompilieren von C-Programmen wird standardmäßig der C23-Standard (Change Summary) mit GNU-Erweiterungen („-std=gnu23“) verwendet. Bisher wurde standardmäßig der C17-Standard verwendet (-std=gnu17). Die Änderung könnte möglicherweise beim Erstellen vorhandener Projekte aufgrund der Einbeziehung der Nullptr-Konstante, des Typs _BitInt(n) und der Schlüsselwörter bool, true und false zu Problemen führen, da diese mit ähnlich benannten Bezeichnern in Konflikt geraten könnten, die in Anwendungen definiert sind.
- Die folgenden Funktionen des C23-Standards wurden implementiert:
- Die Direktive „#embed“ dient zum Einbetten binärer Ressourcen in Code.
- Das Attribut „unsequenced“, das angibt, dass das Ergebnis nicht von der Reihenfolge der Ausführung abhängt.
- Das Attribut „reproduzierbar“ gibt an, dass die Funktion bei gleicher Eingabe immer das gleiche Ergebnis liefert, also nicht von anderen Faktoren abhängt.
- Elemente des zukünftigen C2Y-Standards wurden implementiert (-std=c2y und -std=gnu2y):
- Möglichkeit, Variablen in einer „if“-Anweisung zu deklarieren, z. B. „if (int x = get ()) {...}“.
- Unterstützung für die Benennung von Schleifen, um im Code auf sie zu verweisen. äußere: für (int i = 0; i < IK; ++ i) { Schalter (i) { Fall 1: Unterbrechung; // springt zu CONT1 Fall 2: break outer; // springt zu CONT2 } // CONT1 } // CONT2
- Unterstützung für die Angabe von Bereichen ganzzahliger Werte in Case-Ausdrücken, z. B. „case 1…10:“.
- Die Suffixe „i“ und „j“ bezeichnen den Imaginärteil in komplexen Zahlen.
- Möglichkeit der Verwendung der Operatoren „++“ und „—“ mit komplexen Zahlen.
- Die Konstruktion „_Generic(type, expr1, expr2, …)“ zum Auswählen eines Ausdrucks basierend auf dem Operandentyp.
- Unterstützung für den Zugriff auf Byte-Arrays wie andere Objekttypen, z. B. Strukturen und Vereinigungen.
- Unterstützung für die Anwendung des Operators „alignof“ auf unvollständige Arrays (die ohne Angabe einer Größe deklariert wurden, z. B. „int a[]“).
- Neue Syntax für oktale, hexadezimale und universelle Zeichen-Escape-Sequenzen hinzugefügt. Anstelle von „\u“, „\x“ und „\nnn“ werden die Sequenzen „\u{}“, „\o{}“ und „\x{}“ vorgeschlagen, in denen beliebig viele Ziffern angegeben werden können.
- Integrierte Funktionen „__builtin_stdc_rotate_left“ und „__builtin_stdc_rotate_right“.
- Nulllängenoperationen auf NULL-Zeigern sind zulässig (z. B. „sizeof(*p)“).
- Das Frontend für die Sprache C++ implementiert Funktionen, die für den zukünftigen C++26-Standard entwickelt werden:
- Variationsoperator „Freund“ („Freund Ts …“).
- Die Möglichkeit, das Schlüsselwort constexpr mit einer Variation des neuen Operators (placement new) zu verwenden, um ein Objekt zur Kompilierzeit in den vorab zugewiesenen Speicher zu platzieren.
- Fehlerausgabe beim Löschen eines Zeigers auf einen unvollständigen Typ.
- Die Syntax zum Definieren variadischer Parameter mit Auslassungspunkten ohne vorangestelltes Komma (z. B. bei der Angabe von „void e(int…)“ anstelle von „void e(int, …)“) ist veraltet.
- Indizierung eines Parameterpakets in Vorlagen.
- Attribute für strukturierte Bindungen;
- Syntax '= löschen("Grund")';
- Aufnahme von „@“, „$“ und „`“ in den Basiszeichensatz.
- Die Verwendung von Makros zum Deklarieren von Modulen ist verboten.
- Möglichkeit, strukturierte Bindungen als Bedingung in if- und switch-Anweisungen zu verwenden.
- Die Unterstützung für den direkten Array-Vergleich (z. B. „int arr1[5]; int arr2[5]; bool same = arr1 == arr2“) wurde eingestellt.
- Der „#embed“-Mechanismus zum Einbetten binärer Ressourcen.
- Die Vorlagenklasse is_trivial ist veraltet.
- Hinzugefügte C++23-Funktionen:
- Einige Verwendungen der Direktive „export“ sind nicht zulässig, die Verwendung von „export {}“ ist jedoch zulässig.
- Unterstützung für die Verlängerung der Lebensdauer temporärer Objekte in For-Schleifen, die über Bereiche iterieren.
- Die Bibliothek libstdc++ implementiert experimentelle Unterstützung für die Module std und std.compat.
- Die Verwendung des Initialisierers „{0}“ für Unions in C- und C++-Code garantiert nicht mehr, dass der gesamte Inhalt gelöscht wird, sondern führt stattdessen dazu, dass das erste Element der Union auf Null gesetzt wird. Um die gesamte Vereinigung zu löschen, verwenden Sie den in der C23-Spezifikation definierten Ausdruck „{}“ oder geben Sie die Option „-fzero-init-padding-bits=unions“ an, um das alte Verhalten wiederherzustellen.
- Unterstützung für das Attribut „musttail“ ([[gnu::musttail]] und [[clang::musttail]]) für garantierte Tail-Calls implementiert. Das Attribut gilt für Return-Anweisungen, die einen rekursiven Aufruf der aktuellen Funktion durchführen, und stellt sicher, dass bei einem solchen Aufruf eine Endrekursion verwendet wird, die keinen zusätzlichen Speicher auf dem Stapel zuweist (wodurch das Risiko eines Speichermangels bei einer sehr großen Anzahl von Aufrufen eliminiert wird).
- Implementierte Unterstützung für das flag_enum-Attribut ([[gnu::flag_enum]] und [[clang::flag_enum]]), das auf Aufzählungen angewendet wird, um anzuzeigen, dass die Inhalte in bitweisen Operationen verwendet werden (verhindert Warnungen im -Wswitch-Modus).
- Unterstützung für das Attribut „counted_by“ hinzugefügt, mit dem ein Feld in einer Struktur mit einem flexiblen Array angegeben werden kann, das die Anzahl der Elemente bestimmt. Das Attribut kann verwendet werden, um die Effizienz von Pufferüberlaufprüfungen zu verbessern.
- Den Funktionen wurde das Attribut „nonnull_if_nonzero“ hinzugefügt, das angibt, dass einige Funktionsparameter mit Zeigern nur dann NULL sein können, wenn ein anderer Parameter Null ist.
- Erweiterter Assembler, der „asm(….)“ außerhalb von Funktionen einfügt, ist zulässig. Bei Assembler-Einfügungen ist es zulässig, Speicher in der roten Zone des Stapels (dem Bereich oben auf dem Stapel) zu überschreiben.
- Die Kompilierung von C++-Code ist dank verbessertem Template-Hashing schneller.
- Neue Optimierungen hinzugefügt. Es wurde Unterstützung für die Vektorisierung von Schleifen implementiert, die Code für ein vorzeitiges Beenden enthalten (z. B. über einen Break- oder Return-Aufruf), selbst wenn solche Schleifen dynamisch zugewiesene Arrays oder Puffer manipulieren, deren Größe zur Kompilierzeit unbekannt ist. Wenn die Option -O2 angegeben ist, wird die Vektorisierung einiger leicht vektorisierbarer Schleifen aktiviert, für die keine Tripcount-Informationen verfügbar sind.
- Inkrementeller Optimierungsmodus in der Verknüpfungsphase (LTO, Link-Time Optimization) hinzugefügt, der die Neukompilierungszeit bei Verwendung von LTO in Situationen erheblich reduziert, in denen geringfügige Änderungen am Code vorgenommen wurden (eine Funktion wurde bearbeitet). Um den inkrementellen Modus zu aktivieren, wird die Option „-flto-incremental“ vorgeschlagen.
- Verbesserte Kompilierung sehr großer Eingabedateien. Verfolgung von Spaltennummern größer als 4096 implementiert. Verbesserte Genauigkeit bei der Anzeige des Speicherorts von Fehlern und Warnungen in sehr großen Dateien.
- Verbesserte Sichtbarkeit von Berichten bei der Problemdiagnose. So wird beispielsweise der Fehlerort mit dem Symbol „⚠️“ hervorgehoben, das Layout der Fehlerausgabe in C++-Templates geändert, Hinweise zur einfacheren Umstellung auf den C23-Standard hinzugefügt und das Farbschema neu gestaltet. Möglichkeit zur Ausgabe von Diagnosen im Sarif-Format (-fdiagnostics-format=sarif-file) hinzugefügt.
- Die Bibliothek libgdiagnostics wurde implementiert und ermöglicht Ihnen die Integration von GCC-Funktionen im Zusammenhang mit der Gestaltung von Diagnosemeldungen in Ihre Projekte (Sie können beispielsweise Zitate, Hervorhebungen und Korrekturhinweise verwenden).
- Die Warnungen „-Wtrailing-whitespace“ und „-Wleading-whitespace“ wurden hinzugefügt, um verbleibende Leerzeichen am Zeilenende und zusätzliche Leerzeichen am Zeilenanfang zu erkennen.
- Warnung „-Wheader-guard“ hinzugefügt, um Probleme in Header-Guard-Makros zu melden, die verhindern, dass eine Header-Datei erneut eingefügt wird.
- Das Frontend für die Sprache D wurde auf Version 2.111.0 aktualisiert.
- Dem Fortran-Frontend wurde Unterstützung für vorzeichenlose Ganzzahlen hinzugefügt.
- Das Paket enthält einen Compiler für die COBOL-Sprache, gcobol, der die Plattformen x86-64 und AArch64 unterstützt und nicht für die Verwendung auf 32-Bit-Systemen konzipiert ist. Der Compiler implementiert die Spezifikation ISO/IEC 1989:2023 und besteht die meisten NIST CCVS/85-Tests.
- Die Implementierung der Standards OpenMP 5.0, 5.1, 5.2 und 6.0 (Open Multi-Processing), die die API und Methoden zur Anwendung paralleler Programmiermethoden auf Multi-Core- und Hybridsystemen (CPU+GPU/DSP) mit gemeinsam genutztem Speicher und Vektorisierungseinheiten (SIMD) definieren, wurde fortgesetzt. Unterstützung für Metadirektiven und Kachel-, Unroll-, Interop- und Dispatch-Konstrukte hinzugefügt. Für einige AMD- und NVIDIA-GPUs wurde Unterstützung für einheitlichen gemeinsam genutzten Speicher hinzugefügt (aktiviert durch Angabe von unified_shared_memory in der Direktive „requires“). Unterstützung für den Ausdruck „self_maps“ hinzugefügt.
- Das Backend für die AArch64-Architektur wurde aktualisiert, um die MinGW-Plattform (aarch64-w64-mingw32) zu unterstützen. Es wurden mehr als 20 ARM8-Erweiterungen implementiert und die Unterstützung für die ACLE-Erweiterung (Arm C Language Extensions) wurde verbessert. Am Codegenerator wurden zahlreiche Verbesserungen vorgenommen. CPU-Unterstützung hinzugefügt:
- Apple A12 (Apple-A12)
- Apple M1 (Apple-M1)
- Apple M2 (Apple-M2)
- Apple M3 (Apple-M3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (Cortex-A725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (Cortex-X925)
- Arm Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace
- NVIDIA Olympus (Olympus)
- Qualcomm Oryon-1 (Oryon-1)
- Das Codegenerierungs-Backend der AMD Radeon GPU (GCN) wurde aktualisiert, um die Bibliothek libstdc++ zu unterstützen. Außerdem wurde Unterstützung für die experimentelle Codegenerierung für die Geräteserien gfx9-generic, gfx10-3-generic und gfx11-generic hinzugefügt.
- Das x86-Backend unterstützt jetzt die Intel-Befehlssatzarchitekturerweiterungen AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Unterstützung für Intel Diamond Rapids- und Xeon Phi-CPUs hinzugefügt.
- Erweiterte Backend-Funktionen für LoongArch- und AVR-Plattformen.
- Unterstützung für die in Nios II-Prozessoren verwendete Nios2-Zielarchitektur entfernt. Die Unterstützung für das ILP32 ABI (-mabi=ilp32) im AArch64-Port ist veraltet und wird in der nächsten Hauptversion entfernt.
Source: opennet.ru
