GCC 11 kompiliatoriaus rinkinio išleidimas

Po metų kūrimo buvo išleistas nemokamas GCC 11.1 kompiliatoriaus rinkinys, pirmasis reikšmingas leidimas naujojoje GCC 11.x šakoje. Pagal naują leidimų numeravimo schemą kūrimo metu buvo naudojama 11.0 versija, o prieš pat GCC 11.1 išleidimą jau buvo išsišakojusi GCC 12.0 atšaka, iš kurios bus suformuota kita reikšminga GCC 12.1 versija.

GCC 11.1 pasižymi perėjimu prie DWARF 5 derinimo failo formato pagal numatytuosius nustatymus, numatytuoju C++17 standarto („-std=gnu++17“) įtraukimu, reikšmingais C++20 palaikymo patobulinimais. standartas, eksperimentinis C++23 palaikymas, patobulinimai, susiję su būsimu C kalbos standartu (C2x), nauji našumo optimizavimai.

Pagrindiniai pakeitimai:

  • Numatytasis C++ kalbos režimas buvo perjungtas, kad būtų naudojamas C++17 standartas (-std=gnu++17), o ne anksčiau pasiūlytas C++14. Galima pasirinktinai išjungti naują C++17 elgseną apdorojant šablonus, kuriuose kaip parametras naudojami kiti šablonai (-fno-new-ttp-matching).
  • Pridėtas „AddressSanitizer“ įrankio aparatinės įrangos pagreičio palaikymas, leidžiantis nustatyti prieigos prie atlaisvintų atminties sričių, skirto buferio ribų peržengimo ir kai kurių kitų tipų klaidų dirbant su atmintimi faktus. Aparatinės įrangos spartinimas šiuo metu galimas tik AArch64 architektūrai ir yra skirtas naudoti kompiliuojant Linux branduolį. Norint įgalinti AddressSanitizer aparatinės įrangos spartinimą kuriant vartotojo erdvės komponentus, buvo pridėta vėliavėlė „-fsanitize=hwaddress“ ir branduolio vėliavėlė „-fsanitize=kernel-hwaddress“.
  • Generuojant derinimo informaciją, pagal nutylėjimą naudojamas DWARF 5 formatas, kuris, lyginant su ankstesnėmis versijomis, leidžia generuoti 25% kompaktiškesnius derinimo duomenis. Visiškam DWARF 5 palaikymui reikalinga bent 2.35.2 binutils versija. DWARF 5 formatas palaikomas derinimo įrankiuose nuo GDB 8.0, valgrind 3.17.0, elfutils 0.172 ir dwz 0.14. Norėdami sugeneruoti derinimo failus naudodami kitas DWARF versijas, galite naudoti parinktis „-gdwarf-2“, „-gdwarf-3“ ir „-gdwarf-4“.
  • Padidinti reikalavimai kompiliatoriams, kuriuos galima naudoti kuriant GCC. Dabar kompiliatorius turi palaikyti C++11 standartą (anksčiau buvo reikalingas C++98), t.y. Jei GCC 10 kūrimui pakako GCC 3.4, tai dabar norint sukurti GCC 11 reikia bent GCC 4.8.
  • Pakeistas sąvartynų, laikinųjų failų ir papildomos informacijos, reikalingos LTO optimizavimui, saugojimo failų pavadinimas ir vieta. Tokie failai dabar visada išsaugomi esamame kataloge, nebent kelias būtų aiškiai pakeistas naudojant parinktis "-dumpbase", "-dumpdir" ir "-save-temps=*".
  • Dvejetainio formato BRIG, skirto naudoti su HSAIL (Heterogeneous System Architecture Intermediate Language) kalba, palaikymas buvo nebenaudojamas ir netrukus bus pašalintas.
  • ThreadSanitizer režimo (-fsanitize=thread) galimybės buvo išplėstos, skirtos aptikti lenktynių sąlygas, kai dalijamasi tais pačiais duomenimis iš skirtingų kelių gijų programos gijų. Naujasis leidimas prideda palaikymą alternatyvioms vykdymo laikui ir aplinkoms, taip pat KCSAN (Kernel Concurrency Sanitizer) derinimo įrankiui, skirtą dinamiškai aptikti lenktynių sąlygas Linux branduolyje. Pridėtos naujos parinktys „-param tsan-distinguish-volatile“ ir „-param tsan-instrument-func-entry-exit“.
  • Diagnostinių pranešimų stulpelių numeriai dabar atspindi ne baitų skaičių nuo eilutės pradžios, o iš tikrųjų stulpelių numerius, kuriuose atsižvelgiama į kelių baitų simbolius ir simbolius, užimančius kelias eilutės pozicijas (pavyzdžiui, simbolis 🙂 užima dvi pozicijas ir yra užkoduotas 4 baitais). Taip pat tabuliavimo simboliai dabar traktuojami kaip tam tikras tarpų skaičius (konfigūruojamas naudojant -ftabstop parinktį, numatytoji 8). Norint atkurti seną elgseną, siūloma parinktis „-fdiagnostics-column-unit=byte“, o norint nustatyti pradinę reikšmę (numeracija nuo 0 arba 1) - parinktis „-fdiagnostics-column-origin=“.
  • Vektorizatorius atsižvelgia į visą funkcijos turinį ir prideda apdorojimo galimybes, susijusias su sankirtomis ir nuorodomis į ankstesnius blokus valdymo srauto grafike (CFG, valdymo srauto grafikas).
  • Optimizavimo priemonė įgyvendina galimybę konvertuoti sąlyginių operacijų, kurios lygina tą patį kintamąjį, seriją į perjungimo išraišką. Komutatoriaus išraiška vėliau gali būti užkoduota naudojant bitų testavimo instrukcijas (tokiam konvertavimui valdyti buvo pridėta parinktis „-fbit-tests“).
  • Patobulintas tarpprocedūrinis optimizavimas. Pridėtas naujas IPA-modref leidimas (-fipa-modref), kad būtų galima stebėti šalutinį poveikį skambinant į funkcijas ir pagerinti analizės tikslumą. Patobulintas IPA-ICF leidimo (-fipa-icf) įgyvendinimas, kuris sumažina atminties sąnaudas kompiliavimo metu ir padidina vieningų funkcijų, kurioms derinami identiški kodo blokai, skaičių. IPA-CP (Interprocedūrinis pastovus sklidimas) leidime prognozavimo euristika buvo patobulinta, atsižvelgiant į žinomas kilpų ribas ir ypatybes.
  • Linking Time Optimizations (LTO) baitų kodo formatas optimizuotas, kad sumažintų dydį ir pagerintų apdorojimo greitį. Sumažintas didžiausias atminties suvartojimas susiejimo fazėje.
  • Optimizavimo mechanizme, pagrįstame kodo profiliavimo rezultatais (PGO - Profile-guided optimization), leidžiančiame generuoti optimalesnį kodą remiantis vykdymo ypatybių analize, failų su GCOV duomenimis dydis sumažinamas dėl kompaktiškesnio nulinių skaitiklių pakuotės. . Patobulintas „-fprofile-values“ režimas, stebint daugiau netiesioginių skambučių parametrų.
  • Įdiegus OpenMP 5.0 (Open Multi-Processing) standartą, kuris apibrėžia API ir lygiagretaus programavimo metodų taikymo metodus kelių branduolių ir hibridinėse (CPU+GPU/DSP) sistemose su bendra atmintimi ir vektorizavimo įrenginiais (SIMD). tęsė. Pridėtas pradinis paskirstymo direktyvos palaikymas ir galimybė OpenMP konstrukcijose naudoti nevienalytes kilpas. Įdiegtas aplinkos kintamojo OMP_TARGET_OFFLOAD palaikymas.
  • Patobulintas OpenACC 2.6 lygiagretaus programavimo specifikacijos, numatytos C, C++ ir Fortran kalboms, įgyvendinimas, kuris apibrėžia GPU ir specializuotų procesorių, tokių kaip NVIDIA PTX, operacijų iškrovimo įrankius.
  • C kalboms įdiegtas naujas atributas „no_stack_protector“, skirtas funkcijoms, kurioms neturėtų būti įjungta dėklo apsauga, pažymėti („-fstack-protector“). Atributas „malloc“ buvo išplėstas, kad būtų galima identifikuoti iškvietimų poras, skirtas skirti ir atlaisvinti atmintį (alokatorius / skirstytuvas), kuris naudojamas statiniame analizatoriuje tipinėms darbo su atmintimi klaidoms nustatyti (atminties nutekėjimas, naudojimas po atlaisvinimo, dvigubi iškvietimai į laisvąją funkciją ir t. t.) ir kompiliatoriaus įspėjimuose „-Wmismatched-dealloc“, „-Wmismatched-new-delete“ ir „-Wfree-nonheap-object“, informuojant apie atminties išskyrimo ir atminties paskirstymo operacijų nenuoseklumą.
  • C kalbai buvo pridėti nauji įspėjimai:
    • „-Wmismatched-dealloc“ (įjungta pagal numatytuosius nustatymus) – įspėja apie atminties atskyrimo operacijas, kuriose naudojamas žymeklis, nesuderinamas su atminties paskirstymo funkcijomis.
    • „-Wsizeof-array-div“ (įjungta, kai nurodyta „-Siena“) – įspėja apie dviejų operatorių dydžio padalijimą, jei daliklis neatitinka masyvo elemento dydžio.
    • „-Wstringop-overread“ (įjungta pagal numatytuosius nustatymus) – įspėja apie iškvietimą eilutės funkcijos, kuri nuskaito duomenis iš srities, esančios už masyvo ribos.
    • „-Wtsan“ (įgalinta pagal numatytuosius nustatymus) – įspėja apie funkcijų (pvz., std::atomic_thread_fence), kurios nepalaikomos ThreadSanitizer, naudojimą.
    • „-Warray-parameter“ ir „-Wvla-parameter“ (įjungiama nurodant „-Wall“) – įspėja apie funkcijų nepaisymą su nesuderinamais argumentų, susijusių su fiksuoto ir kintamo ilgio masyvais, deklaracijomis.
    • Įspėjimas „-Wuninitialized“ dabar aptinka bandymus skaityti iš neinicijuotos dinamiškai paskirstytos atminties.
    • Įspėjimas „-Wfree-nonheap-object“ išplečia atvejų, kai atminties išskyrimo funkcijos iškviečiamos naudojant rodyklę, negaunamą naudojant dinaminės atminties paskirstymo funkcijas, apibrėžimą.
    • Įspėjimas „-Wmaybe-unitialized“ išplėtė nukreipiančių rodyklių aptikimą į funkcijas, kurios nurodo inicijuotas atminties vietas.
  • C kalbai buvo įdiegta dalis naujų funkcijų, sukurtų pagal C2X standartą (įjungta nurodant -std=c2x ir -std=gnu2x): makrokomandos BOOL_MAX ir BOOL_WIDTH, pasirenkamas nenaudojamų parametrų pavadinimų nurodymas funkcijoje. apibrėžimai (kaip C++), atributas „[ [nodiscard]]“, pirminio procesoriaus operatorius „__has_c_attribute“, makrokomandos FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, F __STDC_WANT_BL_60559AN, IN, XNUMX LDBL_SNAN, DEC_INFINITY ir DEC _NAN, NaN = makrokomandos FloatN, _FloatNx ir _DecimalN, galimybė nurodyti šuolio ženklus prieš deklaracijas ir sudėtinių teiginių pabaigoje.
  • C++ buvo įdiegta dalis C++20 standarte siūlomų pakeitimų ir naujovių, įskaitant virtualias funkcijas „consteval virtual“, pseudodestruktorius, skirtus objektų gyvavimo ciklo pabaigai, enum klasės naudojimą ir masyvo dydžio apskaičiavimas „naujoje“ išraiškoje.
  • C++ buvo pridėtas eksperimentinis palaikymas kai kuriems būsimojo C++23 standarto patobulinimams (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Pavyzdžiui, dabar palaikoma pažodinė priesaga „zu“, skirta pasirašytoms size_t reikšmėms.
  • libstdc++ pagerino C++17 standarto palaikymą, įskaitant std::from_chars ir std::to_chars įgyvendinimą slankiojo kablelio tipams. Įdiegti nauji C++20 standarto elementai, įskaitant std::bit_cast, std::source_location, atominės operacijos laukti ir pranešti, , , , , taip pat elementų būsimas C++ standartas 23 (std::to_underlying, std::is_scoped_enum). Pridėtas eksperimentinis lygiagretaus duomenų apdorojimo tipų palaikymas (SIMD, Data-Parallel Types). std::uniform_int_distribution diegimas buvo paspartintas.
  • Pašalinta alfa kokybės vėliavėlė iš libgccjit – bendrinamos bibliotekos, skirtos kodo generatoriui įterpti į kitus procesus ir naudoti jį organizuojant JIT baitinio kodo kompiliavimą į mašinos kodą. Pridėta galimybė sukurti libgccjit, skirtą MinGW.
  • Pridėtas AArch64 Armv8-R architektūros palaikymas (-march=armv8-r). AArch64 ir ARM architektūroms pridėtas procesorių palaikymas (parametrai -mcpu ir -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) ir Arm Neoverse N2 (neoverse-n2). Taip pat buvo pridėti Fujitsu A64FX (a64fx) ir Arm Cortex-R82 (cortex-r82) procesoriai, palaikantys tik AArch64 architektūrą.
  • Pridėtas Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) ir MVE (AArch32 M profilis) SIMD instrukcijų palaikymas, skirtas automatizuoti sudėjimo, atimties, daugybos ir sudėjimo/atimties variantus. kompleksiniai skaičiai. Pridėtas pradinis ARM automatinio vektorizavimo palaikymas naudojant MVE instrukcijų rinkinį.
  • ARM platformoms pateikiamas visas kompiliatoriaus integruotų C funkcijų rinkinys (Intrinsics), pakeistas išplėstinėmis vektorinėmis instrukcijomis (SIMD), apimančiomis visas NEON instrukcijas, dokumentuotas ACLE Q3 2020 specifikacijoje.
  • Gfx908 GPU palaikymas buvo įtrauktas į užpakalinę programą, kad būtų galima generuoti kodą AMD GPU, pagrįstą GCN mikroarchitektūra.
  • Pridėtas naujų procesorių palaikymas ir juose įdiegti nauji instrukcijų rinkinio plėtiniai:
    • „Intel Sapphire Rapids“ (-march=sapphirerapids, įgalina palaikymą MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-AVX8, AMX-AVX16, XNUMXNIMX-BFXXNUMX, XNUMXNIMX.
    • „Intel Alderlake“ (-march=alderlake, palaiko CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI ir HRESET instrukcijas).
    • Intel Rocketlake (-march=rocketlake, panašus į Rocket Lake be SGX palaikymo).
    • AMD Zen 3 (-march=znver3).
  • IA-32/x86-64 sistemoms, pagrįstoms Intel procesoriais, buvo pridėta naujų procesoriaus instrukcijų TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI palaikymas.
  • Pridėtas vėliavėlių „-march=x86-64-v[234]“ palaikymas, kad būtų galima pasirinkti x86-64 architektūros lygius (v2 – apima SSE4.2, SSSE3, POPCNT ir CMPXCHG16B plėtinius; v3 – AVX2 ir MOVBE; v4 – AVX-512 ).
  • Pridėtas palaikymas RISC-V sistemoms su didele baitų tvarka. Pridėta parinktis „-misa-spec=*“, kad būtų galima pasirinkti RISC-V instrukcijų rinkinio architektūros specifikacijos versiją. Pridėtas AddressSanitizer palaikymas ir krūvos apsauga naudojant kanarėlių žymes.
  • Nuolat tobulinamas statinės analizės režimas “-fanalyzer”, kuris atlieka daug resursų reikalaujančią tarpprocedūrinę kodo vykdymo kelių ir duomenų srautų programoje analizę. Režimas gali aptikti kompiliavimo stadijos problemas, tokias kaip dvigubi iškvietimai į free() funkciją vienoje atminties srityje, failo deskriptoriaus nutekėjimas, nuorodų panaikinimas ir nulinių rodyklių perdavimas, prieiga prie atlaisvintų atminties blokų, naudojant neinicializuotas reikšmes ir kt. Naujoje versijoje:
    • Programos būsenos sekimo kodas buvo visiškai perrašytas. Išspręstos labai didelių C failų nuskaitymo problemos.
    • Pridėtas pradinis C++ palaikymas.
    • Atminties paskirstymo ir išskyrimo analizė buvo abstrahuota iš konkrečių malloc ir nemokamų funkcijų ir dabar palaiko naują / ištrinti ir naują [] / ištrinti[].
    • Pridėta naujų įspėjimų: -Wanalyzer-shift-count-neigiamas, -Wanalyzer-shift-count-overflow, -Wanalyzer-Write-to-const ir -Wanalyzer-Write-to-String-literal.
    • Pridėtos naujos derinimo parinktys -fdump-analyzer-json ir -fno-analyzer-feasibility.
    • Įdiegta galimybė išplėsti analizatorių per GCC įskiepius (pavyzdžiui, buvo paruoštas įskiepis, skirtas patikrinti, ar CPython sistemoje netinkamai naudojamas visuotinis užraktas (GIL).

Šaltinis: opennet.ru

Добавить комментарий