GCC 16 veröffentlicht
(gcc.gnu.org)- Die neue Version der GNU Compiler Collection markiert einen wichtigen Wendepunkt: Der Standard für C++ wurde standardmäßig auf gnu++20 umgestellt, und die C++20-Implementierung gilt nicht länger als experimental.
- Unterstützung für Reflection, Contracts und
constexpr-Funktionen aus C++26, für Funktionen aus C++23 sowie für experimentelle C++23- und C++26-Bibliotheken wurde hinzugefügt; außerdem sind Diagnosen für Template-Fehler und type trait constraint failures durch hierarchische Meldungen detaillierter geworden. - OpenMP und OpenACC wurden um GPU-Speicherallokation,
target memsetund diedevice memcpyAPI erweitert; auch die Frontends für Ada, Fortran, Modula-2 und Algol 68 erhalten neue Sprachfunktionen und experimentelle Compiler. - x86-64 unterstützt nun AMD Zen6, Intel Wildcat Lake und Intel Nova Lake; auch für AMD-GPU, LoongArch, IBM z Systems und Solaris/Windows kamen zielspezifische Funktionen und ABI-Änderungen hinzu.
- Mit der Entfernung des JSON-Diagnoseformats, dem Ausbau von SARIF- und HTML-Diagnosen, Verbesserungen am static analyzer und 37 neuen Entry Points in libgdiagnostics wurde die Tool-Integration und Diagnose-Infrastruktur deutlich erweitert.
Kompatibilitätsänderungen und allgemeine Verbesserungen
- Auf Solaris wurden
int8_tund ähnliche Typen zur Einhaltung des C99-Standards zusigned chargeändert; dies ist eine inkompatible Änderung.- Details dazu im Solaris-Abschnitt von Porting to GCC 16
- Auf Solaris definiert die Option
-pthread_REENTRANTnicht mehr vorab.- Details dazu im Solaris-Abschnitt von Porting to GCC 16
- Das
json-Format von-fdiagnostics-format=wurde entfernt; für maschinenlesbare Diagnosen soll SARIF verwendet werden. - Link-Time Optimization geht mit
-flto-toplevel-asm-heuristicsbesser mitasm-Anweisungen auf oberster Ebene um. - Speculative Devirtualization verarbeitet nun allgemeine indirekte Funktionsaufrufe und unterstützt die Vorhersage von mehr als einem Ziel.
- Der Vectorizer erkennt die Parallelität innerhalb von Reduction-Loops flexibler und unterstützt die Vektorisierung von Loops mit unbekannter Iterationszahl sowie uncounted loops.
- Unterstützt werden außerdem Alignment-Peeling für vector-length-agnostic loops mit Masking, mutual peeling for alignment sowie das Entfernen der Vector-Induction-Berechnung in Loops mit frühem Abbruch.
- GCC Command Options und der Option Index wurden korrigiert, um viele zuvor fehlende Optionen aufzunehmen.
- Die Dokumentation zu GCC-specific attributes wurde modernisiert, um die standardisierte Attribute-Syntax stärker hervorzuheben, die in allen von GCC unterstützten C/C++-Dialekten zulässig ist.
- Das Material zu Attributen wurde neu strukturiert, um Wiederholungen zu reduzieren, und ein neuer Attribute Index wurde hinzugefügt.
- Die Dokumentation zu Parameter- und Option-Spec-Files wurde in das GCC internals manual verschoben, das sich an GCC-Entwickler und Nutzer mit Bedarf an individuellen GCC-Konfigurationen richtet.
Wichtige Änderungen nach Sprache
-
OpenMP und OpenACC
- Die Unterstützung für OpenMP-Speicherallokation wurde erweitert: Der
pinned-Trait-Allocator undompx_gnu_pinned_mem_allocverwenden, wenn verfügbar, die CUDA API und verbessern so die Leistungsfähigkeit beim Zugriff auf diesen Speicher auf Nvidia-GPUs - Die GNU-Erweiterungen
ompx_gnu_managed_mem_allocals Allocator undompx_gnu_managed_mem_spaceallokieren vom Host aus device-zugänglichen Speicher- Der Zugriff durch das Device ist auch dann möglich, wenn unified-shared memory nicht unterstützt wird; auch auf Systemen, in denen sämtlicher Host-Speicher device-zugänglich ist, kann sich das Page-Migration-Verhalten von anderem Speicher unterscheiden
- OpenMP 5.0 ergänzt eine eingeschränkte Unterstützung für
declare mapperin C/C++, und dieuses_allocators-Clause umfasst sowohl Syntaxänderungen aus OpenMP 5.2 als auch die Unterstützung von Semikolons aus OpenMP 6.0 - OpenMP 5.1 ergänzt eine erste Unterstützung des
iterator-Modifiers in der map-Clause und imtarget update-Konstrukt für C/C++ - OpenMP 5.2 unterstützt die Directive
begin declare variantin C/C++ - OpenMP 6.0 fügt die API-Routinen
omp_target_memsetundomp_target_memset_asynchinzu; außerdem kann die Assumptions-Clauseno_openmp_constructsverwendet werden - In OpenMP 5.0, 5.1 und 5.2 als deprecated markierte Directives und Clauses erzeugen standardmäßig Deprecation-Warnungen; diese lassen sich mit
-Wno-deprecated-openmpabschalten- Auch bei der Nutzung deprecated benannter Konstanten oder API-Routinen wird eine Warnung ausgegeben; diese lässt sich mit
-Wno-deprecated-declarationsabschalten
- Auch bei der Nutzung deprecated benannter Konstanten oder API-Routinen wird eine Warnung ausgegeben; diese lässt sich mit
- OpenACC ergänzt die API-Routinen
acc_memcpy_deviceundacc_memcpy_device_asyncfür C/C++/Fortran - Die
wait-Directive aus OpenACC 3.0 akzeptiert eineif-Clause, und die Fortran-API-Routinenacc_attachundacc_detachaus OpenACC 3.3 ergänzen ihre Gegenstücke aus OpenACC 2.6 für C/C++ - In OpenACC 3.4 ist die Verwendung der benannten Konstante
PARAMETERin Fortran-Data-Clauses laut Spezifikation und in GCC erlaubt, hat in GCC aber keine Auswirkungen auf das Verhalten zur Compile-Zeit oder Laufzeit
- Die Unterstützung für OpenMP-Speicherallokation wurde erweitert: Der
-
Ada, Fortran, Modula-2, Algol 68
- Die Ada-GNAT-Erweiterungen wurden um Constructor und Destructor ergänzt und bieten damit einen Konstruktions-/Finalisierungsmechanismus, der deutlich von Standard-Ada abweicht
- Für Ada wurden die Aspekte Implicit with, Structural Generic instantiation und Extended_Access hinzugefügt
Extended_Accesskann bei allgemeinen Access-Type-Deklarationen angegeben werden, die auf einen unconstrained Array-Subtype zeigen, verändert die Pointer-Repräsentation und erleichtert die Anbindung von Speicher, der nicht von Ada allokiert wurde, an Fremdsprachen
- Ada kann VAST für das Compiler-Debugging mit
-gnatd_Voder-gnatd_Wim Verbose-Modus verwenden; außerdem wurden die semantische Analyse von Reduction Expressions in Ada 2022,Ada.Containers.Bounded_Indefinite_Holders, die Implementierung von Accessibility-Regeln und die Android-Unterstützung verbessert - Fortran unterstützt Coarrays, die auf Einzelknotenmaschinen natives Shared-Memory-Multithreading verwenden, sowie das
TEAM-Feature aus Fortran 2018 - Die Unterstützung für Parameterized Derived Types aus Fortran 2003 wurde verbessert; die Verarbeitung von LEN-Parametern funktioniert, erfordert wegen PR82649 aber künftig Änderungen an der Repräsentation
- Fortran 2018 unterstützt Erweiterungen des
IMPORT-Statements, dieREDUCE-Intrinsic und das neueGENERIC-Statement - Fortran 2023 unterstützt zusätzliche trigonometrische Funktionen wie
sinpi, die intrinsic subroutinesplitsowiec_f_pointermit optionaler unterer Grenze als Argument - Die Option
-fexternal-blas64ruft beiMATMULexterne BLAS-Routinen mit 64-Bit-Integer-Argumenten auf und ist nur auf 64-Bit-Systemen sowie bei Verwendung von-ffrontend-optimizewirksam - Modula-2 gibt bei Import-Listen, Modulnamen und der Verarbeitung von Symbolen in verschachtelten Scopes Rechtschreibhinweise aus und führt eine neue Wide-Set-Implementierung sowie das Bibliotheksmodul
M2WIDESETein- Die Änderungen an Wide Sets verändern die ABI und können dadurch beim Linken Fehler mit Objektdateien aus früheren GCC-Versionen verursachen
- Zur Standardbibliothek von Modula-2 kommt das binäre Wörterbuchmodul
BinDicthinzu; mehrere Module erhalten die ProzedurenWriteundWriteLn, und der Zugriff auf externe Bibliotheksmodule wurde mit der Option-fm2-pathname-root=verbessert - GCC enthält mit
ga68einen experimentellen Algol-68-Compiler, der die Umsetzung des Revised Report sowie der von der IFIP-WG2.1-Unterkommission Algol 68 Support genehmigten Errata zum Ziel hat- Außerdem werden einige GNU-Erweiterungen und eine POSIX-Prelude implementiert; Sprachinformationen finden sich auf der Algol-68-Website, Informationen zum Frontend im Wiki
C++ und libstdc++
- Die Standard-Sprachversion für die C++-Kompilierung wurde von -std=gnu++17 auf -std=gnu++20 geändert
- Code, der von älteren C++-Standards abhängt, muss entweder das Build-Flag -std= ergänzen oder portiert werden; siehe dazu die Porting-Hinweise
- Die Unterstützung für C++20-Module ist weiterhin experimentell und muss mit -fmodules aktiviert werden
- Viele C++26-Funktionen wurden implementiert, darunter Reflection, Annotations for Reflection, Base-Class-Subobject-Splicing, Function-Parameter-Reflection, Contracts,
constexpr-Exceptions undconstexprVirtual Inheritance- P2996R13 Reflection wird mit
-std=c++26 -freflectionaktiviert - Teile von P2686R4 werden teilweise unterstützt; Structured Bindings können
constexprsein, aber Referenzen auf automatischeconstexpr-Variablen sind noch nicht erlaubt
- P2996R13 Reflection wird mit
- C++23-Funktionen aus P2036R3, P2590R2 und P2246R1 wurden implementiert
- C++-Fehlermeldungen haben bei Problemen wie Template-bezogenen Fehlern nun eine hierarchische Struktur; die Verschachtelung der Meldungen wird durch Einrückung und Aufzählungspunkte dargestellt
- Das bisherige Verhalten kann mit
-fno-diagnostics-show-nestingoder-fdiagnostics-plain-outputwiederhergestellt werden
- Das bisherige Verhalten kann mit
- Die experimentelle Unterstützung für C++20-Module baut mit der zusätzlichen Option
--compile-std-moduledie Header Unit<bits/stdc++.h>sowie die Modulestdundstd.compat, bevor die Quelldatei kompiliert wird- Wenn die Header Unit
<bits/stdc++.h>gebaut wurde, werden#include-Anweisungen für importierbare Standardbibliotheks-Header transparent in einen Import von<bits/stdc++.h>umgewandelt - Viele gemeldete Bugs wurden behoben
- Wenn die Header Unit
- Constraint-Failure-Diagnostics für Type Traits der Standardbibliothek geben nun detaillierter an, warum
is_constructible_v,is_invocable_vusw.falseergeben - Auf Targets mit Unterstützung für 128-Bit-Integer liefert in libstdc++
std::is_integral<__int128>und ähnliche Traits nun immertrue- Zuvor war das in GNU-Dialekten
true, in strikten Dialekten jedoch nicht
- Zuvor war das in GNU-Dialekten
- P0952R2: A new specification for
std::generate_canonicalwurde in allen seit C++11 betroffenen Modi implementiert und beeinflusst die beobachtbare Ausgabe- Das frühere Verhalten kann durch Definition von
_GLIBCXX_USE_OLD_GENERATE_CANONICALwiederhergestellt werden
- Das frühere Verhalten kann durch Definition von
- Die ABI von
std::variantwurde aktualisiert, um mit Modi ab C++20 konsistent zu sein, was das Klassenlayout in bestimmten C++17-Modi beeinflusst- Das frühere Verhalten kann durch Definition von
_GLIBCXX_USE_VARIANT_CXX17_OLD_ABIwiederhergestellt werden; die Auswirkung betrifft nur den C++17-Modus
- Das frühere Verhalten kann durch Definition von
- Die Ausführung von
std::regexwurde so umgeschrieben, dass statt des System-Stacks ein Heap-basierter Stack verwendet wird, um Stack Overflows bei größerem String-Matching zu vermeiden - Die C++20-Implementierung ist nicht länger experimentell, und
std::chrono::current_zone()funktioniert unter Windows - Da die C++20-Unterstützung vor GCC 16 experimentell war, sollte man davon ausgehen, dass Programme mit C++20-Komponenten nicht mit älteren Releases kompatibel sind
- Zu den ABI-Änderungen gehören Waiting-/Notifying-Funktionen aus
<atomic>, der Semaphore-Typ aus<semaphore>, Synchronisierung in<syncstream>,std::format-Argumente und die Darstellung vonstd::formatter,std::partial_orderingaus<compare>sowie die Darstellung einiger Adaptor-Typen aus<ranges>
- Zu den ABI-Änderungen gehören Waiting-/Notifying-Funktionen aus
- Die experimentelle Unterstützung für die C++23-Bibliothek umfasst
std::mdspan,ranges::starts_with,ranges::ends_with,ranges::shift_left,ranges::shift_rightundstd::allocator_traits::allocate_at_least - Die experimentelle Unterstützung für die C++26-Bibliothek umfasst
std::simd,std::inplace_vector,std::optional<T&>,std::copyable_function,std::function_ref,std::indirect,std::polymorphic,std::owner_equalfür Shared Pointer sowie den Header<debugging>
Unterstützung für Targets und Betriebssysteme
-
IA-32/x86-64
- CPUs auf Basis von AMD Zen6 werden mit
-march=znver6unterstützt und aktivieren zusätzlich zu den für Zen5 aktivierten ISA-Erweiterungen AVX512_BMM, AVX_NE_CONVERT, AVX_IFMA, AVX_VNNI_INT8 und AVX512_FP16 - Wenn AVX512-Unterstützung aktiviert ist und
znver4,znver5oderznver6als Tuning verwendet wird, versucht die Auto-Vektorisierung, masked vector epilogs zu verwenden, um die Codegröße zu reduzieren und die Performance zu verbessern - Intel Wildcat Lake wird mit
-march=wildcatlake, Intel Nova Lake mit-march=novalakeunterstützt-march=novalakeaktiviert zusätzlich zu den ISA-Erweiterungen auf Basis von Panther Lake auch APX_F, AVX10.1, AVX10.2 und PREFETCHI
- Ab GCC 16 wurde bei mehreren
-march=-Schaltern die Aktivierung von AMX-TRANSPOSE, USER_MSR, CLDEMOTE, KL, WIDEKL und PREFETCHI entfernt -mavx10.1-256,-mavx10.1-512und-mevex512wurden entfernt, ebenso die Warnung über geändertes Verhalten von-mavx10.1- Die Unterstützung für AMX-TRANSPOSE wurde in GCC 16 entfernt, und GCC akzeptiert
-mamx-transposenicht mehr - Die neue Configure-Option
--enable-x86-64-mfentryaktiviert-mfentry, das für x86-64-Profiling__fentry__stattmcountverwendet; auf glibc-Targets ist dies standardmäßig aktiviert --enable-tls=DIALECTunterstützt die Steuerung des Standard-TLS-Dialekts; der Standardwert istgnu, erlaubte Werte sindgnuundgnu2für TLS-Deskriptoren
- CPUs auf Basis von AMD Zen6 werden mit
-
AMD GPU, LoongArch, IBM z Systems
- Beim AMD-GPU-Offloading wurde der Launch-Overhead von OpenMP-Target-Regionen und OpenACC-Compute-Regionen deutlich reduziert
- Experimentelle Unterstützung für AMD Instinct MI300
gfx942-Geräte wurde hinzugefügt, ebensogfx950, das mitgfx9-4-genericweitgehend kompatibel ist - Das Standard-Multilib-Build-Set für AMD GPU wurde auf
gfx908,gfx90a,gfx9-generic,gfx9-4-generic,gfx10-3-genericundgfx11-genericgeändert- Wenn eine generische Architektur vorhanden ist, werden Multilibs für spezifische Geräte standardmäßig nicht mehr gebaut
- Generische Architekturen erfordern ROCm 6.4.0 oder neuer
- Das neue Standard-Multilib-Set erfordert Assembler und Linker aus LLVM 20 oder neuer
- Siehe die AMD installation notes und configuration notes von GCC
- LoongArch unterstützt bitgenaue Integer-Typen wie
_BitInt (N)undunsigned _BitInt (N) - LoongArch unterstützt mit dem Attribut
target_clonesFunction Multi-Versioning, das Funktionsversionen für CPU-Features erstellt und zur Laufzeit automatisch die optimale Version auswählt - Unterstützung für die LoongArch32-Architektur wurde hinzugefügt, einschließlich des Standard-ABI
ilp32dsowie der ABIsilp32fundilp32s- Dabei werden sowohl die Standard-32-Bit-Version LA32 als auch die reduzierte 32-Bit-Version LA32R abgedeckt, wodurch die Erzeugung von 32-Bit-Target-Code für Embedded-Anwendungen möglich wird
- Diese Funktion hängt von der Unterstützung durch Binutils und glibc ab
- S/390, System z und IBM z Systems unterstützen bitgenaue Integer-Typen und den Gleitkommatyp
_Float16_Float16-Operationen werden per Software oder mitfloat-Instruktionen ausgeführt
- Für die S/390-Familie wurde ein globaler Stack-Protector mit
-mstack-protector-guard=globalhinzugefügt, um Runtime-Patching beim Laden von Canary-Adressen im Linux-Kernel zu unterstützen; außerdem wurde-mstack-protector-guard-recordergänzt - Die Unterstützung für
-m31in der S/390-Familie ist deprecated und wird in einer zukünftigen Version entfernt
-
Betriebssysteme
- Solaris unterstützt mit der Option
-gsctfunkompliziert die Erzeugung von Solaris CTF, also Compact C Type Format - Windows unterstützt natives TLS, also Thread-Local Storage
- Zur Aktivierung sind beim Configure
--enable-tlssowie GNU binutils 2.44 oder neuer erforderlich
- Zur Aktivierung sind beim Configure
- Solaris unterstützt mit der Option
Diagnose, Plugins, statische Analyse
- GCC unterstützt mit
-fdiagnostics-add-output=experimental-htmlDiagnoseausgabe im HTML-Format - Die SARIF-Ausgabe folgt dem Dump-Verzeichnis; im Ausgabebeispiel
build-dir/foo.oschreibt GCC 16 SARIF nachbuild-dir/foo.c.sarif- GCC 15 schrieb im gleichen Beispiel nach
foo.c.sarif
- GCC 15 schrieb im gleichen Beispiel nach
- Die SARIF-Ausgabe erfasst die Verschachtelung logischer Orte und enthält in vielen Fällen eine
description-Property imfix-Objekt - Die
kinds-Property von SARIF-threadFlowLocationerhält neu die Wertethrow,catch,unwind,setjmpundlongjmpzur Darstellung nicht standardisierter Kontrollflüsse - GCC-Diagnosen können gerichtete Graphen verknüpfen und auch globale gerichtete Graphen melden
- Graphen werden im Text-Sink ignoriert, aber im SARIF-Sink erfasst;
experimental-htmlrendert sie SVG-basiert mit dot - Wenn bei SARIF- oder HTML-Diagnose-Sinks
cfgs=yesgesetzt wird, wird die Erfassung der GCC-Zwischendarstellung für alle Funktionen in allen Optimierungspässen aktiviert
- Graphen werden im Text-Sink ignoriert, aber im SARIF-Sink erfasst;
- GCC-Diagnosen können auf logische Orte innerhalb von XML- und JSON-Dateien verweisen
- Das Tool
sarif-replaynutzt dies, um beim Melden von Problemen in SARIF-Eingaben JSON-Pointer bereitzustellen
- Das Tool
- Wenn
GCC_DIAGNOSTICS_LOGin der Umgebung gesetzt ist, gibt das Diagnose-Subsystem ein Text-Log nach stderr oder in eine benannte Datei aus- Das dient dazu, interne Entscheidungen nachzuverfolgen, etwa wann und warum Diagnosen verworfen werden
- Wenn
EXPERIMENTAL_SARIF_SOCKETin der Umgebung gesetzt ist, versucht GCC beim Start, sich mit diesem Socket zu verbinden, und sendet für jede auftretende Diagnose eine JSON-RPC-Benachrichtigung - Für Plugin-Autoren wurde ein Publish/Subscribe-Framework hinzugefügt, das stark typisierte Nachrichten zwischen lose gekoppelten Sendern und Empfängern überträgt
- In diesem Release können Plugins nur Themen abonnieren, die Start-/Stopp-Ereignisse von Optimierungspässen bestimmter Funktionen sowie Ereignisse rund um den statischen Analysator betreffen
- GCC-Diagnose-Sinks können ein
extension-Objekt mit einemfinalizer-Hook besitzen; Plugins können dies nutzen, um zusätzliche Informationen in der SARIF-Ausgabedatei zu erfassen - In GCC 16 wurde die Diagnose-Infrastruktur umfassend aufgeräumt; Plugins, die nur
diagnostic-core.hverwenden, sollten nicht betroffen sein- Maintainer von Plugins mit komplexerer Diagnose-Nutzung sollten den Porting Guide beachten
- Der statische Analysator verarbeitet eine erste Unterstützung für C++ Named Return Value Optimization und Exceptions und kann dadurch bei einfachen C++-Beispielen verwendet werden
- Wegen Skalierungsproblemen dürfte er sich in diesem Release aber kaum für produktiven C++-Code eignen
-fanalyzernimmt bei aktiviertem-fexceptionsan, dass externe Funktionsaufrufe ohnenothrow-Attribut Exceptions auslösen können- Die neue Option
-fanalyzer-assume-nothrowdeaktiviert diese Annahme - Das soll den Anstieg von Warnungen in Projekten umgehen, die
-fexceptionsim C-Code für C++-Interoperabilität verwenden, obwohl die genutzte C-API wahrscheinlich keine Exceptions auslöst
- Die neue Option
- Die Datenstruktur für die Repräsentation von User Code in
-fanalyzerwurde neu geschrieben, damit sie leichter zu verstehen und zu debuggen ist; außerdem wurden Diagnose-Orte leicht verbessert- Dafür steigt der Speicherverbrauch des Analysators
- Die Datenstruktur zur Simulation von Speicherinhalten in
-fanalyzerwurde neu implementiert und ist nun schneller und leichter wartbar - Der Analysator beginnt, die
value_range-Infrastruktur von GCC zu nutzen, wodurch einige False Positives entfernt werden
libgdiagnostics und behobene Probleme
- libgdiagnostics erhält insgesamt 37 neue Entry Points
- 5 Entry Points für die Arbeit mit logischen Positionen wurden hinzugefügt
- 2 Entry Points zur Unterstützung von Kommandozeilenoptionen und SARIF Playback wurden hinzugefügt
- 12 Entry Points für die Arbeit mit gerichteten Graphen wurden hinzugefügt und unterstützen die Erstellung von Graphen, die Übergabe globaler Graphen, das Verbinden diagnostischer Graphen, das Hinzufügen und Abfragen von Knoten und Kanten sowie das Setzen von Knotenlabels und Positionen
- 17 Entry Points zum Aufbau von Diagnostic-Text in einem Buffer wurden hinzugefügt
- darunter das Erstellen und Freigeben von Message Buffers, das Anhängen von Strings/Text/Bytes/printf, das Anhängen von Event-IDs, die Verarbeitung von URL-/Zitat-/Farbbereichen, Dumping sowie das Abschließen von bufferbasierten Diagnosen und das Hinzufügen von Positionslabels/Ereignissen
diagnostic_manager_set_debug_physical_locations()wurde ebenfalls hinzugefügt- Die Liste der im GCC-Bug-Tracking-System als fixed für Release 16.1 geführten Problemberichte ist in der PR list zu finden
- diese Liste ist möglicherweise nicht vollständig, und einige behobene PRs könnten nicht enthalten sein
Noch keine Kommentare.