Release av GCC 11-kompilatorsviten

Efter ett års utveckling har lanseringen av den kostnadsfria kompilatorsviten GCC 11.1 släppts, den första betydande utgåvan i den nya GCC 11.x-grenen. Under det nya versionsnumreringsschemat användes version 11.0 under utvecklingen, och strax före lanseringen av GCC 11.1 var GCC 12.0-grenen redan splittrad, från vilken nästa betydande version av GCC 12.1 kommer att bildas.

GCC 11.1 är anmärkningsvärt för sin övergång till att använda DWARF 5 felsökningsfilformat som standard, standardinförandet av C++17-standarden ("-std=gnu++17"), betydande förbättringar av stödet för C++20 standard, experimentellt stöd för C++23, förbättringar relaterade till den framtida C-språkstandarden (C2x), nya prestandaoptimeringar.

Huvudändringar:

  • Standardläget för C++-språket har ändrats till att använda C++17-standarden (-std=gnu++17) istället för det tidigare erbjudna C++14. Det är möjligt att selektivt inaktivera det nya C++17-beteendet vid bearbetning av mallar som använder andra mallar som en parameter (-fno-new-ttp-matching).
  • Tillagt stöd för hårdvaruacceleration av AddressSanitizer-verktyget, som låter dig bestämma fakta om att komma åt frigjorda minnesområden, gå över gränserna för den tilldelade bufferten och vissa andra typer av fel när du arbetar med minne. Hårdvaruacceleration är för närvarande endast tillgänglig för AArch64-arkitekturen och är fokuserad på användning vid kompilering av Linux-kärnan. För att aktivera AddressSanitizer hårdvaruacceleration när man bygger användarutrymmeskomponenter har flaggan "-fsanitize=hwaddress" lagts till och kärnflaggan "-fsanitize=kernel-hwaddress".
  • Vid generering av felsökningsinformation används DWARF 5-formatet som standard, vilket, jämfört med tidigare versioner, tillåter generering av 25 % mer kompakt felsökningsdata. Fullständigt stöd för DWARF 5 kräver åtminstone binutils version 2.35.2. DWARF 5-formatet stöds i felsökningsverktyg sedan GDB 8.0, valgrind 3.17.0, elfutils 0.172 och dwz 0.14. För att generera felsökningsfiler med andra versioner av DWARF kan du använda alternativen "-gdwarf-2", "-gdwarf-3" och "-gdwarf-4".
  • Kraven på kompilatorer som kan användas för att bygga GCC har höjts. Kompilatorn måste nu stödja C++11-standarden (tidigare krävdes C++98), d.v.s. Om GCC 10 räckte för att bygga GCC 3.4, så krävs nu åtminstone GCC 11 för att bygga GCC 4.8.
  • Namnet och platsen för filer för att spara dumpar, temporära filer och ytterligare information som behövs för LTO-optimering har ändrats. Sådana filer sparas nu alltid i den aktuella katalogen om inte sökvägen explicit ändras via alternativen "-dumpbase", "-dumpdir" och "-save-temps=*".
  • Stöd för det binära formatet BRIG för användning med språket HSAIL (Heterogeneous System Architecture Intermediate Language) har fasats ut och kommer snart att tas bort.
  • Möjligheterna i ThreadSanitizer-läget (-fsanitize=thread) har utökats, designade för att upptäcka tävlingsförhållanden när samma data delas från olika trådar i en flertrådig applikation. Den nya utgåvan lägger till stöd för alternativa körtider och miljöer, samt stöd för felsökningsverktyget KCSAN (Kernel Concurrency Sanitizer), designat för att dynamiskt upptäcka tävlingsförhållanden i Linux-kärnan. Lade till nya alternativ "-param tsan-distinguish-volatile" och "-param tsan-instrument-func-entry-exit".
  • Kolumnnummer i diagnostiska meddelanden återspeglar nu inte byteantalet från början av raden, utan faktiskt kolumnnumren som tar hänsyn till flerbytetecken och tecken som upptar flera positioner på raden (t.ex. tecknet 🙂 upptar två positioner och är kodad i 4 byte). På samma sätt behandlas nu tabbtecken som ett visst antal mellanslag (kan konfigureras via alternativet -ftabstop, standard 8). För att återställa det gamla beteendet, föreslås alternativet "-fdiagnostics-column-unit=byte", och för att bestämma initialvärdet (numrering från 0 eller 1) - alternativet "-fdiagnostics-column-origin=".
  • Vektoriseraren tar hänsyn till hela innehållet i funktionen och lägger till bearbetningsmöjligheter associerade med korsningar och referenser till tidigare block i kontrollflödesgrafen (CFG, kontrollflödesgraf).
  • Optimizern implementerar möjligheten att konvertera en serie villkorliga operationer som jämför samma variabel till ett switchuttryck. Switch-uttrycket kan senare kodas med hjälp av bittestningsinstruktioner (alternativet "-fbit-tests" har lagts till för att kontrollera sådan konvertering).
  • Förbättrade interproceduroptimeringar. Lade till ett nytt IPA-modref-pass (-fipa-modref) för att spåra biverkningar vid anrop av funktioner och förbättra analysens noggrannhet. Förbättrad implementering av IPA-ICF-passet (-fipa-icf), vilket minskar minnesförbrukningen under kompilering och ökar antalet enhetliga funktioner för vilka identiska kodblock kombineras. I IPA-CP-passet (Interprocedural constant propagation) har prediktionsheuristiken förbättrats, med hänsyn till kända gränser och egenskaper hos slingorna.
  • I Linking Time Optimizations (LTO) är bytekodformatet optimerat för att minska storleken och förbättra bearbetningshastigheten. Minskad maximal minnesförbrukning under bindningsfasen.
  • I optimeringsmekanismen baserad på resultaten av kodprofilering (PGO - Profile-guided optimization), som möjliggör generering av mer optimal kod baserat på analys av exekveringsfunktioner, minskas storleken på filer med GCOV-data på grund av mer kompakt paketering av nollräknare . Förbättrat "-fprofile-values"-läge genom att hålla reda på fler parametrar på indirekta anrop.
  • Implementeringen av OpenMP 5.0 (Open Multi-Processing) standarden, som definierar API och metoder för att tillämpa parallella programmeringsmetoder på multi-core och hybrid (CPU+GPU/DSP) system med delat minne och vektoriseringsenheter (SIMD), har fortsatt. Lade till initialt stöd för allokeringsdirektivet och möjligheten att använda heterogena loopar i OpenMP-konstruktioner. Implementerat stöd för miljövariabeln OMP_TARGET_OFFLOAD.
  • Implementeringen av OpenACC 2.6 parallellprogrammeringsspecifikationen för C, C++ och Fortran språk har förbättrats, vilket definierar verktyg för att ladda ner operationer på GPU: er och specialiserade processorer, såsom NVIDIA PTX.
  • För C-språk har ett nytt attribut "no_stack_protector" implementerats, designat för att markera funktioner för vilka stackskydd inte ska vara aktiverat ("-fstack-protector"). Attributet "malloc" har utökats för att stödja identifiering av par av samtal för allokering och frigöring av minne (allokator/deallokator), som används i den statiska analysatorn för att identifiera typiska fel vid arbete med minne (minnesläckor, användning efter frigöring, dubbla anrop till gratisfunktionen etc.) och i kompilatorvarningarna "-Wmismatched-dealloc", "-Wmismatched-new-delete" och "-Wfree-nonheap-object", som informerar om inkonsekvens mellan minnesavallokering och minnesallokeringsoperationer.
  • Nya varningar har lagts till för C-språket:
    • "-Wmismatched-dealloc" (aktiverad som standard) - varnar för minnesavallokeringsoperationer som använder en pekare som inte är kompatibel med minnesallokeringsfunktioner.
    • "-Wsizeof-array-div" (aktiverat när "-Wall" är specificerat) - Varnar för att dela två sizeof-operatorer om divisorn inte matchar storleken på arrayelementet.
    • "-Wstringop-overread" (aktiverad som standard) - varnar för anrop av en strängfunktion som läser data från ett område utanför arraygränsen.
    • "-Wtsan" (aktiverat som standard) - Varnar för användning av funktioner (som std::atomic_thread_fence) som inte stöds i ThreadSanitizer.
    • "-Warray-parameter" och "-Wvla-parameter" (aktiverad när du anger "-Wall") - varnar för åsidosättande av funktioner med inkompatibla argumentdeklarationer associerade med arrayer med fast och variabel längd.
    • "-Wuninitialized"-varningen upptäcker nu försök att läsa från oinitierat dynamiskt allokerat minne.
    • "-Wfree-nonheap-object"-varningen utökar definitionen av fall där minnesavallokeringsfunktioner anropas med en pekare som inte erhålls genom dynamiska minnesallokeringsfunktioner.
    • "-Wmaybe-uninitialized"-varningen har utökat detekteringen av passerande pekare till funktioner som refererar till oinitierade minnesplatser.
  • För C-språket har en del av nya funktioner som utvecklats inom ramen för C2X-standarden implementerats (aktiverats genom att specificera -std=c2x och -std=gnu2x): makron BOOL_MAX och BOOL_WIDTH, valfri indikering av namn på oanvända parametrar i funktion definitioner (som i C++), attributet "[ [nodiscard]]", förprocessoroperatorn "__has_c_attribute", makron FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559__XNUMX_EXT_XNUMX__XNUMX, FSN_EXT_XNUMX__XNUMX, INBL_ AN, DEC_INFINITY och DEC _NAN, NaN=makron för FloatN, _FloatNx och _DecimalN, möjlighet att ange hoppmärken före deklarationer och i slutet av sammansatta uttalanden.
  • För C++ har en del av ändringarna och innovationerna som föreslagits i C++20-standarden implementerats, inklusive virtuella funktioner "consteval virtual", pseudo-destruktorer för slutet av objekts livscykel, användningen av enum-klassen och beräkna storleken på en array i det "nya" uttrycket.
  • För C++ har experimentellt stöd lagts till för vissa förbättringar som utvecklas för den framtida C++23-standarden (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Till exempel finns det nu stöd för det bokstavliga suffixet "zu" för signerade size_t-värden.
  • libstdc++ har förbättrat stöd för C++17-standarden, inklusive introduktionen av std::from_chars och std::to_chars-implementationer för flyttalstyper. Implementerade nya element i C++20-standarden, inklusive std::bit_cast, std::source_location, atomic operations wait and notify, , , , , såväl som element i framtida C++ standard 23 (std::to_underlying, std::is_scoped_enum). Lade till experimentellt stöd för typer för parallell databehandling (SIMD, Data-Parallel Types). Implementeringen av std::uniform_int_distribution har påskyndats.
  • Tog bort alfakvalitetsflaggan från libgccjit, ett delat bibliotek för att bädda in en kodgenerator i andra processer och använda den för att organisera JIT-kompilering av bytekod till maskinkod. Lade till möjligheten att bygga libgccjit för MinGW.
  • Lade till stöd för AArch64 Armv8-R-arkitekturen (-march=armv8-r). För AArch64- och ARM-arkitekturer har stöd för processorer lagts till (parametrarna -mcpu och -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) och Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) och Arm Cortex-R82 (cortex-r82) processorer har också lagts till, som endast stöder AArch64-arkitekturen.
  • Tillagt stöd för användning av Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) och MVE (AArch32 M-profil) SIMD-instruktioner för att autovektorisera operationer som utför addition, subtraktion, multiplikation och varianter av addition/subtraktion över komplexa tal. Lade till initialt stöd för autovektorisering för ARM med MVE-instruktionsuppsättningen.
  • För ARM-plattformar tillhandahålls en komplett uppsättning kompilatorintegrerade C-funktioner (Intrinsics), ersatta av utökade vektorinstruktioner (SIMD), som täcker alla NEON-instruktioner som dokumenteras i ACLE Q3 2020-specifikationen.
  • Stöd för gfx908 GPU har lagts till i backend för att generera kod för AMD GPU:er baserad på GCN-mikroarkitekturen.
  • Tillagt stöd för nya processorer och nya instruktionsuppsättningstillägg implementerade i dem:
    • Intel Sapphire Rapids (-march=sapphirerapids, möjliggör stöd för instruktionerna MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALISE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-BVNIMX, AMX-INT8, AMX-INT16, AVVNIMX.
    • Intel Alderlake (-march=alderlake, möjliggör stöd för instruktionerna CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI och HRESET).
    • Intel Rocketlake (-march=rocketlake, liknande Rocket Lake utan SGX-stöd).
    • AMD Zen 3 (-march=znver3).
  • För IA-32/x86-64-system baserade på Intel-processorer har stöd för nya processorinstruktioner TSXLDTRK, SERIALISE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI lagts till.
  • Lade till stöd för "-march=x86-64-v[234]"-flaggor för att välja x86-64-arkitekturnivåer (v2 - täcker SSE4.2, SSSE3, POPCNT och CMPXCHG16B tillägg; v3 - AVX2 och MOVBE; v4 - AVX-512 ) .
  • Tillagt stöd för RISC-V-system med big-endian byte-ordning. Lade till alternativet "-misa-spec=*" för att välja version av RISC-V-instruktionsuppsättningens arkitekturspecifikation. Lade till stöd för AddressSanitizer och stackskydd med kanariefåglar.
  • Fortsatt förbättring av det statiska analysläget "-fanalyzer", som utför resurskrävande interproceduranalys av kodexekveringsvägar och dataflöden i programmet. Läget kan upptäcka problem i kompileringsstadiet, såsom dubbla anrop till free()-funktionen för ett minnesområde, filbeskrivningsläckor, avläsning och överföring av nollpekare, åtkomst till frigjorda minnesblock, användning av oinitierade värden, etc. I den nya versionen:
    • Koden för att spåra programtillståndet har skrivits om helt. Problem med att skanna mycket stora C-filer har lösts.
    • Lade till initialt C++-stöd.
    • Minnestilldelning och avallokeringsanalys har abstraherats från de specifika malloc- och gratisfunktionerna och stöder nu new/delete och new[]/delete[].
    • Nya varningar har lagts till: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const och -Wanalyzer-write-to-string-literal.
    • Lade till nya felsökningsalternativ -fdump-analyzer-json och -fno-analyzer-feasibility.
    • Möjligheten att utöka analysatorn genom plugins för GCC har implementerats (till exempel har en plugin förberetts för att kontrollera felaktig användning av global låsning (GIL) i CPython).

Källa: opennet.ru

Lägg en kommentar