GCC 10 kompiliatoriaus rinkinio išleidimas

Po metų plėtros paskelbti nemokamo kompiliatorių rinkinio išleidimas GCC 10.1, pirmasis didelis leidimas naujoje GCC 10.x šakoje. Pagal nauja schema laidų numerius, kūrimo procese buvo naudojama 10.0 versija, o prieš pat GCC 10.1 išleidimą jau buvo atsišakojusi GCC 11.0 šaka, kurios pagrindu būtų formuojama kita reikšminga laida – GCC 11.1.

GCC 10.1 pasižymi daugybe C++ kalbos naujovių, sukurtų C++20 standartui, patobulinimais, susijusiais su būsimu C kalbos standartu (C2x), naujais kompiliatoriaus užpakalinių sistemų optimizavimu ir eksperimentiniu palaikymu. statinės analizės režimas. Be to, rengiant naują filialą, projektas perkėlė saugyklą iš SVN į Git.

pagrindinis pokyčiai:

  • Pridėta eksperimentinis statinės analizės būdas- fanalizatorius“, kuri atlieka daug resursų reikalaujančią tarpprocedūrinę kodo vykdymo kelių ir duomenų srautų programoje analizę. Režimas gali aptikti problemas kompiliavimo etape, pvz., dvigubus iškvietimus į free() funkciją vienoje atminties srityje, failo deskriptoriaus nutekėjimą, nulinių rodyklių panaikinimą ir perdavimą, prieigą prie atlaisvintų atminties blokų, neinicializuotas vertes ir pan. Naujojo režimo naudojimas OpenSSL kodui jau leido nustatyti pavojingas pažeidžiamumas.
  • Patobulintas tarpprocedūrinis optimizavimas. IPA-SRA (Interprocedural Scalar Shared Replacement) leidimas buvo perkurtas, kad veiktų surišimo metu ir, be kita ko, dabar pašalina apskaičiuotas ir grąžintas nepanaudotas vertes. Optimizavimo režimu „-O2“ įjungta parinktis „-finline-functions“, kuri iš naujo suderinama, kad būtų teikiama pirmenybė kompaktiškesniam kodui, o ne vykdymo našumui. Buvo paspartintas eilutinės funkcijos diegimo euristikos darbas. Inline plėtimosi ir funkcijų klonavimo euristika dabar gali naudoti informaciją apie reikšmių diapazonus, kad būtų galima numatyti atskirų transformacijų efektyvumą. C++ atveju patobulintas tipu pagrįsto slapyvardžių analizės tikslumas.
  • Patobulintas susiejimo laiko optimizavimas (LTO). Pridėtas naujas vykdomasis failas lto-sąvartynas iš naujo nustatyti informaciją apie objektų failus su LTO baito kodu. Lygiagretūs LTO leidimai automatiškai nustato vienu metu vykdomų make užduočių skaičių ir, jei jų neįmanoma nustatyti, kaip lygiagretinimo koeficientą naudoja informaciją apie procesoriaus branduolių skaičių. Pridėta galimybė suspausti LTO baitinį kodą naudojant zstd algoritmą.
  • Patobulintas kodo profiliavimo (PGO – Profile-guided optimization) rezultatais pagrįstas optimizavimo mechanizmas, kuris generuoja optimalesnį kodą, remiantis kodo vykdymo charakteristikų analize. Patobulinta profilio priežiūra kompiliavimo ir karšto/šalto kodo atskyrimo metu. Per parinktį "-fprofilio vertės» dabar gali stebėti iki 4 profilio reikšmių, pavyzdžiui, netiesioginių skambučių ir tikslesnės profilio informacijos.
  • Lygiagretaus programavimo specifikacija įdiegta C, C++ ir Fortran kalboms OpenACC 2.6, kuri apibrėžia GPU ir specializuotų procesorių, pvz., NVIDIA PTX, operacijų iškrovimo įrankius. Standarto įgyvendinimas beveik baigtas „OpenMP 5.0“ (Open Multi-Processing), kuri apibrėžia API ir lygiagretaus programavimo metodų taikymo kelių branduolių ir hibridinėse (CPU+GPU/DSP) sistemose su bendra atmintimi ir vektorizavimo įrenginiais (SIMD) metodus. Pridėtos funkcijos, tokios kaip paskutinės privačios sąlygos, nuskaitymo ir ciklo direktyvos, tvarkos ir use_device_addr išraiškos. „OpenMP“ ir „OpenACC“ buvo pridėtas ketvirtos kartos (Fidžis) ir penktos kartos AMD Radeon (GCN) GPU (VEGA 10 / VEGA 20) iškrovimo operacijų palaikymas.
  • C šeimos kalboms buvo pridėta funkcija „prieiga“, kad apibūdintų funkcijos prieigą prie objektų, perduodamų pagal nuorodą arba rodyklę, ir susieti tokius objektus su sveikųjų skaičių argumentais, kuriuose yra informacijos apie objektų dydį. Norint dirbti kartu su „prieiga“, atributas „type“ yra įdiegtas, kad aptiktų neteisingą vartotojo funkcijų prieigą, pavyzdžiui, rašant reikšmes į sritį, esančią už masyvo ribų. Taip pat pridedamas atributas "symver", skirtas susieti simbolius ELF faile su konkrečiais versijos numeriais.
  • Pridėta naujų įspėjimų:
    • „-Wstring-palyginti“ (įjungta naudojant „-Wextra“) – įspėja apie reiškinius, kuriuose nulis lyginamas su strcmp ir strncmp funkcijų iškvietimo rezultatu, kuris yra lygiavertis konstantai dėl to, kad ilgis vieno argumento dydis yra didesnis nei antrojo argumento masyvo dydis.
    • „-Wzero-length-bounds“ (įjungta su „-Warray-bounds“) – įspėja apie prieigą prie nulinio ilgio masyvo elementų, dėl kurių gali būti perrašyti kiti duomenys.
    • Įspėjimai „-Warray-bounds“, „-Wformat-overflow“, „-Wrestrict“, „-Wreturn-local-addr“ ir „-Wstringop-overflow“ buvo išplėsti, kad padidėtų situacijų, kurios viršija ribas, skaičių. kurie yra tvarkomi.
  • Įdiegta galimybė tiesiogiai nurodyti plačius simbolius identifikatoriuose naudojant dabartinę kodavimą (pagal numatytuosius nustatymus UTF-8), o ne UCN žymėjimą (\uNNNN arba \UNNNNNNNN). Pavyzdžiui:

    statinis const int π = 3;
    int get_naive_pi() {
    grąžinti π;
    }

  • C kalbai buvo įdiegta dalis naujų funkcijų, sukurtų C2X standarte (įjungta nurodant -std=c2x ir -std=gnu2x): atsirado „[[]]“ sintaksės palaikymas apibrėžiant atributus, kaip nurodyta C++ (pavyzdžiui, [[gnu ::const]], [[nebenaudojama]], [[fallthrough]] ir [[maybe_unused]]. Pridėtas „u8“ sintaksės palaikymas konstantoms su UTF-8 simboliais apibrėžti.
    Pridėtos naujos makrokomandos . Prie strftime pridėti „%OB“ ir „%Ob“ pakeitimai.

  • Pagal numatytuosius nustatymus C naudoja "-fno-common" režimą, kuris leidžia efektyviau pasiekti pasaulinius kintamuosius kai kuriose platformose.
  • Dėl C++ įdiegta apie 16 pakeitimų ir naujovių, sukurtų C++20 standarte. Įskaitant pridėtą raktinį žodį „constitin“
    ir buvo įdiegtas šablonų plėtinių palaikymas "koncepcijos“. Sąvokos leidžia apibrėžti šablono parametrų reikalavimų rinkinį, kuris kompiliavimo metu apriboja argumentų, kuriuos galima priimti kaip šablono parametrus, rinkinį. Šios sąvokos gali būti naudojamos siekiant išvengti loginių neatitikimų tarp šablone naudojamų duomenų tipų savybių ir įvesties parametrų duomenų tipo savybių.

  • G++ leidžia aptikti neapibrėžtą elgesį, kurį sukelia pastovių objektų keitimas naudojant constexpr. Sumažėjęs kompiliatoriaus atminties suvartojimas skaičiuojant constexpr. Pridėta naujų įspėjimų „-Wmismatched-tags“ ir „-Wredundant-tags“.
  • Buvo pasiūlytos naujos komandinės eilutės parinktys:
    • „-fallocation-dce“, kad pašalintumėte nereikalingas „naujų“ ir „delete“ operatorių poras.
    • „-fprofile-partial-training“, kad išjungtumėte kodo, kuriame nėra treniruotės, dydžio optimizavimą.
    • "-fprofile-atkuriama, kad būtų galima valdyti profilio atkuriamumo lygį.
    • „-fprofile-prefix-path“, kad apibrėžtų pagrindinio šaltinio kūrimo katalogą, naudojamą atskiram profilio generavimui („-fprofile-generate=profile_dir“ ir „-fprofile-use=profile_dir“).
  • Minėtų parinkčių įspėjamajame tekste pateikiami hipersaitai, leidžiantys pereiti į šių parinkčių dokumentaciją. URL pakeitimas valdomas naudojant parinktį „-fdiagnostics-urls“.
  • Pridėtas pirminio procesoriaus operatorius "__turi_pastatytas“, kurį galima naudoti norint patikrinti, ar nėra įmontuotų funkcijų.
  • Pridėta nauja integruota funkcija „__builtin_roundeven“ su apvalinimo funkcijos, apibrėžtos ISO/IEC TS 18661 specifikacijoje, įgyvendinimu, panašiai kaip „apvalinimas“, bet dalis apvalinama didesne nei 0.5 (iki didesnės vertės), mažesnė nei 0.5 - žemyn (iki nulio) ir lygus 0.5 - pradedant nuo priešpaskutinio skaitmens pariteto.
  • AArch64 architektūrai buvo pridėtas SVE2 plėtinio palaikymas ir patobulintas SVE (Scalable Vector Extension) palaikymas, įskaitant papildomą integruotų SVE ACLE funkcijų ir tipų palaikymą bei vektorizavimo naudojimą. Išplėstas LSE (Large System Extensions) ir TME (Transactional Memory Extension) palaikymas. Pridėtos naujos instrukcijos, siūlomos Armv8.5-A ir Armv8.6-A, įskaitant atsitiktinių skaičių generavimo, apvalinimo, atminties žymų susiejimo instrukcijas,
    bfloat16 ir matricos daugyba. Pridėtas procesoriaus palaikymas
    Ranka Cortex-A77,
    Ranka Cortex-A76AE,
    Ranka Cortex-A65,
    Ranka Cortex-A65AE,
    Ranka Cortex-A34 ir
    Marvell ThunderX3.

  • Pridėtas ABI FDPIC (32 bitų funkcijų rodyklių) palaikymas, skirtas ARM64. Pertvarkytas ir optimizuotas 64 bitų sveikųjų skaičių operacijų apdorojimas. Pridėtas procesoriaus palaikymas
    Ranka Cortex-A77,
    Ranka Cortex-A76AE ir
    Rankena Cortex-M35P. Išplėstas ACLE duomenų apdorojimo instrukcijų palaikymas, įskaitant 32 bitų SIMD, 16 bitų dauginimą, fiksavimo aritmetiką ir kitus DSP algoritmų optimizavimus. Pridėtas eksperimentinis ACLE CDE (Custom Datapath Extension) instrukcijų palaikymas.

  • Žymiai patobulintas kodo generavimas ir vektorizavimas AMD GPU, pagrįsto GCN mikroarchitektūra, fone.
  • Pridėtas palaikymas į XMEGA panašius įrenginius AVR architektūrai
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmegame808ATga809ATme1608, ATmegame1609ATme3208 , ATmega3209, ATmega4808 4809, ATmegaXNUMX ir ATmegaXNUMX.

  • IA-32/x86-64 architektūroms buvo pridėtas naujas Intel ENQCMD instrukcijų rinkinio architektūros plėtinys (-menqcmd). Pridėtas „Intel Cooperlake“ (-march=cooperlake, apima AVX512BF16 ISA plėtinį) ir „Tigerlake“ (-march=tigerlake, apima MOVDIRI, MOVDIR64B ir AVX512VP2INTERSECT ISA plėtinius) procesorių palaikymas.
  • HSAIL (Heterogeneous System Architecture Intermediate Language) diegimas heterogeninėms skaičiavimo sistemoms, pagrįstas HSA architektūra, buvo pasenęs ir greičiausiai bus pašalintas būsimame leidime.

Šaltinis: opennet.ru

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