Utgivelse av GCC 11-kompilatorpakken

Etter et år med utvikling har den gratis kompilatorpakken GCC 11.1 blitt utgitt, den første betydelige utgivelsen i den nye GCC 11.x-grenen. I samsvar med det nye utgivelsesnummereringsskjemaet ble versjon 11.0 brukt i utviklingsprosessen, og kort tid før utgivelsen av GCC 11.1 hadde GCC 12.0-grenen allerede forgrenet seg, hvorfra den neste store utgivelsen, GCC 12.1, ville bli dannet.

GCC 11.1 er kjent for overgangen til å bruke DWARF 5 feilsøkingsfilformatet som standard, standard inkludering av C++17-standarden ("-std=gnu++17"), betydelige forbedringer i støtte for C++20 standard, eksperimentell støtte for C++23, forbedringer knyttet til den fremtidige C-språkstandarden (C2x), nye ytelsesoptimaliseringer.

Hovedendringer:

  • Standardmodusen for C++-språket har blitt byttet til å bruke C++17-standarden (-std=gnu++17) i stedet for den tidligere tilbudte C++14. Det er mulig å selektivt deaktivere den nye C++17-atferden når du behandler maler som bruker andre maler som en parameter (-fno-new-ttp-matching).
  • Lagt til støtte for maskinvareakselerasjon av AddressSanitizer-verktøyet, som lar deg finne fakta om tilgang til frigjorte minneområder, gå utover grensene til den tildelte bufferen og noen andre typer feil når du arbeider med minne. Maskinvareakselerasjon er foreløpig bare tilgjengelig for AArch64-arkitekturen og er fokusert på bruk ved kompilering av Linux-kjernen. For å aktivere AddressSanitizer maskinvareakselerasjon når du bygger brukerplasskomponenter, er flagget "-fsanitize=hwaddress" lagt til, og kjerneflagget "-fsanitize=kernel-hwaddress".
  • Når du genererer feilsøkingsinformasjon, brukes DWARF 5-formatet som standard, som sammenlignet med tidligere versjoner tillater generering av 25 % mer kompakte feilsøkingsdata. Full støtte for DWARF 5 krever minst binutils versjon 2.35.2. DWARF 5-formatet støttes i feilsøkingsverktøy siden GDB 8.0, valgrind 3.17.0, elfutils 0.172 og dwz 0.14. For å generere feilsøkingsfiler ved å bruke andre versjoner av DWARF, kan du bruke alternativene "-gdwarf-2", "-gdwarf-3" og "-gdwarf-4".
  • Kravene til kompilatorer som kan brukes til å bygge GCC er økt. Kompilatoren må nå støtte C++11-standarden (tidligere var C++98 nødvendig), dvs. Hvis GCC 10 var nok til å bygge GCC 3.4, kreves det nå minst GCC 11 for å bygge GCC 4.8.
  • Navnet og plasseringen av filer for lagring av dumps, midlertidige filer og tilleggsinformasjon som er nødvendig for LTO-optimalisering er endret. Slike filer lagres nå alltid i gjeldende katalog med mindre banen eksplisitt endres via alternativene "-dumpbase", "-dumpdir" og "-save-temps=*".
  • Støtte for det binære formatet BRIG for bruk med språket HSAIL (Heterogeneous System Architecture Intermediate Language) er avviklet og vil snart bli fjernet.
  • Mulighetene til ThreadSanitizer-modusen (-fsanitize=thread) har blitt utvidet, designet for å oppdage løpsforhold når de deler de samme dataene fra forskjellige tråder i en flertrådsapplikasjon. Den nye utgivelsen legger til støtte for alternative kjøretider og miljøer, samt støtte for KCSAN (Kernel Concurrency Sanitizer) feilsøkingsverktøyet, designet for å dynamisk oppdage raseforhold i Linux-kjernen. Lagt til nye alternativer "-param tsan-distinguish-volatile" og "-param tsan-instrument-func-entry-exit".
  • Kolonnenumre i diagnostiske meldinger reflekterer nå ikke byte-antallet fra begynnelsen av linjen, men faktisk kolonnenumrene som tar hensyn til multi-byte-tegn og tegn som opptar flere posisjoner i linjen (for eksempel, tegnet 🙂 opptar to posisjoner og er kodet i 4 byte). På samme måte blir tabulatortegn nå behandlet som et visst antall mellomrom (kan konfigureres via -ftabstop-alternativet, standard 8). For å gjenopprette den gamle virkemåten, foreslås alternativet "-fdiagnostics-column-unit=byte", og for å bestemme startverdien (nummerering fra 0 eller 1) - alternativet "-fdiagnostics-column-origin=".
  • Vektoriseringen tar hensyn til hele innholdet i funksjonen og legger til prosesseringsmuligheter knyttet til kryss og referanser til tidligere blokker i kontrollflytgrafen (CFG, kontrollflytgraf).
  • Optimalisatoren implementerer muligheten til å konvertere en serie betingede operasjoner som sammenligner den samme variabelen til et bytteuttrykk. Switch-uttrykket kan senere kodes ved hjelp av bittestinstruksjoner (alternativet "-fbit-tests" er lagt til for å kontrollere slik konvertering).
  • Forbedrede interprosedyreoptimaliseringer. Lagt til et nytt IPA-modref-pass (-fipa-modref) for å spore bivirkninger ved oppkalling av funksjoner og forbedre nøyaktigheten til analysen. Forbedret implementering av IPA-ICF-passet (-fipa-icf), som reduserer minneforbruket under kompilering og øker antallet enhetlige funksjoner som identiske kodeblokker kombineres for. I IPA-CP-passet (Interprocedural constant propagation) har prediksjonsheuristikken blitt forbedret, tatt i betraktning kjente grenser og trekk ved løkkene.
  • I Linking Time Optimizations (LTO) er bytekodeformatet optimalisert for å redusere størrelsen og forbedre behandlingshastigheten. Redusert topp minneforbruk under bindingsfasen.
  • I optimaliseringsmekanismen basert på resultatene av kodeprofilering (PGO - Profile-guided optimization), som gjør det mulig å generere mer optimal kode basert på analyse av utførelsesfunksjoner, reduseres størrelsen på filer med GCOV-data på grunn av mer kompakt pakking av null tellere . Forbedret "-fprofile-values"-modus ved å holde styr på flere parametere på indirekte anrop.
  • Implementeringen av OpenMP 5.0 (Open Multi-Processing) standarden, som definerer API og metoder for å bruke parallelle programmeringsmetoder på multi-core og hybrid (CPU+GPU/DSP) systemer med delt minne og vektoriseringsenheter (SIMD), har fortsatte. Lagt til innledende støtte for allokeringsdirektivet og muligheten til å bruke heterogene løkker i OpenMP-konstruksjoner. Implementert støtte for miljøvariabelen OMP_TARGET_OFFLOAD.
  • Implementeringen av den parallelle programmeringsspesifikasjonen OpenACC 2.6 gitt for C, C++ og Fortran språk har blitt forbedret, som definerer verktøy for avlasting av operasjoner på GPUer og spesialiserte prosessorer, for eksempel NVIDIA PTX.
  • For C-språk er et nytt attributt "no_stack_protector" implementert, designet for å markere funksjoner som stackbeskyttelse ikke skal aktiveres for ("-fstack-protector"). "malloc"-attributtet har blitt utvidet for å støtte identifisering av samtalepar for tildeling og frigjøring av minne (allokator/deallokator), som brukes i den statiske analysatoren for å identifisere typiske feil ved arbeid med minne (minnelekkasjer, bruk etter frigjøring, doble anrop til gratisfunksjonen, etc.) og i kompilatorvarsler "-Wmismatched-dealloc", "-Wmismatched-new-delete" og "-Wfree-nonheap-object", som informerer om inkonsistens mellom minnedeallokering og minneallokeringsoperasjoner.
  • Nye advarsler er lagt til for C-språket:
    • "-Wmismatched-dealloc" (aktivert som standard) - advarer om minnedeallokeringsoperasjoner som bruker en peker som ikke er kompatibel med minneallokeringsfunksjoner.
    • "-Wsizeof-array-div" (aktivert når "-Wall" er spesifisert) - Advarer om å dele to sizeof-operatorer hvis divisoren ikke samsvarer med størrelsen på matriseelementet.
    • "-Wstringop-overread" (aktivert som standard) - advarer om å kalle en strengfunksjon som leser data fra et område utenfor array-grensen.
    • "-Wtsan" (aktivert som standard) - Advarer om bruk av funksjoner (som std::atomic_thread_fence) som ikke støttes i ThreadSanitizer.
    • "-Warray-parameter" og "-Wvla-parameter" (aktivert når du spesifiserer "-Wall") - advarer om overstyrende funksjoner med inkompatible deklarasjoner av argumenter assosiert med arrayer med fast og variabel lengde.
    • "-Wuninitialized"-advarselen oppdager nå forsøk på å lese fra uinitialisert dynamisk allokert minne.
    • "-Wfree-nonheap-object"-advarselen utvider definisjonen av tilfeller der minnedeallokeringsfunksjoner kalles med en peker som ikke er oppnådd gjennom dynamiske minneallokeringsfunksjoner.
    • "-Wmaybe-uninitialized"-advarselen har utvidet gjenkjenning av passerende pekere til funksjoner som refererer til uinitialiserte minneplasseringer.
  • For C-språket er en del av nye funksjoner utviklet innenfor rammen av C2X-standarden implementert (aktivert ved å spesifisere -std=c2x og -std=gnu2x): makroer BOOL_MAX og BOOL_WIDTH, valgfri indikasjon på navn på ubrukte parametere i funksjon definisjoner (som i C++), attributt «[ [nodiscard]]», forprosessoroperator «__has_c_attribute», makroer FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559__XNUMX_EXT_XNUMX__XNUMX_LT_IEC_XNUMX__XNUMX, INBLAN, FSN_ AN, DEC_INFINITY og DEC _NAN, NaN=makroer for FloatN, _FloatNx og _DesimalN, evne til å spesifisere hoppmerker før deklarasjoner og på slutten av sammensatte utsagn.
  • For C++ er en del av endringene og innovasjonene foreslått i C++20-standarden implementert, inkludert virtuelle funksjoner "consteval virtual", pseudo-destruktorer for slutten av livssyklusen til objekter, bruken av enum-klassen og beregne størrelsen på en matrise i det "nye" uttrykket.
  • For C++ er det lagt til eksperimentell støtte for noen forbedringer som utvikles for den fremtidige C++23-standarden (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). For eksempel er det nå støtte for det bokstavelige suffikset "zu" for signerte size_t-verdier.
  • libstdc++ har forbedret støtte for C++17-standarden, inkludert introduksjonen av std::from_chars og std::to_chars-implementeringer for flytende kommatyper. Implementerte nye elementer i C++20-standarden, inkludert std::bit_cast, std::source_location, atomoperasjoner vente og varsle, , , , , samt elementer av fremtidig C++ standard 23 (std::to_underliggende, std::is_scoped_enum). Lagt til eksperimentell støtte for typer for parallell databehandling (SIMD, Data-Parallel Types). Implementeringen av std::uniform_int_distribution har blitt fremskyndet.
  • Fjernet alfakvalitetsflagget fra libgccjit, et delt bibliotek for å bygge inn en kodegenerator i andre prosesser og bruke den til å organisere JIT-kompilering av bytekode i maskinkode. Lagt til muligheten til å bygge libgccjit for MinGW.
  • Lagt til støtte for AArch64 Armv8-R-arkitekturen (-march=armv8-r). For AArch64- og ARM-arkitekturer er det lagt til støtte for prosessorer (parametere -mcpu og -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) og Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) og Arm Cortex-R82 (cortex-r82) CPUer er også lagt til, og støtter kun AArch64-arkitekturen.
  • Lagt til støtte for bruk av Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) og MVE (AArch32 M-profil) SIMD-instruksjoner for å autovektorisere operasjoner som utfører addisjon, subtraksjon, multiplikasjon og varianter av addisjon/subtraksjon over komplekse tall. Lagt til innledende støtte for autovektorisering for ARM ved å bruke MVE-instruksjonssettet.
  • For ARM-plattformer leveres et komplett sett med kompilatorintegrerte C-funksjoner (Intrinsics), erstattet av utvidede vektorinstruksjoner (SIMD), som dekker alle NEON-instruksjoner dokumentert i ACLE Q3 2020-spesifikasjonen.
  • Støtte for gfx908 GPU er lagt til backend for å generere kode for AMD GPUer basert på GCN-mikroarkitekturen.
  • Lagt til støtte for nye prosessorer og nye instruksjonssettutvidelser implementert i dem:
    • Intel Sapphire Rapids (-march=sapphirerapids, muliggjør støtte for instruksjonene MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALISE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-INT16NIMX og AVVNIMX.
    • Intel Alderlake (-march=alderlake, muliggjør støtte for CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI og HRESET-instruksjoner).
    • Intel Rocketlake (-march=rocketlake, lik Rocket Lake uten SGX-støtte).
    • AMD Zen 3 (-march=znver3).
  • For IA-32/x86-64-systemer basert på Intel-prosessorer er støtte for nye prosessorinstruksjoner TSXLDTRK, SERIALISE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI lagt til.
  • Lagt til støtte for "-march=x86-64-v[234]"-flagg for å velge x86-64-arkitekturnivåer (v2 - dekker SSE4.2, SSSE3, POPCNT og CMPXCHG16B utvidelser; v3 - AVX2 og MOVBE; v4 - AVX-512 ).
  • Lagt til støtte for RISC-V-systemer med big-endian byte-rekkefølge. Lagt til "-misa-spec=*"-alternativet for å velge versjonen av RISC-V-instruksjonssettarkitekturspesifikasjonen. Lagt til støtte for AddressSanitizer og stabelbeskyttelse ved hjelp av kanariemerker.
  • Fortsatt forbedring av "-fanalyzer" statisk analysemodus, som utfører ressurskrevende interprosedyreanalyse av kodeutførelsesbaner og dataflyter i programmet. Modusen er i stand til å oppdage problemer på kompileringsstadiet, for eksempel doble anrop til free()-funksjonen for ett minneområde, fildeskriptorlekkasjer, dereferering og overføring av null-pekere, tilgang til frigjorte minneblokker, bruk av uinitialiserte verdier, etc. I den nye versjonen:
    • Koden for sporing av programtilstanden er blitt fullstendig omskrevet. Problemer med å skanne svært store C-filer er løst.
    • Lagt til innledende C++-støtte.
    • Minnetildeling og deallokeringsanalyse har blitt abstrahert fra de spesifikke malloc- og gratisfunksjonene, og støtter nå new/delete og new[]/delete[].
    • Lagt til nye advarsler: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const og -Wanalyzer-write-to-string-literal.
    • Lagt til nye feilsøkingsalternativer -fdump-analyzer-json og -fno-analyzer-feasibility.
    • Muligheten til å utvide analysatoren gjennom plugins for GCC er implementert (for eksempel er det utarbeidet en plugin for å sjekke feil bruk av global låsing (GIL) i CPython).

Kilde: opennet.ru

Legg til en kommentar