Vrystelling van die GCC 9 samesteller suite

Na 'n jaar van ontwikkeling gepubliseer vrystelling van 'n gratis stel samestellers GCC 9.1, die eerste groot vrystelling in die nuwe GCC 9.x-tak. In ooreenstemming met nuwe skema vrystellingnommers, weergawe 9.0 is in die ontwikkelingsproses gebruik, en kort voor die vrystelling van GCC 9.1 het die GCC 10.0-tak reeds afgetak, op grond waarvan die volgende beduidende vrystelling, GCC 10.1, gevorm sou word.

GCC 9.1 is opvallend vir die stabilisering van ondersteuning vir die C++17-standaard, die voortsetting van die implementering van die vermoëns van die toekomstige C++20-standaard (kodenaam C++2a), insluiting in die frontend vir die D-taal, gedeeltelike ondersteuning vir OpenMP 5.0 , byna volledige ondersteuning vir OpenACC 2.5, verhoog skaalbaarheid van interprosedurele optimaliserings en optimaliserings by die bindingstadium, uitbreiding van diagnostiese gereedskap en toevoeging van nuwe waarskuwings, backends vir OpenRISC, C-SKY V2 en AMD GCN GPU.

Die belangrikste veranderinge:

  • Bygevoeg ondersteuning vir die D-programmeertaal. GCC sluit 'n frontend met 'n samesteller in GDC (Gnu D-samesteller) en looptydbiblioteke (libphobos), wat jou toelaat om standaard GCC te gebruik om programme in die D-programmeertaal te bou. Die proses om D-taalondersteuning in GCC te aktiveer het begin terug in 2011, maar uitgerek weens die behoefte om die kode in ooreenstemming te bring met GCC-vereistes en probleme met die oordrag van intellektuele eiendomsregte aan Digital Mars, wat besig is om die D-programmeertaal te ontwikkel;
  • Verbeterings is aangebring aan die kodegenerator. Byvoorbeeld, die gebruik van verskillende strategieë vir die uitbreiding van Switch-uitdrukkings (springtabel, bistoets, besluitboom) na gelang van situasies is geïmplementeer. Bygevoeg die vermoë om lineêre funksies te transformeer wat 'n Switch-uitdrukking insluit deur die "-ftree-switch-conversion"-optimering te gebruik (byvoorbeeld 'n stel voorwaardes soos "geval 2: hoe = 205; breek; geval 3: hoe = 305; breek ;” sal omgeskakel word na "100 * hoe + 5";
  • Verbeterde interprosedure-optimalisasies. Inlyn-ontplooiing-instellings is aangepas vir moderne C++-kodebasisse en uitgebrei met nuwe parameters max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-inss en uninlined -dink-tyd. Verbeterde akkuraatheid en aggressiwiteit van koue / warm kode skeiding. Verbeterde skaalbaarheid vir baie groot vertaaleenhede (byvoorbeeld wanneer optimering in die koppelingstadium aan groot programme toegepas word);
  • Die optimaliseringsmeganisme gebaseer op die resultate van kodeprofilering (PGO - Profile-guided optimization) is verbeter, wat meer optimale kode genereer gebaseer op 'n ontleding van die kenmerke van kode-uitvoering. Opsomming opsie "-fprofiel-gebruik" sluit nou die optimeringsmodusse "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" en "-ftree-loop-distribution" in. Verwyder die insluiting van histogramme met tellers in lêers, wat die grootte van lêers met profiele verminder het (histogramme word nou dadelik gegenereer wanneer optimalisering uitgevoer word tydens koppeling);
  • Verbeterde skakeltydoptimalisasies (LTO). Vereenvoudiging van tipes is verskaf voordat die resultaat gegenereer is, wat dit moontlik gemaak het om die grootte van LTO-objeklêers aansienlik te verminder, geheueverbruik by die bindingstadium te verminder en die parallelisering van bedrywighede te verbeter. Die aantal partisies (-param lto-partisies) is van 32 na 128 verhoog, wat werkverrigting op stelsels met 'n groot aantal SVE-drade verbeter. 'n Parameter is bygevoeg om die aantal optimaliseerderprosesse te beheer
    "-param lto-max-streaming-parallelism";

    As gevolg hiervan, in vergelyking met GCC 8.3, die optimaliserings wat in GCC 9 ingestel is toegelaat verminder die samestellingstyd van Firefox 5 en LibreOffice 66 met ongeveer 6.2.3%. Die grootte van objeklêers het met 7% afgeneem. Bindingstyd op 'n 8-kern SVE het met 11% afgeneem. Die opeenvolgende optimaliseringstadium van die koppelingstadium is nou 28% vinniger en verbruik 20% minder geheue. Geheueverbruik van elke verwerker van die geparalleliseerde stadium van LTO het met 30% afgeneem;

  • Die meeste van die parallelle programmering spesifikasies is geïmplementeer vir C, C++ en Fortran tale OpenACC 2.5, wat gereedskap definieer vir die aflaai van bedrywighede op GPU's en gespesialiseerde verwerkers soos NVIDIA PTX;
  • Gedeeltelike ondersteuning vir die standaard is geïmplementeer vir C en C++ Maak MP 5.0 oop (Open Multi-Processing), wat die API en metodes definieer om parallelle programmeringsmetodes vir C, C++ en Fortran-tale toe te pas op multikern- en hibriede (CPU+GPU/DSP) stelsels met gedeelde geheue en vektoriseringseenhede (SIMD) ;
  • Nuwe waarskuwings is bygevoeg vir die C-taal: "-Wadadres-van-gepakte-lid" (onbelynde wyserwaarde na 'n volgepakte lid van 'n struktuur of unie) en
    «-Wabsoluut-waarde" (wanneer toegang tot funksies verkry word vir die berekening van 'n absolute waarde, as daar 'n meer geskikte funksie vir die gespesifiseerde argument is, moet fabs(3.14) byvoorbeeld gebruik word in plaas van abs(3.14). Nuwe waarskuwings bygevoeg vir C++: "-Wdeprecated-copy",
    "-Winit-lys-leeftyd", "-Wredundant-skuif", "-Wpessimizing-move" en "-Wclass-conversion". Baie voorheen beskikbare waarskuwings is uitgebrei;

  • Bygevoeg eksperimentele ondersteuning vir 'n deel van die toekomstige C-taalstandaard, kodenaam C2x. Om C2x-ondersteuning te aktiveer, gebruik die opsies "-std=c2x" en "-std=gnu2x" (om GNU-uitbreidings te aktiveer). Die standaard is nog in 'n vroeë stadium van ontwikkeling, daarom, van sy vermoëns, word slegs die uitdrukking _Static_assert met een argument ondersteun (_Static_assert met twee argumente word gestandaardiseer in C11);
  • Ondersteuning vir die C++17-standaard is stabiel verklaar. In die frontend is die taalvermoëns van C++17 ten volle geïmplementeer, en in libstdc++ is die biblioteekfunksies wat in die standaard gedefinieer word, naby aan volle implementering;
  • Vervolg implementering elemente van die toekomstige C++2a-standaard. Byvoorbeeld, die vermoë om reekse tydens inisialisering in te sluit, is bygevoeg, uitbreidings vir lambda-uitdrukkings is geïmplementeer, ondersteuning vir leë lede van datastrukture en waarskynlike/onwaarskynlike eienskappe is bygevoeg, die vermoë om virtuele funksies in voorwaardelike uitdrukkings op te roep is verskaf , ens.
    Om C++2a-ondersteuning te aktiveer, gebruik die "-std=c++2a" en "-std=gnu++2a" opsies. Bygevoeg bit- en weergawekoplêers by libstdc++ vir C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible en std::type_identity-eienskappe, std::middelpunt, std::lerp-funksies , std::bind_front,
    std::visit, std::is_constant_evaluated and std::assume_aligned, het ondersteuning vir die char8_t-tipe bygevoeg, die vermoë geïmplementeer om die voorvoegsel en agtervoegsel van snare (begin_met, eindig_met) na te gaan;

  • Bygevoeg ondersteuning vir nuwe ARM verwerkers
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE en Neoverse N1. Bygevoeg ondersteuning vir instruksies bekendgestel in Armv8.3-A vir die werk met komplekse getalle, pseudo-ewekansige getal generering (rng) en geheue tagging (memtag), sowel as instruksies vir die blokkering van aanvalle wat verband hou met spekulatiewe uitvoering en werking van die tak voorspelling eenheid . Vir die AArch64-argitektuur is 'n beskermingsmodus bygevoeg kruisings van stapel en hoop ("-fstack-botsingsbeskerming"). Om die kenmerke van die Armv8.5-A-argitektuur te gebruik, is die opsie "-march=armv8.5-a" bygevoeg

  • Dit bevat 'n backend vir die generering van kode vir AMD GPU's gebaseer op die GCN mikroargitektuur. Die implementering is tans beperk tot die samestelling van enkeldraadtoepassings (ondersteuning vir die uitvoer van multi-draadberekeninge via OpenMP en OpenACC sal later aangebied word) en ondersteuning vir GPU Fidji en Vega 10;
  • Bygevoeg nuwe agterkant vir verwerkers OopRISC;
  • Bygevoeg backend vir verwerkers C-SKY V2, vervaardig deur die Chinese maatskappy met dieselfde naam vir verskeie verbruikerstoestelle;
  • Alle opdragreëlopsies wat greepwaardes bedryf ondersteun die agtervoegsels kb, KiB, MB, MiB, GB en GiB;
  • Geïmplementeer die "-flive-patching=[inline-only-static|inline-clone]"-opsie laat jou toe om veilige samestelling vir lewendige-patching-stelsels te bereik as gevolg van multi-vlak beheer oor die gebruik van interprosedurele (IPA) optimaliserings;
  • Bygevoeg "--voltooiing" opsie vir fyn beheer van opsie voltooiing wanneer bash gebruik word;
  • Die diagnostiese nutsmiddels verskaf vertonings van bronteksuittreksels wat die reëlnommer aandui en verwante inligting visueel nasien, soos operandtipes. Om die vertoning van reëlnommers en etikette te deaktiveer, word die opsies “-fno-diagnostics-show-line-numbers” en “-fno-diagnostics-show-labels” verskaf;

    Vrystelling van die GCC 9 samesteller suite

  • Uitgebreid gereedskap vir die diagnose van foute in C++-kode, verbeterde leesbaarheid van inligting oor die oorsake van foute en uitlig van problematiese parameters;

    Vrystelling van die GCC 9 samesteller suite

  • Bygevoeg opsie "-fdiagnostics-format=json", wat dit moontlik maak om diagnostiese uitvoer in masjienleesbare formaat (JSON) te genereer;
  • Bygevoeg nuwe profilering opsies "-fprofile-filter-lêers" en "-fprofile-uitsluit-lêers" om bronlêers te kies wat verwerk moet word;
  • AddressSanitizer verskaf generering van meer kompakte verifikasiekode vir outomatiese veranderlikes, wat die geheueverbruik van die uitvoerbare lêer wat nagegaan word, verminder;
  • Verbeterde uitset in "-fopt-inligting» (gedetailleerde inligting oor bygevoegde optimaliserings). Bygevoeg nuwe voorvoegsels "geoptimaliseer" en "gemis", bykomend tot die voorheen beskikbare voorvoegsel "nota". Bygevoegde uitvoer van inligting oor besluitneming oor inlyn-ontvouing en vektorisering van siklusse;
  • Bygevoeg die "-fsave-optimization-record" opsie, wanneer gespesifiseer, GCC stoor die SRCFILE.opt-record.json.gz lêer met 'n beskrywing van besluite oor die gebruik van sekere optimaliserings. Die nuwe opsie verskil van die "-fopt-info"-modus deur bykomende metadata in te sluit, soos inligting oor die profiel en inlynkettings;
  • Bygevoeg opsies "-fipa-stack-alignment" en "-fipa-reference-addressable" om stapelbelyning te beheer en die gebruik van adresseringsmodusse (slegs skryf of lees-presies) vir statiese veranderlikes tydens interprosedurele optimalisering;
  • Nuwe ingeboude funksies word bekendgestel om kenmerkbinding sowel as gedrag wat verband hou met takvoorspelling en spekulatiewe instruksie-uitvoering te beheer: "__gebou_het_kenmerk","__ingebou_verwag_met_waarskynlikheid"en"__ingeboude_spekulasie_veilige_waarde". 'n Nuwe kenmerk is bygevoeg vir funksies, veranderlikes en tipes kopie;
  • Volledige ondersteuning vir asinchroniese invoer/afvoer is vir die Fortran-taal geïmplementeer;
  • Ondersteuning vir Solaris 10 (*-*-solaris2.10) en Cell/BE (Cell Broadband Engine SPU) platforms is opgeskort en sal in die volgende groot vrystelling verwyder word. Ondersteuning vir Armv2, Armv3, Armv5 en Armv5E argitekture is gestaak. Ondersteuning vir Intel MPX (Memory Protection Extensions) is gestaak.

Bron: opennet.ru

Voeg 'n opmerking