Udgivelse af GCC 12 compiler suite

Efter et års udvikling er den gratis compilersuite GCC 12.1 blevet frigivet, den første betydelige udgivelse i den nye GCC 12.x-gren. I overensstemmelse med det nye udgivelsesnummereringsskema blev version 12.0 brugt i udviklingsprocessen, og kort før udgivelsen af ​​GCC 12.1 havde GCC 13.0-grenen allerede forgrenet sig, på grundlag af hvilket den næste større udgivelse, GCC 13.1, ville blive dannet. Den 23. maj fejrer projektet 35 år siden dannelsen af ​​den første udgave af GCC.

Vigtigste ændringer:

  • Tilføjet understøttelse af CTF (Compact Type Format) debugging-formatet, som giver kompakt lagring af information om C-typer, forbindelser mellem funktioner og fejlfindingssymboler. Når det er indlejret i ELF-objekter, tillader formatet brugen af ​​EFL-tegntabeller for at undgå dataduplikering.
  • Understøttelse af "STABS"-fejlfindingsinformationslagringsformatet, der blev oprettet i 1980'erne, er blevet forældet.
  • Arbejdet fortsætter med at udvide understøttelsen af ​​fremtidige C2X- og C++23-standarder for C- og C++-sprogene. For eksempel er der tilføjet støtte til udtrykket "hvis consteval"; tilladt at bruge auto i funktionsargumenter ("f(auto(g()))"); brugen af ​​ikke-bogstavelige variabler, goto og etiketter er tilladt i funktioner erklæret som constexpr; tilføjet understøttelse af multidimensionelle indeksoperatører[]; i hvis, for og switch, mulighederne for initialiseringsblokke er blevet udvidet ("for (bruger T = int; T e : v)").
  • C++ Standard Library har forbedret understøttelse af de eksperimentelle sektioner af C++20 og C++23 standarderne. Tilføjet understøttelse af std::move_only_function, , std::basic_string::resize_and_overwrite, , og std::invoke_r. Tilladt at bruge std::unique_ptr, std::vektor, std::basic_string, std::valgfri og std::variant i constexpr-funktioner.
  • Fortran-frontenden giver fuld understøttelse af TS 29113-specifikationen, som beskriver muligheder for at sikre portabilitet mellem Fortran og C-kode.
  • Tilføjet understøttelse af __builtin_shufflevector(vec1, vec2, index1, index2, ...)-udvidelsen, der tidligere er tilføjet til Clang, som tilbyder et enkelt opkald til at udføre almindelige vektor-shuffle- og shuffle-operationer.
  • Når du bruger "-O2" optimeringsniveauet, er vektorisering aktiveret som standard (tilstandene -ftree-vectorize og -fvect-cost-model=very-cheap er aktiveret). Den meget billige model tillader kun vektorisering, hvis vektorkoden fuldstændigt kan erstatte den skalarkode, der vektoriseres.
  • Tilføjet "-ftrivial-auto-var-init"-tilstand for at muliggøre eksplicit initialisering af variabler på stakken for at spore problemer og blokere sårbarheder forbundet med brugen af ​​ikke-initialiserede variabler.
  • For C og C++ sprog er en indbygget funktion __builtin_dynamic_object_size blevet tilføjet for at bestemme størrelsen af ​​et objekt, kompatibel med en lignende funktion fra Clang.
  • For C- og C++-sprogene er der tilføjet understøttelse af attributten "utilgængelig" (du kan f.eks. markere funktioner, der vil generere en fejl, hvis du forsøger at bruge dem).
  • For C- og C++-sprog er understøttelse af forbehandlingsdirektiverne "#elifdef" og "#elifndef" blevet tilføjet.
  • Tilføjet "-Wbidi-chars" flag for at vise en advarsel, hvis UTF-8-tegn bruges forkert, hvilket ændrer rækkefølgen, som tovejstekst vises i.
  • Tilføjet "-Warray-compare" flag for at vise en advarsel, når du forsøger at sammenligne to operander, der refererer til arrays.
  • Implementeringen af ​​OpenMP 5.0 og 5.1 (Open Multi-Processing) standarderne, som definerer API'en og metoder til anvendelse af parallelle programmeringsmetoder på multi-core og hybrid (CPU+GPU/DSP) systemer med delt hukommelse og vektoriseringsenheder (SIMD) , er fortsat.
  • Forbedret implementering af OpenACC 2.6 parallel programmeringsspecifikation, som definerer værktøjer til aflæsning af operationer på GPU'er og specialiserede processorer såsom NVIDIA PTX.
  • Understøttelse af udvidede instruktioner Intel AVX86-FP512 og typen _Float16 er blevet tilføjet til kodegenereringsbackend for x16-arkitekturen.
  • For x86-arkitekturen er der tilføjet beskyttelse mod sårbarheder i processorer forårsaget af spekulativ udførelse af instruktioner efter ubetingede fremadspringsoperationer. Problemet opstår på grund af forebyggende behandling af instruktioner umiddelbart efter greninstruktionen i hukommelsen (SLS, Straight Line Speculation). For at aktivere beskyttelse foreslås "-mharden-sls" muligheden.
  • Tilføjet detektion af brugen af ​​ikke-initialiserede variabler til den eksperimentelle statiske analysator. Tilføjet indledende støtte til analyse af montagekode i inline-indsatser. Forbedret hukommelsessporing. Koden til behandling af switch-udtryk er blevet omskrevet.
  • Tilføjet 30 nye opkald til libgccjit, et delt bibliotek til at indlejre en kodegenerator i andre processer og bruge den til at JIT kompilere bytekode til maskinkode.
  • Understøttelse af CO-RE (Compile Once - Run Everywhere)-mekanismen er blevet tilføjet til backend til generering af BPF-bytekode, som giver dig mulighed for kun at kompilere koden for eBPF-programmer til Linux-kernen én gang og bruge en speciel universel loader, der tilpasser indlæst program til den aktuelle kerne og BPF Type Format). CO-RE løser problemet med portabilitet af kompilerede eBPF-programmer, som tidligere kun kunne bruges i den version af kernen, som de blev kompileret til, da positionen af ​​elementer i datastrukturer ændres fra version til version.
  • RISC-V-backend tilføjer understøttelse af nye instruktionssæt-arkitekturudvidelser zba, zbb, zbc og zbs, samt ISA-udvidelser til vektor- og skalære kryptografiske operationer. Som standard er der understøttet specifikationen RISC-V ISA 20191213. Flaget -mtune=thead-c906 er blevet tilføjet for at muliggøre optimeringer for T-HEAD c906-kerner.
  • Understøttelse af typen __int128_t/integer(kind=16) er blevet tilføjet til kodegenereringsbackend for AMD GPU'er baseret på GCN-mikroarkitekturen. Det er muligt at bruge op til 40 arbejdsgrupper pr. computerenhed (CU) og op til 16 instruktionsfronter (bølgefront, et sæt tråde, der udføres parallelt af SIMD Engine) pr. gruppe. Tidligere var kun én instruktionskant pr. CU tilladt.
  • NVPTX-backend, designet til at generere kode ved hjælp af NVIDIA PTX (Parallel Thread Execution) instruktionssætarkitekturen, har tilføjet muligheden for at bruge "-march", "-mptx" og "-march-map" flagene. Implementeret understøttelse af PTX ISA sm_53, sm_70, sm_75 og sm_80. Standardarkitekturen er sm_30.
  • I backend til PowerPC / PowerPC64 / RS6000 processorer er implementeringerne af indbyggede funktioner blevet omskrevet. De indbyggede funktioner __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar_set er dokumenteret og ___t.
  • Understøttelse af Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) og Arm Cortex-X710 (cortex-x2). Tilføjet understøttelse af nye ARMv2-arkitekturmuligheder til brug med "-march"-indstillingen: armv8-a, armv8.7-a, armv8.8-a. Tilføjet implementering af C-funktioner indbygget i compileren (Intrinsics) til atomisk indlæsning og lagring af data i hukommelsen, baseret på brugen af ​​udvidede ARM-instruktioner (ls9). Tilføjet understøttelse til at accelerere memcpy, memmove og memset-funktionerne ved hjælp af mopsoption ARM-udvidelsen.
  • Tilføjet en ny kontroltilstand "-fsanitize=shadow-call-stack" (ShadowCallStack), som i øjeblikket kun er tilgængelig for AArch64-arkitekturen og fungerer, når der bygges kode med "-ffixed-r18"-indstillingen. Tilstanden giver beskyttelse mod overskrivning af returadressen fra en funktion i tilfælde af bufferoverløb på stakken. Essensen af ​​beskyttelsen er at gemme returadressen i en separat "skygge"-stabel efter at have overført kontrol til en funktion og hentet denne adresse, før funktionen forlades.

Kilde: opennet.ru

Tilføj en kommentar