Veröffentlichung der GCC 10-Compiler-Suite

Nach einem Jahr Entwicklung veröffentlicht Veröffentlichung eines kostenlosen Satzes von Compilern GCC 10.1, die erste Hauptversion im neuen GCC 10.x-Zweig. Gemäß neues Schema Aufgrund der Release-Nummern wurde im Entwicklungsprozess Version 10.0 verwendet und kurz vor der Veröffentlichung von GCC 10.1 hatte sich bereits der GCC 11.0-Zweig abgezweigt, auf dessen Grundlage das nächste bedeutende Release, GCC 11.1, gebildet werden sollte.

GCC 10.1 zeichnet sich durch die Implementierung vieler Neuerungen in der für den C++20-Standard entwickelten C++-Sprache, Verbesserungen im Zusammenhang mit dem zukünftigen C-Sprachstandard (C2x), neue Optimierungen in den Compiler-Backends und experimentelle Unterstützung aus Statischer Analysemodus. Darüber hinaus hat das Projekt während der Vorbereitung eines neuen Zweigs das Repository von SVN nach Git übertragen.

Haupt- Veränderungen:

  • Добавлен experimenteller Modus der statischen Analyse“-Fanalyzer„, das eine ressourcenintensive interprozedurale Analyse von Codeausführungspfaden und Datenflüssen in einem Programm durchführt. Der Modus ist in der Lage, Probleme in der Kompilierungsphase zu erkennen, wie z. B. doppelte Aufrufe der Funktion free() für einen Speicherbereich, Dateideskriptorlecks, Dereferenzierung und Übergabe von Nullzeigern, Zugriff auf freigegebene Speicherblöcke, Verwendung nicht initialisierter Werte usw. Durch den Einsatz des neuen Modus für OpenSSL-Code ist eine Identifizierung bereits möglich gefährliche Schwachstelle.
  • Verbesserte interprozedurale Optimierungen. Der IPA-SRA-Durchlauf (Interprocedural Scalar Shared Replacement) wurde so umgestaltet, dass er zum Bindungszeitpunkt funktioniert und unter anderem jetzt berechnete und zurückgegebene nicht verwendete Werte entfernt. Im Optimierungsmodus „-O2“ ist die Option „-finline-functions“ aktiviert, die neu abgestimmt ist, um kompakteren Code gegenüber der Ausführungsleistung zu bevorzugen. Die Arbeit der Heuristik für die Inline-Funktionsbereitstellung wurde beschleunigt. Heuristiken zur Inline-Erweiterung und zum Klonen von Funktionen können nun Informationen über Wertebereiche nutzen, um die Wirksamkeit einzelner Transformationen vorherzusagen. Für C++ wurde die Genauigkeit der typbasierten Alias-Analyse verbessert.
  • Erweiterte Linking-Time-Optimierungen (LTO). Neue ausführbare Datei hinzugefügt lto-dump um Informationen über Objektdateien mit LTO-Bytecode zurückzusetzen. Parallele LTO-Durchgänge ermitteln automatisch die Anzahl der gleichzeitig laufenden Make-Tasks und nutzen, falls diese nicht ermittelt werden können, Informationen über die Anzahl der CPU-Kerne als Parallelisierungsfaktor. Es wurde die Möglichkeit hinzugefügt, LTO-Bytecode mithilfe des ZSTD-Algorithmus zu komprimieren.
  • Der auf den Ergebnissen der Code-Profilierung basierende Optimierungsmechanismus (PGO – Profile-Guided Optimization) wurde verbessert, wodurch auf der Grundlage einer Analyse der Merkmale der Codeausführung ein optimalerer Code generiert wird. Verbesserte Profilpflege während der Kompilierung und Trennung von Hot-/Cold-Code. Über die Option „-fprofile-Werte» kann jetzt bis zu 4 Profilwerte überwachen, beispielsweise für indirekte Anrufe und Bereitstellung genauerer Profilinformationen.
  • Parallele Programmierspezifikation für die Sprachen C, C++ und Fortran implementiert OpenACC 2.6, das Tools zum Auslagern von Vorgängen auf GPUs und spezialisierten Prozessoren wie NVIDIA PTX definiert. Die Umsetzung des Standards ist nahezu abgeschlossen Öffnen Sie MP 5.0 (Open Multi-Processing), das die API und Methoden zur Anwendung paralleler Programmiermethoden auf Multicore- und Hybridsystemen (CPU+GPU/DSP) mit gemeinsam genutztem Speicher und Vektorisierungseinheiten (SIMD) definiert. Hinzugefügte Funktionen wie lastprivate-Bedingungen, Scan- und Schleifenanweisungen, order- und use_device_addr-Ausdrücke. Für OpenMP und OpenACC wurde Unterstützung für das Auslagern von Vorgängen auf AMD Radeon (GCN)-GPUs der vierten Generation (Fidschi) und der fünften Generation (VEGA 10/VEGA 20) hinzugefügt.
  • Für Sprachen der C-Familie wurde die Funktion „access“ hinzugefügt, um den Zugriff der Funktion auf Objekte zu beschreiben, die als Referenz oder Zeiger übergeben werden, und um solche Objekte mit ganzzahligen Argumenten zu verknüpfen, die Informationen über die Größe der Objekte enthalten. Um in Verbindung mit „access“ zu arbeiten, ist das Attribut „type“ implementiert, um fehlerhaften Zugriff von Benutzerfunktionen zu erkennen, beispielsweise beim Schreiben von Werten in einen Bereich außerhalb der Grenzen des Arrays. Außerdem wurde das Attribut „symver“ hinzugefügt, um Symbole in einer ELF-Datei bestimmten Versionsnummern zuzuordnen.
  • Neue Warnungen hinzugefügt:
    • „-Wstring-compare“ (aktiviert mit „-Wextra“) – warnt vor dem Vorhandensein von Ausdrücken, in denen Null mit dem Ergebnis des Aufrufs der Funktionen strcmp und strncmp verglichen wird, was aufgrund der Länge einer Konstante entspricht eines Arguments ist größer als die Größe des Arrays im zweiten Argument.
    • „-Wzero-length-bounds“ (aktiviert mit „-Warray-bounds“) – warnt vor dem Zugriff auf Array-Elemente mit der Länge Null, was zum Überschreiben anderer Daten führen kann.
    • Die Warnungen „-Warray-bounds“, „-Wformat-overflow“, „-Wrestrict“, „-Wreturn-local-addr“ und „-Wstringop-overflow“ wurden erweitert, um die Anzahl der Situationen außerhalb der Grenzen zu erhöhen die gehandhabt werden.
  • Es wurde die Möglichkeit implementiert, Breitzeichen in Bezeichnern direkt mit der aktuellen Kodierung (standardmäßig UTF-8) anstelle der UCN-Notation (\uNNNN oder \UNNNNNNNN) anzugeben. Zum Beispiel:

    statisch const int π = 3;
    int get_naive_pi() {
    Rückkehr π;
    }

  • Für die C-Sprache wurde ein Teil der im C2X-Standard entwickelten neuen Funktionen implementiert (aktiviert durch Angabe von -std=c2x und -std=gnu2x): Unterstützung für die Syntax „[[]]“ zum Definieren von Attributen wie in C++ (zum Beispiel [[gnu ::const]], [[deprecated]], [[fallthrough]] und [[maybe_unused]]. Unterstützung für „u8“-Syntax zum Definieren von Konstanten mit UTF-8-Zeichen hinzugefügt.
    Neue Makros hinzugefügt . „%OB“- und „%Ob“-Ersetzungen zu strftime hinzugefügt.

  • Der Standardmodus für C ist „-fno-common“, was auf einigen Plattformen einen effizienteren Zugriff auf globale Variablen ermöglicht.
  • Für C++ wurden etwa 16 Änderungen und Neuerungen implementiert, die im C++20-Standard entwickelt wurden. Einschließlich des hinzugefügten Schlüsselworts „constinit“
    und Unterstützung für Template-Erweiterungen wurde implementiert "Konzept". Mit Konzepten können Sie eine Reihe von Vorlagenparameteranforderungen definieren, die zur Kompilierungszeit die Menge der Argumente begrenzen, die als Vorlagenparameter akzeptiert werden können. Mithilfe der Konzepte können logische Inkonsistenzen zwischen den Eigenschaften der in der Vorlage verwendeten Datentypen und den Datentypeigenschaften der Eingabeparameter vermieden werden.

  • G++ ermöglicht die Erkennung von undefiniertem Verhalten, das durch die Änderung konstanter Objekte durch constexpr verursacht wird. Reduzierter Speicherverbrauch durch den Compiler bei der Berechnung von constexpr. Neue Warnungen „-Wmismatched-tags“ und „-Wredundant-tags“ hinzugefügt.
  • Es wurden neue Befehlszeilenoptionen vorgeschlagen:
    • „-fallocation-dce“, um unnötige Paare von „new“- und „delete“-Operatoren zu entfernen.
    • „-fprofile-partial-training“, um die Größenoptimierung für Code zu deaktivieren, der keinen Trainingslauf hat.
    • „-fprofile-reproducible, um den Grad der Profilreproduzierbarkeit zu steuern.
    • „-fprofile-prefix-path“ zum Definieren des Basisquell-Build-Verzeichnisses, das für die separate Profilgenerierung verwendet wird (für „-fprofile-generate=profile_dir“ und „-fprofile-use=profile_dir“).
  • Im Warntext zu den genannten Optionen werden Hyperlinks bereitgestellt, über die Sie zur Dokumentation dieser Optionen gelangen können. Die URL-Ersetzung wird mit der Option „-fdiagnostics-urls“ gesteuert.
  • Präprozessoroperator hinzugefügt „__has_builtin", mit dem nach eingebauten Funktionen gesucht werden kann.
  • Es wurde eine neue integrierte Funktion „__builtin_roundeven“ mit einer Implementierung der in der ISO/IEC TS 18661-Spezifikation definierten Rundungsfunktion hinzugefügt, die „round“ ähnelt, jedoch einen Teil größer als 0.5 aufrundet (auf einen größeren Wert), kleiner als 0.5 - nach unten (auf Null) und gleich 0.5 - beginnend mit der Parität der vorletzten Ziffer.
  • Für die AArch64-Architektur wurde Unterstützung für die SVE2-Erweiterung hinzugefügt und die Unterstützung für SVE (Scalable Vector Extension) verbessert, einschließlich zusätzlicher Unterstützung für integrierte SVE-ACLE-Funktionen und -Typen sowie die Verwendung von Vektorisierung. Die Unterstützung für LSE (Large System Extensions) und TME (Transactional Memory Extension) wurde erweitert. Neue Anweisungen hinzugefügt, die in Armv8.5-A und Armv8.6-A vorgeschlagen werden, einschließlich Anweisungen zur Zufallszahlengenerierung, Rundung, Speicher-Tag-Bindung,
    bfloat16 und Matrixmultiplikation. Prozessorunterstützung hinzugefügt
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 und
    Marvell ThunderX3.

  • Unterstützung für ABI FDPIC (32-Bit-Funktionszeiger) für ARM64 hinzugefügt. Neu gestaltete und optimierte Verarbeitung von 64-Bit-Integer-Operationen. CPU-Unterstützung hinzugefügt
    Arm Cortex-A77,
    Arm Cortex-A76AE und
    Arm Cortex-M35P. Erweiterte Unterstützung für ACLE-Datenverarbeitungsanweisungen, einschließlich 32-Bit-SIMD, 16-Bit-Multiplikation, Latch-Arithmetik und andere DSP-Algorithmusoptimierungen. Experimentelle Unterstützung für ACLE CDE-Anweisungen (Custom Datapath Extension) hinzugefügt.

  • Deutlich verbesserte Codegenerierung und Vektorisierung im Backend für AMD-GPUs basierend auf der GCN-Mikroarchitektur.
  • Unterstützung für XMEGA-ähnliche Geräte für die AVR-Architektur hinzugefügt
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 und ATmegaXNUMX.

  • Für IA-32/x86-64-Architekturen wurde eine neue Erweiterung der Intel ENQCMD-Befehlssatzarchitektur (-menqcmd) hinzugefügt. Unterstützung für Intel Cooperlake- (-march=cooperlake, einschließlich der ISA-Erweiterung AVX512BF16) und Tigerlake-CPUs (-march=tigerlake, einschließlich der ISA-Erweiterungen MOVDIRI, MOVDIR64B und AVX512VP2INTERSECT) hinzugefügt.
  • Eine Implementierung der HSAIL (Heterogeneous System Architecture Intermediate Language) für heterogene Computersysteme basierend auf der HSA-Architektur ist veraltet und wird wahrscheinlich in einer zukünftigen Version entfernt.

Source: opennet.ru

Kommentar hinzufügen