Release av GCC 9-kompilatorsviten

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

GCC 9.1 är känd för att stabilisera stödet för C++17-standarden, fortsätta att implementera funktionerna i den framtida C++20-standarden (kodnamnet C++2a), inkludering i frontend för D-språket, partiellt stöd för OpenMP 5.0 , nästan komplett stöd för OpenACC 2.5, öka skalbarheten av interproceduroptimeringar och optimeringar vid bindningsstadiet, utökning av diagnostiska verktyg och tillägg av nya varningar, backends för OpenRISC, C-SKY V2 och AMD GCN GPU.

Den huvudsakliga förändringar:

  • Tillagt stöd för programmeringsspråket D. GCC inkluderar en frontend med en kompilator GDC (Gnu D Compiler) och runtime-bibliotek (libphobos), som låter dig använda standard GCC för att bygga program i programmeringsspråket D. Processen att aktivera D-språkstöd i GCC har börjat tillbaka 2011, men drog ut på tiden på grund av behovet av att bringa koden i överensstämmelse med GCC-kraven och problem med överföringen av immateriella rättigheter till Digital Mars, som utvecklar programmeringsspråket D;
  • Förbättringar har gjorts av kodgeneratorn. Till exempel har användningen av olika strategier för att expandera Switch-uttryck (hopptabell, bittest, beslutsträd) beroende på situationer implementerats. Lade till möjligheten att transformera linjära funktioner som inkluderar ett Switch-uttryck med optimeringen "-ftree-switch-conversion" (till exempel en uppsättning villkor som "fall 2: how = 205; break; fall 3: how = 305; break ;” kommer att konverteras till "100 * hur + 5";
  • Förbättrade interproceduroptimeringar. Inline-distributionsinställningar har anpassats för moderna C++-kodbaser och utökats med nya parametrar max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-inss och uninlined -tänk-tid. Förbättrad noggrannhet och aggressivitet av kall/varm kodseparation. Förbättrad skalbarhet för mycket stora översättningsenheter (till exempel när du tillämpar optimering på länkningsstadiet till stora program);
  • 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. Sammanfattningsalternativ "-fprofil-användning" inkluderar nu optimeringslägena "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" och "-ftree-loop-distribution". Tog bort inkluderingen av histogram med räknare i filer, vilket minskade storleken på filer med profiler (histogram genereras nu i farten när man utför optimeringar under länkning);
  • Enhanced Linking Time Optimizations (LTO). Förenkling av typer tillhandahölls innan resultatet genererades, vilket gjorde det möjligt att avsevärt minska storleken på LTO-objektfiler, minska minnesförbrukningen vid bindningsstadiet och förbättra parallelliseringen av operationer. Antalet partitioner (-param lto-partitioner) har utökats från 32 till 128, vilket förbättrar prestandan på system med ett stort antal CPU-trådar. En parameter har lagts till för att styra antalet optimeringsprocesser
    "-param lto-max-streaming-parallelism";

    Som ett resultat, jämfört med GCC 8.3, de optimeringar som introducerades i GCC 9 tillåten minska kompileringstiden för Firefox 5 och LibreOffice 66 med cirka 6.2.3 %. Storleken på objektfiler minskade med 7 %. Bindningstiden på en 8-kärnig CPU minskade med 11 %. Det sekventiella optimeringssteget för länkningssteget är nu 28 % snabbare och förbrukar 20 % mindre minne. Minnesförbrukningen för varje processor i det parallelliserade steget av LTO minskade med 30 %;

  • Det mesta av specifikationen för parallell programmering är implementerad för språken C, C++ och Fortran OpenACC 2.5, som definierar verktyg för att ladda ner operationer på GPU:er och specialiserade processorer som NVIDIA PTX;
  • Partiellt stöd för standarden har implementerats för C och C++ Öppna MP 5.0 (Open Multi-Processing), som definierar API och metoder för att tillämpa parallella programmeringsmetoder för C, C++ och Fortran-språk på flerkärniga och hybridsystem (CPU+GPU/DSP) med delat minne och vektoriseringsenheter (SIMD) ;
  • Nya varningar har lagts till för C-språket: "-Waddress-of-packed-medlem" (ojusterat pekarvärde till en packad medlem av en struktur eller förening) och
    «-Wabsolut-värde" (vid åtkomst till funktioner för att beräkna ett absolut värde, om det finns en mer lämplig funktion för det angivna argumentet, till exempel, ska fabs(3.14) användas istället för abs(3.14). Nya varningar tillagda för C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" och "-Wclass-conversion". Många tidigare tillgängliga varningar har utökats;

  • Lade till experimentellt stöd för en del av den framtida C-språkstandarden, kodnamnet C2x. För att aktivera C2x-stöd, använd alternativen "-std=c2x" och "-std=gnu2x" (för att aktivera GNU-tillägg). Standarden är fortfarande i ett tidigt utvecklingsstadium, därför stöds av dess kapacitet endast uttrycket _Static_assert med ett argument (_Static_assert med två argument är standardiserat i C11);
  • Stöd för C++17-standarden har förklarats stabilt. I frontend är språkfunktionerna för C++17 fullt implementerade, och i libstdc++ är biblioteksfunktionerna som definieras i standarden nära full implementering;
  • Fortsatt genomförande delar av den framtida C++2a-standarden. Till exempel har möjligheten att inkludera intervall under initialisering lagts till, tillägg för lambda-uttryck har implementerats, stöd för tomma medlemmar av datastrukturer och sannolika/osannolika attribut har lagts till, möjligheten att anropa virtuella funktioner i villkorliga uttryck har tillhandahållits , etc.
    För att aktivera C++2a-stöd, använd alternativen "-std=c++2a" och "-std=gnu++2a". Lade till bit- och versionshuvudfiler till libstdc++ för C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible och std::type_identity-egenskaper, std::midpoint, std::lerp-funktion , std::bind_front,
    std::visit, std::is_constant_evaluated och std::assume_aligned, lade till stöd för char8_t-typen, implementerade möjligheten att kontrollera prefixet och suffixet för strängar (starts_with, ends_with);

  • Lagt till stöd för nya ARM-processorer
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE och Neoverse N1. Tillagt stöd för instruktioner introducerade i Armv8.3-A för att arbeta med komplexa tal, generering av pseudoslumptal (rng) och minnestaggning (memtag), samt instruktioner för att blockera attacker relaterade till spekulativ exekvering och drift av grenprediktionsenheten . För AArch64-arkitekturen har ett skyddsläge lagts till stack och heap korsningar ("-fstack-clash-protection"). För att använda funktionerna i Armv8.5-A-arkitekturen har alternativet "-march=armv8.5-a" lagts till

  • Den innehåller en backend för att generera kod för AMD GPU:er baserad på GCN-mikroarkitekturen. Implementeringen är för närvarande begränsad till kompilering av enkeltrådade applikationer (stöd för att utföra flertrådiga beräkningar via OpenMP och OpenACC kommer att erbjudas senare) och stöd för GPU Fiji och Vega 10;
  • Lade till ny backend för processorer ÖppnaRISC;
  • Lade till backend för processorer C-SKY V2, producerad av det kinesiska företaget med samma namn för olika konsumentenheter;
  • Alla kommandoradsalternativ som använder bytevärden stöder suffixen kb, KiB, MB, MiB, GB och GiB;
  • Genomfört alternativet "-flive-patching=[inline-only-static|inline-clone]" låter dig uppnå säker kompilering för live-patching-system på grund av kontroll på flera nivåer över användningen av interprocedural (IPA) optimeringar;
  • Lade till alternativet "--komplettering" för finkornig kontroll av komplettering av alternativ när du använder bash;
  • Diagnostikverktygen tillhandahåller visningar av källtextutdrag som anger radnumret och visuell markering av relaterad information, såsom operandtyper. För att inaktivera visningen av radnummer och etiketter finns alternativen "-fno-diagnostics-show-line-numbers" och "-fno-diagnostics-show-labels";

    Release av GCC 9-kompilatorsviten

  • Expanderat verktyg för att diagnostisera fel i C++-kod, förbättrad läsbarhet av information om orsakerna till fel och framhävning av problematiska parametrar;

    Release av GCC 9-kompilatorsviten

  • Lade till alternativet "-fdiagnostics-format=json", som tillåter generering av diagnostisk utdata i maskinläsbart format (JSON);
  • Lade till nya profileringsalternativ "-fprofile-filter-files" och "-fprofile-exclude-files" för att välja källfiler som ska bearbetas;
  • AddressSanitizer ger generering av mer kompakt verifieringskod för automatiska variabler, vilket minskar minnesförbrukningen för den körbara filen som kontrolleras;
  • Förbättrad utgång i "-fopt-info» (detaljerad information om tillagda optimeringar). Lade till nya prefix "optimerad" och "missad", utöver det tidigare tillgängliga prefixet "not". Tillagd information om beslutsfattande om inline-utveckling och vektorisering av cykler;
  • Lade till alternativet "-fsave-optimization-record", när det anges, sparar GCC filen SRCFILE.opt-record.json.gz med en beskrivning av beslut om användningen av vissa optimeringar. Det nya alternativet skiljer sig från "-fopt-info"-läget genom att inkludera ytterligare metadata, såsom information om profilen och inline-kedjor;
  • Lade till alternativ "-fipa-stack-alignment" och "-fipa-reference-addressable" för att kontrollera stackjustering och användningen av adresseringslägen (skrivbara eller läsexakt) för statiska variabler under interproceduroptimeringar;
  • Nya inbyggda funktioner introduceras för att styra attributbindning samt beteende relaterat till grenprediktion och exekvering av spekulativa instruktioner: "__builtin_has_attribute" '__inbyggd_förvänta_med_sannolikhet"och"__builtin_speculation_safe_value". Ett nytt attribut har lagts till för funktioner, variabler och typer kopiera;
  • Fullständigt stöd för asynkron input/output har implementerats för Fortran-språket;
  • Stöd för plattformarna Solaris 10 (*-*-solaris2.10) och Cell/BE (Cell Broadband Engine SPU) har fasats ut och kommer att tas bort i nästa stora utgåva. Stödet för arkitekturerna Armv2, Armv3, Armv5 och Armv5E har upphört. Stödet för Intel MPX (Memory Protection Extensions) har upphört.

Källa: opennet.ru

Lägg en kommentar