PĂ€rast aasta kestnud arendust on avaldatud tasuta GCC 11.1 kompilaatorite komplekti versioon, mis on esimene oluline vĂ€ljaanne uutest GCC 11.x harudest. Uue versiooni numbrite sĂŒsteemi kohaselt kasutati versiooni 11.0 arenduse kĂ€igus, ning vahetult enne GCC 11.1 vĂ€ljalaskmist harutati GCC 12.0, mille pĂ”hjal luuakse jĂ€rgmine oluline vĂ€ljaanne GCC 12.1.
GCC 11.1 iseloomustab vaikimisi DWARF 5 vormingu kasutuselevÔtt, C++17 standardi ("-std=gnu++17") vaikimisi aktiveerimine, mÀrkimisvÀÀrsed tÀiustused C++20 standardi toe osas, eksperimentaalsed tÀiustused C++23 toe osas, tulevase C standardi (C2x) toetamisega seotud tÀiustused ning uued jÔudluse optimeerimise vÔimalused.
Peamised muudatused:
- C++ keele vaikereĆŸiim on vahetatud C++17 standardi (-std=gnu++17) kasutamisele, mitte varasemalt pakutud C++14-le. Uue C++17 kĂ€itumise valikulise keelamise vĂ”imalus on olemas, kui mallides kasutatakse teisi malle (-fno-new-ttp-matching).
- Lisatud on riistvarakaitsete toetamine AddressSanitizer'i tööriistale, mis vĂ”imaldab tuvastada vabastatud mĂ€lualadele juurdepÀÀsude, jaotuse piiridest vĂ€ljapoole minekute ja mĂ”nede muude mĂ€lutöötluse vigade juhtumeid. Riistvarakaitse on seni saadaval ainult AArch64 arhitektuuri jaoks ja on keskendunud Linuxi tuuma kompileerimisele. AddressSanitizer'i riistvarakaitse sisselĂŒlitamiseks kasutamisel kasutage kasutusruumi komponentide ehitamisel lippu â-fsanitize=hwaddressâ ja tuumakomponentide jaoks â-fsanitize=kernel-hwaddressâ.
- Vaikimisi on derivate teabe genereerimisel kasutusel DWARF 5 formaat, mis vĂ”rreldes varasemate versioonidega vĂ”imaldab genereerida 25% kompaktsusi derivate andmete hulka. DWARF 5 tĂ€ielikuks toetamiseks on vajalik binutils vĂ€hemalt versioon 2.35.2. Derivate tööriistades toetatakse DWARF 5 alates GDB 8.0, valgrind 3.17.0, elfutils 0.172 ja dwz 0.14. Muude DWARF versioonide kasutamisel derivate failide genereerimisel vĂ”ib kasutada valikuid â-gdwarf-2â, â-gdwarf-3â ja â-gdwarf-4â.
- TĂ”usnud on nĂ”uded kompilaatoreile, mida saab GCC koostamiseks kasutada. Kompilaator peab nĂŒĂŒd toetama C++11 standardit (varem nĂ”uti C++98), see tĂ€hendab, et kui GCC 10 koostamiseks piisab GCC 3.4 olemasolust, siis GCC 11 koostamiseks on nĂŒĂŒd vajalik vĂ€hemalt GCC 4.8.
- On muudetud failide nimetusi ja asukohti, et sĂ€ilitada koopiaid, ajutisi faile ja tĂ€iendavat teavet, mis on vajalik LTO-optimeerimise lĂ€biviimiseks. Sellised failid salvestatakse nĂŒĂŒd alati praeguses kataloogis, kui teed ei muudeta selgelt parameetritega â-dumpbaseâ, â-dumpdirâ ja â-save-temps=*â.
- BRIG binaarformaadi tugi, mis on ette nÀhtud HSAIL (Heterogeneous System Architecture Intermediate Language) keele jaoks, on kuulutatud aegunuks ja eemaldatakse peagi.
- On laiendatud ThreadSanitizer (-fsanitize=thread) reĆŸiimi vĂ”imalused, mis on mĂ”eldud vĂ”istlusolukordade tuvastamiseks, kui erinevad lĂ”ngad pÀÀsevad samadele andmetele. Uues vĂ€ljaandes on lisatud tugi alternatiivsetele runtime'idele ja keskkondadele, samuti on lisatud KCSAN (Kernel Concurrency Sanitizer) silumise tööriista tugi, mis on mĂ”eldud vĂ”istlusolukordade dĂŒnaamiliseks tuvastamiseks Linuxi tuumas. Uued valikud ââparam tsan-distinguish-volatileâ ja ââparam tsan-instrument-func-entry-exitâ on lisatud.
- Diagnostiliste sĂ”numite veergude numbrid kajastavad nĂŒĂŒd mitte baitide arvu rea algusest, vaid tegelikke veergude numbreid, mis arvestavad mitme baitiga sĂŒmboleid ja sĂŒmboleid, mis vĂ”tavad Readis mitu positsiooni (nĂ€iteks sĂŒmbol đ vĂ”tab kaks positsiooni ja kodeeritakse 4 baitiga). Samuti kĂ€sitletakse tabulatsioonisĂŒmboleid nĂŒĂŒd kindla arvu tĂŒhikute jĂ€rgi (seadistatakse valiku -ftabstop kaudu, vaikimisi 8). Vanade kĂ€itumise taastamiseks on pakutud valikut â-fdiagnostics-column-unit=byteâ, ja algvÀÀrtuse mÀÀramiseks (numereerimine alates 0 vĂ”i 1) - valik â-fdiagnostics-column-origin=â.
- Vektoriseerijas on tagatud funktsiooni kogu sisu arvestamine ning lisatud töötlemise vÔimalused, mis on seotud lÔikele ja viidetele varasematele plokkidele juhtimisvoo graafikus (CFG, control-flow graph).
- Optimeerijas on rakendatud vĂ”imalus teisendada tingimusoperatsioonide seeria switch-vĂ€ljendiks, kus vĂ”rreldakse sama muutujat. Edasi vĂ”ib switch-vĂ€ljend olla kodeeritud bititestimiseks mĂ”eldud kĂ€skudega (selle transformatsiooni juhtimiseks lisati valik â-fbit-testsâ).
- Parandatud on vaheprotseduurilisi optimeerimisi. Lisatud on uus IPA-modref kĂ€ik (-fipa-modref), et jĂ€lgida funktsioonide kutsumise kĂ”rvalmĂ”jusid ja suurendada analĂŒĂŒsi tĂ€psust. Parandatud on IPA-ICF (-fipa-icf) kĂ€igu teostus, mille kĂ€igus on vĂ€hendatud mĂ€lu tarbimist kompileerimise ajal ja suurendatud ĂŒhtsete funktsioonide arvu, mille jaoks toimub identsete koodiplokkide ĂŒhendamine. IPA-CP (Interprocedural constant propagation) kĂ€igus on paranenud ennustamise heuristika, arvestades tuntud piire ja tsĂŒklite töö omadusi.
- Sidumisoptimeerimiste rakendamisel (LTO) on baitkoodiformaat optimeeritud suuruse vÀhendamiseks ja töötlemise kiirusetÔstmiseks. Sidumise etapis on tipptaset vÀhendatud mÀlutarbimise osas.
- Koodi profiilimise alusel optimeerimise mehhanismis (PGO â Profile-guided optimization), mis vĂ”imaldab genereerida paremini optimeeritud koodi, pĂ”hinedes tegevuse iseloomu analĂŒĂŒsile, on GCOV-andmefailide suurust vĂ€hendatud tĂ€nu nullkalkulaatorite kompaktsemale pakkimisele. Parandatud on reĆŸiimi â-fprofile-valuesâ toimimist, tĂ€nu suuremale parameetrite jĂ€lgimisele kaudsete kutsetega.
- JĂ€tkub OpenMP 5.0 (Open Multi-Processing) standardi rakendamine, mis mÀÀratleb API ja meetodid paralleelse programmeerimise rakendamiseks mitme tuumaga ja hĂŒbriidsetes (CPU+GPU/DSP) sĂŒsteemides koos jagatud mĂ€lu ja vektorimisplokkidega (SIMD). Lisatud on esmane tugi allocate-direktiivile ja vĂ”imalus kasutada ebaĂŒhtlasi tsĂŒkleid OpenMP konstruktsioonides. On rakendatud keskkonna muutuja OMP_TARGET_OFFLOAD toetus.
- C, C++ ja Fortran'i keelte jaoks on parendatud OpenACC 2.6 paralleelse programmeerimise spetsifikatsioon, mis mÀÀratleb vahendid operatsioonide (offloading) edastamiseks GPU-dele ja spetsialiseeritud protsessoritele, nagu NVIDIA PTX.
- C keelte peres on sisse viidud uus atribuudi âno_stack_protectorâ for, mis tĂ€histab funktsioone, mille puhul ei tohiks aktiveerida stack'i kaitset (â-fstack-protectorâ). Atribuut âmallocâ on laiendatud mĂ€luhaldurite ja vabastajate (allocator/deallocator) kutsete paaride identifitseerimise toega, mis kasutatakse staatilises analĂŒsaatoris, et tuvastada tĂŒĂŒpilisi mĂ€luhalduse vigu (mĂ€lu lekked, kasutamine pĂ€rast vabastamist, funktsiooni free kahekorraline kutsumine jne) ja kaasata kompilaatori hoiatused â-Wmismatched-deallocâ, â-Wmismatched-new-deleteâ ja â-Wfree-nonheap-objectâ, teavitades mĂ€luhaldusoperatsioonide ebajooksust.
- C keelele on lisatud uusi hoiatusi:
- â-Wmismatched-deallocâ (vaikimisi aktiivne) â hoiatab mĂ€lu vabastamise operatsioonide eest, kus kasutatakse nĂ€idikut, mis ei ĂŒhildu mĂ€lu jaotamise funktsioonidega.
- «-Wsizeof-array-div» (lĂŒlitatakse sisse, kui on mÀÀratud «-Wall») â hoiatab, kui jagatakse kahte sizeof operaatorit, kui jagaja ei vasta massiivi elemendi suurusele.
- «-Wstringop-overread» (vaikimisi sisse lĂŒlitatud) â hoiatab, kui stringifunktsioon kutsub andmeid lugema massiivi piirest vĂ€ljapoole.
- «-Wtsan» (vaikimisi sisse lĂŒlitatud) â hoiatab, kui kasutatakse funksioone (nt std::atomic_thread_fence), mida ThreadSanitizer ei toeta.
- «-Warray-parameter» ja «-Wvla-parameter» (lĂŒlitatakse sisse, kui on mÀÀratud «-Wall») â hoiatab, kui funktsioonide ĂŒlekirjutamine ei ĂŒhti massiivi fikseeritud ja muutliku pikkusega argumentide kuulutustega.
- Hoiatus «-Wuninitialized» tuvastab nĂŒĂŒd katsed lugeda mitteinitsialiseeritud dĂŒnaamiliselt jaotatud mĂ€lust.
- Hoiatuses «-Wfree-nonheap-object» on laiendatud mÀÀratlemise ulatust, kui vabastamisfunktsioonide kutsumise puhul kasutatakse mitte dĂŒnaamilise mĂ€lu jaotamise funktsioonide kaudu saadud ponteerijat.
- Hoiatuses «-Wmaybe-uninitialized» on laiendatud tuvastamine, kui funktsioonidele edastatakse mitteinitsialiseeritud mÀlupiirkondadele viitavad ponteerijad.
- C keele jaoks on ellu viidud uus hulk vĂ”imalusi, mis arendatakse C2X standardi raames (lĂŒlitatakse sisse valikuga -std=c2x ja -std=gnu2x): makrod BOOL_MAX ja BOOL_WIDTH, valikuline mittekasutatud parameetrite nimede mÀÀramine funktsioonide mÀÀratlemisel (nagu C++-s), atribuut â[[nodiscard]]â, eelprotsessor ĐŸĐżĐ”Ńаtor â__has_c_attributeâ, makrod 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 ja DEC_NAN, NaN=makrod FloatN, _FloatNx ja _DecimalN, vĂ”imalus mÀÀrata ĂŒlemineku silte enne deklaratsioone ja koostatud operaatorite lĂ”pus.
- C++ jaoks on ellu viidud hulk muudatusi ja uuendusi, mis on ette pandud C++20 standardis, sealhulgas virtuaalsed funktsioonid âconsteval virtualâ, vale-destruktorite objektide elutsĂŒkli lĂ”puks, enum klassi kasutamine ja massi suuruse arvutamine ânewâ vĂ€ljendis.
- C++-s on lisatud eksperimentaalne tugi mitmete tĂ€ienduste jaoks, mis on arendamisel tulevase C++23 standardi jaoks (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu++2b). NĂ€iteks on lisatud toetus tĂ€histuslisandi âzuâ kasutamiseks signaalsete size_t vÀÀrtuste puhul.
- libstdc++-s on paranenud C++17 standardi tugi, sealhulgas std::from_chars ja std::to_chars rakenduste lisamine ujuvate arvutĂŒĂŒpide jaoks. Uued C++20 standardi elemendid, sealhulgas std::bit_cast, std::source_location, aatomilised operatsioonid wait ja notify, , , , , samuti tulevase C++23 standardi elemendid (std::to_underlying, std::is_scoped_enum) on rakendatud. Eksperimentaalne toetus andmete paralleelse töötlemise (SIMD, andmete paralleeltĂŒĂŒbid) jaoks on lisatud. std::uniform_int_distribution rakendust on kiiremaks muudetud.
- libgccjit-lt on eemaldatud alfa-kvaliteedi mÀrk, mis on jagatud teek, et integreerida koodigeneraator teistesse protsessidesse ja kasutada JIT-kompileerimise korraldamiseks bytekoodist masinkoodiks. Lisatud on vÔimalus kompileerida libgccjit MinGW-le.
- AArch64 Armv8-R (-march=armv8-r) arhitektuuri toetus on lisatud. AArch64 ja ARM arhitektuuride jaoks on lisatud tugiprotsessorid (valikud -mcpu ja -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) ja Arm Neoverse N2 (neoverse-n2). Samuti on lisatud CPU-d Fujitsu A64FX (a64fx) ja Arm Cortex-R82 (cortex-r82), mis toetavad ainult AArch64 arhitektuuri.
- Lisatud on tugi SIMD-i kÀskude kasutamiseks Armv8.3-a (AArch64 / AArch32), SVE (AArch64), SVE2 (AArch64) ja MVE (AArch32 M-profiil) automaatvektoriseerimiseks operatsioonide jaoks, mis teostavad liitmist, lahutamist, korrutamist ja liitmise / lahutamise variante kompleksnumbritega. ARM-i jaoks on lisatud algne tugi automaatvektoriseerimiseks MVE kÀskude kogumi abil.
- ARM-plaatformidele on pakutud tÀielik kogum C funktsioone (Intrinsics), mis on asendatud laiendatud vektori kÀskudega (SIMD), hÔlmates kÔik NEON-i kÀskud, mis on dokumenteeritud ACLE Q3 2020 spetsifikatsioonis.
- GPU AMD koodigeneraatori tagaplaanile, mis pÔhineb GCN mikroarhitektuuril, on lisatud tugi GPU gfx908-le.
- Lisatud on uute protsessorite ja nende uusimate kÀskude kogumi toetamine:
- Intel Sapphire Rapids (-march=sapphirerapids, sisaldab kÀskude tugi MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 ja AVX-VNNI).
- Intel Alderlake (-march=alderlake, sisaldab kÀskude tugi CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI ja HRESET).
- Intel Rocketlake (-march=rocketlake, Rocket Lake'i analoog ilma SGX toeta).
- AMD Zen 3 (-march=znver3).
- Intel'i pĂ”hjal pĂ”hinevatele IA-32/x86-64 sĂŒsteemidele on lisatud tugi uutele protsessori kĂ€sukogudele: TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
- On lisatud toetused lippudele «-march=x86-64-v[234]» arhitektuuri tasemete valimiseks x86-64-s (v2 â katab laiendusi SSE4.2, SSSE3, POPCNT ja CMPXCHG16B; v3 â AVX2 ja MOVBE; v4 â AVX-512).
- On lisatud RISC-V sĂŒsteemide tugi, mille korral on baitide jĂ€rjekord «big-endian». Lisatud on valik «-misa-spec=*» RISC-V kĂ€sukogude spetsifikatsiooni versiooni valimiseks. Lisatud on AddressSanitizer ja virna kaitse kanarootsade abil.
- On jĂ€tkatud staatilise analĂŒĂŒsi reĆŸiimi «-fanalyzer» tĂ€iustamist, mis teostab ressursimahukat vaheprotseduuride analĂŒĂŒsi koodi tĂ€itmise radadest ja andmevoogudest programmis. ReĆŸiim suudab kompileerimise etapis tuvastada selliseid probleeme nagu kahekordne free() funktsiooni kutse sama mĂ€luala jaoks, faili descriptorite lekkeid, nullpunktide derreferentsimist ja edastamist, vabastatud mĂ€lublokkidele juurdepÀÀsu, mitte-initsialiseeritud vÀÀrtuste kasutamist jne. Uues versioonis:
- Kood on tĂ€ielikult ĂŒmber kirjutatud, et jĂ€lgida programmi seisundit. Suured C-failid kontrollimisega seotud probleemid on lahendatud.
- C++ algtoetuse lisamine.
- MĂ€lu eraldamise ja vabastamise analĂŒĂŒs on abstraktne spetsiifilistest malloc ja free funktsioonidest ning toetab nĂŒĂŒd new/delete ja new[]/delete[].
- Uued hoiatusteated: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const ja -Wanalyzer-write-to-string-literal.
- Uued silumisvalikud -fdump-analyzer-json ja -fno-analyzer-feasibility on lisatud.
- AnalĂŒsaatori laiendamine GCC pluginatega on rakendatud (nt GMPythonis vale globaalsete lukustuste (GIL) kasutamise kontrollimiseks on plugin ette valmistatud).
Allikas: opennet.ru
