Liberigo de la GCC 10 kompililo

Post jaro da evoluo eldonita liberigo de libera aro de kompililoj GCC 10.1, la unua grava eldono en la nova GCC 10.x branĉo. Konforme nova skemo eldonaj nombroj, versio 10.0 estis uzata en la evoluprocezo, kaj baldaŭ antaŭ la liberigo de GCC 10.1, la branĉo GCC 11.0 jam disbranĉiĝis, surbaze de kiu la sekva signifa eldono, GCC 11.1, estus formita.

GCC 10.1 estas rimarkinda pro la efektivigo de multaj inventoj en la C++-lingvo evoluigita por la C++20-normo, plibonigoj ligitaj al la estonta C-lingva normo (C2x), novaj optimumigoj en la kompililo-backends kaj eksperimenta subteno. statika analiza reĝimo. Krome, dum la preparado de nova branĉo, la projekto translokigis la deponejon de SVN al Git.

Ĉefa ŝanĝi:

  • Aldonita eksperimenta reĝimo de senmova analizo"-fananalizilo", kiu elfaras rimedintensan interproceduran analizon de kodaj ekzekutvojoj kaj datumfluoj en programo. La reĝimo kapablas detekti problemojn ĉe la kompilfazo, kiel duoblaj vokoj al la free() funkcio por unu memorareo, dosierpriskribiloj likoj, dereferencing kaj preterpasado de nulaj montriloj, aliro al liberigitaj memorblokoj, uzante neinicialigitajn valorojn, ktp. La uzo de la nova reĝimo por OpenSSL-kodo jam ebligis identigi danĝera vundebleco.
  • Plibonigitaj interproceduraj optimumoj. La enirpermesilo IPA-SRA (Interprocedural Scalar Shared Replacement) estis restrukturita por funkcii je ligotempo kaj, interalie, nun forigas komputitajn kaj redonitajn neuzatajn valorojn. En la "-O2" optimumiga reĝimo, la opcio "-finline-functions" estas ebligita, kiu estas reagordita por favori pli kompaktan kodon super ekzekutfunkcio. La laboro de la heŭristiko por enlinia funkcio deplojo estis akcelita. Enlinia vastiĝo kaj funkciklonada heŭristiko nun povas uzi informojn pri valorintervaloj por antaŭdiri la efikecon de individuaj transformoj. Por C++, la precizeco de tip-bazita kaŝnomo-analizo estis plibonigita.
  • Plibonigitaj Interligaj Tempo-Optimigoj (LTO). Aldonita nova rulebla lto-dump por restarigi informojn pri objektodosieroj kun LTO-bajtkodo. Paralelaj LTO-enirpermesiloj aŭtomate determinas la nombron da samtempe kurantaj farotaskoj kaj, se ili ne povas esti determinitaj, utiligas informojn pri la nombro da CPU-kernoj kiel paraleligfaktoron. Aldonis la kapablon kunpremi LTO-bajtkodon per la zstd-algoritmo.
  • La optimumiga mekanismo bazita sur la rezultoj de koda profilado (PGO - Profile-guided optimization) estis plibonigita, kiu generas pli optimuman kodon bazitan sur analizo de la karakterizaĵoj de koda ekzekuto. Plibonigita prizorgado de profiloj dum kompilo kaj varma/malvarma koda apartigo. Per la opcio "-fprofile-valoroj» nun povas kontroli ĝis 4 profilvalorojn, ekzemple por nerektaj vokoj kaj disponigante pli precizajn profilinformojn.
  • Paralela programa specifo efektivigita por C, C++ kaj Fortran lingvoj OpenACC 2.6, kiu difinas ilojn por malŝarĝi operaciojn sur GPU-oj kaj specialigitaj procesoroj kiel NVIDIA PTX. Efektivigo de la normo estas preskaŭ kompleta Malfermu MP 5.0 (Malferma Multi-Processing), kiu difinas la API kaj metodojn de aplikado de paralelaj programaj metodoj sur plurkernaj kaj hibridaj (CPU+GPU/DSP) sistemoj kun komuna memoro kaj vektorigaj unuoj (SIMD). Aldonitaj funkcioj kiel lastprivate kondiĉoj, skanado kaj buklo direktivoj, ordigi kaj use_device_addr esprimoj. Por OpenMP kaj OpenACC, subteno estis aldonita por malŝarĝado de operacioj sur kvara generacio (Fiĝioj) kaj kvina generacio AMD Radeon (GCN) GPUoj (VEGA 10/VEGA 20).
  • Por lingvoj de la C-familio, la funkcio "aliro" estis aldonita por priskribi la aliron de la funkcio al objektoj pasigitaj per referenco aŭ montrilo, kaj por asocii tiajn objektojn kun entjeraj argumentoj enhavantaj informojn pri la grandeco de la objektoj. Por labori kune kun "aliro", la atributo "tipo" estas efektivigita por detekti malĝustan aliron de uzantfunkcioj, ekzemple, kiam oni skribas valorojn al areo ekster la limoj de la tabelo. Aldonas ankaŭ la atributo "symver" por asocii simbolojn en ELF-dosiero kun specifaj versinumeroj.
  • Novaj avertoj aldonitaj:
    • "-Wstring-compare" (ebligita per "-Wextra") - avertas pri la ĉeesto de esprimoj, en kiuj nulo estas komparata kun la rezulto de vokado de la funkcioj strcmp kaj strncmp, kio estas ekvivalenta al konstanto pro la fakto, ke la longo de unu argumento estas pli granda ol la grandeco de la tabelo en la dua argumento.
    • "-Wzero-length-bounds" (ebligita kun "-Warray-bounds") - avertas pri aliro de tabelelementoj de nula longo, kio povas konduki al anstataŭigo de aliaj datumoj.
    • La avertoj "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" kaj "-Wstringop-overflow" estis vastigitaj por pligrandigi la nombron da eksterlimaj situacioj. kiuj estas pritraktitaj.
  • Efektivigis la kapablon rekte specifi larĝajn signojn en identigiloj uzante la nunan kodigon (UTF-8 defaŭlte) prefere ol UCN-notacio (\uNNNN aŭ \UNNNNNNNN). Ekzemple:

    static const int π = 3;
    int get_naïve_pi () {
    reveni π;
    }

  • Por la C-lingvo, parto de novaj funkcioj evoluigitaj ene de la C2X-normo estis efektivigita (ebligita per specifo de -std=c2x kaj -std=gnu2x): aperis subteno por la sintakso "[[]]" por difinado de atributoj kiel en C++ (ekzemple, [[gnu ::const]], [[malrekomendita]], [[fallthrough]] kaj [[eble_unused]]. Aldonita subteno por "u8" sintakso por difini konstantojn kun UTF-8-signoj.
    Aldonitaj novaj makrooj al . Aldonitaj "%OB" kaj "%Ob" anstataŭaĵoj al strftime.

  • La defaŭlta reĝimo por C estas "-fno-common", kio permesas pli efikan aliron al tutmondaj variabloj sur kelkaj platformoj.
  • Por C++, proksimume 16 ŝanĝoj kaj inventoj estis efektivigitaj, evoluigitaj en la C++20-normo. Inkluzive de la aldonita ŝlosilvorto "konstinit"
    kaj subteno por ŝablonaj etendoj estis efektivigita "konceptoj". Konceptoj ebligas al vi difini aron da ŝablonaj parametropostuloj kiuj, en kompilo-tempo, limigas la aron de argumentoj kiuj povas esti akceptitaj kiel ŝablonaj parametroj. La konceptoj povas esti utiligitaj por eviti logikajn faktkonfliktojn inter la trajtoj de la datumtipoj uzitaj ene de la ŝablono kaj la datumtiptrajtoj de la enirparametroj.

  • G++ disponigas detekton de nedifinita konduto kaŭzita de ŝanĝado de konstantaj objektoj per constexpr. Reduktita memorkonsumo de la kompililo dum kalkulado de konstexpr. Aldonitaj novaj avertoj "-Wmismatched-tags" kaj "-Wredundant-tags".
  • Novaj komandliniaj opcioj estis proponitaj:
    • "-fallocation-dce" por forigi nenecesajn parojn de "novaj" kaj "forigi" funkciigistoj.
    • "-fprofile-partial-training" por malŝalti grandeco-optimumigon por kodo, kiu ne havas trejnadon.
    • "-fprofile-reproducible por kontroli la nivelon de profilreproduktebleco.
    • "-fprofile-prefix-path" por difini la bazfontan konstrudosierujon uzatan por aparta profilgenerado (por "-fprofile-generate=profile_dir" kaj "-fprofile-use=profile_dir").
  • En la averta teksto por la menciitaj opcioj, hiperligiloj estas provizitaj, kiuj permesas vin iri al la dokumentado por ĉi tiuj opcioj. URL-anstataŭigo estas kontrolata per la opcio "-fdiagnostics-urls".
  • Aldonita antaŭprocesora operatoro "__havas_konstruita", kiu povas esti uzata por kontroli enkonstruitajn funkciojn.
  • Aldonis novan enkonstruitan funkcion "__builtin_roundeven" kun efektivigo de la rondiga funkcio difinita en la specifo ISO/IEC TS 18661, simila al "ronda", sed rondiga parto pli granda ol 0.5 (al pli granda valoro), malpli ol 0.5. - malsupren (al nulo), kaj egala al 0.5 - komencante de la egaleco de la antaŭlasta cifero.
  • Por la AArch64-arkitekturo, subteno por la SVE2 etendaĵo estis aldonita kaj subteno por SVE (Scalable Vector Extension) estis plibonigita, inkluzive de aldonita subteno por enkonstruitaj SVE ACLE-funkcioj kaj tipoj, kaj la uzo de vektorizado. Subteno por LSE (Large System Extensions) kaj TME (Transactional Memory Extension) estis vastigita. Aldonitaj novaj instrukcioj proponitaj en Armv8.5-A kaj Armv8.6-A, inkluzive de instrukcioj por hazarda nombrogenerado, rondigo, memoretikedo ligado,
    bfloat16 kaj matrica multipliko. Aldonita procesoro subteno
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 kaj
    Marvell ThunderX3.

  • Aldonita subteno por ABI FDPIC (32-bitaj funkciomontriloj) por ARM64. Redisegnita kaj optimumigita pretigo de 64-bitaj entjeraj operacioj. Aldonita CPU-subteno
    Arm Cortex-A77,
    Arm Cortex-A76AE kaj
    Brako Cortex-M35P. Plivastigita subteno por ACLE-datumtraktad-instrukcioj, inkluzive de 32-bita SIMD, 16-bita multipliko, latch-aritmetiko kaj aliaj DSP-algoritmoptimumigoj. Aldonita eksperimenta subteno por instrukcioj de ACLE CDE (Custom Datapath Extension).

  • Signife plibonigita kodgenerado kaj vektorizado en la backend por AMD GPUoj bazitaj sur la GCN-mikroarkitekturo.
  • Aldonita subteno por XMEGA-similaj aparatoj por AVR-arkitekturo
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 kaj ATmegaXNUMX.

  • Nova etendo de arkitekturo de instrukcioj de Intel ENQCMD (-menqcmd) estis aldonita por arkitekturoj IA-32/x86-64. Aldonita subteno por Intel Cooperlake (-march=cooperlake, inkluzivas la AVX512BF16 ISA etendo) kaj Tigerlake (-march=tigerlake, inkluzivas la MOVDIRI, MOVDIR64B kaj AVX512VP2INTERSECT ISA etendaĵojn) CPU.
  • Efektivigo de la HSAIL (Heterogeneous System Architecture Intermediate Language) por heterogenaj komputiksistemoj bazitaj sur la HSA-arkitekturo estis malrekomendita kaj verŝajne estos forigita en estonta eldono.

fonto: opennet.ru

Aldoni komenton