Veröffentlichung der GCC 12-Compiler-Suite

Nach einem Jahr Entwicklungszeit wurde die kostenlose Compiler-Suite GCC 12.1 veröffentlicht, die erste bedeutende Veröffentlichung im neuen GCC 12.x-Zweig. Gemäß dem neuen Release-Nummerierungsschema wurde im Entwicklungsprozess Version 12.0 verwendet, und kurz vor der Veröffentlichung von GCC 12.1 hatte sich bereits der GCC 13.0-Zweig abgezweigt, auf dessen Grundlage das nächste Hauptrelease, GCC 13.1, erfolgen sollte gebildet werden. Am 23. Mai feiert das Projekt den 35. Jahrestag seit der Gründung der ersten Ausgabe des GCC.

Wichtigste Änderungen:

  • Unterstützung für das Debugging-Format CTF (Compact Type Format) hinzugefügt, das eine kompakte Speicherung von Informationen über C-Typen, Verbindungen zwischen Funktionen und Debugging-Symbolen ermöglicht. Bei der Einbettung in ELF-Objekte ermöglicht das Format die Verwendung von EFL-Zeichentabellen, um Datenduplizierung zu vermeiden.
  • Die Unterstützung für das in den 1980er Jahren entwickelte Debug-Informationsspeicherformat „STABS“ ist veraltet.
  • Es wird weiterhin daran gearbeitet, die Unterstützung für zukünftige C2X- und C++23-Standards für die Sprachen C und C++ zu erweitern. Beispielsweise wurde Unterstützung für den Ausdruck „if consteval“ hinzugefügt; erlaubt, auto in Funktionsargumenten zu verwenden („f(auto(g()))“); die Verwendung von nicht-literalen Variablen, goto und Labels ist in als constexpr deklarierten Funktionen zulässig; Unterstützung für mehrdimensionale Indexoperatoren hinzugefügt: Operator[]; in if, for und switch wurden die Fähigkeiten von Initialisierungsblöcken erweitert („for (using T = int; T e : v)“).
  • Die C++-Standardbibliothek bietet eine verbesserte Unterstützung für die experimentellen Abschnitte der Standards C++20 und C++23. Unterstützung für std::move_only_function hinzugefügt, , std::basic_string::resize_and_overwrite, , und std::invoke_r. Die Verwendung von std::unique_ptr, std::vector, std::basic_string, std::optional und std::variant in constexpr-Funktionen ist zulässig.
  • Das Fortran-Frontend bietet vollständige Unterstützung für die TS 29113-Spezifikation, die Funktionen zur Gewährleistung der Portabilität zwischen Fortran und C-Code beschreibt.
  • Unterstützung für die zuvor zu Clang hinzugefügte Erweiterung __builtin_shufflevector(vec1, vec2, index1, index2, ...) hinzugefügt, die einen einzigen Aufruf zum Ausführen allgemeiner Vektor-Shuffle- und Shuffle-Operationen bietet.
  • Bei Verwendung der Optimierungsstufe „-O2“ ist die Vektorisierung standardmäßig aktiviert (die Modi -ftree-vectorize und -fvect-cost-model=very-cheap sind aktiviert). Das sehr kostengünstige Modell ermöglicht die Vektorisierung nur, wenn der Vektorcode den zu vektorisierenden Skalarcode vollständig ersetzen kann.
  • Modus „-ftrivial-auto-var-init“ hinzugefügt, um die explizite Initialisierung von Variablen auf dem Stapel zu ermöglichen, um Probleme zu verfolgen und Schwachstellen zu blockieren, die mit der Verwendung nicht initialisierter Variablen verbunden sind.
  • Für die Sprachen C und C++ wurde eine integrierte 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 Unterstützung für das Attribut „nicht verfügbar“ hinzugefügt (Sie können beispielsweise Funktionen markieren, die einen Fehler erzeugen, wenn Sie versuchen, sie zu verwenden).
  • Für die Sprachen C und C++ wurde Unterstützung für die Vorverarbeitungsanweisungen „#elifdef“ und „#elifndef“ hinzugefügt.
  • Flag „-Wbidi-chars“ hinzugefügt, um eine Warnung anzuzeigen, wenn UTF-8-Zeichen falsch verwendet werden, wodurch die Reihenfolge geändert wird, in der bidirektionaler Text angezeigt wird.
  • Flag „-Warray-compare“ hinzugefügt, um eine Warnung anzuzeigen, wenn versucht wird, zwei Operanden zu vergleichen, die auf Arrays verweisen.
  • Die Implementierung der Standards OpenMP 5.0 und 5.1 (Open Multi-Processing), die die API und Methoden zur Anwendung paralleler Programmiermethoden auf Multicore- und Hybridsystemen (CPU+GPU/DSP) mit gemeinsam genutztem Speicher und Vektorisierungseinheiten (SIMD) definieren. , wurde fortgesetzt.
  • Verbesserte Implementierung der OpenACC 2.6-Spezifikation für parallele Programmierung, die Tools zum Auslagern von Vorgängen auf GPUs und spezialisierten Prozessoren wie NVIDIA PTX definiert.
  • Dem Codegenerierungs-Backend für die x86-Architektur wurde Unterstützung für erweiterte Anweisungen Intel AVX512-FP16 und den Typ _Float16 hinzugefügt.
  • Für die x86-Architektur wurde ein Schutz gegen Schwachstellen in Prozessoren hinzugefügt, die durch die spekulative Ausführung von Anweisungen nach bedingungslosen Vorwärtssprungoperationen verursacht werden. Das Problem tritt aufgrund der präventiven Verarbeitung von Anweisungen auf, die unmittelbar auf die Verzweigungsanweisung im Speicher folgen (SLS, Straight Line Speculation). Um den Schutz zu aktivieren, wird die Option „-mharden-sls“ vorgeschlagen.
  • Erkennung der Verwendung nicht initialisierter Variablen zum experimentellen statischen Analysator hinzugefügt. Erste Unterstützung für die Analyse von Assembler-Code in Inline-Einfügungen hinzugefügt. Verbesserte Speicherverfolgung. Der Code zur Verarbeitung von Schalterausdrücken wurde neu geschrieben.
  • 30 neue Aufrufe zu libgccjit hinzugefügt, einer gemeinsam genutzten Bibliothek zum Einbetten eines Codegenerators in andere Prozesse und zur Verwendung zur JIT-Kompilierung von Bytecode in Maschinencode.
  • Dem Backend zur Generierung von BPF-Bytecode wurde Unterstützung für den CO-RE-Mechanismus (Compile Once – Run Everywhere) hinzugefügt, der es Ihnen ermöglicht, den Code von eBPF-Programmen für den Linux-Kernel nur einmal zu kompilieren und einen speziellen Universal-Loader zu verwenden, der den anpasst geladenes Programm in den aktuellen Kernel und BPF Types Format). CO-RE löst das Problem der Portabilität kompilierter eBPF-Programme, die bisher nur in der Version des Kernels verwendet werden konnten, für die sie kompiliert wurden, da sich die Position von Elementen in Datenstrukturen von Version zu Version ändert.
  • Das RISC-V-Backend bietet Unterstützung für die neuen Erweiterungen der Befehlssatzarchitektur zba, zbb, zbc und zbs sowie ISA-Erweiterungen für vektorielle und skalare kryptografische Operationen. Standardmäßig wird die Spezifikation RISC-V ISA 20191213 unterstützt. Das Flag -mtune=thead-c906 wurde hinzugefügt, um Optimierungen für T-HEAD c906-Kerne zu ermöglichen.
  • Dem Codegenerierungs-Backend für AMD-GPUs basierend auf der GCN-Mikroarchitektur wurde Unterstützung für den Typ __int128_t/integer(kind=16) hinzugefügt. Es ist möglich, bis zu 40 Arbeitsgruppen pro Recheneinheit (CU) und bis zu 16 Befehlsfronten (Wavefront, ein Satz von Threads, die von der SIMD Engine parallel ausgeführt werden) pro Gruppe zu verwenden. Bisher war nur eine Befehlsflanke pro CU zulässig.
  • Das NVPTX-Backend, das zum Generieren von Code mithilfe der NVIDIA PTX-Befehlssatzarchitektur (Parallel Thread Execution) entwickelt wurde, hat die Möglichkeit hinzugefügt, die Flags „-march“, „-mptx“ und „-march-map“ zu verwenden. Unterstützung für PTX ISA sm_53, sm_70, sm_75 und sm_80 implementiert. Die Standardarchitektur ist sm_30.
  • Im Backend für PowerPC-/PowerPC64-/RS6000-Prozessoren wurden die Implementierungen integrierter Funktionen neu geschrieben. Die integrierten 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.
  • Unterstützung für Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) und Arm Cortex-X710 (cortex-x2). Unterstützung für neue ARMv2-Architekturoptionen zur Verwendung mit der Option „-march“ hinzugefügt: armv8-a, armv8.7-a, armv8.8-a. Implementierung von im Compiler integrierten C-Funktionen (Intrinsics) zum atomaren Laden und Speichern von Daten im Speicher hinzugefügt, basierend auf der Verwendung erweiterter ARM-Anweisungen (ls9). Unterstützung für die Beschleunigung der Funktionen memcpy, memmove und memset mithilfe der ARM-Erweiterung mopsoption hinzugefügt.
  • Ein neuer Prüfmodus „-fsanitize=shadow-call-stack“ (ShadowCallStack) wurde hinzugefügt, der derzeit nur für die AArch64-Architektur verfügbar ist und beim Erstellen von Code mit der Option „-ffixed-r18“ funktioniert. Der Modus bietet Schutz vor dem Überschreiben der Rücksprungadresse einer Funktion im Falle eines Pufferüberlaufs auf dem Stapel. Der Kern des Schutzes besteht darin, die Rücksprungadresse in einem separaten „Schattenstapel“ zu speichern, nachdem die Steuerung an eine Funktion übergeben wurde, und diese Adresse vor dem Verlassen der Funktion abzurufen.

Source: opennet.ru

Kommentar hinzufügen