Pas një viti zhvillimi, është publikuar kohëzgjidhja e paketës së lirë të kompilerëve GCC 11.1, lëshimi i parë i rëndësishëm 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ë procesit të zhvillimit, dhe pak para daljes së GCC 11.1, dega GCC 12.0 u ndan, mbi të cilën do të formohet lëshimi i ardhshëm i rëndësishëm GCC 12.1.
GCC 11.1 është i njohur për kalimin në përdorimin e formatit të skedarëve të shenjave DWARF 5 si default, përfshirjen e standardit C++17 ('-std=gnu++17') si default, përmirësimin e theksuar të mbështetjes për standardin C++20, mbështetje eksperimentale për C++23, përmirësime të lidhura me standardin e ardhshëm të gjuhës C (C2x), dhe optimizime të reja për performancën.
Ndryshimet kryesore:
- Regjimi default pĂ«r gjuhĂ«n C++ Ă«shtĂ« kaluar nĂ« pĂ«rdorimin e standardit C++17 (-std=gnu++17) nĂ« vend tĂ« C++14 qĂ« ishte propozuar mĂ« parĂ«. ĂshtĂ« e mundur tĂ« çaktivizohet selektivisht komportimi i ri tĂ« C++17 kur pĂ«rpunohen shabllone, nĂ« tĂ« cilat pĂ«rdoren shabllone tĂ« tjera si parametra (-fno-new-ttp-matching).
- Shtohet mbĂ«shtetje pĂ«r pĂ«rshpejtimin hardueror tĂ« instrumentit AddressSanitizer, i cili mundĂ«son pĂ«rcaktimin e rasteve tĂ« aksesit nĂ« zona tĂ« çliruara tĂ« memories, daljes pĂ«rtej kufijve tĂ« ndarjeve tĂ« alokuara dhe disa lloje tĂ« tjera gabimesh gjatĂ« punĂ«s me memorien. PĂ«rshtatja harduerore Ă«shtĂ« aktualisht e disponueshme vetĂ«m pĂ«r arkitekturĂ«n AArch64 dhe Ă«shtĂ« pĂ«rqendruar nĂ« pĂ«rdorimin e saj gjatĂ« kompilimit tĂ« bĂ«rthamĂ«s Linux. PĂ«r tĂ« aktivizuar pĂ«rshpejtimin hardueror tĂ« AddressSanitizer gjatĂ« ndĂ«rtimit tĂ« komponenteve tĂ« hapĂ«sirĂ«s sĂ« pĂ«rdoruesit Ă«shtĂ« shtuar flagu "-fsanitize=hwaddress", ndĂ«rsa pĂ«r bĂ«rthamĂ«n â "-fsanitize=kernel-hwaddress".
- Gjatë gjenerimit të informacionit për debugin, formati DWARF 5 ka qenë aktiv nga ana e të dhënave, duke lejuar gjenerimin e të dhënave debuguese deri në 25% më të kompaktuara krahasuar me versionet e mëparshme. Për mbështetje të plotë të DWARF 5, kërkohet binutils të paktën versioni 2.35.2. Në mjetet për debugin, formati DWARF 5 mbështetet që nga GDB 8.0, valgrind 3.17.0, elfutils 0.172 dhe dwz 0.14. Për të gjeneruar skedarë debuguese duke përdorur versione të tjera të DWARF, mund të përdoren opsionet "-gdwarf-2", "-gdwarf-3" dhe "-gdwarf-4".
- Kërkesa për kompilatorët që mund të përdoren për ndërtimin e GCC janë rritur. Tani kompilatorët duhet të mbështesin standardin C++11 (më parë kërkesa ishte C++98), domethënë, nëse për ndërtimin e GCC 10 mjaftonte prania e GCC 3.4, tani për ndërtimin e GCC 11 kërkohet të paktën GCC 4.8.
- EmĂ«rtimi dhe vendndodhja e skedarĂ«ve pĂ«r ruajtjen e dump-eve, skedarĂ«ve tĂ« pĂ«rkohshĂ«m dhe informacionit shtesĂ« tĂ« nevojshĂ«m pĂ«r optimizimin LTO Ă«shtĂ« ndryshuar. Tani kĂ«to skedarĂ« gjithmonĂ« ruhen nĂ« katalogun e tanishĂ«m, nĂ«se rruga nuk ndryshohet qartĂ« pĂ«rmes parametrave â-dumpbaseâ, â-dumpdirâ dhe â-save-temps=*â.
- Mbështetje për formatin binar BRIG, e destinuar për t'u përdorur me gjuhën HSAIL (Heterogeneous System Architecture Intermediate Language), është shpallur e tejkaluar dhe do të hiqet së shpejti.
- KanĂ« zgjeruar funksionalitetin e modit ThreadSanitizer (-fsanitize=thread), i destinuar pĂ«r zbuluar gjendjet e garĂ«s gjatĂ« aksesit nĂ« tĂ« njĂ«jtat tĂ« dhĂ«na nga fishkat e ndryshme tĂ« aplikacioneve shumĂ«-fishk. NĂ« versionin e ri Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r runtime alternative dhe mjedise, si dhe mbĂ«shtetje pĂ«r mjetin debugues KCSAN (Kernel Concurrency Sanitizer), qĂ« shĂ«rben pĂ«r zbuluar dinamikisht gjendjet e garĂ«s brenda bĂ«rthamĂ«s Linux. JanĂ« shtuar mundĂ«si tĂ« reja "âparam tsan-distinguish-volatile" dhe "âparam tsan-instrument-func-entry-exit".
- Numrat e kolonave nĂ« mesazhet diagnostikuese tani pasqyrojnĂ« jo numĂ«ratorin e bajtĂ«ve nga fillimi i rreshtit, por vĂ«rtet numrat e kolonave qĂ« marrin parasysh simbolet shumĂ«-bajtĂ« dhe simbolet qĂ« zĂ«nĂ« disa pozita nĂ« rresht (p.sh., simboli đ zĂ« dy pozita dhe kodifikohet me 4 bajta). NĂ« mĂ«nyrĂ« tĂ« ngjashme, simbolet e tabulimit tani pĂ«rpunohen si njĂ« numĂ«r tĂ« caktuar hapĂ«sirash (cilĂ«simi bĂ«het pĂ«rmes opsionit -ftabstop, me 8 si parazgjedhje). PĂ«r tĂ« rikthyer sjelljen e vjetĂ«r, Ă«shtĂ« propozuar opsioni "-fdiagnostics-column-unit=byte", dhe pĂ«r tĂ« pĂ«rcaktuar vlerĂ«n fillestare (numĂ«rimi nga 0 ose 1) - opsioni "-fdiagnostics-column-origin=".
- Në vektorizator është siguruar mbajtja e të gjithë përmbajtjes së funksionit dhe është shtuar trajtimi i mundësive të lidhura me ndërprerjet dhe referencat në blloqet e mëparshme në grafikun e rrjedhës së controles (CFG, control-flow graph).
- Në optimizues është realizuar mundësia për ta transformuar një seri operacioneve kushtore për të krijuar një shprehje switch, në të cilat krahasohet e njëjta variabël. Më tej, shprehja switch mund të kodifikohet duke përdorur instrukcione testimi bitshe (për të menaxhuar këtë transformim është shtuar opsioni "-fbit-tests").
- JanĂ« pĂ«rmirĂ«suar optimizimet ndĂ«rprocedurale. ĂshtĂ« shtuar njĂ« kalim i ri IPA-modref (-fipa-modref) pĂ«r tĂ« gjurmuar efektet anĂ«sore gjatĂ« thirrjeve tĂ« funksioneve dhe pĂ«r tĂ« rritur saktĂ«sinĂ« e analizĂ«s. ĂshtĂ« pĂ«rmirĂ«suar realizimi i kalimit IPA-ICF (-fipa-icf), nĂ« tĂ« cilin Ă«shtĂ« reduktuar konsumimi i memories gjatĂ« kompilimit dhe Ă«shtĂ« rritur numri i funksioneve tĂ« unifikuara, pĂ«r tĂ« cilat bĂ«het bashkimi i blloqeve tĂ« kodit identik. NĂ« kalimin IPA-CP (PĂ«rhapja e konstantave ndĂ«rprocedurale) Ă«shtĂ« pĂ«rmirĂ«suar heuristika e parashikimit duke marrĂ« parasysh kufijtĂ« e njohur dhe veçoritĂ« e punĂ«s sĂ« cikleve.
- NĂ« realizimin e optimizimeve nĂ« fazĂ«n e lidhjes (LTO), formati i kodit bajt Ă«shtĂ« optimizuar pĂ«r tĂ« reduktuar madhĂ«sinĂ« dhe pĂ«r tĂ« rritur shpejtĂ«sinĂ« e pĂ«rpunimit. ĂshtĂ« reduktuar konsumimi maksimal i memories gjatĂ« fazĂ«s sĂ« lidhjes.
- NĂ« mekanizmin e optimizimit tĂ« bazuar nĂ« rezultatet e profilizimit tĂ« kodit (PGO - Optimize me udhĂ«zime nga profili), i cili lejon tĂ« gjenerohet kod mĂ« optimal bazuar nĂ« analizĂ«n e veçorive tĂ« ekzekutimit, Ă«shtĂ« reduktuar madhĂ«sia e skedarĂ«ve tĂ« tĂ« dhĂ«nave GCOV pĂ«r shkak tĂ« paketimit mĂ« kompakt tĂ« numrave zero. ĂshtĂ« pĂ«rmirĂ«suar moda "-fprofile-values", duke bĂ«rĂ« qĂ« tĂ« ndiqen mĂ« shumĂ« parametra gjatĂ« thirrjeve indirekte.
- ĂshtĂ« vazhduar realizimi i standardit OpenMP 5.0 (Open Multi-Processing), i cili pĂ«rcakton API dhe metodat e aplikimit tĂ« metodave tĂ« programimit paralel nĂ« sisteme me shumĂ« bĂ«rthama dhe hibride (CPU+GPU/DSP) me memorie tĂ« pĂ«rbashkĂ«t dhe blloqe vektorizimi (SIMD). ĂshtĂ« shtuar mbĂ«shtetje fillestare pĂ«r direktivĂ«n allocate dhe mundĂ«sia e pĂ«rdorimit tĂ« cikleve tĂ« heterogjene nĂ« konstruksionet OpenMP. ĂshtĂ« realizuar mbĂ«shtetje pĂ«r variablĂ«n e mjedisit OMP_TARGET_OFFLOAD.
- Implementimi i përmirësuar i specifikimeve të programimit paralel OpenACC 2.6 për gjuhët C, C++ dhe Fortran, i cili përcakton mjete për të realizuar operacione (offloading) në GPU dhe procesorë të specializuar, si NVIDIA PTX.
- Për gjuhët e familjes C është implementuar një atribut i ri "no_stack_protector", i dedikuar për të etiketuar funksionet për të cilat nuk duhet përfshirë mbrojtja e stack-ut ("-fstack-protector"). Atributi "malloc" është zgjeruar me mbështetje për identifikimin e çifteve të thirrjeve për alokim dhe çalokim të memories (allocator/deallocator), i cili përdoret në analizatorin statik për të identifikuar gabimet tipike të menaxhimit të memories (rrjedhje memorjeje, përdorim pas çalokimit, thirrje të dyfishta të funksionit free, etj.) dhe në paralajmërimet e kompajlerit "-Wmismatched-dealloc", "-Wmismatched-new-delete" dhe "-Wfree-nonheap-object", që informojnë për mosakordimin e operacioneve të çalokimit dhe alokimit të memories.
- Për gjuhën C janë shtuar paralajmërime të reja:
- "-Wmismatched-dealloc" (aktivizuar si parazgjedhje) â paralajmĂ«ron pĂ«r operacionet e çalokimit tĂ« memories ku pĂ«rdoret njĂ« tregues, qĂ« nuk pĂ«rputhet me funksionet e alokimit tĂ« memories.
- «-Wsizeof-array-div» (aktivizohet kur pĂ«rcaktohet «-Wall») â tĂ«rheq vĂ«mendjen pĂ«r ndarjen e dy operatorĂ«ve sizeof, nĂ«se ndarje nuk korrespondon me pĂ«rmasĂ«n e elementit tĂ« vargut.
- «-Wstringop-overread» (aktivizohet si parazgjedhje) â tĂ«rheq vĂ«mendjen pĂ«r thirrjen e funksionit tĂ« pjesĂ«s string, qĂ« lexon tĂ« dhĂ«na nga zona jashtĂ« kufijve tĂ« vargut.
- «-Wtsan» (aktivizohet si parazgjedhje) â tĂ«rheq vĂ«mendjen pĂ«r pĂ«rdorimin e mundĂ«sive (si std::atomic_thread_fence), qĂ« nuk mbĂ«shteten nĂ« ThreadSanitizer.
- «-Warray-parameter» dhe «-Wvla-parameter» (aktivizohet kur pĂ«rcaktohet «-Wall») â tĂ«rheq vĂ«mendjen pĂ«r pĂ«rcaktimin e funksioneve me deklarata argumentesh tĂ« paqĂ«ndrueshme, tĂ« lidhura me vargje me gjatĂ«si fikse dhe variabĂ«l.
- Paralajmërimi «-Wuninitialized» tani përcakton përpjekjet për të lexuar nga kujtesë dinamike të pa inicializuar.
- Në paralajmërimin «-Wfree-nonheap-object» është zgjeruar spektri i rasteve të përcaktuara të thirrjeve të funksioneve të lirimit të kujtesës me një tregues, i marrë jo përmes funksioneve të alokimit dinamik të kujtesës.
- Në paralajmërimin «-Wmaybe-uninitialized» është zgjeruar identifikimi i kaluarjes në funksione të treguesve, që referojnë në zona të pa inicializuara të kujtesës.
- Për gjuhën C është realizuar një sërë mundësish të reja, të zhvilluara në kuadër të standardit C2X (aktivizohet duke treguar -std=c2x dhe -std=gnu2x): makrot e BOOL_MAX dhe BOOL_WIDTH, të gjitha parametrat opsionalë në përkufizimin e funksioneve (si në C++), atributi '[[nodiscard]]', operatori i përpunimit '.__has_c_attribute', makrot 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, DEC_INFINITY dhe DEC_NAN, NaN=makrot për FloatN, _FloatNx dhe _DecimalN, mundësia e caktimit të etiketave të kalimit para shpalljeve dhe në fund të operatorëve të përbërë.
- Për C++ është realizuar një sërë ndryshimesh dhe risish, të propozuara në standardin C++20, duke përfshirë funksionet virtuale 'consteval virtual', pseudodestroyers të përfundimit të ciklit të jetës së objekteve, përdorimin e klasës enum dhe llogaritjen e madhësisë së array në shprehjen 'new'.
- 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, është shtuar mbështetje për sufixin literal 'zu' për vlerat e nënshkruara size_t.
- NĂ« libstdc++ Ă«shtĂ« pĂ«rmirĂ«suar mbĂ«shtetje pĂ«r standardin C++17, duke pĂ«rfshirĂ« implementimin e std::from_chars dhe std::to_chars pĂ«r tipet me pikĂ« fluturuese. JanĂ« realizuar elemente tĂ« reja tĂ« standardit C++20, duke pĂ«rfshirĂ« std::bit_cast, std::source_location, operacione atomike wait dhe notify, , , , , si dhe elemente tĂ« standardit tĂ« ardhshĂ«m C++23 (std::to_underlying, std::is_scoped_enum). ĂshtĂ« shtuar mbĂ«shtetje eksperimentale pĂ«r tipet e pĂ«rpunimit paralel tĂ« tĂ« dhĂ«nave (SIMD, Data-Parallel Types). Implementimi i std::uniform_int_distribution Ă«shtĂ« pĂ«rshpejtuar.
- ShtĂ« hequr si njĂ« shenjĂ« e cilĂ«sisĂ« alfa libgccjit, bibliotekĂ« e ndarĂ« pĂ«r integrimin e gjeneruesit tĂ« kodit nĂ« procese tĂ« tjera dhe pĂ«rdorimin pĂ«r organizimin e JIT-kompilaimit tĂ« kodit tĂ« bytkodit nĂ« kodin e makinĂ«s. ĂshtĂ« shtuar mundĂ«sia e ndĂ«rtimit tĂ« libgccjit pĂ«r MinGW.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r arkitekturĂ«n AArch64 Armv8-R (-march=armv8-r). PĂ«r arkitekturat AArch64 dhe ARM Ă«shtĂ« shtuar mbĂ«shtetje 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). JanĂ« shtuar gjithashtu CPU Fujitsu A64FX (a64fx) dhe Arm Cortex-R82 (cortex-r82), qĂ« mbĂ«shtesin vetĂ«m arkitekturĂ«n AArch64.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r pĂ«rdorimin e instrukcioneve SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) dhe MVE (AArch32 M-profile) pĂ«r avtokomponentizimin e operacioneve qĂ« kryejnĂ« shumimin, zbritjen, shumĂ«zimin dhe varianta e shumimit/zbritjes mbi numra kompleksĂ«. PĂ«r ARM Ă«shtĂ« shtuar mbĂ«shtetje fillestare pĂ«r avtokomponentizimin duke pĂ«rdorur setin e instrukcioneve MVE.
- Për platformat ARM është ofruar një gamë e plotë funksionesh të ndërtuara në kompilatorin C (Intrinsics), të zëvendësuara me instrukcione të zgjeruara vektoriale (SIMD), duke përfshirë të gjithë instrukcionet NEON, të dokumentuara në specifikimin ACLE Q3 2020.
- Në backend për gjenerimin e kodit për GPU AMD bazuar në mikroarkitekturën GCN është shtuar mbështetje për GPU gfx908.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r procesorĂ« tĂ« rinj dhe zgjerime tĂ« reja tĂ« implementuar nĂ« setin e instrukcioneve:
- Intel Sapphire Rapids (-march=sapphirerapids, përfshin mbështetje për instrukcione MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 dhe AVX-VNNI).
- Intel Alderlake (-march=alderlake, përfshin mbështetje për instrukcione CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI dhe HRESET).
- Intel Rocketlake (-march=rocketlake, analog i Rocket Lake pa mbështetje për SGX).
- AMD Zen 3 (-march=znver3).
- Për sistemet IA-32/x86-64 bazuar në procesorët Intel, është shtuar mbështetje për instruksionet e reja të procesorit TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
- Shtuar mbështetje për flamujt «-march=x86-64-v[234]» për zgjedhjen e niveleve të arkitekturës x86-64 (v2 - përmban zgjerimet SSE4.2, SSSE3, POPCNT dhe CMPXCHG16B; v3 - AVX2 dhe MOVBE; v4 - AVX-512).
- Shtuar mbështetje për sistemet RISC-V me renditje bajtesh «big-endian». Shtuar opsioni «-misa-spec=*» për zgjedhjen e versionit të specifikimit të arkitekturës së grupit të komandave RISC-V. Shtuar mbështetje për AddressSanitizer dhe mbrojtjen e stack-ut duke përdorur etiketat e kanarinës.
- Përmirësimi i vazhdueshëm i modit të analizës statike «-fanalyzer», i cili kryen një analizë ndërprocedurale të rëndë të rrugëve të ekzekutimit të kodit dhe rrjedhave të të dhënave në program. Moda është në gjendje të identifikojë gjatë fazës së kompilimit probleme të tilla si thirrjen e dyfishtë të funksionit free() për një zonë memorjeje, rrjedhje të descriptorëve të skedarëve, dereferencimin dhe kalimin e treguesve nul, aksesin në blloqet e memorjes së çliruar, përdorimin e vlerave të pa inicializuara, etj. Në versionin e ri:
- Kodi Ă«shtĂ« shkruar plotĂ«sisht pĂ«rsĂ«ri pĂ«r tĂ« ndjekur gjendjen e programit. ĂĂ«shtjet me verifikimin e skedarĂ«ve shumĂ« tĂ« mĂ«dhenj C janĂ« zgjidhur.
- Shtohet mbështetje fillestare për C++.
- Analiza e ndarjes dhe lëshimit të memories është abstraktuar nga funksionet e veçanta malloc dhe free, dhe tani mbështet new/delete dhe new[]/delete[].
- Shtohet paralajmërime të reja: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const dhe -Wanalyzer-write-to-string-literal.
- Shtohet mundësi të reja për debuggim -fdump-analyzer-json dhe -fno-analyzer-feasibility.
- Ka realizuar mundësinë e zgjerimit të analizuesit përmes plugineve në GCC (për shembull, është përgatitur një plugin për të verifikuar përdorimin e papërshtatshëm të bllokimit global (GIL) në CPython).
Burimi: opennet.ru
