Vrijgave van de GCC 11-compilersuite

Na een jaar van ontwikkeling is de release van de gratis GCC 11.1-compilersuite uitgebracht, de eerste belangrijke release in de nieuwe GCC 11.x-tak. Onder het nieuwe nummeringsschema voor releases werd versie 11.0 gebruikt tijdens de ontwikkeling, en kort voor de release van GCC 11.1 was de GCC 12.0-tak al gesplitst, waaruit de volgende belangrijke release van GCC 12.1 zal worden gevormd.

GCC 11.1 valt op door de overgang naar het standaard gebruik van het DWARF 5 debug-bestandsformaat, de standaard opname van de C++17-standaard (“-std=gnu++17”), aanzienlijke verbeteringen in de ondersteuning voor de C++20 standaard, experimentele ondersteuning voor C++23, verbeteringen gerelateerd aan de toekomstige C-taalstandaard (C2x), nieuwe prestatie-optimalisaties.

Grote veranderingen:

  • De standaardmodus voor de C++-taal is gewijzigd om de C++17-standaard (-std=gnu++17) te gebruiken in plaats van de eerder aangeboden C++14. Het is mogelijk om het nieuwe C++17-gedrag selectief uit te schakelen bij het verwerken van sjablonen die andere sjablonen als parameter gebruiken (-fno-new-ttp-matching).
  • Ondersteuning toegevoegd voor hardwareversnelling van de tool AddressSanitizer, waarmee u de feiten kunt bepalen van toegang tot vrijgekomen geheugengebieden, het overschrijden van de grenzen van de toegewezen buffer en enkele andere soorten fouten bij het werken met geheugen. Hardwareversnelling is momenteel alleen beschikbaar voor de AArch64-architectuur en is gericht op gebruik bij het compileren van de Linux-kernel. Om de hardwareversnelling van AddressSanitizer in te schakelen bij het bouwen van componenten voor de gebruikersruimte, is de vlag "-fsanitize=hwaddress" toegevoegd, en de kernelvlag "-fsanitize=kernel-hwaddress".
  • Bij het genereren van foutopsporingsinformatie wordt standaard het DWARF 5-formaat gebruikt, waardoor, vergeleken met eerdere versies, 25% compactere foutopsporingsgegevens kunnen worden gegenereerd. Volledige ondersteuning voor DWARF 5 vereist minimaal binutils versie 2.35.2. Het DWARF 5-formaat wordt ondersteund in debugging-tools sinds GDB 8.0, valgrind 3.17.0, elfutils 0.172 en dwz 0.14. Om debug-bestanden te genereren met andere versies van DWARF, kunt u de opties "-gdwarf-2", "-gdwarf-3" en "-gdwarf-4" gebruiken.
  • De vereisten voor compilers die kunnen worden gebruikt om GCC te bouwen zijn verhoogd. De compiler moet nu de C++11-standaard ondersteunen (voorheen was C++98 vereist), d.w.z. Als GCC 10 voldoende was om GCC 3.4 te bouwen, dan is nu tenminste GCC 11 vereist om GCC 4.8 te bouwen.
  • De naam en locatie van bestanden voor het opslaan van dumps, tijdelijke bestanden en aanvullende informatie die nodig is voor LTO-optimalisatie zijn gewijzigd. Dergelijke bestanden worden nu altijd in de huidige map opgeslagen, tenzij het pad expliciet wordt gewijzigd via de opties "-dumpbase", "-dumpdir" en "-save-temps=*".
  • Ondersteuning voor het binaire formaat BRIG voor gebruik met de taal HSAIL (Heterogeneous System Architecture Intermediate Language) is verouderd en zal binnenkort worden verwijderd.
  • De mogelijkheden van de ThreadSanitizer-modus (-fsanitize=thread) zijn uitgebreid, ontworpen om race-omstandigheden te detecteren bij het delen van dezelfde gegevens uit verschillende threads van een multi-threaded applicatie. De nieuwe release voegt ondersteuning toe voor alternatieve runtimes en omgevingen, evenals ondersteuning voor de KCSAN (Kernel Concurrency Sanitizer) debugging tool, ontworpen om race-omstandigheden binnen de Linux-kernel dynamisch te detecteren. Nieuwe opties toegevoegd "-param tsan-distinguish-volatile" en "-param tsan-instrument-func-entry-exit".
  • Kolomnummers in diagnostische berichten weerspiegelen nu niet het aantal bytes vanaf het begin van de regel, maar feitelijk de kolomnummers die rekening houden met multi-bytetekens en tekens die verschillende posities in de regel innemen (het teken 🙂 bezet bijvoorbeeld twee posities en is gecodeerd in 4 bytes). Op dezelfde manier worden tabtekens nu behandeld als een bepaald aantal spaties (configureerbaar via de optie -ftabstop, standaard 8). Om het oude gedrag te herstellen, wordt de optie “-fdiagnostics-column-unit=byte” voorgesteld, en om de initiële waarde te bepalen (nummering van 0 of 1) - de optie “-fdiagnostics-column-origin=”.
  • De vectorizer houdt rekening met de volledige inhoud van de functie en voegt verwerkingsmogelijkheden toe die verband houden met snijpunten en verwijzingen naar eerdere blokken in de control-flow-grafiek (CFG, control-flow-grafiek).
  • De optimalisatie implementeert de mogelijkheid om een ​​reeks voorwaardelijke bewerkingen die dezelfde variabele vergelijken, om te zetten in een schakelexpressie. De schakelexpressie kan later worden gecodeerd met behulp van bittestinstructies (de optie "-fbit-tests" is toegevoegd om een ​​dergelijke conversie te besturen).
  • Verbeterde interprocedurele optimalisaties. Een nieuwe IPA-modref-pas (-fipa-modref) toegevoegd om bijwerkingen bij het aanroepen van functies te volgen en de nauwkeurigheid van de analyse te verbeteren. Verbeterde implementatie van de IPA-ICF-pas (-fipa-icf), die het geheugenverbruik tijdens het compileren vermindert en het aantal uniforme functies vergroot waarvoor identieke codeblokken worden gecombineerd. In de IPA-CP-pass (Interprocedurele constante voortplanting) zijn de voorspellingsheuristieken verbeterd, waarbij rekening wordt gehouden met bekende grenzen en kenmerken van de lussen.
  • Bij Linking Time Optimizations (LTO) wordt het bytecodeformaat geoptimaliseerd om de grootte te verkleinen en de verwerkingssnelheid te verbeteren. Verminderd piekgeheugenverbruik tijdens de bindingsfase.
  • In het optimalisatiemechanisme gebaseerd op de resultaten van codeprofilering (PGO - Profile-guided Optimization), waarmee een meer optimale code kan worden gegenereerd op basis van analyse van uitvoeringskenmerken, wordt de grootte van bestanden met GCOV-gegevens verkleind dankzij een compactere verpakking van nultellers . Verbeterde "-fprofile-values"-modus door meer parameters bij indirecte oproepen bij te houden.
  • De implementatie van de OpenMP 5.0-standaard (Open Multi-Processing), die 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), heeft voortgezet. Initiële ondersteuning toegevoegd voor de toewijzingsrichtlijn en de mogelijkheid om heterogene lussen te gebruiken in OpenMP-constructies. Ondersteuning geïmplementeerd voor de omgevingsvariabele OMP_TARGET_OFFLOAD.
  • De implementatie van de OpenACC 2.6 parallelle programmeerspecificatie voor de talen C, C++ en Fortran is verbeterd, die tools definieert voor het overbrengen van bewerkingen op GPU's en gespecialiseerde processors, zoals NVIDIA PTX.
  • Voor C-talen is een nieuw attribuut “no_stack_protector” geïmplementeerd, ontworpen om functies te markeren waarvoor stackbescherming niet ingeschakeld mag zijn (“-fstack-protector”). Het attribuut “malloc” is uitgebreid ter ondersteuning van de identificatie van paren oproepen voor het toewijzen en vrijmaken van geheugen (allocator/deallocator), dat in de statische analysator wordt gebruikt om typische fouten bij het werken met geheugen te identificeren (geheugenlekken, gebruik na het vrijmaken, dubbele aanroepen naar de gratis functie, enz.) en in compilerwaarschuwingen "-Wmismatched-dealloc", "-Wmismatched-new-delete" en "-Wfree-nonheap-object", die informeren over inconsistentie tussen geheugendeallocatie en geheugentoewijzingsbewerkingen.
  • Er zijn nieuwe waarschuwingen toegevoegd voor de C-taal:
    • "-Wmismatched-dealloc" (standaard ingeschakeld) - waarschuwt voor bewerkingen voor geheugendeallocatie die een pointer gebruiken die niet compatibel is met geheugentoewijzingsfuncties.
    • "-Wsizeof-array-div" (ingeschakeld wanneer "-Wall" is opgegeven) - Waarschuwt voor het delen van twee sizeof-operatoren als de deler niet overeenkomt met de grootte van het array-element.
    • "-Wstringop-overread" (standaard ingeschakeld) - waarschuwt voor het aanroepen van een stringfunctie die gegevens leest uit een gebied buiten de arraygrens.
    • "-Wtsan" (standaard ingeschakeld) - Waarschuwt voor het gebruik van functies (zoals std::atomic_thread_fence) die niet worden ondersteund in ThreadSanitizer.
    • “-Warray-parameter” en “-Wvla-parameter” (ingeschakeld bij het specificeren van “-Wall”) - waarschuwt voor het overschrijven van functies met incompatibele declaraties van argumenten die verband houden met arrays met vaste en variabele lengte.
    • De waarschuwing "-Wuninitialized" detecteert nu pogingen om te lezen uit niet-geïnitialiseerd dynamisch toegewezen geheugen.
    • De waarschuwing "-Wfree-nonheap-object" breidt de definitie uit van gevallen waarin functies voor geheugendeallocatie worden aangeroepen met een pointer die niet wordt verkregen via dynamische geheugentoewijzingsfuncties.
    • De waarschuwing "-Wmaybe-uninitialized" heeft de detectie van passerende verwijzingen naar functies die verwijzen naar niet-geïnitialiseerde geheugenlocaties uitgebreid.
  • Voor de C-taal is een deel van de nieuwe functies geïmplementeerd die zijn ontwikkeld binnen het raamwerk van de C2X-standaard (mogelijk gemaakt door het specificeren van -std=c2x en -std=gnu2x): macro's BOOL_MAX en BOOL_WIDTH, optionele indicatie van namen van ongebruikte parameters in functie definities (zoals in C++), attribuut “[ [nodiscard]]”, preprocessor operator "__has_c_attribute", macro's FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DE C_INFINITY en DEC _NAN, NaN=macro's voor FloatN, _FloatNx en _DecimalN, mogelijkheid om sprongmarkeringen op te geven vóór declaraties en aan het einde van samengestelde instructies.
  • Voor C++ is een deel van de veranderingen en innovaties voorgesteld in de C++20-standaard geïmplementeerd, waaronder virtuele functies “consteval virtual”, pseudo-destructors voor het einde van de levenscyclus van objecten, het gebruik van de enum-klasse en het berekenen van de grootte van een array in de "nieuwe" expressie.
  • Voor C++ is experimentele ondersteuning toegevoegd voor enkele verbeteringen die worden ontwikkeld voor de toekomstige C++23-standaard (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Er is nu bijvoorbeeld ondersteuning voor het letterlijke achtervoegsel “zu” voor ondertekende size_t-waarden.
  • libstdc++ heeft de ondersteuning voor de C++17-standaard verbeterd, inclusief de introductie van std::from_chars en std::to_chars implementaties voor drijvende-kommatypen. Nieuwe elementen van de C++20-standaard geïmplementeerd, waaronder std::bit_cast, std::source_location, atomic operations wait and notificatie, , , , , evenals elementen van de toekomstige C++ standaard 23 (std::to_underlying, std::is_scoped_enum). Experimentele ondersteuning toegevoegd voor typen voor parallelle gegevensverwerking (SIMD, Data-Parallel Types). De implementatie van std::uniform_int_distribution is versneld.
  • De alpha-kwaliteitsvlag verwijderd uit libgccjit, een gedeelde bibliotheek voor het inbedden van een codegenerator in andere processen en het gebruik ervan om JIT-compilatie van bytecode in machinecode te organiseren. De mogelijkheid toegevoegd om libgccjit voor MinGW te bouwen.
  • Ondersteuning toegevoegd voor de AArch64 Armv8-R-architectuur (-march=armv8-r). Voor AArch64- en ARM-architecturen is ondersteuning voor processors toegevoegd (parameters -mcpu en -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex-X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) en Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) en Arm Cortex-R82 (cortex-r82) CPU's zijn ook toegevoegd, die alleen de AArch64-architectuur ondersteunen.
  • Ondersteuning toegevoegd voor het gebruik van Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) en MVE (AArch32 M-profiel) SIMD-instructies voor het autovectoriseren van bewerkingen waarbij optellen, aftrekken, vermenigvuldigen en varianten van optellen/aftrekken worden uitgevoerd complexe getallen. Initiële ondersteuning toegevoegd voor autovectorisatie voor ARM met behulp van de MVE-instructieset.
  • Voor ARM-platforms wordt een volledige set compiler-geïntegreerde C-functies (Intrinsics) geleverd, vervangen door uitgebreide vectorinstructies (SIMD), die alle NEON-instructies dekken die zijn gedocumenteerd in de ACL Q3 2020-specificatie.
  • Ondersteuning voor gfx908 GPU is toegevoegd aan de backend voor het genereren van code voor AMD GPU's op basis van de GCN-microarchitectuur.
  • Ondersteuning toegevoegd voor nieuwe processors en nieuwe instructiesetuitbreidingen die daarin zijn geïmplementeerd:
    • Intel Sapphire Rapids (-march=sapphirerapids, maakt ondersteuning mogelijk voor de MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 en AVX-VNNI instructies.
    • Intel Alderlake (-march=alderlake, maakt ondersteuning mogelijk voor CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI en HRESET-instructies).
    • Intel Rocketlake (-march=rocketlake, vergelijkbaar met Rocket Lake zonder SGX-ondersteuning).
    • AMD Zen 3 (-maart=znver3).
  • Voor IA-32/x86-64-systemen op basis van Intel-processors is ondersteuning voor nieuwe processorinstructies TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI toegevoegd.
  • Ondersteuning toegevoegd voor "-march=x86-64-v[234]"-vlaggen om x86-64-architectuurniveaus te selecteren (v2 - omvat SSE4.2-, SSSE3-, POPCNT- en CMPXCHG16B-extensies; v3 - AVX2 en MOVBE; v4 - AVX-512 ).
  • Ondersteuning toegevoegd voor RISC-V-systemen met big-endian bytevolgorde. Optie "-misa-spec=*" toegevoegd om de versie van de architectuurspecificatie van de RISC-V-instructieset te selecteren. Ondersteuning toegevoegd voor AddressSanitizer en stapelbescherming met behulp van canary-tags.
  • Voortdurende verbetering van de statische analysemodus “-fanalyzer”, die resource-intensieve interprocedurele analyses uitvoert van code-uitvoeringspaden en gegevensstromen in het 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. In de nieuwe versie:
    • De code voor het volgen van de programmastatus is volledig herschreven. Problemen met het scannen van zeer grote C-bestanden zijn opgelost.
    • Initiële C++-ondersteuning toegevoegd.
    • Geheugentoewijzing en deallocatieanalyse is geabstraheerd van de specifieke malloc- en vrije functies, en ondersteunt nu new/delete en new[]/delete[].
    • Nieuwe waarschuwingen toegevoegd: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const en -Wanalyzer-write-to-string-literal.
    • Nieuwe foutopsporingsopties -fdump-analyzer-json en -fno-analyzer-feasibility toegevoegd.
    • De mogelijkheid om de analyser uit te breiden via plug-ins voor GCC is geïmplementeerd (er is bijvoorbeeld een plug-in voorbereid om het onjuiste gebruik van globale vergrendeling (GIL) in CPython te controleren).

Bron: opennet.ru

Voeg een reactie