Vrystelling van die GCC 10 samesteller suite

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

GCC 10.1 is opvallend vir die implementering van baie innovasies in die C++-taal wat ontwikkel is vir die C++20-standaard, verbeterings wat verband hou met die toekomstige C-taalstandaard (C2x), nuwe optimaliserings in die samesteller-agtergronde en eksperimentele ondersteuning statiese analise-modus. Daarbenewens het die projek tydens die voorbereiding van 'n nuwe tak die bewaarplek van SVN na Git oorgedra.

Die belangrikste veranderinge:

  • Bygevoeg eksperimentele modus van statiese analise "-fanaliseerder", wat hulpbron-intensiewe interprosedurele analise van kode-uitvoeringspaaie en datavloei in 'n program uitvoer. Die modus is in staat om probleme in die samestellingstadium op te spoor, soos dubbele oproepe na die free()-funksie vir een geheuearea, lêerbeskrywinglekkasies, herkenning en deurgee van nulwysers, toegang tot vrygestelde geheueblokke, die gebruik van ongeinitialiseerde waardes, ens. Die gebruik van die nuwe modus vir OpenSSL-kode het dit reeds moontlik gemaak om te identifiseer gevaarlike kwesbaarheid.
  • Verbeterde interprosedure-optimalisasies. Die IPA-SRA-pas (Interprocedural Scalar Shared Replacement) is herontwerp om op bindtyd te werk en verwyder onder andere nou berekende en teruggestuurde ongebruikte waardes. In die "-O2"-optimeringsmodus is die "-finline-funksies" opsie geaktiveer, wat heringestel word om meer kompakte kode bo uitvoeringsprestasie te bevoordeel. Die werk van die heuristiek vir inlynfunksie-ontplooiing is versnel. Inlynuitbreiding en funksiekloningheuristiek kan nou inligting oor waardereekse gebruik om die doeltreffendheid van individuele transformasies te voorspel. Vir C++ is die akkuraatheid van tipe-gebaseerde alias-ontleding verbeter.
  • Verbeterde skakeltydoptimalisasies (LTO). Bygevoeg nuwe uitvoerbare lto-dump om inligting oor objeklêers met LTO-greepkode terug te stel. Parallelle LTO-passe bepaal outomaties die aantal gelyktydige lopende maak-take en, indien hulle nie bepaal kan word nie, gebruik inligting oor die aantal SVE-kerns as 'n paralleliseringsfaktor. Bygevoeg die vermoë om LTO-greepkode saam te komprimeer met behulp van die zstd-algoritme.
  • 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. Verbeterde profielinstandhouding tydens samestelling en warm/koue kode skeiding. Via die opsie "-fprofiel-waardes» kan nou tot 4 profielwaardes monitor, byvoorbeeld vir indirekte oproepe en die verskaffing van meer presiese profielinligting.
  • Parallelle programmering spesifikasie geïmplementeer vir C, C++ en Fortran tale OpenACC 2.6, wat gereedskap definieer vir die aflaai van bedrywighede op GPU's en gespesialiseerde verwerkers soos NVIDIA PTX. Implementering van die standaard is amper voltooi Maak MP 5.0 oop (Open Multi-Processing), wat die API en metodes definieer om parallelle programmeringsmetodes toe te pas op multi-kern en hibriede (CPU+GPU/DSP) stelsels met gedeelde geheue en vektoriseringseenhede (SIMD). Bygevoeg kenmerke soos laaste privaat voorwaardes, skandering en lus riglyne, orde en use_device_addr uitdrukkings. Vir OpenMP en OpenACC is ondersteuning bygevoeg vir die aflaai van bedrywighede op vierde generasie (Fidji) en vyfde generasie AMD Radeon (GCN) GPU's (VEGA 10/VEGA 20).
  • Vir tale van die C-familie is die "toegang"-funksie bygevoeg om die funksie se toegang tot voorwerpe te beskryf wat deur verwysing of wyser geslaag is, en om sulke voorwerpe te assosieer met heelgetalargumente wat inligting bevat oor die grootte van die voorwerpe. Om saam met "toegang" te werk, word die "tipe"-kenmerk geïmplementeer om verkeerde toegang vanaf gebruikersfunksies op te spoor, byvoorbeeld wanneer waardes geskryf word na 'n area buite die grense van die skikking. Ook bygevoeg is die "symver"-kenmerk om simbole in 'n ELF-lêer met spesifieke weergawenommers te assosieer.
  • Nuwe waarskuwings bygevoeg:
    • “-Wstring-compare” (geaktiveer met “-Wextra”) - waarsku oor die teenwoordigheid van uitdrukkings waarin nul vergelyk word met die resultaat van die oproep van die strcmp- en strncmp-funksies, wat gelykstaande is aan 'n konstante as gevolg van die feit dat die lengte van een argument is groter as die grootte van die skikking in die tweede argument.
    • "-Wzero-length-bounds" (geaktiveer met "-Warray-bounds") - waarsku oor toegang tot skikkingselemente van nul lengte, wat kan lei tot die oorskryf van ander data.
    • Die "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" en "-Wstringop-overflow" waarskuwings is uitgebrei om die aantal buitegrenssituasies uit te brei wat hanteer word.
  • Implementeer die vermoë om wye karakters direk in identifiseerders te spesifiseer deur die huidige enkodering (UTF-8 by verstek) eerder as UCN-notasie (\uNNNN of \UNNNNNNNNN) te gebruik. Byvoorbeeld:

    statiese konst int π = 3;
    int get_naïve_pi() {
    terugkeer π;
    }

  • Vir die C-taal is 'n gedeelte van nuwe kenmerke wat binne die C2X-standaard ontwikkel is geïmplementeer (geaktiveer deur -std=c2x en -std=gnu2x te spesifiseer): ondersteuning vir die "[[]]"-sintaksis het verskyn vir die definisie van eienskappe soos in C++ (byvoorbeeld, [[gnu ::const]], [[deprecated]], [[fallthrough]] en [[miskien_ongebruik]]. Bygevoeg ondersteuning vir "u8" sintaksis vir die definisie van konstantes met UTF-8 karakters.
    Nuwe makro's bygevoeg . Het "%OB" en "%Ob" vervangings by strftime gevoeg.

  • Die verstekmodus vir C is "-fno-common", wat meer doeltreffende toegang tot globale veranderlikes op sommige platforms moontlik maak.
  • Vir C++ is ongeveer 16 veranderinge en innovasies geïmplementeer, ontwikkel in die C++20-standaard. Insluitend die bygevoegde sleutelwoord "constinit"
    en ondersteuning vir sjabloonuitbreidings is geïmplementeer "konsepte". Konsepte laat jou toe om 'n stel sjabloonparametervereistes te definieer wat, tydens samestelling, die stel argumente wat as sjabloonparameters aanvaar kan word, beperk. Die konsepte kan gebruik word om logiese teenstrydighede tussen die eienskappe van die datatipes wat binne die sjabloon gebruik word en die datatipe-eienskappe van die invoerparameters te vermy.

  • G++ bied opsporing van ongedefinieerde gedrag wat veroorsaak word deur konstante voorwerpe te verander deur constexpr. Verminderde geheueverbruik deur die samesteller wanneer constexpr bereken word. Bygevoeg nuwe waarskuwings "-Wmismatched-tags" en "-Wredundant-tags".
  • Nuwe opdragreëlopsies is voorgestel:
    • "-fallocation-dce" om onnodige pare "nuwe" en "vee" operateurs te verwyder.
    • "-fprofile-partial-training" om grootte-optimering te deaktiveer vir kode wat nie 'n oefenlopie het nie.
    • "-fprofiel-reproduceerbaar om die vlak van profielreproduceerbaarheid te beheer.
    • "-fprofile-prefix-path" om die basisbronbougids wat gebruik word vir aparte profielgenerering (vir "-fprofile-generate=profiel_dir" en "-fprofile-use=profiel_dir") te definieer.
  • In die waarskuwingsteks vir die genoemde opsies word hiperskakels verskaf wat jou toelaat om na die dokumentasie vir hierdie opsies te gaan. URL-vervanging word beheer deur die "-fdiagnostics-urls" opsie.
  • Bygevoeg voorverwerker operateur "__het_ingebou", wat gebruik kan word om na ingeboude funksies te kyk.
  • Het 'n nuwe ingeboude funksie "__builtin_roundeven" bygevoeg met 'n implementering van die afrondingsfunksie wat in die ISO/IEC TS 18661-spesifikasie gedefinieer is, soortgelyk aan "rond", maar afrondende deel groter as 0.5 op (tot 'n groter waarde), minder as 0.5 - af (na nul), en gelyk aan 0.5 - vanaf die pariteit van die voorlaaste syfer.
  • Vir die AArch64-argitektuur is ondersteuning vir die SVE2-uitbreiding bygevoeg en ondersteuning vir SVE (Scalable Vector Extension) is verbeter, insluitend bykomende ondersteuning vir ingeboude SVE ACLE-funksies en -tipes, en die gebruik van vektorisering. Ondersteuning vir LSE (Large System Extensions) en TME (Transactional Memory Extension) is uitgebrei. Bygevoeg nuwe instruksies voorgestel in Armv8.5-A en Armv8.6-A, insluitend instruksies vir die generering van ewekansige getalle, afronding, geheue tag binding,
    bfloat16 en matriksvermenigvuldiging. Bygevoeg verwerker ondersteuning
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 en
    Marvell ThunderX3.

  • Bygevoeg ondersteuning vir ABI FDPIC (32-bis funksie wysers) vir ARM64. Herontwerp en geoptimaliseerde verwerking van 64-bis heelgetalbewerkings. Bygevoeg CPU-ondersteuning
    Arm Cortex-A77,
    Arm Cortex-A76AE en
    Arm Cortex-M35P. Uitgebreide ondersteuning vir ACLE-dataverwerkingsinstruksies, insluitend 32-bis SIMD, 16-bis vermenigvuldiging, grendelrekenkunde en ander DSP-algoritme-optimalisasies. Bygevoeg eksperimentele ondersteuning vir ACLE CDE (Custom Datapath Extension) instruksies.

  • Aansienlik verbeterde kodegenerering en vektorisering in die agterkant vir AMD GPU's gebaseer op die GCN-mikroargitektuur.
  • Bygevoeg ondersteuning vir XMEGA-agtige toestelle vir AVR argitektuur
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ga, ATmega809ga, ATmega1608ga, ATmega1609ga, 3208 3209, ATmega4808, ATmega4809 XNUMX, ATmegaXNUMX en ATmegaXNUMX.

  • 'n Nuwe Intel ENQCMD-instruksiestel-argitektuuruitbreiding (-menqcmd) is bygevoeg vir IA-32/x86-64-argitekture. Bygevoegde ondersteuning vir Intel Cooperlake (-march=cooperlake, sluit die AVX512BF16 ISA-uitbreiding in) en Tigerlake (-march=tigerlake, sluit die MOVDIRI-, MOVDIR64B- en AVX512VP2INTERSECT ISA-uitbreidings in) SVE's in.
  • 'n Implementering van die HSAIL (Heterogeneous System Architecture Intermediate Language) vir heterogene rekenaarstelsels gebaseer op die HSA-argitektuur is opgeskort en sal waarskynlik in 'n toekomstige vrystelling verwyder word.

Bron: opennet.ru

Voeg 'n opmerking