Lëshimi i paketës së përpiluesit GCC 11

Pas një viti zhvillimi, lëshimi i paketës së përpiluesit falas GCC 11.1 është lëshuar, lëshimi i parë domethënës në degën e re GCC 11.x. Sipas skemës së re të numërimit të lëshimeve, versioni 11.0 u përdor gjatë zhvillimit, dhe pak para lëshimit të GCC 11.1, dega GCC 12.0 ishte tashmë e degëzuar, nga e cila do të formohet versioni tjetër domethënës i GCC 12.1.

GCC 11.1 është i dukshëm për kalimin e tij në përdorimin e formatit të skedarit të korrigjimit DWARF 5 si parazgjedhje, përfshirjen e paracaktuar të standardit C++17 (“-std=gnu++17”), përmirësime të rëndësishme në mbështetje për C++20 standarde, mbështetje eksperimentale për C++23, përmirësime në lidhje me standardin e ardhshëm të gjuhës C (C2x), optimizime të reja të performancës.

Ndryshimet kryesore:

  • Modaliteti i paracaktuar për gjuhën C++ është ndërruar për të përdorur standardin C++17 (-std=gnu++17) në vend të C++14 të ofruar më parë. Është e mundur që në mënyrë selektive të çaktivizohet sjellja e re C++17 kur përpunohen shabllone që përdorin shabllone të tjerë si parametër (-fno-new-ttp-matching).
  • Mbështetje e shtuar për përshpejtimin e harduerit të mjetit AddressSanitizer, i cili ju lejon të përcaktoni faktet e hyrjes në zonat e liruara të memories, duke shkuar përtej kufijve të tamponit të caktuar dhe disa lloje të tjera gabimesh kur punoni me kujtesën. Përshpejtimi i harduerit është aktualisht i disponueshëm vetëm për arkitekturën AArch64 dhe është i fokusuar në përdorimin gjatë përpilimit të kernelit Linux. Për të aktivizuar përshpejtimin e harduerit AddressSanitizer gjatë ndërtimit të komponentëve të hapësirës së përdoruesit, është shtuar flamuri "-fsanitize=hwaddress" dhe flamuri i kernelit "-fsanitize=kernel-hwaddress".
  • Gjatë gjenerimit të informacionit të korrigjimit, formati DWARF 5 përdoret si parazgjedhje, i cili, krahasuar me versionet e mëparshme, lejon gjenerimin e të dhënave 25% më kompakte të korrigjimit. Mbështetja e plotë për DWARF 5 kërkon të paktën versionin 2.35.2 të binutils. Formati DWARF 5 mbështetet në mjetet e korrigjimit që nga GDB 8.0, valgrind 3.17.0, elfutils 0.172 dhe dwz 0.14. Për të gjeneruar skedarë korrigjimi duke përdorur versione të tjera të DWARF, mund të përdorni opsionet "-gdwarf-2", "-gdwarf-3" dhe "-gdwarf-4".
  • Kërkesat për përpiluesit që mund të përdoren për të ndërtuar GCC janë rritur. Përpiluesi tani duhet të mbështesë standardin C++11 (më parë kërkohej C++98), d.m.th. Nëse GCC 10 ishte e mjaftueshme për të ndërtuar GCC 3.4, atëherë të paktën GCC 11 tani kërkohet për të ndërtuar GCC 4.8.
  • Emri dhe vendndodhja e skedarëve për ruajtjen e deponive, skedarët e përkohshëm dhe informacionet shtesë të nevojshme për optimizimin e LTO janë ndryshuar. Skedarë të tillë tani ruhen gjithmonë në drejtorinë aktuale, përveç nëse shtegu ndryshohet në mënyrë eksplicite nëpërmjet opsioneve "-dumpbase", "-dumpdir" dhe "-save-temps=*".
  • Mbështetja për formatin binar BRIG për përdorim me gjuhën HSAIL (Heterogeneous System Architecture Intermediate Language) është zhvlerësuar dhe së shpejti do të hiqet.
  • Aftësitë e modalitetit ThreadSanitizer (-fsanitize=thread) janë zgjeruar, të dizajnuara për të zbuluar kushtet e garës kur ndahen të njëjtat të dhëna nga temat e ndryshme të një aplikacioni me shumë fije. Publikimi i ri shton mbështetje për kohëzgjatje dhe mjedise alternative, si dhe mbështetje për mjetin e korrigjimit të KCSAN (Kernel Concurrency Sanitizer), i krijuar për të zbuluar në mënyrë dinamike kushtet e garës brenda kernelit Linux. U shtuan opsione të reja "-param tsan-distinguish-volatile" dhe "-param tsan-instrument-func-entry-exit".
  • Numrat e kolonave në mesazhet diagnostikuese tani nuk pasqyrojnë numrin e bajteve nga fillimi i rreshtit, por në fakt numrat e kolonave që marrin parasysh karakteret me shumë bajtë dhe karakteret që zënë disa pozicione në rresht (për shembull, karakteri 🙂 zë dy pozicione dhe është i koduar në 4 bajt). Po kështu, karakteret e skedës tani trajtohen si një numër i caktuar hapësirash (të konfigurueshme nëpërmjet opsionit -ftabstop, parazgjedhja 8). Për të rivendosur sjelljen e vjetër, propozohet opsioni "-fdiagnostics-column-unit=byte", dhe për të përcaktuar vlerën fillestare (duke numëruar nga 0 ose 1) - opsioni "-fdiagnostics-column-origin=".
  • Vektorizuesi merr parasysh të gjithë përmbajtjen e funksionit dhe shton aftësitë e përpunimit të lidhura me kryqëzimet dhe referenca në blloqet e mëparshme në grafikun e rrjedhës së kontrollit (CFG, grafiku i rrjedhës së kontrollit).
  • Optimizuesi zbaton aftësinë për të kthyer një seri operacionesh të kushtëzuara që krahasojnë të njëjtën variabël në një shprehje switch. Në të ardhmen, shprehja e çelësit mund të kodohet duke përdorur udhëzime të testimit të biteve (opsioni "-fbit-tests" është shtuar për të kontrolluar një konvertim të tillë).
  • Përmirësimi i optimizimeve ndërprocedurale. U shtua një kalim i ri IPA-modref (-fipa-modref) për të gjurmuar efektet anësore gjatë thirrjes së funksioneve dhe për të përmirësuar saktësinë e analizës. Implementimi i përmirësuar i kalimit IPA-ICF (-fipa-icf), i cili redukton konsumin e kujtesës gjatë përpilimit dhe rrit numrin e funksioneve të unifikuara për të cilat kombinohen blloqe identike të kodit. Në kalimin IPA-CP (Përhapja konstante ndërprocedurale), heuristikat e parashikimit janë përmirësuar, duke marrë parasysh kufijtë dhe veçoritë e njohura të sytheve.
  • Në Linking Time Optimizations (LTO), formati i bytecode është optimizuar për të zvogëluar madhësinë dhe për të përmirësuar shpejtësinë e përpunimit. Reduktuar pikun e konsumit të memories gjatë fazës së lidhjes.
  • Në mekanizmin e optimizimit bazuar në rezultatet e profilizimit të kodit (PGO - Profile-guided optimization), i cili lejon gjenerimin e kodit më optimal bazuar në analizën e veçorive të ekzekutimit, madhësia e skedarëve me të dhëna GCOV zvogëlohet për shkak të paketimit më kompakt të numëruesve zero. . Modaliteti i përmirësuar "-fprofile-values" duke mbajtur gjurmët e më shumë parametrave në thirrjet indirekte.
  • Zbatimi i standardit OpenMP 5.0 (Open Multi-Processing), i cili përcakton API-në dhe metodat për aplikimin e metodave të programimit paralel në sistemet multi-core dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe njësi vektorizimi (SIMD), ka vazhdoi. Mbështetja fillestare e shtuar për direktivën e alokimit dhe aftësia për të përdorur sythe heterogjene në konstruktet OpenMP. Mbështetje e zbatuar për variablin e mjedisit OMP_TARGET_OFFLOAD.
  • Është përmirësuar zbatimi i specifikimit të programimit paralel OpenACC 2.6 të ofruar për gjuhët C, C++ dhe Fortran, i cili përcakton mjetet për shkarkimin e operacioneve në GPU dhe procesorë të specializuar, si NVIDIA PTX.
  • Për gjuhët C, është zbatuar një atribut i ri "no_stack_protector", i krijuar për të shënuar funksione për të cilat mbrojtja e stivës nuk duhet të aktivizohet ("-fstack-protector"). Atributi "malloc" është zgjeruar për të mbështetur identifikimin e çifteve të thirrjeve për alokimin dhe çlirimin e memories (alokator/shpërndarës), i cili përdoret në analizuesin statik për të identifikuar gabimet tipike në punën me memorien (rrjedhje memorie, përdorim pas çlirimit, thirrjet e dyfishta në funksionin e lirë, etj.) dhe në paralajmërimet e kompajlerit "-Wmismatched-dealloc", "-Wmismatched-new-delete" dhe "-Wfree-nonheap-object", duke informuar për mospërputhjen midis operacioneve të ndarjes së memories dhe ndarjes së memories.
  • Janë shtuar paralajmërime të reja për gjuhën C:
    • "-Wmismatched-dealloc" (i aktivizuar si parazgjedhje) - paralajmëron për operacionet e ndarjes së memories që përdorin një tregues që nuk është i pajtueshëm me funksionet e alokimit të memories.
    • "-Wsizeof-array-div" (aktivizohet kur specifikohet "-Wall") - Paralajmëron për ndarjen e dy operatorëve të madhësisë nëse pjesëtuesi nuk përputhet me madhësinë e elementit të grupit.
    • "-Wstringop-overread" (i aktivizuar si parazgjedhje) - paralajmëron për thirrjen e një funksioni vargu që lexon të dhëna nga një zonë jashtë kufirit të grupit.
    • "-Wtsan" (i aktivizuar si parazgjedhje) - Paralajmëron për përdorimin e veçorive (të tilla si std::atomic_thread_fence) që nuk mbështeten në ThreadSanitizer.
    • "-Warray-parameter" dhe "-Wvla-parameter" (aktivizuar kur specifikohet "-Wall") - paralajmëron për funksionet mbizotëruese me deklarata të papajtueshme të argumenteve të lidhura me vargje me gjatësi fikse dhe të ndryshueshme.
    • Paralajmërimi "-Wuninicialized" tani zbulon përpjekjet për të lexuar nga memoria e painitializuar e alokuar dinamikisht.
    • Paralajmërimi "-Wfree-nonheap-object" zgjeron përkufizimin e rasteve kur funksionet e ndarjes së memories thirren me një tregues që nuk merret përmes funksioneve dinamike të alokimit të memories.
    • Paralajmërimi "-Wmaybe-uninicialized" ka zgjeruar zbulimin e kalimit të treguesve te funksionet që u referohen vendndodhjeve të memories të painitializuara.
  • Për gjuhën C, një pjesë e veçorive të reja të zhvilluara brenda kornizës së standardit C2X është zbatuar (mundësuar duke specifikuar -std=c2x dhe -std=gnu2x): makrot BOOL_MAX dhe BOOL_WIDTH, tregues opsional i emrave të parametrave të papërdorur në funksion definicionet (si në C++), atributi “[ [nodiscard]]”, operatori paraprocesor "__has_c_atribute", makro FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_60559_WANT_XNUMX, FLT, NI , DBL_SNAN, LDBL_SNAN, DEC_INFINITY dhe DEC _NAN, NaN=makrot për FloatN, _FloatNx dhe _DecimalN, aftësia për të specifikuar shenjat e kërcimit përpara deklaratave dhe në fund të deklaratave të përbëra.
  • Për C++, është zbatuar një pjesë e ndryshimeve dhe inovacioneve të propozuara në standardin C++20, duke përfshirë funksionet virtuale "consteval virtual", pseudo-destruktorët për fundin e ciklit jetësor të objekteve, përdorimin e klasës enum dhe llogaritja e madhësisë së një grupi në shprehjen "e re".
  • Për C++, është shtuar mbështetje eksperimentale për disa përmirësime që po zhvillohen për standardin e ardhshëm C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Për shembull, tani ka mbështetje për prapashtesën fjalë për fjalë "zu" për vlerat e nënshkruara size_t.
  • libstdc++ ka përmirësuar mbështetjen për standardin C++17, duke përfshirë prezantimin e implementimeve std::from_chars dhe std::to_chars për llojet e pikave lundruese. Implementuar elementë të rinj të standardit C++20, duke përfshirë std::bit_cast, std::source_location, operacionet atomike presin dhe njoftojnë, , , , , si dhe elemente të Standardi i ardhshëm C++ 23 (std::to_underlying, std::is_scoped_enum). U shtua mbështetje eksperimentale për llojet për përpunimin paralel të të dhënave (SIMD, Llojet e të dhënave-Parallel). Zbatimi i std::uniform_int_distribution është përshpejtuar.
  • U hoq flamuri i cilësisë alfa nga libgccjit, një bibliotekë e përbashkët për futjen e një gjeneruesi kodi në procese të tjera dhe përdorimin e tij për të organizuar përpilimin JIT të bajtkodit në kodin e makinës. U shtua aftësia për të ndërtuar libgccjit për MinGW.
  • Mbështetje e shtuar për arkitekturën AArch64 Armv8-R (-marsh=armv8-r). Për arkitekturat AArch64 dhe ARM, është shtuar mbështetja për procesorët (parametrat -mcpu dhe -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) dhe Arm Neoverse N2 (neoverse-n2). CPU-të Fujitsu A64FX (a64fx) dhe Arm Cortex-R82 (cortex-r82) janë shtuar gjithashtu, duke mbështetur vetëm arkitekturën AArch64.
  • Mbështetje e shtuar për përdorimin e Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) dhe MVE (AArch32 M-profili) udhëzimet SIMD për të autovektorizuar operacionet që kryejnë mbledhje, zbritje, shumëzim dhe variante të mbledhjes/zbritjes mbi numra komplekse. U shtua mbështetje fillestare për autovektorizimin për ARM duke përdorur grupin e udhëzimeve MVE.
  • Për platformat ARM, ofrohet një grup i plotë funksionesh C të integruara në përpilues (Intrinsics), të zëvendësuara me udhëzime të zgjeruara vektoriale (SIMD), që mbulojnë të gjitha udhëzimet NEON të dokumentuara në specifikimet ACLE Q3 2020.
  • Mbështetja për gfx908 GPU është shtuar në backend për gjenerimin e kodit për GPU-të AMD bazuar në mikroarkitekturën GCN.
  • Mbështetje e shtuar për procesorë të rinj dhe shtesa të reja të grupit të udhëzimeve të implementuara në to:
    • Intel Sapphire Rapids (-marsh=sapphirerapids, mundëson mbështetje për udhëzimet MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK8, AMT-XAMF, TSXLDTRK16, AMT-XAMF, AMT-XINT, dhe .
    • Intel Alderlake (-marsh=alderlake, mundëson mbështetje për udhëzimet CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI dhe HRESET).
    • Intel Rocketlake (-marsh=rocketlake, i ngjashëm me Rocket Lake pa mbështetje SGX).
    • AMD Zen 3 (-mars=znver3).
  • Për sistemet IA-32/x86-64 të bazuara në procesorë Intel, është shtuar mbështetje për udhëzimet e reja të procesorit TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Mbështetje e shtuar për flamujt "-marsh=x86-64-v[234]" për të zgjedhur nivelet e arkitekturës x86-64 (v2 - mbulon shtesat SSE4.2, SSSE3, POPCNT dhe CMPXCHG16B; v3 - AVX2 dhe MOVBE; v4 - AVX-512 ) .
  • Mbështetje e shtuar për sistemet RISC-V me renditje të bajteve të mëdha endian. U shtua opsioni "-misa-spec=*" për të zgjedhur versionin e specifikimit të arkitekturës së grupit të udhëzimeve RISC-V. Mbështetje e shtuar për AddressSanitizer dhe mbrojtjen e stivës duke përdorur etiketat e kanarisë.
  • Përmirësimi i vazhdueshëm i mënyrës së analizës statike “-fanalyzer”, i cili kryen analiza ndërprocedurale me burime intensive të shtigjeve të ekzekutimit të kodit dhe rrjedhave të të dhënave në program. Modaliteti është i aftë të zbulojë probleme në fazën e kompilimit, si thirrjet e dyfishta në funksionin free() për një zonë memorie, rrjedhjet e përshkruesit të skedarëve, çreferencimi dhe kalimi i treguesve null, aksesi në blloqet e memories të liruara, përdorimi i vlerave të painitializuara, etj. Në versionin e ri:
    • Kodi për ndjekjen e gjendjes së programit është rishkruar plotësisht. Problemet me skanimin e skedarëve shumë të mëdhenj C janë zgjidhur.
    • U shtua mbështetja fillestare e C++.
    • Analiza e ndarjes së memories dhe shpërndarja është abstraguar nga funksionet specifike malloc dhe të lira, dhe tani mbështet new/delete dhe new[]/delete[].
    • Paralajmërimet e reja të shtuara: -Nga analyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const dhe -Wanalyzer-write-to-string-literal.
    • U shtuan opsione të reja korrigjimi -fdump-analyzer-json dhe -fno-analyzer-feasibility.
    • Është zbatuar aftësia për të zgjeruar analizuesin përmes shtojcave për GCC (për shembull, një shtojcë është përgatitur për të kontrolluar përdorimin e gabuar të bllokimit global (GIL) në CPython).

Burimi: opennet.ru

Shto një koment