Release av GCC 12-kompilatorsviten

Efter ett års utveckling har den kostnadsfria kompilatorsviten GCC 12.1 släppts, den första betydande utgåvan i den nya GCC 12.x-grenen. I enlighet med det nya versionsnumreringsschemat användes version 12.0 i utvecklingsprocessen, och kort före lanseringen av GCC 12.1 hade GCC 13.0-grenen redan avvecklats, på grundval av vilken nästa stora utgåva, GCC 13.1, skulle bildas. Den 23 maj firar projektet 35 år sedan bildandet av den första upplagan av GCC.

Huvudändringar:

  • Tillagt stöd för felsökningsformatet CTF (Compact Type Format), som ger kompakt lagring av information om C-typer, kopplingar mellan funktioner och felsökningssymboler. När det är inbäddat i ELF-objekt tillåter formatet användning av EFL-teckentabeller för att undvika dataduplicering.
  • Stöd för lagringsformatet "STABS" för felsökningsinformation, skapat på 1980-talet, har fasats ut.
  • Arbetet fortsätter med att utöka stödet för framtida C2X- och C++23-standarder för C- och C++-språken. Till exempel har stöd för uttrycket "if consteval" lagts till; tillåts använda auto i funktionsargument ("f(auto(g()))"); användningen av icke-literala variabler, goto och etiketter är tillåten i funktioner som deklareras som constexpr; lagt till stöd för flerdimensionell indexoperator[]; in om, för och switch, kapaciteten för initieringsblock har utökats ("för (med T = int; T e : v)").
  • C++ Standard Library har förbättrat stöd för experimentsektionerna i C++20 och C++23 standarderna. Lade till stöd för std::move_only_function, , std::basic_string::resize_and_overwrite, , och std::invoke_r. Tillåtet att använda std::unique_ptr, std::vektor, std::basic_string, std::valfritt och std::variant i constexpr-funktioner.
  • Fortran-gränssnittet ger fullt stöd för TS 29113-specifikationen, som beskriver möjligheter för att säkerställa portabilitet mellan Fortran och C-kod.
  • Lade till stöd för tillägget __builtin_shufflevector(vec1, vec2, index1, index2, ...) som tidigare lagts till i Clang, som erbjuder ett enda anrop för att utföra vanliga vektorshuffle- och shuffle-operationer.
  • När du använder optimeringsnivån "-O2" är vektorisering aktiverad som standard (lägena -ftree-vectorize och -fvect-cost-model=very-cheap är aktiverade). Den mycket billiga modellen tillåter vektorisering endast om vektorkoden helt kan ersätta den skalära koden som vektoriseras.
  • Lade till "-ftrivial-auto-var-init"-läge för att möjliggöra explicit initiering av variabler på stacken för att spåra problem och blockera sårbarheter associerade med användning av oinitierade variabler.
  • För språken C och C++ har en inbyggd funktion __builtin_dynamic_object_size lagts till för att bestämma storleken på ett objekt, kompatibel med en liknande funktion från Clang.
  • För C- och C++-språken har stöd för attributet "unavailable" lagts till (du kan till exempel markera funktioner som genererar ett fel om du försöker använda dem).
  • För språken C och C++ har stöd för förbehandlingsdirektiven "#elifdef" och "#elifndef" lagts till.
  • Lade till "-Wbidi-chars"-flaggan för att visa en varning om UTF-8-tecken används felaktigt, vilket ändrar ordningen i vilken dubbelriktad text visas.
  • Lade till flaggan "-Warray-compare" för att varna när man försöker jämföra två operander som hänvisar till arrayer.
  • Implementeringen av OpenMP 5.0 och 5.1 (Open Multi-Processing) standarder, som definierar API och metoder för att tillämpa parallella programmeringsmetoder på flerkärniga och hybridsystem (CPU+GPU/DSP) med delat minne och vektoriseringsenheter (SIMD) , har fortsatt.
  • Förbättrad implementering av OpenACC 2.6 parallellprogrammeringsspecifikationen, som definierar verktyg för att ladda ner operationer på GPU:er och specialiserade processorer som NVIDIA PTX.
  • Stöd för utökade instruktioner Intel AVX86-FP512 och typen _Float16 har lagts till kodgenereringsbackend för x16-arkitekturen.
  • För x86-arkitekturen har skydd lagts till mot sårbarheter i processorer orsakade av spekulativ exekvering av instruktioner efter ovillkorliga framåthoppningsoperationer. Problemet uppstår på grund av förebyggande bearbetning av instruktioner omedelbart efter greninstruktionen i minnet (SLS, Straight Line Speculation). För att möjliggöra skydd föreslås alternativet "-mharden-sls".
  • Lade till detektion av användningen av oinitierade variabler till den experimentella statiska analysatorn. Lade till initialt stöd för att analysera monteringskod i inline-inlägg. Förbättrad minnesspårning. Koden för bearbetning av switchuttryck har skrivits om.
  • Lade till 30 nya anrop till libgccjit, ett delat bibliotek för att bädda in en kodgenerator i andra processer och använda den för att JIT-kompilera bytekod till maskinkod.
  • Stöd för CO-RE (Compile Once - Run Everywhere)-mekanismen har lagts till i backend för att generera BPF-bytekod, vilket låter dig kompilera koden för eBPF-program för Linuxkärnan endast en gång och använda en speciell universell laddare som anpassar laddat program till den aktuella kärnan och BPF Types Format). CO-RE löser problemet med portabilitet av kompilerade eBPF-program, som tidigare bara kunde användas i den version av kärnan som de kompilerades för, eftersom positionen för element i datastrukturer ändras från version till version.
  • RISC-V-backend lägger till stöd för nya instruktionsuppsättningsarkitekturtillägg zba, zbb, zbc och zbs, såväl som ISA-tillägg för vektor- och skalära kryptografiska operationer. Som standard tillhandahålls stöd för specifikationen RISC-V ISA 20191213. Flaggan -mtune=thead-c906 har lagts till för att möjliggöra optimeringar för T-HEAD c906-kärnor.
  • Stöd för typen __int128_t/integer(kind=16) har lagts till i kodgenereringsbackend för AMD GPU:er baserat på GCN-mikroarkitekturen. Det är möjligt att använda upp till 40 arbetsgrupper per datorenhet (CU) och upp till 16 instruktionsfronter (vågfront, en uppsättning trådar som exekveras parallellt av SIMD-motorn) per grupp. Tidigare var endast en instruktionskant per CU tillåten.
  • NVPTX-backend, designad för att generera kod med NVIDIA PTX (Parallel Thread Execution) instruktionsuppsättningsarkitektur, har lagt till möjligheten att använda flaggorna "-march", "-mptx" och "-march-map". Implementerat stöd för PTX ISA sm_53, sm_70, sm_75 och sm_80. Standardarkitekturen är sm_30.
  • Implementeringar av inbyggda funktioner har skrivits om i backend för PowerPC/PowerPC64/RS6000-processorer. De inbyggda funktionerna __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar_ är dokument och ___tfiar
  • Stöd för Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) och Arm Cortex-X710 (cortex-x2). Tillagt stöd för nya ARMv2-arkitekturalternativ för användning med "-march"-alternativet: armv8-a, armv8.7-a, armv8.8-a. Lade till implementering av C-funktioner inbyggda i kompilatorn (Intrinsics) för atomladdning och lagring av data i minnet, baserat på användningen av utökade ARM-instruktioner (ls9). Tillagt stöd för att accelerera funktionerna memcpy, memmove och memset med mopsoption ARM-tillägget.
  • Lade till ett nytt kontrollläge "-fsanitize=shadow-call-stack" (ShadowCallStack), som för närvarande endast är tillgängligt för AArch64-arkitekturen och fungerar när man bygger kod med alternativet "-ffixed-r18". Läget ger skydd mot överskrivning av returadressen från en funktion i händelse av ett buffertspill på stacken. Kärnan i skyddet är att spara returadressen i en separat "skuggstack" efter att ha överfört kontrollen till en funktion och hämtat denna adress innan funktionen avslutas.

Källa: opennet.ru

Lägg en kommentar