Veröffentlichung des Compiler-Pakets GCC 12

Nach einem Jahr der Entwicklung wurde die Veröffentlichung des freien Compiler-Sets GCC 12.1 angekündigt, der erste bedeutende Release der neuen GCC 12.x Reihe. Gemäß dem neuen Versionsschema wurde Version 12.0 während der Entwicklungsphase verwendet, und kurz vor der Veröffentlichung von GCC 12.1 wurde bereits der Branch GCC 13.0 abgezweigt, auf dessen Grundlage die nächste bedeutende Veröffentlichung, GCC 13.1, entstehen wird. Am 23. Mai feiert das Projekt 35 Jahre seit der Veröffentlichung des ersten GCC-Releases.

Wesentliche Änderungen:

  • Die Unterstützung des Debugging-Formats CTF (Compact Type Format) wurde hinzugefügt, das eine kompakte Speicherung der Informationen über C-Typen, die Beziehungen zwischen Funktionen und Debugging-Symbole ermöglicht. Bei der Einbettung in ELF-Objekte erlaubt das Format die Verwendung von EFL-Symboltabellen, um Datenverdopplungen zu vermeiden.
  • Die Unterstützung des Debugging-Informationsspeicherformats „STABS“, das in den 1980er Jahren entwickelt wurde, wurde als veraltet erklärt.
  • Die Arbeit an der Erweiterung der Unterstützung zukünftiger Standards C2X und C++23 für die Sprachen C und C++ wurde fortgesetzt. So wurde beispielsweise die Unterstützung für den Ausdruck „if consteval“ hinzugefügt; die Verwendung von auto in Funktionsargumenten („f(auto(g()))“) erlaubt; der Einsatz von nicht-literalen Variablen, goto und Labels in als constexpr deklarierten Funktionen erlaubt; Unterstützung für mehrdimensionale Indexoperatoren operator[] hinzugefügt; die Möglichkeiten von Initialisierungsblöcken in if, for und switch erweitert („for (using T = int; T e : v)“).
  • In der Standardbibliothek von C++ wurde die Unterstützung für experimentelle Abschnitte der Standards C++20 und C++23 verbessert. Unterstützung für std::move_only_function, , std::basic_string::resize_and_overwrite, , und std::invoke_r hinzugefügt. Die Verwendung von std::unique_ptr, std::vector, std::basic_string, std::optional und std::variant in constexpr-Funktionen ist jetzt erlaubt.
  • Für die Programmiersprache Fortran wurde im Frontend vollständige Unterstützung für die Spezifikation TS 29113 bereitgestellt, die Möglichkeiten zur Gewährleistung der Portabilität zwischen Fortran- und C-Code beschreibt.
  • Unterstützung für die Erweiterung __builtin_shufflevector(vec1, vec2, index1, index2, …) hinzugefügt, die zuvor in Clang eingeführt wurde und einen einheitlichen Aufruf für die Ausführung von allgemeinen Vektoroperationen zur Permutation und Mischung bietet.
  • Bei Verwendung des Optimierungslevels „-O2“ ist die Vektorisierung standardmäßig aktiviert (einschließlich der Modi -ftree-vectorize und -fvect-cost-model=very-cheap). Das Modell „very-cheap“ erlaubt die Vektorisierung nur, wenn der Vektorkode den vektorisierbaren Skalarcode vollständig ersetzen kann.
  • Der Modus „-ftrivial-auto-var-init“ wurde hinzugefügt, um eine explizite Initialisierung von Variablen im Stack zu ermöglichen, um Probleme zu verfolgen und Schwachstellen im Zusammenhang mit der Verwendung nicht initialisierter Variablen zu verhindern.
  • Für die Sprachen C und C++ wurde die eingebaute Funktion __builtin_dynamic_object_size hinzugefügt, um die Größe eines Objekts zu bestimmen, die mit einer ähnlichen Funktion von Clang kompatibel ist.
  • Für die Sprachen C und C++ wurde die Unterstützung des Attributs „unavailable“ hinzugefügt (z. B. können Funktionen gekennzeichnet werden, bei deren Verwendung eine Fehlermeldung ausgegeben wird).
  • Für die Sprachen C und C++ wurde die Unterstützung der Präprozessor-Direktiven „#elifdef“ und „#elifndef“ hinzugefügt.
  • Das Flag „-Wbidi-chars“ wurde hinzugefügt, um eine Warnmeldung auszugeben, wenn UTF-8-Zeichen, die die Anzeigereihenfolge von bidirektionalem Text ändern, falsch verwendet werden.
  • Die Flagge „-Warray-compare“ wurde hinzugefügt, um eine Warnung auszugeben, wenn versucht wird, zwei Operanden, die auf Arrays verweisen, zu vergleichen.
  • Die Implementierung der OpenMP 5.0 und 5.1 Standards (Open Multi-Processing) wurde fortgesetzt, die APIs und Methoden für die Anwendung paralleler Programmierung auf Multi-Core- und Hybridprozessoren (CPU+GPU/DSP) mit gemeinsamem Speicher und Vektorisierungsblöcken (SIMD) definieren.
  • Die Implementierung der OpenACC 2.6-Spezifikation für parallele Programmierung wurde verbessert, die Mittel für das Auslagern von Operationen (offloading) auf GPUs und spezialisierte Prozessoren wie NVIDIA PTX definiert.
  • Die Unterstützung erweiterter Intel AVX512-FP16-Instruktionen und des Typs _Float16 wurde in den Code-Generierungs-Backend für die x86-Architektur hinzugefügt.
  • Für die x86-Architektur wurde ein Schutz gegen Schwachstellen in Prozessoren, die durch spekulative Ausführung von Instruktionen nach bedingungslosen Sprungoperationen verursacht werden, hinzugefügt. Das Problem entsteht durch die vorzeitige Verarbeitung von Instruktionen, die im Speicher direkt nach dem Sprungbefehl folgen (SLS, Straight Line Speculation). Um den Schutz zu aktivieren, wurde die Option „-mharden-sls“ vorgeschlagen.
  • Der experimentelle statische Analyse-Tool hat eine Definition für die Nutzung nicht initialisierter Variablen hinzugefügt. Erste Unterstützung für die Analyse von Assembler-Code in Inline-Einfügungen wurde implementiert. Das Verfolgen des Speicherstatus wurde verbessert. Der Code zur Verarbeitung von Switch-Ausdrücken wurde neu geschrieben.
  • Es wurden 30 neue Aufrufe in libgccjit hinzugefügt, einer gemeinsamen Bibliothek zur Integration eines Codegenerators in andere Prozesse und zur Verwendung für die Organisation der JIT-Kompilierung von Bytecode in Maschinencode.
  • Der Backend-Generator für BPF-Bytecode hat Unterstützung für den CO-RE-Mechanismus (Compile Once — Run Everywhere) hinzugefügt, der es ermöglicht, eBPF-Code für den Linux-Kernel nur einmal zu kompilieren und einen speziellen universellen Loader zu verwenden, der das zu ladende Programm an den aktuellen Kernel und die BTF-Typen (BPF Type Format) anpasst. CO-RE löst das Problem der Portabilität von kompilierte eBPF-Programmen, die zuvor nur in der Kernel-Version verwendet werden konnten, für die sie kompiliert wurden, da sich die Position der Elemente in Datenstrukturen von Version zu Version ändert.
  • Im Backend für die RISC-V-Architektur wurde die Unterstützung neuer Erweiterungen des Befehlssatzes zba, zbb, zbc und zbs sowie ISA-Erweiterungen für Vektor- und skalare kryptografische Operationen hinzugefügt. Standardmäßig wird die Unterstützung der Spezifikation der RISC-V ISA 20191213 bereitgestellt. Ein neues Flag -mtune=thead-c906 wurde hinzugefügt, das Optimierungen für die T-HEAD-Cores c906 aktiviert.
  • Im Backend zur Codegenerierung für AMD-GPUs auf Basis der Mikroarchitektur GCN wurde die Unterstützung für den Typ __int128_t/integer(kind=16) hinzugefügt. Die Nutzung von bis zu 40 Arbeitsgruppen pro Recheneinheit (CU) und bis zu 16 Instruktionsfronten (Wavefront, eine Gruppe von Threads, die gleichzeitig im SIMD Engine ausgeführt werden) wurde ermöglicht. Zuvor war nur ein einzelner Instruktionsfront pro CU erlaubt.
  • Im NVPTX-Backend, das für die Codegenerierung mit der NVIDIA-PTX (Parallel Thread Execution)-Befehlssatzarchitektur vorgesehen ist, wurde die Verwendung der Flags „-march“, „-mptx“ und „-march-map“ ermöglicht. Die Unterstützung für die PTX ISA sm_53, sm_70, sm_75 und sm_80 wurde implementiert. Standardmäßig wird die Architektur sm_30 verwendet.
  • Im Backend für PowerPC / PowerPC64 / RS6000 wurden die Implementierungen der eingebetteten Funktionen überarbeitet. Die eingebetteten Funktionen __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar und __builtin_set_tfiar sind dokumentiert.
  • Im Backend für die ARM/AArch64-Architektur wurde die Unterstützung für die CPU Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) und Arm Cortex-X2 (cortex-x2) hinzugefügt. Neue ARMv8-Architekturvarianten wurden hinzugefügt, um sie in der Option „-march“ zu verwenden: armv8.7-a, armv8.8-a, armv9-a. Es wurde eine Implementierung der C-Compiler-Eintrümpfe (Intrinsics) für atomare Lade- und Speicheroperationen erstellt, die auf den erweiterten ARM-Befehlen (ls64) basiert. Unterstützt werden zudem Beschleunigungen der Funktionen memcpy, memmove und memset durch die ARM-Erweiterung mopsoption.
  • Ein neuer Prüfmodus „-fsanitize=shadow-call-stack“ (ShadowCallStack) wurde hinzugefügt, der derzeit nur für die Architektur AArch64 verfügbar ist und beim Kompilieren von Code mit der Option „-ffixed-r18“ funktioniert. Dieser Modus bietet Schutz vor der Überschreibung der Rücksprungadresse aus einer Funktion im Falle eines Bufferüberlaufs im Stack. Der Schutz besteht darin, nach der Übergabe der Kontrolle an die Funktion die Rücksprungadresse in einem separaten „schattenhaften“ Stack zu speichern und diese Adresse vor dem Verlassen der Funktion abzurufen.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster