Vrijgave van de GCC 9-compilersuite

Na een jaar van ontwikkeling gepubliceerde release van een gratis set compilers GCC 9.1, de eerste grote release in de nieuwe GCC 9.x-tak. In overeenstemming met nieuw schema releasenummers, versie 9.0 werd gebruikt in het ontwikkelingsproces, en kort voor de release van GCC 9.1 was de GCC 10.0-tak al vertakt, op basis waarvan de volgende belangrijke release, GCC 10.1, zou worden gevormd.

GCC 9.1 valt op door het stabiliseren van de ondersteuning voor de C++17-standaard, het blijven implementeren van de mogelijkheden van de toekomstige C++20-standaard (codenaam C++2a), opname in de frontend voor de D-taal, gedeeltelijke ondersteuning voor OpenMP 5.0 , bijna volledige ondersteuning voor OpenACC 2.5, verhoging van de schaalbaarheid van interprocedurele optimalisaties en optimalisaties in de bindingsfase, uitbreiding van diagnostische tools en toevoeging van nieuwe waarschuwingen, backends voor OpenRISC, C-SKY V2 en AMD GCN GPU.

De belangrijkste veranderingen:

  • Ondersteuning toegevoegd voor de programmeertaal D. GCC bevat een frontend met een compiler GDC (Gnu D Compiler) en runtime-bibliotheken (libphobos), waarmee u standaard GCC kunt gebruiken om programma's te bouwen in de programmeertaal D. Het proces van het inschakelen van D-taalondersteuning in GCC is begonnen in 2011, maar sleepte vanwege de noodzaak om de code in overeenstemming te brengen met de GCC-vereisten en problemen met de overdracht van intellectuele eigendomsrechten aan Digital Mars, dat de programmeertaal D ontwikkelt;
  • Er zijn verbeteringen aangebracht aan de codegenerator. Er is bijvoorbeeld het gebruik van verschillende strategieën geïmplementeerd voor het uitbreiden van Switch-expressies (springtabel, bittest, beslissingsboom), afhankelijk van de situatie. De mogelijkheid toegevoegd om lineaire functies te transformeren die een Switch-expressie bevatten met behulp van de “-ftree-switch-conversion”-optimalisatie (bijvoorbeeld een reeks voorwaarden zoals “case 2: how = 205; break; case 3: how = 305; break ;” wordt geconverteerd naar "100 * hoe + 5";
  • Verbeterde interprocedurele optimalisaties. Inline-implementatie-instellingen zijn aangepast voor moderne C++-codebases en uitgebreid met nieuwe parameters max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns en uninlined -denk-tijd. Verbeterde nauwkeurigheid en agressiviteit van koude/warme codescheiding. Verbeterde schaalbaarheid voor zeer grote vertaaleenheden (bijvoorbeeld bij het toepassen van optimalisatie in de koppelingsfase van grote programma's);
  • Het optimalisatiemechanisme op basis van de resultaten van codeprofilering (PGO - Profile-guided Optimization) is verbeterd, waardoor een optimalere code wordt gegenereerd op basis van een analyse van de kenmerken van code-uitvoering. Samenvatting optie "-fprofile-gebruik" omvat nu de optimalisatiemodi "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" en "-ftree-loop-distribution". De opname van histogrammen met tellers in bestanden verwijderd, waardoor de grootte van bestanden met profielen werd verkleind (histogrammen worden nu direct gegenereerd bij het uitvoeren van optimalisaties tijdens het koppelen);
  • Verbeterde koppelingstijdoptimalisaties (LTO). Voordat het resultaat werd gegenereerd, werd de typen vereenvoudigd, waardoor het mogelijk werd de grootte van LTO-objectbestanden aanzienlijk te verkleinen, het geheugengebruik in de bindingsfase te verminderen en de parallellisatie van bewerkingen te verbeteren. Het aantal partities (-param lto-partities) is verhoogd van 32 naar 128, wat de prestaties verbetert op systemen met een groot aantal CPU-threads. Er is een parameter toegevoegd om het aantal optimalisatieprocessen te regelen
    "-param lto-max-streaming-parallelisme";

    Als gevolg hiervan zijn, vergeleken met GCC 8.3, de optimalisaties geïntroduceerd in GCC 9 toegestaan verkort de compilatietijd van Firefox 5 en LibreOffice 66 met ongeveer 6.2.3%. De omvang van objectbestanden is met 7% afgenomen. De bindingstijd op een 8-core CPU daalde met 11%. De sequentiële optimalisatiefase van de koppelingsfase is nu 28% sneller en verbruikt 20% minder geheugen. Het geheugenverbruik van elke processor van de geparallelliseerde fase van LTO daalde met 30%;

  • Het grootste deel van de parallelle programmeerspecificatie is geïmplementeerd voor de talen C, C++ en Fortran OpenACC 2.5, dat tools definieert voor het overbrengen van bewerkingen op GPU's en gespecialiseerde processors zoals NVIDIA PTX;
  • Gedeeltelijke ondersteuning voor de standaard is geïmplementeerd voor C en C++ Open MP 5.0 (Open Multi-Processing), dat de API en methoden definieert voor het toepassen van parallelle programmeermethoden voor de talen C, C++ en Fortran op multi-core en hybride (CPU+GPU/DSP) systemen met gedeeld geheugen en vectorisatie-eenheden (SIMD) ;
  • Er zijn nieuwe waarschuwingen toegevoegd voor de C-taal: "-Wadadres-van-verpakt-lid" (niet-uitgelijnde pointerwaarde naar een ingepakt lid van een structuur of unie) en
    «-Wabsolute-waarde" (bij toegang tot functies voor het berekenen van een absolute waarde en als er een geschiktere functie is voor het opgegeven argument, moet bijvoorbeeld fabs(3.14) worden gebruikt in plaats van abs(3.14). Nieuwe waarschuwingen toegevoegd voor C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" en "-Wclass-conversion". Veel eerder beschikbare waarschuwingen zijn uitgebreid;

  • Experimentele ondersteuning toegevoegd voor een deel van de toekomstige C-taalstandaard, met codenaam C2x. Om C2x-ondersteuning in te schakelen, gebruikt u de opties "-std=c2x" en "-std=gnu2x" (om GNU-extensies in te schakelen). De standaard bevindt zich nog in een vroeg ontwikkelingsstadium. Daarom wordt van zijn mogelijkheden alleen de uitdrukking _Static_assert met één argument ondersteund (_Static_assert met twee argumenten is gestandaardiseerd in C11);
  • Ondersteuning voor de C++17-standaard is stabiel verklaard. In de frontend zijn de taalmogelijkheden van C++17 volledig geïmplementeerd, en in libstdc++ zijn de bibliotheekfuncties die in de standaard zijn gedefinieerd bijna volledig geïmplementeerd;
  • Voortgezet implementatie elementen van de toekomstige C++2a-standaard. Zo is bijvoorbeeld de mogelijkheid toegevoegd om bereiken op te nemen tijdens de initialisatie, zijn er uitbreidingen voor lambda-expressies geïmplementeerd, is er ondersteuning voor lege leden van datastructuren en waarschijnlijke/onwaarschijnlijke attributen toegevoegd en is er de mogelijkheid geboden om virtuele functies in voorwaardelijke expressies aan te roepen , enz.
    Om C++2a-ondersteuning in te schakelen, gebruikt u de opties "-std=c++2a" en "-std=gnu++2a". Bit- en versieheaderbestanden toegevoegd aan libstdc++ voor C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible en std::type_identity traits, std::midpoint, std::lerp functies , std::bind_front,
    std::visit, std::is_constant_evaluated en std::assume_aligned, ondersteuning toegevoegd voor het char8_t type, de mogelijkheid geïmplementeerd om het voor- en achtervoegsel van strings te controleren (starts_with, Ends_with);

  • Ondersteuning toegevoegd voor nieuwe ARM-processors
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE en Neoverse N1. Ondersteuning toegevoegd voor instructies geïntroduceerd in Armv8.3-A voor het werken met complexe getallen, het genereren van pseudo-willekeurige getallen (rng) en geheugentagging (memtag), evenals instructies voor het blokkeren van aanvallen gerelateerd aan speculatieve uitvoering en werking van de branch-voorspellingseenheid . Voor de AArch64-architectuur is een beveiligingsmodus toegevoegd snijpunten van stapel en hoop (“-fstack-clash-bescherming”). Om de functies van de Armv8.5-A-architectuur te gebruiken, is de optie “-march=armv8.5-a” toegevoegd

  • Het bevat een backend voor het genereren van code voor AMD GPU's op basis van de GCN-microarchitectuur. De implementatie beperkt zich momenteel tot het compileren van single-threaded applicaties (ondersteuning voor het uitvoeren van multi-threaded berekeningen via OpenMP en OpenACC wordt later aangeboden) en ondersteuning voor GPU Fiji en Vega 10;
  • Nieuwe backend voor processors toegevoegd OpenRISC;
  • Backend voor processors toegevoegd C-SKY V2, geproduceerd door het gelijknamige Chinese bedrijf voor verschillende consumentenapparaten;
  • Alle opdrachtregelopties die bytewaarden bedienen, ondersteunen de achtervoegsels kb, KiB, MB, MiB, GB en GiB;
  • Geïmplementeerd Met de optie “-flive-patching=[inline-only-static|inline-clone]” kunt u een veilige compilatie voor live-patchingsystemen realiseren dankzij controle op meerdere niveaus over het gebruik van interprocedurele (IPA) optimalisaties;
  • Optie "--completion" toegevoegd voor fijnmazige controle over de voltooiing van opties bij gebruik van bash;
  • De diagnostische hulpmiddelen bieden weergaven van brontekstfragmenten die het regelnummer aangeven en gerelateerde informatie visueel markeren, zoals operandtypen. Om de weergave van regelnummers en labels uit te schakelen, zijn de opties “-fno-diagnostics-show-line-numbers” en “-fno-diagnostics-show-labels” aanwezig;

    Vrijgave van de GCC 9-compilersuite

  • Uitgebreid hulpmiddelen voor het diagnosticeren van fouten in C++-code, verbeterde leesbaarheid van informatie over de oorzaken van fouten en het benadrukken van problematische parameters;

    Vrijgave van de GCC 9-compilersuite

  • Optie “-fdiagnostics-format=json” toegevoegd, waarmee diagnostische uitvoer in machineleesbaar formaat (JSON) kan worden gegenereerd;
  • Nieuwe profileringsopties “-fprofile-filter-files” en “-fprofile-exclude-files” toegevoegd om bronbestanden te selecteren die moeten worden verwerkt;
  • AddressSanitizer biedt het genereren van compactere verificatiecode voor automatische variabelen, waardoor het geheugengebruik van het uitvoerbare bestand dat wordt gecontroleerd, wordt verminderd;
  • Verbeterde uitvoer in "-fopt-info» (gedetailleerde informatie over toegevoegde optimalisaties). Nieuwe voorvoegsels "geoptimaliseerd" en "gemist" toegevoegd, naast het eerder beschikbare voorvoegsel "opmerking". Toegevoegde output van informatie over besluitvorming over inline-ontvouwing en vectorisatie van cycli;
  • De optie “-fsave-optimization-record” is toegevoegd. Indien gespecificeerd, slaat GCC het bestand SRCFILE.opt-record.json.gz op met een beschrijving van beslissingen over het gebruik van bepaalde optimalisaties. De nieuwe optie verschilt van de “-fopt-info”-modus door aanvullende metadata op te nemen, zoals informatie over het profiel en inline-ketens;
  • Opties toegevoegd “-fipa-stack-alignment” en “-fipa-reference-addressable” om de stapeluitlijning en het gebruik van adresseringsmodi (alleen schrijven of exact lezen) voor statische variabelen tijdens interprocedurele optimalisaties te controleren;
  • Er worden nieuwe ingebouwde functies geïntroduceerd om attribuutbinding te controleren, evenals gedrag gerelateerd aan vertakkingsvoorspelling en uitvoering van speculatieve instructies: "__ingebouwd_heeft_kenmerk' "__ingebouwde_verwacht_met_waarschijnlijkheid" En "__ingebouwde_speculatie_veilige_waarde". Er is een nieuw attribuut toegevoegd voor functies, variabelen en typen kopiëren;
  • Volledige ondersteuning voor asynchrone invoer/uitvoer is geïmplementeerd voor de Fortran-taal;
  • Ondersteuning voor Solaris 10 (*-*-solaris2.10) en Cell/BE (Cell Broadband Engine SPU) platforms is verouderd en wordt verwijderd in de volgende grote release. Ondersteuning voor Armv2-, Armv3-, Armv5- en Armv5E-architecturen is stopgezet. Ondersteuning voor Intel MPX (Memory Protection Extensions) is stopgezet.

Bron: opennet.ru

Voeg een reactie