Udgivelse af GCC 10 compiler suite

Efter et års udvikling offentliggjort frigivelse af et gratis sæt kompilatorer GCC 10.1, den første store udgivelse i den nye GCC 10.x-gren. I overensstemmelse med ny ordning udgivelsesnumre, version 10.0 blev brugt i udviklingsprocessen, og kort før udgivelsen af ​​GCC 10.1 var GCC 11.0-grenen allerede forgrenet, på grundlag af hvilken den næste væsentlige udgivelse, GCC 11.1, ville blive dannet.

GCC 10.1 er bemærkelsesværdig for implementeringen af ​​mange innovationer i C++-sproget udviklet til C++20-standarden, forbedringer relateret til den fremtidige C-sprogstandard (C2x), nye optimeringer i compiler-backends og eksperimentel support statisk analysetilstand. Derudover overførte projektet under udarbejdelsen af ​​en ny filial depotet fra SVN til Git.

The main ændringer:

  • Tilføjet eksperimentel tilstand for statisk analyse "-fanalysator“, som udfører ressourcekrævende interprocedureanalyse af kodeeksekveringsstier og datastrømme i et program. Tilstanden er i stand til at detektere problemer på kompileringsstadiet, såsom dobbeltkald til free()-funktionen for et hukommelsesområde, fildeskriptorlæk, dereferencing og videregivelse af nul-pointere, adgang til frigjorte hukommelsesblokke, brug af ikke-initialiserede værdier osv. Brugen af ​​den nye tilstand for OpenSSL-kode har allerede gjort det muligt at identificere farlig sårbarhed.
  • Forbedrede interprocedureelle optimeringer. IPA-SRA (Interprocedural Scalar Shared Replacement)-passet er blevet omdesignet til at fungere på bindetidspunktet og fjerner blandt andet nu beregnede og returnerede ubrugte værdier. I "-O2"-optimeringstilstanden er "-finline-functions"-indstillingen aktiveret, som genindstilles for at favorisere mere kompakt kode frem for eksekveringsydelse. Arbejdet med heuristikken til implementering af inline-funktioner er blevet fremskyndet. Inline-udvidelses- og funktionskloningsheuristik kan nu bruge information om værdiintervaller til at forudsige effektiviteten af ​​individuelle transformationer. For C++ er nøjagtigheden af ​​typebaseret alias-parsing blevet forbedret.
  • Enhanced Linking Time Optimizations (LTO). Tilføjet ny eksekverbar lto-dump at nulstille information om objektfiler med LTO bytecode. Parallelle LTO-beløb bestemmer automatisk antallet af simultant kørende make-opgaver, og hvis de ikke kan bestemmes, bruger oplysninger om antallet af CPU-kerner som en paralleliseringsfaktor. Tilføjet muligheden for at komprimere LTO-bytekode ved hjælp af zstd-algoritmen.
  • Optimeringsmekanismen baseret på resultaterne af kodeprofilering (PGO - Profile-guided optimization) er blevet forbedret, hvilket genererer mere optimal kode baseret på en analyse af kodeeksekveringens karakteristika. Forbedret profilvedligeholdelse under kompilering og varm/kold kodeadskillelse. Via muligheden "-fprofil-værdier» kan nu overvåge op til 4 profilværdier, for eksempel for indirekte opkald og give mere præcise profiloplysninger.
  • Parallel programmeringsspecifikation implementeret for C, C++ og Fortran sprog OpenACC 2.6, som definerer værktøjer til aflæsning af operationer på GPU'er og specialiserede processorer såsom NVIDIA PTX. Implementeringen af ​​standarden er næsten afsluttet Åbn MP 5.0 (Open Multi-Processing), som definerer API'et og metoder til at anvende parallelle programmeringsmetoder på multi-core og hybrid (CPU+GPU/DSP) systemer med delt hukommelse og vektoriseringsenheder (SIMD). Tilføjede funktioner såsom lastprivate conditionals, scan- og loop-direktiver, orden og use_device_addr-udtryk. For OpenMP og OpenACC er der tilføjet understøttelse af aflæsningsoperationer på fjerde generation (Fiji) og femte generation af AMD Radeon (GCN) GPU'er (VEGA 10/VEGA 20).
  • For sprog i C-familien er "access"-funktionen blevet tilføjet for at beskrive funktionens adgang til objekter, der sendes med reference eller pointer, og for at associere sådanne objekter med heltalsargumenter, der indeholder information om størrelsen af ​​objekterne. For at arbejde sammen med "adgang", er "type"-attributten implementeret til at detektere forkert adgang fra brugerfunktioner, for eksempel ved skrivning af værdier til et område uden for arrayets grænser. Også tilføjet er "symver"-attributten for at associere symboler i en ELF-fil med specifikke versionsnumre.
  • Nye advarsler tilføjet:
    • "-Wstring-compare" (aktiveret med "-Wextra") - advarer om tilstedeværelsen af ​​udtryk, hvor nul sammenlignes med resultatet af at kalde funktionerne strcmp og strncmp, hvilket svarer til en konstant på grund af det faktum, at længden af et argument er større end størrelsen af ​​arrayet i det andet argument.
    • "-Wzero-length-bounds" (aktiveret med "-Warray-bounds") - advarer om adgang til array-elementer med nul længde, hvilket kan føre til overskrivning af andre data.
    • Advarslerne "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" og "-Wstringop-overflow" er blevet udvidet for at udvide antallet af out-of-bounds-situationer der håndteres.
  • Implementeret muligheden for direkte at specificere brede tegn i identifikatorer ved hjælp af den aktuelle kodning (UTF-8 som standard) i stedet for UCN-notation (\uNNNN eller \UNNNNNNNNN). For eksempel:

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

  • For C-sproget er en del af nye funktioner udviklet inden for C2X-standarden blevet implementeret (aktiveret ved at specificere -std=c2x og -std=gnu2x): understøttelse af "[[]]"-syntaksen til at definere attributter som i C++ (f.eks. [[gnu ::const]], [[forældet]], [[fallthrough]] og [[maybe_unused]]. Tilføjet understøttelse af "u8"-syntaks til at definere konstanter med UTF-8-tegn.
    Tilføjet nye makroer til . Tilføjede "%OB" og "%Ob" substitutioner til strftime.

  • Standardtilstanden for C er "-fno-common", som giver mulighed for mere effektiv adgang til globale variabler på nogle platforme.
  • For C++ er der implementeret omkring 16 ændringer og innovationer, udviklet i C++20-standarden. Inklusive det tilføjede søgeord "constinit"
    og understøttelse af skabelonudvidelser er blevet implementeret "konceptet". Koncepter giver dig mulighed for at definere et sæt skabelonparameterkrav, der på kompileringstidspunktet begrænser det sæt af argumenter, der kan accepteres som skabelonparametre. Koncepterne kan bruges til at undgå logiske uoverensstemmelser mellem egenskaberne for de datatyper, der anvendes i skabelonen, og datatypeegenskaberne for inputparametrene.

  • G++ giver detektering af udefineret adfærd forårsaget af ændring af konstante objekter gennem constexpr. Reduceret hukommelsesforbrug af compileren ved beregning af constexpr. Tilføjet nye advarsler "-Wmismatched-tags" og "-Wredundant-tags".
  • Nye kommandolinjeindstillinger er blevet foreslået:
    • "-fallocation-dce" for at fjerne unødvendige par af "nye" og "slet" operatorer.
    • "-fprofile-partial-training" for at deaktivere størrelsesoptimering for kode, der ikke har en træningskørsel.
    • "-fprofile-reproducerbar for at kontrollere niveauet af profilreproducerbarhed.
    • "-fprofile-prefix-path" for at definere den grundlæggende kildeopbygningsmappe, der bruges til separat profilgenerering (for "-fprofile-generate=profile_dir" og "-fprofile-use=profile_dir").
  • I advarselsteksten for de nævnte muligheder findes hyperlinks, der giver dig mulighed for at gå til dokumentationen for disse muligheder. URL substitution styres ved hjælp af "-fdiagnostics-urls" muligheden.
  • Tilføjet forprocessor operatør "__har_indbygget", som kan bruges til at tjekke for indbyggede funktioner.
  • Tilføjet en ny indbygget funktion "__builtin_roundeven" med en implementering af afrundingsfunktionen defineret i ISO/IEC TS 18661-specifikationen, svarende til "round", men afrundende del større end 0.5 opad (til en større værdi), mindre end 0.5 - ned (til nul), og lig med 0.5 - startende fra pariteten af ​​det næstsidste ciffer.
  • For AArch64-arkitekturen er der tilføjet understøttelse af SVE2-udvidelsen, og understøttelse af SVE (Scalable Vector Extension) er blevet forbedret, herunder tilføjet understøttelse af indbyggede SVE ACLE-funktioner og -typer og brug af vektorisering. Understøttelse af LSE (Large System Extensions) og TME (Transactional Memory Extension) er blevet udvidet. Tilføjet nye instruktioner foreslået i Armv8.5-A og Armv8.6-A, inklusive instruktioner til generering af tilfældige tal, afrunding, binding af memory tag,
    bfloat16 og matrix multiplikation. Tilføjet processorunderstøttelse
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 og
    Marvell ThunderX3.

  • Tilføjet understøttelse af ABI FDPIC (32-bit funktions pointere) til ARM64. Omdesignet og optimeret behandling af 64-bit heltal operationer. Tilføjet CPU-understøttelse
    Arm Cortex-A77,
    Arm Cortex-A76AE og
    Arm Cortex-M35P. Udvidet understøttelse af ACLE-databehandlingsinstruktioner, inklusive 32-bit SIMD, 16-bit multiplikation, latch-aritmetik og andre DSP-algoritmeoptimeringer. Tilføjet eksperimentel understøttelse af ACLE CDE (Custom Datapath Extension) instruktioner.

  • Væsentlig forbedret kodegenerering og vektorisering i backend til AMD GPU'er baseret på GCN-mikroarkitekturen.
  • Tilføjet understøttelse af XMEGA-lignende enheder til AVR-arkitektur
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ga, ATmega809, ATmega 1608, 1609 ATmega 3208, 3209 4808, ATmega4809, ATmegaXNUMX XNUMX, ATmegaXNUMX og ATmegaXNUMX.

  • En ny Intel ENQCMD-instruktionssæt-arkitekturudvidelse (-menqcmd) er blevet tilføjet til IA-32/x86-64-arkitekturer. Tilføjet understøttelse af Intel Cooperlake (-march=cooperlake, inkluderer AVX512BF16 ISA-udvidelsen) og Tigerlake (-march=tigerlake, inkluderer MOVDIRI, MOVDIR64B og AVX512VP2INTERSECT ISA-udvidelserne) CPU'er.
  • En implementering af HSAIL (Heterogeneous System Architecture Intermediate Language) til heterogene computersystemer baseret på HSA-arkitekturen er blevet forældet og vil sandsynligvis blive fjernet i en fremtidig udgivelse.

Kilde: opennet.ru

Tilføj en kommentar