Release av GCC 10-kompilatorsviten

Efter ett år av utveckling publicerad release av en gratis uppsättning kompilatorer GCC 10.1, den första stora utgåvan i den nya GCC 10.x-grenen. I enlighet med nytt system releasenummer, version 10.0 användes i utvecklingsprocessen, och kort före lanseringen av GCC 10.1 hade GCC 11.0-grenen redan avvecklats, på basis av vilken nästa betydande utgåva, GCC 11.1, skulle bildas.

GCC 10.1 är känd för implementeringen av många innovationer i C++-språket utvecklat för C++20-standarden, förbättringar relaterade till den framtida C-språkstandarden (C2x), nya optimeringar i kompilatorns backends och experimentellt stöd statiskt analysläge. Dessutom, under förberedelsen av en ny filial, överförde projektet förvaret från SVN till Git.

Den huvudsakliga förändringar:

  • tillsatt experimentellt läge för statisk analys "-fanalysator", som utför resurskrävande interproceduranalys av kodexekveringsvägar och dataflöden i ett program. Läget kan upptäcka problem vid kompileringsstadiet, såsom dubbla anrop till free()-funktionen för ett minnesområde, filbeskrivningsläckor, avläsning och överföring av nollpekare, åtkomst till frigjorda minnesblock, användning av oinitierade värden, etc. Användningen av det nya läget för OpenSSL-kod har redan gjort det möjligt att identifiera farlig sårbarhet.
  • Förbättrade interproceduroptimeringar. IPA-SRA-passet (Interprocedural Scalar Shared Replacement) har designats om för att fungera vid bindningstid och bland annat tar nu bort beräknade och returnerade oanvända värden. I "-O2"-optimeringsläget är alternativet "-finline-functions" aktiverat, vilket justeras för att gynna mer kompakt kod framför exekveringsprestanda. Arbetet med heuristiken för implementering av inlinefunktioner har påskyndats. Inline-expansion och funktionskloningsheuristik kan nu använda information om värdeintervall för att förutsäga effektiviteten av individuella transformationer. För C++ har noggrannheten för typbaserad aliasanalys förbättrats.
  • Enhanced Linking Time Optimizations (LTO). Lade till ny körbar fil lto-dumpa för att återställa information om objektfiler med LTO-bytekod. Parallella LTO-passningar bestämmer automatiskt antalet samtidigt körande gör-uppgifter och, om de inte kan fastställas, använder information om antalet CPU-kärnor som en parallelliseringsfaktor. Lade till möjligheten att komprimera LTO-bytekod med hjälp av zstd-algoritmen.
  • Optimeringsmekanismen baserad på resultaten av kodprofilering (PGO - Profile-guided optimization) har förbättrats, vilket genererar mer optimal kod baserat på en analys av egenskaperna för kodexekvering. Förbättrat profilunderhåll under kompilering och varm/kall kodseparering. Via alternativet "-fprofil-värden» kan nu övervaka upp till 4 profilvärden, till exempel för indirekta samtal och ge mer exakt profilinformation.
  • Parallell programmeringsspecifikation implementerad för språken C, C++ och Fortran OpenACC 2.6, som definierar verktyg för att ladda ner operationer på GPU:er och specialiserade processorer som NVIDIA PTX. Implementeringen av standarden är nästan klar Öppna MP 5.0 (Open Multi-Processing), som definierar API:et och metoderna för att tillämpa parallella programmeringsmetoder på flerkärniga och hybridsystem (CPU+GPU/DSP) med delat minne och vektoriseringsenheter (SIMD). Lade till funktioner som lastprivate villkor, scan och loop direktiv, order och use_device_addr uttryck. För OpenMP och OpenACC har stöd lagts till för avlastningsoperationer på fjärde generationens (Fiji) och femte generationens AMD Radeon (GCN) GPU:er (VEGA 10/VEGA 20).
  • För språk i C-familjen har funktionen "access" lagts till för att beskriva funktionens åtkomst till objekt som skickas med referens eller pekare, och för att associera sådana objekt med heltalsargument som innehåller information om storleken på objekten. För att fungera tillsammans med "access" implementeras attributet "type" för att upptäcka felaktig åtkomst från användarfunktioner, till exempel när man skriver värden till ett område utanför arrayens gränser. Dessutom läggs till "symver"-attributet för att associera symboler i en ELF-fil med specifika versionsnummer.
  • Nya varningar tillagda:
    • "-Wstring-compare" (aktiverad med "-Wextra") - varnar för närvaron av uttryck där noll jämförs med resultatet av att anropa funktionerna strcmp och strncmp, vilket motsvarar en konstant på grund av att längden av ett argument är större än storleken på arrayen i det andra argumentet.
    • "-Wzero-length-bounds" (aktiverat med "-Warray-bounds") - varnar för åtkomst av arrayelement med noll längd, vilket kan leda till att andra data skrivs över.
    • Varningarna "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" och "-Wstringop-overflow" har utökats för att utöka antalet out-of-bounds-situationer som hanteras.
  • Implementerat möjligheten att direkt specificera breda tecken i identifierare med den aktuella kodningen (UTF-8 som standard) snarare än UCN-notation (\uNNNN eller \UNNNNNNNNN). Till exempel:

    statisk konst int π = 3;
    int get_naïve_pi() {
    returnera π;
    }

  • För C-språket har en del av nya funktioner som utvecklats inom C2X-standarden implementerats (aktiverats genom att specificera -std=c2x och -std=gnu2x): stöd för "[[]]"-syntaxen har dykt upp för att definiera attribut som i C++ (till exempel [[gnu ::const]], [[utfasad]], [[fallthrough]] och [[kanske_unused]]. Lagt till stöd för "u8"-syntax för att definiera konstanter med UTF-8-tecken.
    Lade till nya makron till . Lade till "%OB" och "%Ob" substitutioner till strftime.

  • Som standard använder C läget "-fno-common", vilket möjliggör effektivare åtkomst till globala variabler på vissa plattformar.
  • För C++ har ett 16-tal förändringar och innovationer implementerats, utvecklade i C++20-standarden. Inkluderar det tillagda sökordet "constinit"
    och stöd för malltillägg har implementerats "begrepp". Begrepp låter dig definiera en uppsättning mallparameterkrav som vid kompilering begränsar uppsättningen argument som kan accepteras som mallparametrar. Koncepten kan användas för att undvika logiska inkonsekvenser mellan egenskaperna för datatyperna som används i mallen och datatypegenskaperna för indataparametrarna.

  • G++ ger detektering av odefinierat beteende orsakat av att konstanta objekt ändras genom constexpr. Minskad minnesförbrukning av kompilatorn vid beräkning av constexpr. Lade till nya varningar "-Wmismatched-tags" och "-Wredundant-tags".
  • Nya kommandoradsalternativ har föreslagits:
    • "-fallocation-dce" för att ta bort onödiga par av "nya" och "radera" operatorer.
    • "-fprofile-partial-training" för att inaktivera storleksoptimering för kod som inte har en träningskörning.
    • "-fprofile-reproducerbar för att kontrollera nivån på profilreproducerbarhet.
    • "-fprofile-prefix-path" för att definiera baskällkatalogen som används för separat profilgenerering (för "-fprofile-generate=profile_dir" och "-fprofile-use=profile_dir").
  • I varningstexten för de nämnda alternativen finns hyperlänkar som gör att du kan gå till dokumentationen för dessa alternativ. URL-ersättning kontrolleras med alternativet "-fdiagnostics-urls".
  • Lade till förprocessoroperatör "__har_byggt", som kan användas för att söka efter inbyggda funktioner.
  • Lade till en ny inbyggd funktion "__builtin_roundeven" med en implementering av avrundningsfunktionen definierad i ISO/IEC TS 18661-specifikationen, liknande "runda", men avrundande del större än 0.5 uppåt (till ett större värde), mindre än 0.5 - ner (till noll) och lika med 0.5 - med början från pariteten för den näst sista siffran.
  • För AArch64-arkitekturen har stöd för SVE2-tillägget lagts till och stöd för SVE (Scalable Vector Extension) har förbättrats, inklusive extra stöd för inbyggda SVE ACLE-funktioner och -typer, och användning av vektorisering. Stödet för LSE (Large System Extensions) och TME (Transactional Memory Extension) har utökats. Lade till nya instruktioner föreslagna i Armv8.5-A och Armv8.6-A, inklusive instruktioner för generering av slumptal, avrundning, bindning av minnesetiketter,
    bfloat16 och matrismultiplikation. Lade till processorstöd
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 och
    Marvell ThunderX3.

  • Lade till stöd för ABI FDPIC (32-bitars funktionspekare) för ARM64. Omdesignad och optimerad bearbetning av 64-bitars heltalsoperationer. Lade till CPU-stöd
    Arm Cortex-A77,
    Arm Cortex-A76AE och
    Arm Cortex-M35P. Utökat stöd för ACLE-databehandlingsinstruktioner, inklusive 32-bitars SIMD, 16-bitars multiplikation, låsaritmetik och andra DSP-algoritmoptimeringar. Lade till experimentellt stöd för instruktioner för ACLE CDE (Custom Datapath Extension).

  • Betydligt förbättrad kodgenerering och vektorisering i backend för AMD GPU:er baserade på GCN-mikroarkitekturen.
  • Tillagt stöd för XMEGA-liknande enheter för AVR-arkitektur
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, 1609 ATmega 3208 3209, ATmega4808, ATmega4809 XNUMX, ATmegaXNUMX och ATmegaXNUMX.

  • En ny arkitekturtillägg för Intel ENQCMD-instruktionsuppsättning (-menqcmd) har lagts till för IA-32/x86-64-arkitekturer. Tillagt stöd för Intel Cooperlake (-march=cooperlake, inkluderar AVX512BF16 ISA-tillägget) och Tigerlake (-march=tigerlake, inkluderar MOVDIRI-, MOVDIR64B- och AVX512VP2INTERSECT ISA-tilläggen).
  • En implementering av HSAIL (Heterogeneous System Architecture Intermediate Language) för heterogena datorsystem baserade på HSA-arkitekturen har fasats ut och kommer sannolikt att tas bort i en framtida version.

Källa: opennet.ru

Lägg en kommentar