Utgivelse av GCC 9-kompilatorpakken

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

GCC 9.1 er kjent for å stabilisere støtte for C++17-standarden, fortsette å implementere mulighetene til den fremtidige C++20-standarden (kodenavnet C++2a), inkludering i frontend for D-språket, delvis støtte for OpenMP 5.0 , nesten fullstendig støtte for OpenACC 2.5, øke skalerbarheten av interprosedyreoptimaliseringer og optimaliseringer på bindingsstadiet, utvidelse av diagnoseverktøy og tillegg av nye advarsler, backends for OpenRISC, C-SKY V2 og AMD GCN GPU.

Den viktigste endringer:

  • Lagt til støtte for programmeringsspråket D. GCC inkluderer en frontend med en kompilator GDC (Gnu D Compiler) og runtime-biblioteker (libphobos), som lar deg bruke standard GCC for å bygge programmer i programmeringsspråket D. Prosessen med å aktivere D-språkstøtte i GCC har begynt tilbake i 2011, men trukket videre på grunn av behovet for å bringe koden i samsvar med GCC-kravene og problemer med overføringen av immaterielle rettigheter til Digital Mars, som utvikler D-programmeringsspråket;
  • Det er gjort forbedringer i kodegeneratoren. For eksempel er bruk av ulike strategier for å utvide Switch-uttrykk (hopptabell, bittest, beslutningstre) avhengig av situasjoner implementert. Lagt til muligheten til å transformere lineære funksjoner som inkluderer et Switch-uttrykk ved å bruke "-ftree-switch-conversion"-optimaliseringen (for eksempel et sett med betingelser som "tilfelle 2: hvordan = 205; brudd; tilfelle 3: hvordan = 305; brudd ;” vil bli konvertert til "100 * hvordan + 5";
  • Forbedrede interprosedyreoptimaliseringer. Innebygde distribusjonsinnstillinger er tilpasset moderne C++-kodebaser og utvidet med nye parametere max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-inss og uninlined -tanke-tid. Forbedret nøyaktighet og aggressivitet av kald/varm kodeseparasjon. Forbedret skalerbarhet for svært store oversettelsesenheter (for eksempel når du bruker optimalisering på koblingsstadiet til store programmer);
  • 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. Oppsummeringsalternativ "-fprofil-bruk" inkluderer nå optimaliseringsmodusene "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" og "-ftree-loop-distribution". Fjernet inkluderingen av histogrammer med tellere i filer, noe som reduserte størrelsen på filer med profiler (histogrammer genereres nå i farten når du utfører optimaliseringer under kobling);
  • Enhanced Linking Time Optimizations (LTO). Forenkling av typer ble gitt før generering av resultatet, noe som gjorde det mulig å redusere størrelsen på LTO-objektfiler betydelig, redusere minneforbruket på bindingsstadiet og forbedre parallelliseringen av operasjoner. Antall partisjoner (-param lto-partisjoner) er økt fra 32 til 128, noe som forbedrer ytelsen på systemer med et stort antall CPU-tråder. En parameter er lagt til for å kontrollere antall optimeringsprosesser
    "-param lto-max-streaming-parallelism";

    Som et resultat, sammenlignet med GCC 8.3, ble optimaliseringene introdusert i GCC 9 tillatt reduser kompileringstiden for Firefox 5 og LibreOffice 66 med omtrent 6.2.3 %. Størrelsen på objektfilene ble redusert med 7 %. Bindingstiden på en 8-kjerners CPU gikk ned med 11 %. Det sekvensielle optimaliseringsstadiet til koblingsstadiet er nå 28 % raskere og bruker 20 % mindre minne. Minneforbruket til hver prosessor i det parallelliserte trinnet i LTO gikk ned med 30 %;

  • Det meste av parallellprogrammeringsspesifikasjonen er implementert for C, C++ og Fortran språk OpenACC 2.5, som definerer verktøy for avlasting av operasjoner på GPUer og spesialiserte prosessorer som NVIDIA PTX;
  • Delvis støtte for standarden er implementert for C og C++ Åpne MP 5.0 (Open Multi-Processing), som definerer API og metoder for å bruke parallelle programmeringsmetoder for C, C++ og Fortran-språk på multi-core og hybrid (CPU+GPU/DSP) systemer med delt minne og vektoriseringsenheter (SIMD) ;
  • Nye advarsler er lagt til for C-språket: "-Vaddress-of-packed-medlem" (ujustert pekerverdi til et pakket medlem av en struktur eller fagforening) og
    «-Wabsolutt-verdi" (ved tilgang til funksjoner for å beregne en absolutt verdi, hvis det er en mer passende funksjon for det spesifiserte argumentet, for eksempel, skal fabs(3.14) brukes i stedet for abs(3.14). Nye advarsler lagt til for C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" og "-Wclass-conversion". Mange tidligere tilgjengelige advarsler er utvidet;

  • Lagt til eksperimentell støtte for en del av den fremtidige C-språkstandarden, kodenavnet C2x. For å aktivere C2x-støtte, bruk alternativene "-std=c2x" og "-std=gnu2x" (for å aktivere GNU-utvidelser). Standarden er fortsatt på et tidlig stadium av utviklingen, derfor er det bare uttrykket _Static_assert med ett argument som støttes (_Static_assert med to argumenter er standardisert i C11);
  • Støtte for C++17-standarden er erklært stabil. I frontend er språkmulighetene til C++17 fullt implementert, og i libstdc++ er bibliotekfunksjonene definert i standarden nær full implementering;
  • Fortsettelse realisering av elementer i den fremtidige C++2a-standarden. For eksempel er muligheten til å inkludere områder under initialisering lagt til, utvidelser for lambda-uttrykk er implementert, støtte for tomme medlemmer av datastrukturer og sannsynlige/usannsynlige attributter er lagt til, muligheten til å kalle virtuelle funksjoner i betingede uttrykk er gitt , etc.
    For å aktivere C++2a-støtte, bruk alternativene "-std=c++2a" og "-std=gnu++2a". La til bit- og versjonshodefiler til libstdc++ for C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity-trekk, std::midpoint, std::lerp-funksjon , std::bind_front,
    std::visit, std::is_constant_evaluated og std::assume_aligned, la til støtte for char8_t-typen, implementerte muligheten til å sjekke prefikset og suffikset til strenger (starts_with, ends_with);

  • Lagt til støtte for nye ARM-prosessorer
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE og Neoverse N1. Lagt til støtte for instruksjoner introdusert i Armv8.3-A for arbeid med komplekse tall, generering av pseudo-tilfeldig tall (rng) og minnetagging (memtag), samt instruksjoner for blokkering av angrep relatert til spekulativ utførelse og drift av grenprediksjonsenheten . For AArch64-arkitekturen er det lagt til en beskyttelsesmodus skjæringspunktet mellom stabel og haug ("-fstack-clash-protection"). For å bruke funksjonene til Armv8.5-A-arkitekturen er alternativet "-march=armv8.5-a" lagt til

  • Den inkluderer en backend for å generere kode for AMD GPUer basert på GCN-mikroarkitekturen. Implementeringen er foreløpig begrenset til kompilering av entrådede applikasjoner (støtte for å utføre flertrådede beregninger via OpenMP og OpenACC vil bli tilbudt senere) og støtte for GPU Fiji og Vega 10;
  • Lagt til ny backend for prosessorer ÅpenRISC;
  • Lagt til backend for prosessorer C-SKY V2, produsert av det kinesiske selskapet med samme navn for ulike forbrukerenheter;
  • Alle kommandolinjealternativer som opererer byteverdier støtter suffiksene kb, KiB, MB, MiB, GB og GiB;
  • Implementert alternativet "-flive-patching=[inline-only-static|inline-clone]" lar deg oppnå sikker kompilering for live-patching-systemer på grunn av flernivåkontroll over bruken av interprosedyre (IPA) optimaliseringer;
  • Lagt til "--completion"-alternativet for finkornet kontroll av valgfullføringen ved bruk av bash;
  • Diagnoseverktøyene gir visninger av kildetekstutdrag som indikerer linjenummeret og visuelt markering av relatert informasjon, for eksempel operandtyper. For å deaktivere visningen av linjenumre og etiketter, er alternativene "-fno-diagnostics-show-line-numbers" og "-fno-diagnostics-show-labels" tilgjengelig;

    Utgivelse av GCC 9-kompilatorpakken

  • Utvidet verktøy for å diagnostisere feil i C++-kode, forbedret lesbarhet av informasjon om årsakene til feil og fremheving av problematiske parametere;

    Utgivelse av GCC 9-kompilatorpakken

  • Lagt til alternativet "-fdiagnostics-format=json", som gjør det mulig å generere diagnostiske utdata i maskinlesbart format (JSON);
  • Lagt til nye profileringsalternativer "-fprofile-filter-files" og "-fprofile-exclude-files" for å velge kildefiler som skal behandles;
  • AddressSanitizer gir generering av mer kompakt bekreftelseskode for automatiske variabler, noe som reduserer minneforbruket til den kjørbare filen som kontrolleres;
  • Forbedret utgang i "-fopt-info» (detaljert informasjon om ekstra optimaliseringer). Lagt til nye prefikser "optimalisert" og "savnet", i tillegg til det tidligere tilgjengelige prefikset "merknad". Lagt til produksjon av informasjon om beslutningstaking om inline-utfolding og vektorisering av sykluser;
  • Lagt til "-fsave-optimization-record", når spesifisert, lagrer GCC filen SRCFILE.opt-record.json.gz med en beskrivelse av beslutninger om bruk av visse optimaliseringer. Det nye alternativet skiller seg fra "-fopt-info"-modusen ved å inkludere ytterligere metadata, for eksempel informasjon om profilen og innebygde kjeder;
  • Lagt til alternativer "-fipa-stack-alignment" og "-fipa-reference-addressable" for å kontrollere stabeljustering og bruk av adresseringsmoduser (bare skrive eller lese-eksakt) for statiske variabler under interprosedyreoptimaliseringer;
  • Nye innebygde funksjoner introduseres for å kontrollere attributtbinding så vel som atferd relatert til grenprediksjon og utførelse av spekulativ instruksjon: "__builtin_has_attribute" '__bygget_forventer_med_sannsynlighet"Og"__builtin_speculation_safe_value". Et nytt attributt er lagt til for funksjoner, variabler og typer kopiere;
  • Full støtte for asynkron input/output er implementert for Fortran-språket;
  • Støtte for Solaris 10 (*-*-solaris2.10) og Cell/BE (Cell Broadband Engine SPU)-plattformer er avviklet og vil bli fjernet i neste store utgivelse. Støtte for Armv2, Armv3, Armv5 og Armv5E arkitekturer er avviklet. Støtte for Intel MPX (Memory Protection Extensions) er avviklet.

Kilde: opennet.ru

Legg til en kommentar