Vrijgave van de GCC 12-compilersuite

Na een jaar van ontwikkeling is de gratis compilersuite GCC 12.1 uitgebracht, de eerste belangrijke release in de nieuwe GCC 12.x-tak. In overeenstemming met het nieuwe releasenummeringsschema werd versie 12.0 gebruikt in het ontwikkelingsproces, en kort voor de release van GCC 12.1 was de GCC 13.0-tak al vertakt, op basis waarvan de volgende grote release, GCC 13.1, zou plaatsvinden. worden gevormd. Op 23 mei viert het project het 35 jaar geleden dat de eerste editie van GCC werd opgericht.

Grote veranderingen:

  • Ondersteuning toegevoegd voor het foutopsporingsformaat CTF (Compact Type Format), dat compacte opslag biedt van informatie over C-typen, verbindingen tussen functies en foutopsporingssymbolen. Wanneer ingebed in ELF-objecten, maakt het formaat het gebruik van EFL-tekentabellen mogelijk om gegevensduplicatie te voorkomen.
  • Ondersteuning voor het "STABS"-opslagformaat voor foutopsporingsinformatie, gecreëerd in de jaren tachtig, is verouderd.
  • Er wordt verder gewerkt aan het uitbreiden van de ondersteuning voor toekomstige C2X- en C++23-standaarden voor de C- en C++-talen. Er is bijvoorbeeld ondersteuning voor de uitdrukking “if consteval” toegevoegd; toegestaan ​​om auto te gebruiken in functieargumenten (“f(auto(g()))”); het gebruik van niet-letterlijke variabelen, goto en labels is toegestaan ​​in functies die zijn gedeclareerd als constexpr; ondersteuning toegevoegd voor multidimensionale indexoperatoren operator[]; in if, for en switch zijn de mogelijkheden van initialisatieblokken uitgebreid (“for (met T = int; T e: v)”).
  • De C++ Standard Library heeft verbeterde ondersteuning voor de experimentele secties van de C++20- en C++23-standaarden. Ondersteuning toegevoegd voor std::move_only_function, , std::basic_string::resize_and_overwrite, , en std::invoke_r. Toegestaan ​​om std::unique_ptr, std::vector, std::basic_string, std::optioneel en std::variant te gebruiken in constexpr-functies.
  • De Fortran-frontend biedt volledige ondersteuning voor de TS 29113-specificatie, die mogelijkheden beschrijft om portabiliteit tussen Fortran- en C-code te garanderen.
  • Ondersteuning toegevoegd voor de __builtin_shufflevector(vec1, vec2, index1, index2, ...) extensie die eerder aan Clang is toegevoegd, die een enkele oproep biedt om algemene vectorshuffle- en shuffle-bewerkingen uit te voeren.
  • Wanneer u het optimalisatieniveau "-O2" gebruikt, is vectorisatie standaard ingeschakeld (de modi -ftree-vectorize en -fvect-cost-model=very-cheap zijn ingeschakeld). Het zeer goedkope model staat vectorisatie alleen toe als de vectorcode de scalaire code die wordt gevectoriseerd volledig kan vervangen.
  • "-ftrivial-auto-var-init"-modus toegevoegd om expliciete initialisatie van variabelen op de stapel mogelijk te maken om problemen op te sporen en kwetsbaarheden te blokkeren die verband houden met het gebruik van niet-geïnitialiseerde variabelen.
  • Voor C- en C++-talen is een ingebouwde functie __builtin_dynamic_object_size toegevoegd om de grootte van een object te bepalen, compatibel met een vergelijkbare functie van Clang.
  • Voor de talen C en C++ is ondersteuning voor het attribuut “unavailable” toegevoegd (u kunt bijvoorbeeld functies markeren die een fout genereren als u ze probeert te gebruiken).
  • Voor C- en C++-talen is ondersteuning voor voorverwerkingsrichtlijnen “#elifdef” en “#elifndef” toegevoegd.
  • Vlag "-Wbidi-chars" toegevoegd om een ​​waarschuwing weer te geven als UTF-8-tekens onjuist worden gebruikt, waardoor de volgorde waarin bidirectionele tekst wordt weergegeven wordt gewijzigd.
  • Vlag "-Warray-compare" toegevoegd om een ​​waarschuwing weer te geven bij een poging om twee operanden te vergelijken die naar arrays verwijzen.
  • De implementatie van de OpenMP 5.0 en 5.1 (Open Multi-Processing) standaarden, die de API en methoden definiëren voor het toepassen van parallelle programmeermethoden op multi-core en hybride (CPU+GPU/DSP) systemen met gedeeld geheugen en vectorisatie-eenheden (SIMD) , is voortgezet.
  • Verbeterde implementatie van de OpenACC 2.6 parallelle programmeerspecificatie, die tools definieert voor het overbrengen van bewerkingen op GPU's en gespecialiseerde processors zoals NVIDIA PTX.
  • Ondersteuning voor uitgebreide instructies Intel AVX86-FP512 en het type _Float16 zijn toegevoegd aan de backend voor het genereren van code voor de x16-architectuur.
  • Voor de x86-architectuur is bescherming toegevoegd tegen kwetsbaarheden in processors veroorzaakt door speculatieve uitvoering van instructies na onvoorwaardelijke voorwaartse sprongoperaties. Het probleem treedt op vanwege de preventieve verwerking van instructies die onmiddellijk volgen op de vertakkingsinstructie in het geheugen (SLS, Straight Line Speculation). Om bescherming mogelijk te maken, wordt de optie “-mharden-sls” voorgesteld.
  • Detectie van het gebruik van niet-geïnitialiseerde variabelen toegevoegd aan de experimentele statische analysator. Initiële ondersteuning toegevoegd voor het analyseren van assemblagecode in inline-inserts. Verbeterde geheugentracking. De code voor het verwerken van schakelexpressies is herschreven.
  • Er zijn 30 nieuwe aanroepen toegevoegd aan libgccjit, een gedeelde bibliotheek voor het inbedden van een codegenerator in andere processen en het gebruik ervan om bytecode JIT te compileren in machinecode.
  • Ondersteuning voor het CO-RE-mechanisme (Compile Once - Run Everywhere) is toegevoegd aan de backend voor het genereren van BPF-bytecode, waarmee u de code van eBPF-programma's voor de Linux-kernel slechts één keer kunt compileren en een speciale universele lader kunt gebruiken die de geladen programma naar de huidige kernel en BPF Types Format). CO-RE lost het probleem op van de overdraagbaarheid van gecompileerde eBPF-programma's, die voorheen alleen konden worden gebruikt in de versie van de kernel waarvoor ze waren gecompileerd, omdat de positie van elementen in datastructuren van versie tot versie verandert.
  • De RISC-V-backend voegt ondersteuning toe voor nieuwe instructiesetarchitectuuruitbreidingen zba, zbb, zbc en zbs, evenals ISA-uitbreidingen voor vector- en scalaire cryptografische bewerkingen. Standaard wordt ondersteuning geboden voor de RISC-V ISA 20191213-specificatie. De vlag -mtune=thead-c906 is toegevoegd om optimalisaties voor T-HEAD c906-cores mogelijk te maken.
  • Ondersteuning voor het type __int128_t/integer(kind=16) is toegevoegd aan de backend voor het genereren van code voor AMD GPU's op basis van de GCN-microarchitectuur. Het is mogelijk om maximaal 40 werkgroepen per rekeneenheid (CU) en maximaal 16 instructiefronten (wavefront, een reeks threads die parallel worden uitgevoerd door de SIMD Engine) per groep te gebruiken. Voorheen was slechts één instructierand per CU toegestaan.
  • De NVPTX-backend, ontworpen om code te genereren met behulp van de NVIDIA PTX-instructiesetarchitectuur (Parallel Thread Execution), heeft de mogelijkheid toegevoegd om de vlaggen "-march", "-mptx" en "-march-map" te gebruiken. Ondersteuning geïmplementeerd voor PTX ISA sm_53, sm_70, sm_75 en sm_80. De standaardarchitectuur is sm_30.
  • In de backend voor PowerPC / PowerPC64 / RS6000-processors zijn de implementaties van ingebouwde functies herschreven. De ingebouwde functies __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar en __builtin_set_tfiar zijn gedocumenteerd.
  • Ondersteuning voor Arm Ampere-64 (-mcpu/-mtune ampère1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) en Arm Cortex-X710 (cortex-x2). Ondersteuning toegevoegd voor nieuwe ARMv2-architectuuropties voor gebruik met de "-march"-optie: armv8-a, armv8.7-a, armv8.8-a. Implementatie toegevoegd van C-functies ingebouwd in de compiler (Intrinsics) voor atomair laden en opslaan van gegevens in het geheugen, gebaseerd op het gebruik van uitgebreide ARM-instructies (ls9). Ondersteuning toegevoegd voor het versnellen van de memcpy-, memmove- en memset-functies met behulp van de mopsoption ARM-extensie.
  • Een nieuwe controlemodus “-fsanitize=shadow-call-stack” (ShadowCallStack) toegevoegd, die momenteel alleen beschikbaar is voor de AArch64-architectuur en werkt bij het bouwen van code met de optie “-ffixed-r18”. De modus biedt bescherming tegen het overschrijven van het retouradres van een functie in het geval van een bufferoverflow op de stapel. De essentie van de beveiliging is om het retouradres op te slaan in een aparte “schaduwstapel” nadat de besturing naar een functie is overgedragen en dit adres is opgehaald voordat de functie wordt verlaten.

Bron: opennet.ru

Voeg een reactie