Utjefte fan 'e GCC 11-kompilersuite

Nei in jier fan ûntwikkeling is de frijlitting fan 'e fergese GCC 11.1-kompilersuite frijlitten, de earste wichtige release yn' e nije GCC 11.x-tûke. Under it nije nûmeringskema foar frijlitting waard ferzje 11.0 brûkt tidens ûntwikkeling, en koart foar de frijlitting fan GCC 11.1 wie de GCC 12.0-tûke al forkeard, wêrfan de folgjende wichtige release fan GCC 12.1 sil wurde foarme.

GCC 11.1 is opmerklik foar syn oergong nei it brûken fan it DWARF 5-debug-bestânformaat standert, de standertopnimming fan 'e C++17-standert ("-std=gnu++17"), signifikante ferbetteringen yn stipe foar de C++20 standert, eksperimintele stipe foar C ++ 23, ferbetterings yn ferbân mei de takomstige C taal standert (C2x), nije prestaasje optimizations.

Grutte feroaringen:

  • De standertmodus foar de C++-taal is oerskeakele om de C++17-standert (-std=gnu++17) te brûken ynstee fan de earder oanbean C++14. It is mooglik om selektyf útskeakelje de nije C ++ 17 gedrach by it ferwurkjen fan sjabloanen dy't brûke oare sjabloanen as parameter (-fno-new-ttp-matching).
  • Stipe tafoege foar hardware-fersnelling fan it AddressSanitizer-ark, wêrtroch jo de feiten kinne bepale fan tagong ta befrijde ûnthâldgebieten, bûten de grinzen fan 'e tawiisde buffer gean, en guon oare soarten flaters by it wurkjen mei ûnthâld. Hardware-fersnelling is op it stuit allinich beskikber foar de AArch64-arsjitektuer en is rjochte op gebrûk by it kompilearjen fan de Linux-kernel. Om AddressSanitizer hardware-fersnelling yn te skeakeljen by it bouwen fan brûkersromte-komponinten, is de flagge "-fsanitize=hwaddress" tafoege, en de kearnflagge "-fsanitize=kernel-hwaddress".
  • By it generearjen fan debuggenynformaasje wurdt it DWARF 5-formaat standert brûkt, wat, yn ferliking mei eardere ferzjes, it generearjen fan 25% kompaktere debuggengegevens mooglik makket. Folsleine stipe foar DWARF 5 fereasket op syn minst binutils ferzje 2.35.2. DWARF 5-formaat wurdt stipe yn debuggen ark sûnt GDB 8.0, valgrind 3.17.0, elfutils 0.172 en dwz 0.14. Om debugbestannen te generearjen mei oare ferzjes fan DWARF, kinne jo de opsjes "-gdwarf-2", "-gdwarf-3" en "-gdwarf-4" brûke.
  • De easken foar gearstallers dy't kinne wurde brûkt om GCC te bouwen binne ferhege. De kompilator moat no de C++11-standert stypje (earder wie C++98 ferplicht), d.w.s. As GCC 10 genôch wie om GCC 3.4 te bouwen, dan is teminsten GCC 11 no ferplicht om GCC 4.8 te bouwen.
  • De namme en lokaasje fan bestannen foar it bewarjen fan dumps, tydlike bestannen en oanfoljende ynformaasje dy't nedich is foar LTO-optimisaasje binne feroare. Sokke triemmen wurde no altyd bewarre yn de aktive map, útsein as it paad eksplisyt feroare wurdt fia de "-dumpbase", "-dumpdir" en "-save-temps=*" opsjes.
  • Stipe foar it binêre formaat BRIG foar gebrûk mei de HSAIL (Heterogeneous System Architecture Intermediate Language) taal is ôfkard en sil ynkoarten fuortsmiten wurde.
  • De mooglikheden fan 'e ThreadSanitizer-modus (-fsanitize=thread) binne útwreide, ûntworpen om racebetingsten te detektearjen by it dielen fan deselde gegevens fan ferskate threads fan in multi-threaded applikaasje. De nije release foeget stipe ta foar alternative runtimes en omjouwings, lykas ek stipe foar it KCSAN (Kernel Concurrency Sanitizer) debuggen-ark, ûntworpen om racebetingsten dynamysk te detektearjen binnen de Linux-kernel. Nije opsjes tafoege "-param tsan-distinguish-flechtich" en "-param tsan-instrument-func-entry-exit".
  • Kolomnûmers yn diagnostyske berjochten reflektearje no net de bytetelling fan it begjin fan 'e rigel, mar eins de kolomnûmers dy't rekken hâlde mei multi-byte-tekens en karakters dy't ferskate posysjes yn 'e rigel besette (bygelyks, it karakter 🙂 beslacht twa posysjes en is kodearre yn 4 bytes). Likegoed wurde ljeppertekens no behannele as in bepaald oantal spaasjes (konfigurearber fia de -ftabstop-opsje, standert 8). Om it âlde gedrach te herstellen, wurdt de opsje "-fdiagnostics-column-unit=byte" foarsteld, en om de begjinwearde te bepalen (nûmering fan 0 of 1) - de opsje "-fdiagnostics-column-origin=".
  • De vectorizer nimt rekken mei de hiele ynhâld fan 'e funksje en foeget ferwurkingsmooglikheden ta ferbûn mei krusingen en ferwizings nei eardere blokken yn' e kontrôlestreamgrafyk (CFG, kontrôlestreamgrafyk).
  • De optimizer ymplemintearret de mooglikheid om in searje betingsten operaasjes te konvertearjen dy't deselde fariabele fergelykje yn in skeakelekspresje. De switch-ekspresje kin letter wurde kodearre mei help fan bittestynstruksjes (de opsje "-fbit-tests" is tafoege om sokke konverzje te kontrolearjen).
  • Ferbettere ynterprosedurale optimisaasjes. In nije IPA-modref-pas (-fipa-modref) tafoege om side-effekten te folgjen by it oproppen fan funksjes en de krektens fan 'e analyse te ferbetterjen. Ferbettere ymplemintaasje fan 'e IPA-ICF-pas (-fipa-icf), dy't ûnthâldferbrûk ferminderet tidens kompilaasje en fergruttet it oantal ferienige funksjes wêrfoar identike blokken koade wurde kombineare. Yn 'e IPA-CP-pas (Interprocedural constant propagation) binne de foarsizzingsheuristyk ferbettere, rekken hâldend mei bekende grinzen en funksjes fan' e loops.
  • Yn Linking Time Optimizations (LTO) wurdt it bytecode-formaat optimalisearre om grutte te ferminderjen en ferwurkingssnelheid te ferbetterjen. Reduzearre peak ûnthâld konsumpsje tidens de binende faze.
  • Yn it optimalisearjen meganisme basearre op de resultaten fan koade profilearring (PGO - Profile-guided optimization), wêrtroch it generearjen fan mear optimale koade basearre op analyze fan útfiering funksjes, de grutte fan triemmen mei GCOV gegevens wurdt fermindere fanwege kompakter ferpakking fan nul tellers . Ferbettere "-fprofile-wearden" modus troch it folgjen fan mear parameters op yndirekte oproppen.
  • De ymplemintaasje fan 'e OpenMP 5.0 (Open Multi-Processing) standert, dy't de API en metoaden definiearret foar it tapassen fan parallelle programmearmetoaden op multi-core en hybride (CPU + GPU / DSP) systemen mei dielde ûnthâld en vectorization units (SIMD), hat ferfolge. Inisjele stipe tafoege foar de allocate-rjochtline en de mooglikheid om heterogene loops te brûken yn OpenMP-konstruksjes. Implementearre stipe foar de omjouwingsfariabele OMP_TARGET_OFFLOAD.
  • De ymplemintaasje fan 'e OpenACC 2.6 parallelle programmearring spesifikaasje foarsjoen foar C, C ++ en Fortran talen is ferbettere, dy't definiearret ark foar it ôfladen fan operaasjes op GPU's en spesjalisearre processors, lykas NVIDIA PTX.
  • Foar C-talen is in nij attribút "no_stack_protector" ymplementearre, ûntworpen om funksjes te markearjen wêrfoar stackbeskerming net ynskeakele wurde moat ("-fstack-protector"). It attribút "malloc" is útwreide om de identifikaasje te stypjen fan pearen fan oproppen foar it allocearjen en befrijen fan ûnthâld (allocator / deallocator), dat wurdt brûkt yn 'e statyske analysator om typyske flaters te identifisearjen by it wurkjen mei ûnthâld (ûnthâldlekken, gebrûk nei it befrijen, dûbele oproppen nei de frije funksje, ensfh) en yn gearstaller warskôgingen "-Wmismatched-dealloc", "-Wmismatched-new-delete" en "-Wfree-nonheap-object", ynformearje oer inkonsistinsje tusken ûnthâld deallocation en ûnthâld tawizing operaasjes.
  • Nije warskôgings binne tafoege foar de C-taal:
    • "-Wmismatched-dealloc" (standert ynskeakele) - warskôget oer ûnthâld deallocation operaasjes dy't brûke in oanwizer dat is net kompatibel mei ûnthâld tawizing funksjes.
    • "-Wsizeof-array-div" (ynskeakele as "-Wall" is oantsjutte) - warskôget oer it dielen fan twa grutte fan operators as de divisor net oerienkomt mei de grutte fan it array-elemint.
    • "-Wstringop-overread" (standert ynskeakele) - warskôget oer it oproppen fan in stringfunksje dy't gegevens lêst fan in gebiet bûten de arraygrins.
    • "-Wtsan" (standert ynskeakele) - warskôget oer it brûken fan funksjes (lykas std::atomic_thread_fence) dy't net wurde stipe yn ThreadSanitizer.
    • "-Warray-parameter" en "-Wvla-parameter" (ynskeakele by it opjaan fan "-Wall") - warskôget oer oerskriuwende funksjes mei ynkompatibele deklaraasjes fan arguminten ferbûn mei arrays fan fêste en fariabele lingte.
    • De "-Wuninitialized" warskôging detektearret no besykjen om te lêzen út net-initialisearre dynamysk tawiisd ûnthâld.
    • De warskôging "-Wfree-nonheap-object" wreidet de definysje út fan gefallen wêrby't ûnthâlddeallokaasjefunksjes wurde neamd mei in oanwizer dy't net krigen wurdt troch dynamyske ûnthâldallokaasjefunksjes.
    • De warskôging "-Wmaybe-uninitialized" hat de deteksje útwreide fan trochjaan fan oanwizers nei funksjes dy't ferwize nei net-inisjalisearre ûnthâldlokaasjes.
  • Foar de C-taal is in diel fan nije funksjes ûntwikkele yn it ramt fan 'e C2X-standert ymplementearre (ynskeakele troch it opjaan fan -std=c2x en -std=gnu2x): makro's BOOL_MAX en BOOL_WIDTH, opsjonele yndikaasje fan nammen fan net brûkte parameters yn funksje definysjes (lykas yn C++), attribút "[ [nodiscard]]", preprocessor-operator "__has_c_attribute", makro's FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559__XNUMX_FIN_IEC_XNUMX__XNUMX_EXT_XNUMX, DBL_IS_IEC_XNUMX, __STDC_WANT_IEC_XNUMX__XNUMX_IN AN, DEC_INFINITY en DEC _NAN, NaN=makro's foar FloatN, _FloatNx en _DecimalN, mooglikheid om sprongmarken oan te jaan foar deklaraasjes en oan 'e ein fan gearstalde útspraken.
  • Foar C ++ is in diel fan 'e feroarings en ynnovaasjes foarsteld yn' e C ++ 20-standert ymplementearre, ynklusyf firtuele funksjes "konsteval firtuele", pseudo-destruktors foar it ein fan 'e libbenssyklus fan objekten, it gebrûk fan' e enum-klasse en it berekkenjen fan de grutte fan in array yn 'e "nije" ekspresje.
  • Foar C++ is eksperimintele stipe tafoege foar guon ferbetterings dy't ûntwikkele wurde foar de takomstige C++23-standert (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Bygelyks is d'r no stipe foar it letterlike efterheaksel "zu" foar ûndertekene size_t-wearden.
  • libstdc ++ hat ferbettere stipe foar de C ++ 17 standert, ynklusyf de ynfiering fan std :: from_chars en std :: to_chars ymplemintaasjes foar driuwende punt typen. Nije eleminten fan 'e C++20-standert ymplementearre, ynklusyf std::bit_cast, std::source_location, atomyske operaasjes wachtsje en notify, , , , , lykas eleminten fan 'e takomstige C++ standert 23 (std :: to_underlying, std :: is_scoped_enum). Eksperimintele stipe tafoege foar typen foar parallelle gegevensferwurking (SIMD, Data-Parallel Types). De ymplemintaasje fan std :: uniform_int_distribution is fersneld.
  • Fuortsmite de alfa kwaliteit flagge út libgccjit, in dielde bibleteek foar it ynbêde in koade generator yn oare prosessen en it brûken fan it te organisearjen JIT kompilaasje fan bytecode yn masine koade. De mooglikheid tafoege om libgccjit te bouwen foar MinGW.
  • Stipe tafoege foar de AArch64 Armv8-R-arsjitektuer (-march=armv8-r). Foar AArch64- en ARM-arsjitektuer is stipe foar processors tafoege (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 binne ek tafoege, dy't allinich de AArch64-arsjitektuer stypje.
  • Tafoege stipe foar it brûken fan Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) en MVE (AArch32 M-profyl) SIMD-ynstruksjes om operaasjes te autovektorisearjen dy't optellen, subtraksje, fermannichfâldigjen en farianten fan optellen / subtraksje útfiere oer komplekse getallen. Inisjele stipe tafoege foar autovectorization foar ARM mei de MVE-ynstruksjeset.
  • Foar ARM-platfoarms wurdt in folsleine set fan kompiler-yntegreare C-funksjes (Intrinsics) levere, ferfongen troch útwreide fektorynstruksjes (SIMD), dy't alle NEON-ynstruksjes dekke dokuminteare yn 'e ACLE Q3 2020-spesifikaasje.
  • Stipe foar gfx908 GPU is tafoege oan 'e efterkant foar it generearjen fan koade foar AMD GPU's basearre op' e GCN-mikroarsjitektuer.
  • Stipe tafoege foar nije processors en nije tafoegings foar ynstruksjesets dy't yn har ymplementearre binne:
    • Intel Sapphire Rapids (-march = sapphirerapids, makket stipe foar de MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALISE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-BFVNIMX, AMX-INT8, AMX-INT16, AMT-TILE, AMX-INTXNUMX, AVVNIMX, en AV-X.
    • Intel Alderlake (-march = alderlake, jout stipe foar CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI en HRESET ynstruksjes).
    • Intel Rocketlake (-march = rocketlake, fergelykber mei Rocket Lake sûnder SGX-stipe).
    • AMD Zen 3 (-march=znver3).
  • Foar IA-32 / x86-64 systemen basearre op Intel processors, stipe foar nije prosessor ynstruksjes TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI is tafoege.
  • Stipe tafoege foar "-march=x86-64-v[234]" flaggen om x86-64-arsjitektuernivo's te selektearjen (v2 - beslacht SSE4.2, SSSE3, POPCNT en CMPXCHG16B-útwreidingen; v3 - AVX2 en MOVBE; v4 - AVX-512 ).
  • Stipe tafoege foar RISC-V-systemen mei big-endian byte-oarder. Tafoege "-misa-spec =*" opsje om de ferzje fan de RISC-V ynstruksje set arsjitektuer spesifikaasje te selektearjen. Stipe tafoege foar AddressSanitizer en stapelbeskerming mei kanaryske tags.
  • Trochgeande ferbettering fan 'e statyske analysemodus "-fanalyzer", dy't boarne-yntinsive ynterprosedurale analyze fan koade-útfierpaden en gegevensstreamen yn it programma útfiert. De modus is by steat om te ûntdekken problemen op de kompilaasje stadium, lykas dûbele oproppen nei de frije () funksje foar ien ûnthâld gebiet, triem beskriuwing lekken, dereferencing en trochjaan nul pointers, tagong ta frijmakke ûnthâld blokken, mei help fan uninitialized wearden, etc. Yn de nije ferzje:
    • De koade foar it folgjen fan de programmatastân is folslein opnij skreaun. Problemen mei it scannen fan heul grutte C-bestannen binne oplost.
    • Inisjele C ++-stipe tafoege.
    • Unthâld tawizing en deallocation analyze is abstrahearre út de spesifike malloc en frije funksjes, en no stipet nij / wiskje en nij [] / wiskje[].
    • Nije warskôgings tafoege: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const en -Wanalyzer-write-to-string-literal.
    • Nije debuggen-opsjes tafoege -fdump-analyzer-json en -fno-analyzer-feasibility.
    • De mooglikheid om de analysator út te wreidzjen fia plugins foar GCC is ymplementearre (bygelyks is in plugin taret om it ferkeard gebrûk fan global locking (GIL) yn CPython te kontrolearjen).

Boarne: opennet.ru

Add a comment