Utgivelse av GCC 10-kompilatorpakken

Etter et år med utvikling publisert utgivelse av et gratis sett med kompilatorer GCC 10.1, den første store utgivelsen i den nye GCC 10.x-grenen. I samsvar med ny ordning utgivelsesnumre, versjon 10.0 ble brukt i utviklingsprosessen, og kort tid før utgivelsen av GCC 10.1 hadde GCC 11.0-grenen allerede forgrenet seg, på grunnlag av hvilket den neste betydelige utgivelsen, GCC 11.1, ville bli dannet.

GCC 10.1 er kjent for implementeringen av mange innovasjoner i C++-språket utviklet for C++20-standarden, forbedringer relatert til den fremtidige C-språkstandarden (C2x), nye optimaliseringer i kompilatorens backends og eksperimentell støtte statisk analysemodus. I tillegg, under utarbeidelsen av en ny filial, overførte prosjektet depotet fra SVN til Git.

Den viktigste endringer:

  • La til eksperimentell modus for statisk analyse "-fanalysator", som utfører ressurskrevende interprosedyreanalyse av kodeutførelsesbaner og datastrømmer i et program. 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. Bruken av den nye modusen for OpenSSL-kode har allerede gjort det mulig å identifisere farlig sårbarhet.
  • Forbedrede interprosedyreoptimaliseringer. IPA-SRA (Interprocedural Scalar Shared Replacement)-passet har blitt redesignet for å fungere på bindingstidspunktet og fjerner blant annet nå beregnede og returnerte ubrukte verdier. I "-O2"-optimaliseringsmodus er alternativet "-finline-functions" aktivert, som justeres på nytt for å favorisere mer kompakt kode fremfor utførelsesytelse. Arbeidet med heuristikken for utplassering av innebygde funksjoner har blitt fremskyndet. Inline utvidelse og funksjonskloningsheuristikk kan nå bruke informasjon om verdiområder for å forutsi effektiviteten til individuelle transformasjoner. For C++ har nøyaktigheten av typebasert alias-parsing blitt forbedret.
  • Enhanced Linking Time Optimizations (LTO). Lagt til ny kjørbar fil lto-dumpe for å tilbakestille informasjon om objektfiler med LTO-bytekode. Parallelle LTO-passeringer bestemmer automatisk antall samtidig kjørende make-oppgaver og, hvis de ikke kan bestemmes, bruker informasjon om antall CPU-kjerner som en parallelliseringsfaktor. Lagt til muligheten til å komprimere LTO-bytekode ved hjelp av zstd-algoritmen.
  • Optimaliseringsmekanismen basert på resultatene av kodeprofilering (PGO – Profile-guided optimization) er forbedret, noe som genererer mer optimal kode basert på en analyse av egenskapene til kodeutførelse. Forbedret profilvedlikehold under kompilering og separasjon av varm/kald kode. Via alternativet "-fprofil-verdier» kan nå overvåke opptil 4 profilverdier, for eksempel for indirekte anrop og gi mer presis profilinformasjon.
  • Parallell programmeringsspesifikasjon implementert for C, C++ og Fortran språk OpenACC 2.6, som definerer verktøy for avlasting av operasjoner på GPUer og spesialiserte prosessorer som NVIDIA PTX. Implementeringen av standarden er nesten fullført Åpne MP 5.0 (Open Multi-Processing), som definerer API og metoder for å bruke parallelle programmeringsmetoder på multi-core og hybrid (CPU+GPU/DSP) systemer med delt minne og vektoriseringsenheter (SIMD). Lagt til funksjoner som lastprivate conditionals, scan and loop-direktiver, order og use_device_addr uttrykk. For OpenMP og OpenACC er det lagt til støtte for avlastingsoperasjoner på fjerdegenerasjons (Fiji) og femte generasjons AMD Radeon (GCN) GPUer (VEGA 10/VEGA 20).
  • For språk i C-familien er "tilgang"-funksjonen lagt til for å beskrive funksjonens tilgang til objekter som sendes med referanse eller peker, og for å assosiere slike objekter med heltallsargumenter som inneholder informasjon om størrelsen på objektene. For å fungere sammen med "tilgang", er "type"-attributtet implementert for å oppdage feil tilgang fra brukerfunksjoner, for eksempel når du skriver verdier til et område utenfor matrisens grenser. Også lagt til er "symver"-attributtet for å knytte symboler i en ELF-fil med spesifikke versjonsnumre.
  • Nye advarsler lagt til:
    • "-Wstring-compare" (aktivert med "-Wextra") - advarer om tilstedeværelsen av uttrykk der null sammenlignes med resultatet av å kalle strcmp- og strncmp-funksjonene, som tilsvarer en konstant på grunn av det faktum at lengden av ett argument er større enn størrelsen på matrisen i det andre argumentet.
    • "-Wzero-length-bounds" (aktivert med "-Warray-bounds") - advarer om tilgang til array-elementer med null lengde, noe som kan føre til overskriving av andre data.
    • Advarslene "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" og "-Wstringop-overflow" er utvidet for å utvide antallet situasjoner utenfor grensen. som håndteres.
  • Implementerte muligheten til å direkte spesifisere brede tegn i identifikatorer ved å bruke gjeldende koding (UTF-8 som standard) i stedet for UCN-notasjon (\uNNNN eller \UNNNNNNNNN). For eksempel:

    statisk konstant int π = 3;
    int get_naïve_pi() {
    returner π;
    }

  • For C-språket er en del av nye funksjoner utviklet innenfor C2X-standarden implementert (aktivert ved å spesifisere -std=c2x og -std=gnu2x): støtte for "[[]]"-syntaksen har dukket opp for å definere attributter som i C++ (for eksempel [[gnu ::const]], [[avviklet]], [[fallthrough]] og [[kanskje_ubrukt]]. Lagt til støtte for "u8"-syntaks for å definere konstanter med UTF-8-tegn.
    Lagt til nye makroer til . Lagt til "%OB" og "%Ob"-erstatninger til strftime.

  • Standardmodusen for C er "-fno-common", som gir mer effektiv tilgang til globale variabler på enkelte plattformer.
  • For C++ er det implementert ca 16 endringer og innovasjoner, utviklet i C++20-standarden. Inkluderer det lagt til søkeordet «constinit»
    og støtte for malutvidelser er implementert "konseptet". Konsepter lar deg definere et sett med malparameterkrav som på kompileringstidspunktet begrenser settet med argumenter som kan aksepteres som malparametere. Konseptene kan brukes for å unngå logiske inkonsekvenser mellom egenskapene til datatypene som brukes i malen og datatypeegenskapene til inngangsparameterne.

  • G++ gir deteksjon av udefinert atferd forårsaket av endring av konstante objekter gjennom constexpr. Redusert minneforbruk av kompilatoren ved beregning av constexpr. Lagt til nye advarsler "-Wmismatched-tags" og "-Wredundant-tags".
  • Nye kommandolinjealternativer er foreslått:
    • "-fallocation-dce" for å fjerne unødvendige par med "nye" og "slett"-operatorer.
    • "-fprofile-partial-training" for å deaktivere størrelsesoptimalisering for kode som ikke har et treningsløp.
    • "-fprofile-reproduserbar for å kontrollere nivået av profilreproduserbarhet.
    • "-fprofile-prefix-path" for å definere grunnkildekatalogen som brukes for separat profilgenerering (for "-fprofile-generate=profile_dir" og "-fprofile-use=profile_dir").
  • I advarselsteksten for de nevnte alternativene er det gitt hyperlenker som lar deg gå til dokumentasjonen for disse alternativene. URL-erstatning kontrolleres ved å bruke alternativet "-fdiagnostics-urls".
  • Lagt til forprosessoroperatør "__har_bygget", som kan brukes til å se etter innebygde funksjoner.
  • Lagt til en ny innebygd funksjon "__builtin_roundeven" med en implementering av avrundingsfunksjonen definert i ISO/IEC TS 18661-spesifikasjonen, lik "round", men avrunding større enn 0.5 opp (til en større verdi), mindre enn 0.5 - ned (til null), og lik 0.5 - fra pariteten til det nest siste sifferet.
  • For AArch64-arkitekturen er støtte for SVE2-utvidelsen lagt til og støtte for SVE (Scalable Vector Extension) er forbedret, inkludert ekstra støtte for innebygde SVE ACLE-funksjoner og -typer, og bruk av vektorisering. Støtte for LSE (Large System Extensions) og TME (Transactional Memory Extension) er utvidet. Lagt til nye instruksjoner foreslått i Armv8.5-A og Armv8.6-A, inkludert instruksjoner for generering av tilfeldige tall, avrunding, minnekodebinding,
    bfloat16 og matrisemultiplikasjon. Lagt til prosessorstøtte
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 og
    Marvell ThunderX3.

  • Lagt til støtte for ABI FDPIC (32-bits funksjonspekere) for ARM64. Redesignet og optimalisert behandling av 64-bits heltallsoperasjoner. Lagt til CPU-støtte
    Arm Cortex-A77,
    Arm Cortex-A76AE og
    Arm Cortex-M35P. Utvidet støtte for ACLE-databehandlingsinstruksjoner, inkludert 32-bits SIMD, 16-bits multiplikasjon, latch-aritmetikk og andre DSP-algoritmeoptimaliseringer. Lagt til eksperimentell støtte for ACLE CDE (Custom Datapath Extension)-instruksjoner.

  • Betydelig forbedret kodegenerering og vektorisering i backend for AMD GPUer basert på GCN-mikroarkitekturen.
  • Lagt til støtte for XMEGA-lignende enheter for AVR-arkitektur
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ga, ATmega809ga, 1608mega1609, 3208 3209, ATmega4808, ATmega4809 XNUMX, ATmegaXNUMX og ATmegaXNUMX.

  • En ny Intel ENQCMD instruksjonssett-arkitekturutvidelse (-menqcmd) er lagt til for IA-32/x86-64-arkitekturer. Lagt til støtte for Intel Cooperlake (-march=cooperlake, inkluderer AVX512BF16 ISA-utvidelsen) og Tigerlake (-march=tigerlake, inkluderer CPU-ene MOVDIRI, MOVDIR64B og AVX512VP2INTERSECT ISA-utvidelsene).
  • En implementering av HSAIL (Heterogeneous System Architecture Intermediate Language) for heterogene datasystemer basert på HSA-arkitekturen har blitt avviklet og vil sannsynligvis bli fjernet i en fremtidig utgivelse.

Kilde: opennet.ru

Legg til en kommentar