Veröffentlichung der GCC 11-Compiler-Suite

Nach einem Jahr der Entwicklung wurde die Veröffentlichung der kostenlosen GCC 11.1-Compiler-Suite veröffentlicht, die erste bedeutende Veröffentlichung im neuen GCC 11.x-Zweig. Unter dem neuen Release-Nummerierungsschema wurde während der Entwicklung Version 11.0 verwendet, und kurz vor der Veröffentlichung von GCC 11.1 wurde der GCC 12.0-Zweig bereits gespalten, aus dem die nächste bedeutende Version von GCC 12.1 gebildet wird.

GCC 11.1 zeichnet sich durch den Übergang zur standardmäßigen Verwendung des DWARF 5-Debugdateiformats, die standardmäßige Einbeziehung des C++17-Standards („-std=gnu++17“) und erhebliche Verbesserungen bei der Unterstützung für C++20 aus Standard, experimentelle Unterstützung für C++23, Verbesserungen im Zusammenhang mit dem zukünftigen C-Sprachstandard (C2x), neue Leistungsoptimierungen.

Wichtigste Änderungen:

  • Der Standardmodus für die C++-Sprache wurde geändert, um den C++17-Standard (-std=gnu++17) anstelle des zuvor angebotenen C++14 zu verwenden. Es ist möglich, das neue C++17-Verhalten bei der Verarbeitung von Vorlagen, die andere Vorlagen als Parameter verwenden, selektiv zu deaktivieren (-fno-new-ttp-matching).
  • Unterstützung für die Hardwarebeschleunigung des Tools AddressSanitizer hinzugefügt, mit dem Sie die Fakten zum Zugriff auf freigegebene Speicherbereiche, das Überschreiten der Grenzen des zugewiesenen Puffers und einige andere Arten von Fehlern beim Arbeiten mit Speicher ermitteln können. Die Hardwarebeschleunigung ist derzeit nur für die AArch64-Architektur verfügbar und konzentriert sich auf die Verwendung beim Kompilieren des Linux-Kernels. Um die Hardwarebeschleunigung von AddressSanitizer beim Erstellen von User-Space-Komponenten zu aktivieren, wurde das Flag „-fsanitize=hwaddress“ und das Kernel-Flag „-fsanitize=kernel-hwaddress“ hinzugefügt.
  • Bei der Generierung von Debugging-Informationen wird standardmäßig das DWARF 5-Format verwendet, was im Vergleich zu früheren Versionen die Generierung von 25 % kompakteren Debugging-Daten ermöglicht. Für die vollständige Unterstützung von DWARF 5 ist mindestens die Binutils-Version 2.35.2 erforderlich. Das DWARF 5-Format wird in Debugging-Tools seit GDB 8.0, Valgrind 3.17.0, Elfutils 0.172 und DWZ 0.14 unterstützt. Um Debug-Dateien mit anderen Versionen von DWARF zu generieren, können Sie die Optionen „-gdwarf-2“, „-gdwarf-3“ und „-gdwarf-4“ verwenden.
  • Die Anforderungen an Compiler, die zum Erstellen von GCC verwendet werden können, wurden erhöht. Der Compiler muss nun den C++11-Standard unterstützen (zuvor war C++98 erforderlich), d.h. Wenn GCC 10 ausreichte, um GCC 3.4 zu erstellen, dann ist jetzt mindestens GCC 11 erforderlich, um GCC 4.8 zu erstellen.
  • Der Name und der Speicherort der Dateien zum Speichern von Dumps, temporären Dateien und zusätzlichen Informationen, die für die LTO-Optimierung erforderlich sind, wurden geändert. Solche Dateien werden nun immer im aktuellen Verzeichnis gespeichert, es sei denn, der Pfad wird explizit über die Optionen „-dumpbase“, „-dumpdir“ und „-save-temps=*“ geändert.
  • Die Unterstützung für das Binärformat BRIG zur Verwendung mit der HSAIL-Sprache (Heterogeneous System Architecture Intermediate Language) ist veraltet und wird bald entfernt.
  • Die Funktionen des ThreadSanitizer-Modus (-fsanitize=thread) wurden erweitert, um Race Conditions zu erkennen, wenn dieselben Daten von verschiedenen Threads einer Multithread-Anwendung gemeinsam genutzt werden. Die neue Version bietet Unterstützung für alternative Laufzeiten und Umgebungen sowie Unterstützung für das Debugging-Tool KCSAN (Kernel Concurrency Sanitizer), das zur dynamischen Erkennung von Race Conditions im Linux-Kernel entwickelt wurde. Neue Optionen „-param tsan-distinguish-volatile“ und „-param tsan-instrument-func-entry-exit“ hinzugefügt.
  • Spaltennummern in Diagnosemeldungen spiegeln jetzt nicht die Byteanzahl vom Zeilenanfang an, sondern tatsächlich die Spaltennummern, die Multibyte-Zeichen und Zeichen berücksichtigen, die mehrere Positionen in der Zeile einnehmen (z. B. das Zeichen 🙂 zwei Positionen einnimmt und). wird in 4 Bytes kodiert). Ebenso werden Tabulatorzeichen jetzt als eine bestimmte Anzahl von Leerzeichen behandelt (konfigurierbar über die Option -ftabstop, Standard 8). Um das alte Verhalten wiederherzustellen, wird die Option „-fdiagnostics-column-unit=byte“ vorgeschlagen, und um den Anfangswert (Nummerierung von 0 oder 1) zu bestimmen – die Option „-fdiagnostics-column-origin=“.
  • Der Vektorisierer berücksichtigt den gesamten Inhalt der Funktion und fügt Verarbeitungsmöglichkeiten hinzu, die mit Schnittpunkten und Verweisen auf vorherige Blöcke im Kontrollflussdiagramm (CFG, Kontrollflussdiagramm) verbunden sind.
  • Der Optimierer implementiert die Möglichkeit, eine Reihe bedingter Operationen, die dieselbe Variable vergleichen, in einen Switch-Ausdruck umzuwandeln. Der Schalterausdruck kann später mithilfe von Bittestanweisungen codiert werden (die Option „-fbit-tests“ wurde hinzugefügt, um eine solche Konvertierung zu steuern).
  • Verbesserte interprozedurale Optimierungen. Ein neuer IPA-modref-Pass (-fipa-modref) wurde hinzugefügt, um Nebenwirkungen beim Aufrufen von Funktionen zu verfolgen und die Genauigkeit der Analyse zu verbessern. Verbesserte Implementierung des IPA-ICF-Passes (-fipa-icf), der den Speicherverbrauch während der Kompilierung reduziert und die Anzahl der einheitlichen Funktionen erhöht, für die identische Codeblöcke kombiniert werden. Im IPA-CP-Durchlauf (Interprocedural Constant Propagation) wurde die Vorhersageheuristik unter Berücksichtigung bekannter Grenzen und Merkmale der Schleifen verbessert.
  • Bei Linking Time Optimizations (LTO) wird das Bytecode-Format optimiert, um die Größe zu reduzieren und die Verarbeitungsgeschwindigkeit zu verbessern. Reduzierter Spitzenspeicherverbrauch während der Bindungsphase.
  • Beim Optimierungsmechanismus basierend auf den Ergebnissen der Code-Profilierung (PGO – Profilgesteuerte Optimierung), der die Generierung eines optimaleren Codes basierend auf der Analyse von Ausführungsmerkmalen ermöglicht, wird die Größe von Dateien mit GCOV-Daten aufgrund einer kompakteren Verpackung von Nullzählern reduziert . Verbesserter „-fprofile-values“-Modus durch Verfolgung weiterer Parameter bei indirekten Aufrufen.
  • Die Implementierung des OpenMP 5.0-Standards (Open Multi-Processing), der die API und Methoden für die Anwendung paralleler Programmiermethoden auf Multicore- und Hybridsystemen (CPU+GPU/DSP) mit gemeinsam genutztem Speicher und Vektorisierungseinheiten (SIMD) definiert, hat Fortsetzung. Erste Unterstützung für die Allocate-Direktive und die Möglichkeit hinzugefügt, heterogene Schleifen in OpenMP-Konstrukten zu verwenden. Unterstützung für die Umgebungsvariable OMP_TARGET_OFFLOAD implementiert.
  • Die Implementierung der für die Sprachen C, C++ und Fortran bereitgestellten parallelen Programmierspezifikation OpenACC 2.6 wurde verbessert und definiert Tools zum Auslagern von Vorgängen auf GPUs und spezialisierten Prozessoren wie NVIDIA PTX.
  • Für C-Sprachen wurde ein neues Attribut „no_stack_protector“ implementiert, das Funktionen markiert, für die der Stapelschutz nicht aktiviert werden sollte („-fstack-protector“). Das Attribut „malloc“ wurde erweitert, um die Identifizierung von Aufrufpaaren zum Zuweisen und Freigeben von Speicher (Allocator/Deallocator) zu unterstützen, das im statischen Analysator verwendet wird, um typische Fehler bei der Arbeit mit Speicher zu identifizieren (Speicherlecks, Verwendung nach Freigabe, doppelte Aufrufe der Free-Funktion usw.) und in Compiler-Warnungen „-Wmismatched-dealloc“, „-Wmismatched-new-delete“ und „-Wfree-nonheap-object“, die über Inkonsistenzen zwischen Speicherfreigabe und Speicherzuweisungsvorgängen informieren.
  • Für die Sprache C wurden neue Warnungen hinzugefügt:
    • „-Wmismatched-dealloc“ (standardmäßig aktiviert) – warnt vor Speicherfreigabevorgängen, die einen Zeiger verwenden, der nicht mit Speicherzuweisungsfunktionen kompatibel ist.
    • „-Wsizeof-array-div“ (aktiviert, wenn „-Wall“ angegeben ist) – Warnt vor der Division zweier sizeof-Operatoren, wenn der Divisor nicht mit der Größe des Array-Elements übereinstimmt.
    • „-Wstringop-overread“ (standardmäßig aktiviert) – warnt vor dem Aufruf einer String-Funktion, die Daten aus einem Bereich außerhalb der Array-Grenze liest.
    • „-Wtsan“ (standardmäßig aktiviert) – Warnt vor der Verwendung von Funktionen (wie std::atomic_thread_fence), die in ThreadSanitizer nicht unterstützt werden.
    • „-Warray-parameter“ und „-Wvla-parameter“ (aktiviert bei Angabe von „-Wall“) – warnt vor dem Überschreiben von Funktionen mit inkompatiblen Deklarationen von Argumenten, die mit Arrays fester und variabler Länge verknüpft sind.
    • Die Warnung „-Wuninitialized“ erkennt jetzt Versuche, aus nicht initialisiertem, dynamisch zugewiesenem Speicher zu lesen.
    • Die Warnung „-Wfree-nonheap-object“ erweitert die Definition von Fällen, in denen Speicherfreigabefunktionen mit einem Zeiger aufgerufen werden, der nicht durch dynamische Speicherzuordnungsfunktionen erhalten wird.
    • Die Warnung „-Wmaybe-uninitialized“ hat die Erkennung der Übergabe von Zeigern auf Funktionen erweitert, die auf nicht initialisierte Speicherorte verweisen.
  • Für die Sprache C wurde ein Teil der im Rahmen des C2X-Standards entwickelten neuen Funktionen implementiert (aktiviert durch Angabe von -std=c2x und -std=gnu2x): Makros BOOL_MAX und BOOL_WIDTH, optionale Angabe der Namen nicht verwendeter Parameter in der Funktion Definitionen (wie in C++), Attribut „[ [nodiscard]]“, Präprozessoroperator „__has_c_attribute“, Makros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC _INFINITY und DEC _NAN, NaN=Makros für FloatN, _FloatNx und _DecimalN, Möglichkeit zur Angabe von Sprungmarken vor Deklarationen und am Ende zusammengesetzter Anweisungen.
  • Für C++ wurde ein Teil der im C++20-Standard vorgeschlagenen Änderungen und Neuerungen implementiert, darunter virtuelle Funktionen „consteval virtual“, Pseudo-Destruktoren für das Ende des Lebenszyklus von Objekten, die Verwendung der Enum-Klasse und Berechnen der Größe eines Arrays im „neuen“ Ausdruck.
  • Für C++ wurde experimentelle Unterstützung für einige Verbesserungen hinzugefügt, die für den zukünftigen C++23-Standard entwickelt werden (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu). ++2b). Beispielsweise gibt es jetzt Unterstützung für das Literalsuffix „zu“ für vorzeichenbehaftete size_t-Werte.
  • libstdc++ hat die Unterstützung für den C++17-Standard verbessert, einschließlich der Einführung der Implementierungen std::from_chars und std::to_chars für Gleitkommatypen. Neue Elemente des C++20-Standards wurden implementiert, darunter std::bit_cast, std::source_location, atomare Operationen warten und benachrichtigen, , , , sowie Elemente des zukünftigen C++23-Standards (std::to_underlying, std::is_scoped_enum). Experimentelle Unterstützung für Typen für die parallele Datenverarbeitung (SIMD, Data-Parallel Types) hinzugefügt. Die Implementierung von std::uniform_int_distribution wurde beschleunigt.
  • Das Alpha-Qualitätsflag wurde aus libgccjit entfernt, einer gemeinsam genutzten Bibliothek zum Einbetten eines Codegenerators in andere Prozesse und zum Organisieren der JIT-Kompilierung von Bytecode in Maschinencode. Es wurde die Möglichkeit hinzugefügt, libgccjit für MinGW zu erstellen.
  • Unterstützung für die AArch64 Armv8-R-Architektur (-march=armv8-r) hinzugefügt. Für AArch64- und ARM-Architekturen wurde Unterstützung für Prozessoren hinzugefügt (Parameter -mcpu und -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex-X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) und Arm Neoverse N2 (neoverse-n2). Außerdem wurden Fujitsu A64FX (a64fx) und Arm Cortex-R82 (cortex-r82) CPUs hinzugefügt, die nur die AArch64-Architektur unterstützen.
  • Unterstützung für die Verwendung von Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) und MVE (AArch32 M-Profil) SIMD-Anweisungen zur automatischen Vektorisierung von Operationen zur Durchführung von Additionen, Subtraktionen, Multiplikationen und Varianten der Addition/Subtraktion hinzugefügt komplexe Zahlen. Erste Unterstützung für Autovektorisierung für ARM mithilfe des MVE-Befehlssatzes hinzugefügt.
  • Für ARM-Plattformen wird ein vollständiger Satz Compiler-integrierter C-Funktionen (Intrinsics) bereitgestellt, die durch erweiterte Vektoranweisungen (SIMD) ersetzt werden und alle in der ACLE Q3 2020-Spezifikation dokumentierten NEON-Anweisungen abdecken.
  • Dem Backend wurde Unterstützung für die gfx908-GPU hinzugefügt, um Code für AMD-GPUs basierend auf der GCN-Mikroarchitektur zu generieren.
  • Unterstützung für neue Prozessoren und darin implementierte neue Befehlssatzerweiterungen hinzugefügt:
    • Intel Sapphire Rapids (-march=sapphirerapids, ermöglicht die Unterstützung der Anweisungen MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 und AVX-VNNI.
    • Intel Alderlake (-march=alderlake, ermöglicht die Unterstützung für CLDEMOTE-, PTWRITE-, WAITPKG-, SERIALIZE-, KEYLOCKER-, AVX-VNNI- und HRESET-Anweisungen).
    • Intel Rocketlake (-march=rocketlake, ähnlich wie Rocket Lake ohne SGX-Unterstützung).
    • AMD Zen 3 (-march=znver3).
  • Für IA-32/x86-64-Systeme, die auf Intel-Prozessoren basieren, wurde Unterstützung für die neuen Prozessoranweisungen TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI hinzugefügt.
  • Unterstützung für „-march=x86-64-v[234]“-Flags hinzugefügt, um x86-64-Architekturebenen auszuwählen (v2 – deckt die Erweiterungen SSE4.2, SSSE3, POPCNT und CMPXCHG16B ab; v3 – AVX2 und MOVBE; v4 – AVX-512 ).
  • Unterstützung für RISC-V-Systeme mit Big-Endian-Bytereihenfolge hinzugefügt. Option „-misa-spec=*“ hinzugefügt, um die Version der RISC-V-Befehlssatzarchitekturspezifikation auszuwählen. Unterstützung für AddressSanitizer und Stack-Schutz mithilfe von Canary-Tags hinzugefügt.
  • Kontinuierliche Verbesserung des statischen Analysemodus „-fanalyzer“, der eine ressourcenintensive interprozedurale Analyse von Codeausführungspfaden und Datenflüssen im 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. In der neuen Version:
    • Der Code zur Verfolgung des Programmstatus wurde komplett neu geschrieben. Probleme beim Scannen sehr großer C-Dateien wurden behoben.
    • Erste C++-Unterstützung hinzugefügt.
    • Die Analyse der Speicherzuweisung und -freigabe wurde von den spezifischen malloc- und free-Funktionen abstrahiert und unterstützt jetzt new/delete und new[]/delete[].
    • Neue Warnungen hinzugefügt: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const und -Wanalyzer-write-to-string-literal.
    • Neue Debugging-Optionen -fdump-analyzer-json und -fno-analyzer-feasibility hinzugefügt.
    • Die Möglichkeit, den Analysator durch Plugins für GCC zu erweitern, wurde implementiert (z. B. wurde ein Plugin vorbereitet, um die fehlerhafte Verwendung von Global Locking (GIL) in CPython zu überprüfen).

Source: opennet.ru

Kommentar hinzufügen