Nach einem Jahr Entwicklung Veröffentlichung des freien Compiler-Setups , das erste bedeutende Release in der neuen GCC 9.x-Serie. Gemäß der wurde Version 9.0 während der Entwicklung verwendet, und kurz vor dem Release von GCC 9.1 wurde bereits der Branch GCC 10.0 abgezweigt, auf dessen Basis das nächste bedeutende Release GCC 10.1 entstehen wird.
GCC 9.1 ist bemerkenswert durch die Stabilisierung der Unterstützung für den C++17 Standard, die Fortsetzung der Implementierung von Funktionen des zukünftigen C++20 Standards (Codename C++2a), die Einbeziehung eines Frontends für die Programmiersprache D, partielle Unterstützung für OpenMP 5.0, nahezu vollständige Unterstützung für OpenACC 2.5, die Erhöhung der Skalierbarkeit von interprozeduralen Optimierungen und Linker-Optimierungen, die Erweiterung der Diagnosewerkzeuge sowie das Hinzufügen neuer Warnungen und Backends für OpenRISC, C-SKY V2 und AMD GCN GPUs.
Haupt :
- Die Unterstützung für die Programmiersprache D wurde hinzugefügt. Das Hauptsetup von GCC umfasst das Frontend mit dem Compiler (Gnu D Compiler) und Runtime-Bibliotheken (libphobos), die es ermöglichen, den standardmäßigen GCC zum Kompilieren von Programmen in der Programmiersprache D zu verwenden. Der Prozess zur Einführung der Unterstützung für die Sprache D in GCC schon im Jahr 2011, aber Aufgrund der Notwendigkeit, den Code an die Anforderungen der GCC anzupassen, sowie wegen Problemen bei der Übertragung von Rechten an das geistige Eigentum der Firma Digital Mars, die die Programmiersprache D entwickelt;
- Verbesserungen wurden im Code-Generator vorgenommen. Beispielsweise wurde die Anwendung verschiedener Strategien zur Entfaltung von Switch-Ausdrücken (Sprungtabelle, Bit-Test, Entscheidungsbaum) je nach Situation implementiert. Es wurde die Möglichkeit hinzugefügt, lineare Funktionen, die Switch-Ausdrücke enthalten, mit der Optimierung „-ftree-switch-conversion“ zu transformieren (z. B. wird eine Bedingung wie „case 2: how = 205; break; case 3: how = 305; break;“ in „100 * how + 5“ umgewandelt);
- Die interproceduralen Optimierungen wurden verbessert. Die Einstellungen für das Inline-Entfalten wurden an moderne C++-Codebasen angepasst und um neue Parameter wie max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns und uninlined-thunk-time erweitert. Die Genauigkeit und Aggressivität der Trennung von "kaltem" und "warmem" Code wurde erhöht. Die Skalierbarkeit für sehr große (z. B. bei der Anwendung von Optimierungen in der Link-Phase auf große Programme) wurde verbessert;
- Der Mechanismus zur Optimierung basierend auf den Ergebnissen der Code-Profilierung (PGO – Profile-guided optimization) wurde verbessert, was zu einer effizienteren Codegenerierung auf der Grundlage der Analyse der Ausführungsmerkmale des Codes führt. Die zusammenfassende Option „“ schließt jetzt die Optimierungsmodi „-fversion-loops-for-strides“, „-floop-interchange“, „-floop-unroll-and-jam“ und „-ftree-loop-distribution“ ein. Die Einbindung von Histogrammdateien mit Zählern wurde entfernt, was die Dateigröße der Profile reduziert (Histogramme werden jetzt in Echtzeit beim Ausführen von Optimierungen während des Linkens generiert);
- Die Optimierungen in der Link-Phase (LTO) wurden erweitert. Es wurde eine Vereinfachung der Typen vor der Ergebnisgenerierung sichergestellt, was zu einer erheblichen Reduzierung der Größe der LTO-Objektdateien führte, den Speicherbedarf während des Linkens verringerte und die Parallelisierung der Operationen verbesserte. Die Anzahl der Partitionen (—param lto-partitions) wurde von 32 auf 128 erhöht, was die Effizienz auf Systemen mit vielen CPU-Kernen gesteigert hat. Um die Anzahl der Optimierungsprozesse zu steuern, wurde der Parameter
„—param lto-max-streaming-parallelism“ hinzugefügt;Insgesamt ermöglichten die in GCC 9 vorgenommenen Optimierungen im Vergleich zu GCC 8.3 Die Kompilierungszeit von Firefox 66 und LibreOffice 6.2.3 kann um etwa 5 % verkürzt werden. Die Größe der Objektdateien reduzierte sich um 7 %. Die Linkzeit auf einem 8-Kern-CPU verringerte sich um 11 %. Die sequentielle Optimierungsphase während des Linkens erfolgt jetzt 28 % schneller und benötigt 20 % weniger Speicher. Der Speicherbedarf jedes Verarbeiters der parallelisierten LTO-Phase senkte sich um 30%;
- Für die Sprachen C, C++ und Fortran wurde der Großteil der Spezifikation für paralleles Programmieren implementiert. , das die Mittel zum Offloading von Operationen auf GPUs und spezialisierte Prozessoren wie NVIDIA PTX definiert;
- Für C und C++ wurde eine teilweise Unterstützung des Standards (Open Multi-Processing) implementiert, das APIs und Verfahren zur Anwendung von Methoden des parallelen Programmierens für C, C++ und Fortran auf Mehrkern- und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und Vektorisierungsblöcken (SIMD) definiert;
- Für die Sprache C wurden neue Warnungen hinzugefügt: „“ (nicht ausgerichteter Zeiger auf das gepackte Element einer Struktur oder Union) und
«» (bei der Verwendung von Funktionen zur Berechnung des Absolutwerts sollte, falls für das angegebene Argument eine passendere Funktion vorhanden ist, beispielsweise anstelle von abs(3,14) die Funktion fabs(3,14) verwendet werden). Für C++ wurden neue Warnungen hinzugefügt: „-Wdeprecated-copy“
„-Winit-list-lifetime“, „-Wredundant-move“, „-Wpessimizing-move“ und „-Wclass-conversion“. Viele frühere Warnungen wurden erweitert; - Experimentelle Unterstützung für einen Teil des zukünftigen C-Standards, der unter dem Codenamen C2x entwickelt wird, wurde hinzugefügt. Um die Unterstützung für C2x zu aktivieren, sollten die Optionen „-std=c2x“ und „-std=gnu2x“ (für die Aktivierung von GNU-Erweiterungen) verwendet werden. Der Standard befindet sich noch in einer frühen Entwicklungsphase, daher wird derzeit nur der Ausdruck _Static_assert mit einem Argument unterstützt (_Static_assert mit zwei Argumenten ist in C11 standardisiert);
- Die Unterstützung für den Standard C++17 wurde stabil erklärt. Im Frontend sind die Sprachfunktionen von C++17 vollständig implementiert, und in libstdc++ sind die im Standard definierten Bibliotheksfunktionen nahezu vollständig implementiert;
- Fortsetzung der Elemente des zukünftigen C++2a-Standards. Zum Beispiel wurde die Möglichkeit zur Einbindung von Bereichen bei der Initialisierung hinzugefügt, Erweiterungen für Lambda-Ausdrücke implementiert, Unterstützung für leere Mitglieder von Datenstrukturen und für die Attribute likely/unlikely eingeführt sowie die Möglichkeit geschaffen, virtuelle Funktionen in bedingten Ausdrücken aufzurufen.
Um die Unterstützung für C++2a zu aktivieren, sollten die Optionen „-std=c++2a“ und „-std=gnu++2a“ verwendet werden. In libstdc++ für C++2a wurden die Header-Dateien bit und version hinzugefügt, sowie die Typen std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible und std::type_identity, sowie die Funktionen std::midpoint, std::lerp, std::bind_front,
std::visit, std::is_constant_evaluated und std::assume_aligned, und zudem wurde die Unterstützung des Typs char8_t hinzugefügt. Es wurde die Möglichkeit zur Überprüfung von String-Präfixen und -Suffixen (starts_with, ends_with) realisiert. - Unterstützung für neue ARM-Prozessoren hinzugefügt.
Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE und Neoverse N1. Die Unterstützung für die in Armv8.3-A eingeführten Instruktionen zur Arbeit mit komplexen Zahlen, zur Erzeugung von Pseudo-Zufallszahlen (rng) und zur Taggen von Speicher (memtag) wurde hinzugefügt, ebenso wie Instruktionen zur Verhinderung von Angriffen, die mit spekulativer Ausführung und der Arbeit mit dem Sprungvorhersageblock zusammenhängen. Für die Architektur AArch64 wurde ein Schutzmodus hinzugefügt. («-fstack-clash-protection»). Zur Nutzung der Eigenschaften der Armv8.5-A Architektur wurde die Option «-march=armv8.5-a» hinzugefügt. - Ein Backend zur Codegenerierung für AMD GPUs mit der Microarchitektur GCN wurde integriert. Die Umsetzung beschränkt sich derzeit auf die Kompilierung von Einzelanwendungen (die Unterstützung für multi-threaded Berechnungen über OpenMP und OpenACC wird später angeboten) sowie die Unterstützung der GPUs Fiji und Vega 10.
- Ein neues Backend für Prozessoren wurde hinzugefügt. ;
- Ein Backend für Prozessoren wurde hinzugefügt. , die von einem gleichnamigen chinesischen Unternehmen für verschiedene Endgeräte hergestellt werden;
- In allen Optionen der Befehlszeile, die mit Bytewerten arbeiten, wird die Unterstützung für die Suffixe kb, KiB, MB, MiB, GB und GiB sichergestellt.
- Die Option «-flive-patching=[inline-only-static|inline-clone]» ermöglicht eine sichere Kompilierung für Systeme mit Hot-Patching durch mehrstufige Verwaltung der Anwendung interproceduraler) Optimierungen.
- Die Option «—completion» wurde hinzugefügt, um die Autovervollständigung von Optionen bei der Verwendung von bash feiner zu steuern.
- Die Diagnosetools zeigen Ausschnitte des Quelltexts mit Zeilennummern und visuellen Markierungen zu begleitenden Informationen wie Operandtypen an. Um die Anzeige von Zeilennummern und Markierungen zu deaktivieren, stehen die Optionen „-fno-diagnostics-show-line-numbers“ und „-fno-diagnostics-show-labels“ zur Verfügung.
- Werkzeuge zur Fehlerdiagnose in C++-Code, verbessert die Lesbarkeit der Fehlermeldungen und hebt problematische Parameter hervor.

- Die Option „-fdiagnostics-format=json“ wurde hinzugefügt, die es ermöglicht, Diagnosedaten in einem maschinenlesbaren Format (JSON) zu erzeugen.
- Neue Profilierungsoptionen „-fprofile-filter-files“ und „-fprofile-exclude-files“ wurden hinzugefügt, um die zu verarbeitenden Quelltextdateien auszuwählen.
- In AddressSanitizer wurde die Generierung kompakterer Prüfcode für automatische Variablen verbessert, wodurch der Speicherverbrauch der geprüften ausführbaren Datei gesenkt werden konnte.
- Die Ausgabe im Modus „“ wurde verbessert (Detailinformationen zu den durchgeführten Optimierungen). Es wurden neue Präfixe „optimized“ und „missed“ hinzugefügt, neben dem vorher verfügbaren Präfix „note“. Zudem werden Informationen zur Entscheidung über Inline-Entwicklung und zur Vektorisierung von Schleifen ausgegeben.
- Die Option „-fsave-optimization-record“ wurde hinzugefügt. Wenn diese angegeben ist, speichert GCC die Datei SRCFILE.opt-record.json.gz mit einer Beschreibung der Entscheidungen zur Anwendung bestimmter Optimierungen. Im Gegensatz zum Modus „-fopt-info“ umfasst die neue Option zusätzliche Metadaten, wie Profile-Informationen und Inline-Ketten;
- Die Optionen „-fipa-stack-alignment“ und „-fipa-reference-addressable“ wurden hinzugefügt, um bei interprozeduralen Optimierungen die Stapelausrichtung und die Verwendung von Adressierungsmodi (nur Schreiben oder genaues Lesen) für statische Variablen zu steuern;
- Neue eingebaute Funktionen wurden eingeführt, um das Management von Attributbindungen sowie das Verhalten im Zusammenhang mit Sprungvorhersagen und spekulativer Ausführung zu steuern: „«, «“ und „“. Für Funktionen, Variablen und Typen wurde ein neues Attribut hinzugefügt; ;
- Für die Programmiersprache Fortran wurde vollständige Unterstützung für asynchronen Ein-/Ausgabe implementiert;
- Die Unterstützung für die Plattformen Solaris 10 (*-*-solaris2.10) und Cell/B.E (Cell Broadband Engine SPU) wurde als veraltet erklärt und wird in der nächsten bedeutenden Version entfernt. Die Unterstützung für die Architekturen Armv2, Armv3, Armv5 und Armv5E wurde eingestellt. Auch die Unterstützung für die Intel MPX (Memory Protection Extensions) wurde eingestellt.
Quelle: opennet.ru

