Vrijgave van de GCC 10-compilersuite

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

GCC 10.1 valt op door de implementatie van veel innovaties in de C++-taal ontwikkeld voor de C++20-standaard, verbeteringen gerelateerd aan de toekomstige C-taalstandaard (C2x), nieuwe optimalisaties in de compiler-backends en experimentele ondersteuning statische analysemodus. Bovendien heeft het project tijdens de voorbereiding van een nieuwe branch de repository van SVN naar Git overgedragen.

De belangrijkste veranderingen:

  • toegevoegd experimentele modus van statische analyse "-fananalysator“, dat een resource-intensieve interprocedurele analyse uitvoert van code-uitvoeringspaden en gegevensstromen in een programma. De modus kan problemen in de compilatiefase detecteren, zoals dubbele aanroepen van de functie free() voor één geheugengebied, lekken van bestandsdescriptors, dereferentie en het doorgeven van null-pointers, toegang tot vrijgemaakte geheugenblokken, het gebruik van niet-geïnitialiseerde waarden, enz. Het gebruik van de nieuwe modus voor OpenSSL-code heeft identificatie al mogelijk gemaakt gevaarlijke kwetsbaarheid.
  • Verbeterde interprocedurele optimalisaties. De IPA-SRA-pas (Interprocedural Scalar Shared Replacement) is opnieuw ontworpen om te werken op het moment van binden en verwijdert nu onder andere berekende en geretourneerde ongebruikte waarden. In de "-O2"-optimalisatiemodus is de optie "-finline-functions" ingeschakeld, die opnieuw is afgestemd om compactere code te bevoordelen boven uitvoeringsprestaties. Het werk van de heuristiek voor inline functie-implementatie is versneld. Inline-expansie- en functiekloningheuristieken kunnen nu informatie over waardebereiken gebruiken om de effectiviteit van individuele transformaties te voorspellen. Voor C++ is de nauwkeurigheid van op type gebaseerde aliasparsering verbeterd.
  • Verbeterde koppelingstijdoptimalisaties (LTO). Nieuw uitvoerbaar bestand toegevoegd Lto-dump om informatie over objectbestanden opnieuw in te stellen met LTO-bytecode. Parallelle LTO-passen bepalen automatisch het aantal gelijktijdig uitgevoerde make-taken en gebruiken, als deze niet kunnen worden bepaald, informatie over het aantal CPU-kernen als parallellisatiefactor. De mogelijkheid toegevoegd om LTO-bytecode te comprimeren met behulp van het zstd-algoritme.
  • 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. Verbeterd profielonderhoud tijdens compilatie en hot/cold-codescheiding. Via de optie "-fprofile-waarden» kan nu tot 4 profielwaarden monitoren, bijvoorbeeld voor indirecte oproepen en het verstrekken van nauwkeurigere profielinformatie.
  • Parallelle programmeerspecificatie geïmplementeerd voor C-, C++- en Fortran-talen OpenACC 2.6, dat tools definieert voor het overbrengen van bewerkingen op GPU's en gespecialiseerde processors zoals NVIDIA PTX. De implementatie van de standaard is bijna voltooid Open MP 5.0 (Open Multi-Processing), dat de API en methoden definieert voor het toepassen van parallelle programmeermethoden op multi-core en hybride (CPU+GPU/DSP) systemen met gedeeld geheugen en vectorisatie-eenheden (SIMD). Functies toegevoegd zoals lastprivate conditionals, scan- en loop-richtlijnen, order en use_device_addr-expressies. Voor OpenMP en OpenACC is ondersteuning toegevoegd voor het overbrengen van bewerkingen op AMD Radeon (GCN) GPU's van de vierde generatie (Fiji) en vijfde generatie (VEGA 10/VEGA 20).
  • Voor talen van de C-familie is de functie ‘toegang’ toegevoegd om de toegang van de functie tot objecten te beschrijven die via referentie of pointer worden doorgegeven, en om dergelijke objecten te associëren met integer-argumenten die informatie bevatten over de grootte van de objecten. Om samen te werken met ‘access’ is het attribuut ‘type’ geïmplementeerd om onjuiste toegang van gebruikersfuncties te detecteren, bijvoorbeeld bij het schrijven van waarden naar een gebied buiten de grenzen van de array. Ook toegevoegd is het attribuut "symver" om symbolen in een ELF-bestand te koppelen aan specifieke versienummers.
  • Nieuwe waarschuwingen toegevoegd:
    • "-Wstring-compare" (ingeschakeld met "-Wextra") - waarschuwt voor de aanwezigheid van expressies waarin nul wordt vergeleken met het resultaat van het aanroepen van de strcmp- en strncmp-functies, wat equivalent is aan een constante vanwege het feit dat de lengte van één argument is groter dan de grootte van de array in het tweede argument.
    • "-Wzero-length-bounds" (ingeschakeld met "-Warray-bounds") - waarschuwt voor toegang tot array-elementen met een lengte nul, wat kan leiden tot het overschrijven van andere gegevens.
    • De waarschuwingen “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” en “-Wstringop-overflow” zijn uitgebreid om het aantal out-of-bounds-situaties uit te breiden die worden afgehandeld.
  • De mogelijkheid geïmplementeerd om direct brede tekens in ID's op te geven met behulp van de huidige codering (standaard UTF-8) in plaats van de UCN-notatie (\uNNNN of \UNNNNNNN). Bijvoorbeeld:

    statische const int π = 3;
    int get_naïve_pi() {
    retourneer π;
    }

  • Voor de C-taal is een deel van de nieuwe functies, ontwikkeld binnen de C2X-standaard, geïmplementeerd (mogelijk gemaakt door het specificeren van -std=c2x en -std=gnu2x): er is ondersteuning verschenen voor de syntaxis “[[]]” voor het definiëren van attributen zoals in C++ (bijvoorbeeld [[gnu ::const]], [[verouderd]], [[fallthrough]] en [[maybe_unused]]. Ondersteuning toegevoegd voor de syntaxis "u8" voor het definiëren van constanten met UTF-8-tekens.
    Nieuwe macro's toegevoegd aan . Vervangingen "%OB" en "%Ob" toegevoegd aan strftime.

  • De standaardmodus voor C is "-fno-common", wat op sommige platforms een efficiëntere toegang tot globale variabelen mogelijk maakt.
  • Voor C++ zijn er ongeveer 16 wijzigingen en innovaties doorgevoerd, ontwikkeld in de C++20 standaard. Inclusief het toegevoegde zoekwoord “constinit”
    en ondersteuning voor sjabloonextensies is geïmplementeerd "het concept". Met concepten kunt u een reeks sjabloonparametervereisten definiëren die tijdens het compileren de reeks argumenten beperken die als sjabloonparameters kunnen worden geaccepteerd. De concepten kunnen worden gebruikt om logische inconsistenties te voorkomen tussen de eigenschappen van de gegevenstypen die in de sjabloon worden gebruikt en de gegevenstype-eigenschappen van de invoerparameters.

  • G++ biedt detectie van ongedefinieerd gedrag veroorzaakt door het veranderen van constante objecten via constexpr. Verminderd geheugengebruik door de compiler bij het berekenen van constexpr. Nieuwe waarschuwingen "-Wmismatched-tags" en "-Wredundant-tags" toegevoegd.
  • Er zijn nieuwe opdrachtregelopties voorgesteld:
    • "-fallocation-dce" om onnodige paren "nieuwe" en "delete" operatoren te verwijderen.
    • "-fprofile-partial-training" om de grootte-optimalisatie uit te schakelen voor code waarvoor geen trainingsuitvoering is uitgevoerd.
    • "-fprofile-reproduceerbaar om het niveau van profielreproduceerbaarheid te regelen.
    • "-fprofile-prefix-path" om de basisbronbuildmap te definiëren die wordt gebruikt voor het afzonderlijk genereren van profielen (voor "-fprofile-generate=profile_dir" en "-fprofile-use=profile_dir").
  • In de waarschuwingstekst voor de genoemde opties zijn hyperlinks opgenomen waarmee u naar de documentatie voor deze opties kunt gaan. URL-vervanging wordt beheerd met behulp van de optie "-fdiagnostics-urls".
  • Preprocessor-operator toegevoegd "__heeft_ingebouwd", die kan worden gebruikt om te controleren op ingebouwde functies.
  • Een nieuwe ingebouwde functie "__builtin_roundeven" toegevoegd met een implementatie van de afrondingsfunctie gedefinieerd in de ISO/IEC TS 18661-specificatie, vergelijkbaar met "rond", maar een gedeelte groter dan 0.5 naar boven afgerond (naar een grotere waarde), minder dan 0.5 - naar beneden (naar nul), en gelijk aan 0.5 - beginnend bij de pariteit van het voorlaatste cijfer.
  • Voor de AArch64-architectuur is ondersteuning voor de SVE2-extensie toegevoegd en is ondersteuning voor SVE (Scalable Vector Extension) verbeterd, inclusief extra ondersteuning voor ingebouwde SVE ACLE-functies en -typen, en het gebruik van vectorisatie. Ondersteuning voor LSE (Large System Extensions) en TME (Transactional Memory Extension) is uitgebreid. Nieuwe instructies toegevoegd voorgesteld in Armv8.5-A en Armv8.6-A, inclusief instructies voor het genereren van willekeurige getallen, afronding, binding van geheugentags,
    bfloat16 en matrixvermenigvuldiging. Processorondersteuning toegevoegd
    Armcortex-A77,
    Armcortex-A76AE,
    Armcortex-A65,
    Armcortex-A65AE,
    Arm Cortex-A34 en
    Marvell ThunderX3.

  • Ondersteuning toegevoegd voor ABI FDPIC (32-bit functieaanwijzers) voor ARM64. Opnieuw ontworpen en geoptimaliseerde verwerking van 64-bit integer-bewerkingen. CPU-ondersteuning toegevoegd
    Armcortex-A77,
    Arm Cortex-A76AE en
    Arm Cortex-M35P. Uitgebreide ondersteuning voor ACLE-gegevensverwerkingsinstructies, inclusief 32-bit SIMD, 16-bit vermenigvuldiging, rekenkundige vergrendeling en andere DSP-algoritme-optimalisaties. Experimentele ondersteuning toegevoegd voor ACLE CDE-instructies (Custom Datapath Extension).

  • Aanzienlijk verbeterde codegeneratie en vectorisatie in de backend voor AMD GPU's op basis van de GCN-microarchitectuur.
  • Ondersteuning toegevoegd voor XMEGA-achtige apparaten voor AVR-architectuur
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 en ATmegaXNUMX.

  • Er is een nieuwe architectuuruitbreiding voor de Intel ENQCMD-instructieset (-menqcmd) toegevoegd voor IA-32/x86-64-architecturen. Ondersteuning toegevoegd voor Intel Cooperlake (-march=cooperlake, inclusief de AVX512BF16 ISA-extensie) en Tigerlake (-march=tigerlake, inclusief de MOVDIRI, MOVDIR64B en AVX512VP2INTERSECT ISA-extensies) CPU's.
  • Een implementatie van de HSAIL (Heterogeneous System Architecture Intermediate Language) voor heterogene computersystemen op basis van de HSA-architectuur is verouderd en zal waarschijnlijk in een toekomstige release worden verwijderd.

Bron: opennet.ru

Voeg een reactie