Veröffentlichung des GCC 10 Compiler-Pakets

Nach einem Jahr Entwicklung veröffentlicht Veröffentlichung des freien Compiler-Setups GCC 10.1, die erste bedeutende Veröffentlichung in der neuen Reihe GCC 10.x. Entsprechend neuen Versionsnummerierung der Versionsnummerierung wurde die Version 10.0 während der Entwicklung verwendet, und kurz vor der Veröffentlichung von GCC 10.1 wurde bereits der Branch GCC 11.0 abgezweigt, auf dessen Basis die nächste bedeutende Veröffentlichung GCC 11.1 erstellt wird.

GCC 10.1 zeichnet sich durch die Implementierung vieler Neuerungen der Programmiersprache C++, die für den C++20-Standard entwickelt wurden, durch Verbesserungen im Zusammenhang mit dem zukünftigen Standard der Programmiersprache C (C2x), durch neue Optimierungen in den Backends des Compilers sowie durch experimentelle Unterstützung des statischen Analysemodus aus.Darüber hinaus wurde im Rahmen der Vorbereitung des neuen Branches das Repository vom SVN auf Git umgestellt.

Haupt eingeführt wurde, die im Januar dieses Jahres in den Kernel übernommen wurde. Es betrifft ausschließlich die Version 5.1 und tritt in den meisten Fällen auf Systemen mit Samsung-SSD-Speichern auf, bei denen zur Verschlüsselung Daten mit dm-crypt/LUKS über device-mapper/LVM verwendet werden.:

  • Hinzugefügt experimenteller statischer Analysemodus „-fanalyzer«, der eine ressourcenintensive interprocedurale Analyse von Codeausführungswegen und Datenströmen im Programm durchführt. Der Modus kann bereits während der Kompilierung Probleme wie doppelte Aufrufe der Funktion free() für denselben Speicherbereich, Dateideskriptorlecks, Dereferenzierung und Übergabe von Nullzeigern, Zugriff auf freigegebene Speicherblöcke, Verwendung uninitialisierter Werte usw. identifizieren. Die Anwendung des neuen Modus auf den OpenSSL-Code hat bereits eine gefährliche Schwachstelle.
  • Optimierungen bei den Interproceduralen wurden verbessert. Der IPA-SRA (Interprocedural Scalar Replacement of Common Values) wurde überarbeitet, um während der Bindung zu arbeiten und entfernt nun unter anderem nicht verwendete berechnete und zurückgegebene Werte. Im Optimierungsmodus „-O2“ ist die Option „-finline-functions“ aktiviert, die neu konfiguriert wurde, um kompakteren Code gegenüber der Ausführungsleistung zu bevorzugen. Die Leistung der Heuristik zur Inline-Funktionsausweitung wurde verbessert. Die Heuristik zur Inline-Funktionsausweitung und das Klonen von Funktionen können nun Informationen über Wertebereiche nutzen, um die Effizienz einzelner Transformationen vorherzusagen. Für C++ wurde die Genauigkeit der Alias-Analyse basierend auf Typen erhöht.
  • Die Optimierungen in der Bindungsphase (LTO) wurden erweitert. Eine neue ausführbare Datei wurde hinzugefügt. lto-dump zum Zurücksetzen von Informationen über Objektdateien mit LTO-Bytecode. Bei parallel durchgeführten LTO-Durchgängen wird automatisch die Anzahl der gleichzeitig ausgeführten Make-Aufgaben bestimmt, und wenn dies nicht möglich ist, werden Informationen über die Anzahl der CPU-Kerne als Parallelisierungsfaktor verwendet. Es wurde die Möglichkeit hinzugefügt, LTO-Bytecode mit dem zstd-Algorithmus zu komprimieren.
  • Der Mechanismus zur Optimierung auf der Grundlage von Profilergebnissen (PGO — Profile-guided optimization) wurde verbessert, um optimierteren Code basierend auf der Analyse der Ausführungsmerkmale zu generieren. Die Pflege des Profils während des Kompilierungs- und Trennprozesses von „hot“/„cold“ Code wurde verbessert. Über die Option „-fprofile-valueskann jetzt die Verfolgung von bis zu 4 Profilwerten erfolgen, beispielsweise für indirekte Aufrufe, um genauere Profilinformationen bereitzustellen.
  • Für die Sprachen C, C++ und Fortran wurde die Spezifikation für paralleles Programmieren OpenACC 2.6, eingeführt, die Mittel für das Offloading auf GPUs und spezialisierte Prozessoren wie NVIDIA PTX definiert. Die Implementierung des Standards ist fast abgeschlossen. OpenMP 5.0 (Open Multi-Processing), die API und Methoden zur Anwendung paralleler Programmierung auf Mehrkern- und Hybrid-Systemen (CPU+GPU/DSP) mit gemeinsamem Speicher und Vektorisierungseinheiten (SIMD) definieren. Zu den neuen Funktionen gehören Bedingungen wie lastprivate, Direktiven wie scan und loop sowie die Ausdrücke order und use_device_addr. Für OpenMP und OpenACC wurde die Unterstützung für das Offloading von Operationen auf AMD Radeon GPUs (GCN) der vierten (Fiji) und fünften Generation (VEGA 10/VEGA 20) hinzugefügt.
  • Für Programmiersprachen aus der C-Familie wurde die Funktion „access“ hinzugefügt, um den Zugriff einer Funktion auf Objekte, die durch Referenzen oder Zeiger übergeben werden, und zur Verknüpfung solcher Objekte mit ganzzahligen Argumenten, die Informationen über die Objektdimensionen enthalten, zu beschreiben. Zur Zusammenarbeit mit „access“ wurde das Attribut „type“ implementiert, um fehlerhaften Zugriff aus Benutzermethoden zu erkennen, beispielsweise beim Schreiben von Werten in den Bereich außerhalb der Array-Grenzen. Außerdem wurde das Attribut „symver“ hinzugefügt, um Symbole in ELF-Dateien an bestimmte Versionsnummern zu binden.
  • Neue Warnungen hinzugefügt:
    • «-Wstring-compare» (aktiviert durch «-Wextra») — warnt vor Ausdrücken, in denen Null mit dem Ergebnis von Funktionsaufrufen wie strcmp und strncmp verglichen wird, die wegen der Länge eines Arguments größer als die Größe des Arrays im zweiten Argument konstant sind.
    • «-Wzero-length-bounds» (aktiviert durch «-Warray-bounds») — warnt vor Zugriff auf Elemente von Arrays mit null Länge, was zu einer Überschreibung anderer Daten führen kann.
    • Erweiterte Warnungen für «-Warray-bounds», «-Wformat-overflow», «-Wrestrict», «-Wreturn-local-addr» und «-Wstringop-overflow», in denen die Anzahl der verarbeiteten Situationen für den Grenzübertritt erweitert wurde.
  • Die Möglichkeit, erweiterte Zeichen in Identifikatoren direkt anzugeben, wurde implementiert, wobei die aktuelle Kodierung (standardmäßig UTF-8) anstelle der UCN-Notation (\uNNNN oder \UNNNNNNNN) verwendet wird. Zum Beispiel:

    static const int π = 3;
    int get_naïve_pi() {
    return π;
    }

  • Für die Programmiersprache C wurden eine Reihe neuer Möglichkeiten im Rahmen des Standards C2X implementiert (aktiviert durch die Angabe von -std=c2x und -std=gnu2x): Es gibt jetzt Unterstützung für die Syntax ‚[[]]‘ zur Definition von Attributen wie in C++ (zum Beispiel [[gnu::const]], [[deprecated]], [[fallthrough]] und [[maybe_unused]]). Zusätzlich wurde die Syntax u8 zur Definition von Konstanten mit UTF-8-Zeichen eingeführt.
    Neue Makros wurden in <float.h> hinzugefügt. In strftime wurden die Platzhalter ‚%OB‘ und ‚%Ob‘ ergänzt.
  • Standardmäßig wird für C der Modus „-fno-common“ verwendet, der den Zugriff auf globale Variablen auf einigen Plattformen effizienter macht.
  • Für C++ wurden etwa 16 Änderungen und Neuerungen im Standard C++20 implementiert. Dazu gehört das Schlüsselwort ‚constinit‘.
    und die Unterstützung für die Erweiterung von Templates ‚Konzepten‘. Konzepte ermöglichen es, eine Reihe von Anforderungen an die Parameter von Templates zu definieren, die zur Kompilierzeit den Satz von Argumenten einschränken, die als Template-Parameter akzeptiert werden können. Konzepte können verwendet werden, um logische Unstimmigkeiten zwischen den Eigenschaften der Datentypen, die innerhalb des Templates verwendet werden, und den Eigenschaften der Datentypen der Eingabeparameter zu vermeiden.
  • In G++ wird das unbestimmte Verhalten, das durch die Änderung von Konstantobjekten über constexpr verursacht wird, erkannt. Der Speicherverbrauch des Compilers bei der Berechnung von constexpr wurde reduziert. Neue Warnungen „-Wmismatched-tags“ und „-Wredundant-tags“ wurden hinzugefügt.
  • Neue Befehlszeilenoptionen werden vorgeschlagen:
    • „-fallocation-dce“ zum Entfernen überflüssiger Paare von „new“- und „delete“-Operatoren.
    • „-fprofile-partial-training“ zum Deaktivieren der Größenoptimierung für Code, für den kein Trainingsdurchlauf durchgeführt wurde.
    • „-fprofile-reproducible“ zur Steuerung des Reproduzierbarkeitsgrads des Profils.
    • „-fprofile-prefix-path“ zur Bestimmung des Basisverzeichnisses der Build-Quellen, das bei der separaten Generierung von Profilen verwendet wird (für „-fprofile-generate=profile_dir“ und „-fprofile-use=profile_dir“).
  • In den Warnungstexten zu den genannten Optionen wird auf Links verwiesen, die zur Dokumentation dieser Optionen führen. Die URL-Einsetzung wird über die Option „-fdiagnostics-urls“ gesteuert.
  • Ein Präprozessor-Befehl „__has_builtin„ wurde hinzugefügt, der zur Überprüfung der Verfügbarkeit von eingebauten Funktionen verwendet werden kann.
  • Eine neue integrierte Funktion „__builtin_roundeven“ wurde hinzugefügt, die in der Spezifikation ISO/IEC TS 18661 definierte Rundungsfunktion implementiert. Diese ähnelt „round“, rundet jedoch Werte über 0,5 auf (auf den nächsthöheren Wert), Werte unter 0,5 ab (auf null) und Werte, die genau 0,5 sind, basierend auf der Parität der zweitletzten Ziffer.
  • Für die Architektur AArch64 wurde Unterstützung für die SVE2-Erweiterung hinzugefügt und die Unterstützung für SVE (Scalable Vector Extension) verbessert. Dabei wurde auch Unterstützung für integrierte Funktionen und Typen von SVE ACLE gewährleistet, und die Vektorisierung wurde implementiert. Die Unterstützung für LSE (Large System Extensions) und TME (Transactional Memory Extension) wurde erweitert. Neue Anweisungen, die in Armv8.5-A und Armv8.6-A vorgeschlagen wurden, wurden hinzugefügt, einschließlich Anweisungen zur Generierung von Zufallszahlen, Rundung und zur Verknüpfung von Tags mit dem Speicher.
    bfloat16 und Matrizenmultiplikation. Unterstützung für Prozessoren wurde hinzugefügt.
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 und
    Marvell ThunderX3.
  • Für ARM32 wurde Unterstützung für ABI FDPIC (64-Bit-Funktionszeiger) hinzugefügt. Die Verarbeitung von 64-Bit-Ganzzahloperationen wurde überarbeitet und optimiert. Unterstützung für die CPU wurde hinzugefügt.
    Arm Cortex-A77,
    Arm Cortex-A76AE und
    Arm Cortex-M35P. Erweiterte Unterstützung für ACLE-Befehle zur Datenverarbeitung, einschließlich 32-Bit SIMD, 16-Bit-Multiplikation, arithmetische Operationen mit Minimal- und Maximalwerten sowie andere Mittel zur Optimierung von DSP-Algorithmen. Experimentelle Unterstützung für ACLE CDE (Custom Datapath Extension) hinzugefügt.
  • Die Codegenerierung und Vektorisierung im Backend für AMD-GPUs auf Basis der Mikroarchitektur GCN wurde erheblich verbessert.
  • Für die AVR-Architektur wurde Unterstützung für XMEGA-ähnliche Geräte hinzugefügt.
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209, ATmega4808 und ATmega4809.
  • Für die IA-32/x86-64-Architekturen wurde eine neue Erweiterung des Befehlssatzes hinzugefügt: Intel ENQCMD (-menqcmd). Unterstützung für Intel Cooperlake-CPU (-march=cooperlake, einschließlich ISA-Erweiterung AVX512BF16) und Tigerlake (-march=tigerlake, einschließlich ISA-Erweiterungen MOVDIRI, MOVDIR64B und AVX512VP2INTERSECT) hinzugefügt.
  • Die Implementierung des Intermediate Language HSAIL (Heterogeneous System Architecture Intermediate Language) für heterogene Rechnersysteme auf der Basis der HSA-Architektur wurde als veraltet erklärt und wird voraussichtlich in einer zukünftigen Version entfernt.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster