Udgivelse af GCC 11 compiler suite

Efter et års udvikling er udgivelsen af ​​den gratis GCC 11.1 compiler suite blevet frigivet, den første betydelige udgivelse i den nye GCC 11.x gren. Under det nye udgivelsesnummereringsskema blev version 11.0 brugt under udviklingen, og kort før udgivelsen af ​​GCC 11.1 var GCC 12.0-grenen allerede splittet, hvorfra den næste betydelige udgivelse af GCC 12.1 vil blive dannet.

GCC 11.1 er bemærkelsesværdig for sin overgang til at bruge DWARF 5-debug-filformatet som standard, standardinkluderingen af ​​C++17-standarden ("-std=gnu++17"), betydelige forbedringer i understøttelse af C++20 standard, eksperimentel understøttelse af C++23, forbedringer relateret til den fremtidige C-sprogstandard (C2x), nye ydelsesoptimeringer.

Vigtigste ændringer:

  • Standardtilstanden for C++-sproget er blevet skiftet til at bruge C++17-standarden (-std=gnu++17) i stedet for den tidligere tilbudte C++14. Det er muligt selektivt at deaktivere den nye C++17-adfærd ved behandling af skabeloner, der bruger andre skabeloner som en parameter (-fno-new-ttp-matching).
  • Tilføjet understøttelse af hardwareacceleration af AddressSanitizer-værktøjet, som giver dig mulighed for at bestemme fakta om adgang til frigjorte hukommelsesområder, gå ud over grænserne for den tildelte buffer og nogle andre typer fejl, når du arbejder med hukommelse. Hardwareacceleration er i øjeblikket kun tilgængelig for AArch64-arkitekturen og er fokuseret på brug ved kompilering af Linux-kernen. For at aktivere AddressSanitizer hardwareacceleration, når der bygges brugerrumskomponenter, er flaget "-fsanitize=hwaddress" blevet tilføjet, og kerneflaget "-fsanitize=kernel-hwaddress".
  • Ved generering af fejlfindingsoplysninger bruges DWARF 5-formatet som standard, hvilket sammenlignet med tidligere versioner tillader generering af 25 % mere kompakte fejlfindingsdata. Fuld understøttelse af DWARF 5 kræver mindst binutils version 2.35.2. DWARF 5-formatet er understøttet i fejlfindingsværktøjer siden GDB 8.0, valgrind 3.17.0, elfutils 0.172 og dwz 0.14. For at generere debug-filer ved hjælp af andre versioner af DWARF, kan du bruge indstillingerne "-gdwarf-2", "-gdwarf-3" og "-gdwarf-4".
  • Kravene til compilere, der kan bruges til at bygge GCC, er blevet øget. Compileren skal nu understøtte C++11-standarden (tidligere var C++98 påkrævet), dvs. Hvis GCC 10 var nok til at bygge GCC 3.4, så kræves der nu mindst GCC 11 for at bygge GCC 4.8.
  • Navnet og placeringen af ​​filer til lagring af dumps, midlertidige filer og yderligere oplysninger, der er nødvendige for LTO-optimering, er blevet ændret. Sådanne filer gemmes nu altid i den aktuelle mappe, medmindre stien eksplicit ændres via "-dumpbase", "-dumpdir" og "-save-temps=*" mulighederne.
  • Understøttelse af det binære format BRIG til brug med sproget HSAIL (Heterogeneous System Architecture Intermediate Language) er blevet forældet og vil snart blive fjernet.
  • Mulighederne for ThreadSanitizer-tilstanden (-fsanitize=thread) er blevet udvidet, designet til at detektere race-forhold, når de samme data fra forskellige tråde i en multi-threaded-applikation deles. Den nye udgivelse tilføjer understøttelse af alternative kørselstider og miljøer samt understøttelse af KCSAN (Kernel Concurrency Sanitizer) debugging-værktøjet, designet til dynamisk at detektere race-forhold i Linux-kernen. Tilføjet nye muligheder "-param tsan-distinguish-volatile" og "-param tsan-instrument-func-entry-exit".
  • Kolonnenumre i diagnostiske meddelelser afspejler nu ikke byte-antallet fra begyndelsen af ​​linjen, men faktisk kolonnenumrene, der tager højde for multi-byte-tegn og tegn, der optager flere positioner i linjen (f.eks. optager tegnet 🙂 to positioner og er kodet i 4 bytes). Ligeledes behandles tabulatortegn nu som et vist antal mellemrum (kan konfigureres via -ftabstop-indstillingen, standard 8). For at gendanne den gamle adfærd foreslås "-fdiagnostics-column-unit=byte" muligheden, og for at bestemme startværdien (nummerering fra 0 eller 1) - "-fdiagnostics-column-origin=" muligheden.
  • Vektoriseringen tager højde for hele indholdet af funktionen og tilføjer behandlingsmuligheder forbundet med skæringspunkter og referencer til tidligere blokke i kontrol-flow-grafen (CFG, kontrol-flow-graf).
  • Optimizeren implementerer evnen til at konvertere en række betingede operationer, der sammenligner den samme variabel til et switch-udtryk. Switch-udtrykket kan senere kodes ved hjælp af bit-testinstruktioner (muligheden "-fbit-tests" er blevet tilføjet for at kontrollere en sådan konvertering).
  • Forbedrede interprocedureelle optimeringer. Tilføjet et nyt IPA-modref-pas (-fipa-modref) for at spore bivirkninger ved opkald af funktioner og forbedre analysens nøjagtighed. Forbedret implementering af IPA-ICF-passet (-fipa-icf), som reducerer hukommelsesforbruget under kompilering og øger antallet af forenede funktioner, for hvilke identiske kodeblokke kombineres. I IPA-CP (Interprocedural constant propagation) passet er forudsigelsesheuristikken blevet forbedret under hensyntagen til kendte grænser og træk ved sløjferne.
  • I Linking Time Optimizations (LTO) er bytekodeformatet optimeret for at reducere størrelsen og forbedre behandlingshastigheden. Reduceret maksimalt hukommelsesforbrug under bindingsfasen.
  • I optimeringsmekanismen baseret på resultaterne af kodeprofilering (PGO - Profile-guided optimization), som gør det muligt at generere mere optimal kode baseret på analyse af eksekveringsfunktioner, reduceres størrelsen af ​​filer med GCOV-data på grund af mere kompakt pakning af nul-tællere . Forbedret "-fprofile-values" tilstand ved at holde styr på flere parametre på indirekte opkald.
  • Implementeringen af ​​OpenMP 5.0 (Open Multi-Processing) standarden, som definerer API og metoder til at anvende parallelle programmeringsmetoder på multi-core og hybrid (CPU+GPU/DSP) systemer med delt hukommelse og vektoriseringsenheder (SIMD), har fortsatte. Tilføjet indledende støtte til allokeringsdirektivet og muligheden for at bruge heterogene loops i OpenMP-konstruktioner. Implementeret understøttelse af miljøvariablen OMP_TARGET_OFFLOAD.
  • Implementeringen af ​​OpenACC 2.6 parallel programmeringsspecifikationen til C, C++ og Fortran sprog er blevet forbedret, hvilket definerer værktøjer til aflæsning af operationer på GPU'er og specialiserede processorer, såsom NVIDIA PTX.
  • For C-sprog er en ny attribut "no_stack_protector" blevet implementeret, designet til at markere funktioner, for hvilke stackbeskyttelse ikke bør aktiveres ("-fstack-protector"). "malloc"-attributten er blevet udvidet til at understøtte identifikation af par af opkald til tildeling og frigørelse af hukommelse (allokator/deallokator), som bruges i den statiske analysator til at identificere typiske fejl i arbejdet med hukommelse (hukommelseslækager, brug efter frigørelse, dobbeltkald til den gratis funktion osv.) og i kompileringsadvarsler "-Wmismatched-dealloc", "-Wmismatched-new-delete" og "-Wfree-nonheap-object", der informerer om inkonsistens mellem hukommelsesdeallokering og hukommelsesallokeringsoperationer.
  • Der er tilføjet nye advarsler for C-sproget:
    • "-Wmismatched-dealloc" (aktiveret som standard) - advarer om hukommelsesdeallokeringsoperationer, der bruger en markør, der ikke er kompatibel med hukommelsesallokeringsfunktioner.
    • "-Wsizeof-array-div" (aktiveret, når "-Wall" er angivet) - Advarer om at dividere to størrelser af operatorer, hvis divisoren ikke svarer til størrelsen af ​​array-elementet.
    • "-Wstringop-overread" (aktiveret som standard) - advarer om at kalde en strengfunktion, der læser data fra et område uden for array-grænsen.
    • "-Wtsan" (aktiveret som standard) - Advarer om brug af funktioner (såsom std::atomic_thread_fence), der ikke understøttes i ThreadSanitizer.
    • "-Warray-parameter" og "-Wvla-parameter" (aktiveret ved specificering af "-Wall") - advarer om tilsidesættelse af funktioner med inkompatible erklæringer af argumenter forbundet med fast- og variabel-længde-arrays.
    • Advarslen "-Wuninitialized" registrerer nu forsøg på at læse fra uinitialiseret dynamisk allokeret hukommelse.
    • "-Wfree-nonheap-object"-advarslen udvider definitionen af ​​tilfælde, hvor hukommelsesdeallokeringsfunktioner kaldes med en pointer, der ikke er opnået gennem dynamiske hukommelsesallokeringsfunktioner.
    • "-Wmaybe-uninitialized"-advarslen har udvidet registreringen af ​​passerende pointere til funktioner, der henviser til ikke-initialiserede hukommelsesplaceringer.
  • For C-sproget er en del af nye funktioner udviklet inden for rammerne af C2X-standarden blevet implementeret (aktiveret ved at specificere -std=c2x og -std=gnu2x): makroer BOOL_MAX og BOOL_WIDTH, valgfri indikation af navne på ubrugte parametre i funktion definitioner (som i C++), attribut "[ [nodiscard]]", præprocessor-operator "__has_c_attribute", makroer FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559__XNUMX_EXT_XNUMX__XNUMX_LT_IEC_XNUMX__XNUMX, INBL_ AN, DEC_INFINITY og DEC _NAN, NaN=makroer for FloatN, _FloatNx og _DecimalN, mulighed for at specificere springmærker før deklarationer og i slutningen af ​​sammensatte udsagn.
  • For C++ er en del af de ændringer og innovationer, der er foreslået i C++20-standarden, blevet implementeret, herunder virtuelle funktioner "consteval virtual", pseudo-destruktorer til slutningen af ​​objekters livscyklus, brugen af ​​enum-klassen og beregning af størrelsen af ​​et array i det "nye" udtryk.
  • For C++ er der tilføjet eksperimentel støtte til nogle forbedringer, der udvikles til den fremtidige C++23-standard (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). For eksempel er der nu understøttelse af det bogstavelige suffiks "zu" for signerede size_t-værdier.
  • libstdc++ har forbedret understøttelse af C++17-standarden, herunder introduktionen af ​​std::from_chars og std::to_chars implementeringer til flydende kommatyper. Implementerede nye elementer i C++20-standarden, herunder std::bit_cast, std::source_location, atomic operations wait and notify, , , , , samt elementer af fremtidig C++ standard 23 (std::til_underliggende, std::is_scoped_enum). Tilføjet eksperimentel understøttelse af typer til parallel databehandling (SIMD, Data-Parallel Types). Implementeringen af ​​std::uniform_int_distribution er blevet fremskyndet.
  • Fjernede alpha-kvalitetsflaget fra libgccjit, et delt bibliotek til at indlejre en kodegenerator i andre processer og bruge den til at organisere JIT-kompilering af bytekode i maskinkode. Tilføjet muligheden for at bygge libgccjit til MinGW.
  • Tilføjet understøttelse af AArch64 Armv8-R-arkitekturen (-march=armv8-r). For AArch64- og ARM-arkitekturer er der tilføjet understøttelse af processorer (parametre -mcpu og -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) og Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) og Arm Cortex-R82 (cortex-r82) CPU'er er også blevet tilføjet, der kun understøtter AArch64-arkitekturen.
  • Tilføjet støtte til brug af Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) og MVE (AArch32 M-profil) SIMD-instruktioner til at autovektorisere operationer, der udfører addition, subtraktion, multiplikation og varianter af addition/subtraktion over komplekse tal. Tilføjet indledende støtte til autovektorisering for ARM ved hjælp af MVE-instruktionssættet.
  • For ARM-platforme leveres et komplet sæt af compiler-integrerede C-funktioner (Intrinsics), erstattet af udvidede vektorinstruktioner (SIMD), der dækker alle NEON-instruktioner, der er dokumenteret i ACLE Q3 2020-specifikationen.
  • Understøttelse af gfx908 GPU er blevet tilføjet til backend til generering af kode til AMD GPU'er baseret på GCN-mikroarkitekturen.
  • Tilføjet understøttelse af nye processorer og nye instruktionssætudvidelser implementeret i dem:
    • Intel Sapphire Rapids (-march=sapphirerapids, muliggør understøttelse af instruktionerne MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALISE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-INT16, AVVNIMX og AVVNIMX.
    • Intel Alderlake (-march=alderlake, muliggør understøttelse af CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI og HRESET instruktioner).
    • Intel Rocketlake (-march=rocketlake, svarende til Rocket Lake uden SGX-understøttelse).
    • AMD Zen 3 (-march=znver3).
  • For IA-32/x86-64-systemer baseret på Intel-processorer er understøttelse af nye processorinstruktioner TSXLDTRK, SERIALISE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI tilføjet.
  • Tilføjet understøttelse af "-march=x86-64-v[234]" flag for at vælge x86-64 arkitekturniveauer (v2 - dækker SSE4.2, SSSE3, POPCNT og CMPXCHG16B udvidelser; v3 - AVX2 og MOVBE; v4 - AVX-512 ).
  • Tilføjet understøttelse af RISC-V-systemer med big-endian byte-rækkefølge. Tilføjet "-misa-spec=*" mulighed for at vælge versionen af ​​RISC-V-instruktionssættets arkitekturspecifikation. Tilføjet understøttelse af AddressSanitizer og stakbeskyttelse ved hjælp af canary tags.
  • Fortsat forbedring af "-fanalyzer" statiske analysetilstand, som udfører ressourcekrævende interprocedureanalyse af kodeeksekveringsstier og datastrømme i programmet. Tilstanden er i stand til at detektere problemer på kompileringsstadiet, såsom dobbeltkald til free()-funktionen for et hukommelsesområde, fildeskriptorlæk, dereferencing og videregivelse af nul-pointere, adgang til frigjorte hukommelsesblokke, brug af ikke-initialiserede værdier osv. I den nye version:
    • Koden til sporing af programtilstanden er blevet fuldstændig omskrevet. Problemer med at scanne meget store C-filer er blevet løst.
    • Tilføjet indledende C++-understøttelse.
    • Hukommelseallokering og deallokeringsanalyse er blevet abstraheret fra de specifikke malloc og gratis funktioner og understøtter nu new/delete og new[]/delete[].
    • Tilføjet nye advarsler: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const og -Wanalyzer-write-to-string-literal.
    • Tilføjet nye fejlfindingsmuligheder -fdump-analyzer-json og -fno-analyzer-feasibility.
    • Muligheden for at udvide analysatoren gennem plugins til GCC er blevet implementeret (for eksempel er et plugin blevet forberedt til at kontrollere den forkerte brug af global låsning (GIL) i CPython).

Kilde: opennet.ru

Tilføj en kommentar