Liberigo de la GCC 9 kompililo

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

GCC 9.1 estas rimarkinda pro stabiligado de subteno por la C++17-normo, daŭrante efektivigi la kapablojn de la estonta C++20-normo (kodita C++2a), inkludo en la fasado por la D-lingvo, parta subteno por OpenMP 5.0. , preskaŭ kompleta subteno por OpenACC 2.5, pliigas skaleblon de interproceduraj optimumigoj kaj optimumigoj ĉe la liga stadio, vastiĝo de diagnozaj iloj kaj aldono de novaj avertoj, backends por OpenRISC, C-SKY V2 kaj AMD GCN GPU.

Ĉefa ŝanĝi:

  • Aldonita subteno por la programlingvo D. GCC inkluzivas fasadon kun kompililo GDC (Gnu D Kompililo) kaj rultempaj bibliotekoj (libphobos), kiuj permesas vin uzi norman GCC por konstrui programojn en la D programlingvo. La procezo de ebligado de D-lingva subteno en GCC komenciĝis reen en 2011, sed trenis plu pro la neceso konformi la kodon al GCC-postuloj kaj problemoj pri transdono de rajtoj pri intelekta proprieto al Cifereca Marso, kiu disvolvas la programlingvon D;
  • Plibonigoj estis faritaj al la kodgeneratoro. Ekzemple, la uzo de malsamaj strategioj por vastigi Ŝalt-esprimojn (salttabelo, bittesto, decidarbo) depende de situacioj estis efektivigita. Aldonis la kapablon transformi linearajn funkciojn, kiuj inkluzivas Ŝaltilo-esprimon uzante la "-ftree-switch-conversion" optimumigo (ekzemple, aro de kondiĉoj kiel "kazo 2: kiel = 205; rompo; kazo 3: kiel = 305; rompo). ;” estos konvertita al "100 * kiel + 5";
  • Plibonigitaj interproceduraj optimumoj. Enliniaj deplojaj agordoj estis adaptitaj por modernaj C++-kodbazoj kaj vastigitaj kun novaj parametroj max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns kaj uninlined -dank-tempo. Plibonigita precizeco kaj agresemo de malvarma/varma koda apartigo. Plibonigita skaleblo por tre grandaj tradukunuoj (ekzemple, kiam oni aplikas optimumigon ĉe la ligado al grandaj programoj);
  • 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. Resuma opcio "-fprofile-use" nun inkluzivas la optimumigajn reĝimojn "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" kaj "-ftree-loop-distribution". Forigita la inkludo de histogramoj kun nombriloj en dosieroj, kiu reduktis la grandecon de dosieroj kun profiloj (histogramoj nun estas generitaj sur la flugo dum elfarado de optimumigoj dum ligado);
  • Plibonigitaj Interligaj Tempo-Optimigoj (LTO). Simpligo de tipoj estis provizita antaŭ generi la rezulton, kio ebligis signife redukti la grandecon de LTO-objektaj dosieroj, redukti memorkonsumon en la liga stadio kaj plibonigi la paraleligon de operacioj. La nombro da sekcioj (-param lto-sekcioj) estis pliigita de 32 al 128, kio plibonigas rendimenton en sistemoj kun granda nombro da CPU-fadenoj. Parametro estis aldonita por kontroli la nombron da optimumigaj procezoj
    "-param lto-max-streaming-paralelism";

    Kiel rezulto, kompare kun GCC 8.3, la optimumigoj enkondukitaj en GCC 9 permesite redukti la kompiltempon de Firefox 5 kaj LibreOffice 66 je ĉirkaŭ 6.2.3%. La grandeco de objektodosieroj malpliiĝis je 7%. Ligtempo sur 8-kerna CPU malpliiĝis je 11%. La sinsekva optimumiga etapo de la liga stadio nun estas 28% pli rapida kaj konsumas 20% malpli da memoro. Memorkonsumo de ĉiu procesoro de la paraleligita stadio de LTO malpliiĝis je 30%;

  • La plej granda parto de la paralela programa specifo estas efektivigita por C, C++ kaj Fortran-lingvoj OpenACC 2.5, kiu difinas ilojn por malŝarĝi operaciojn sur GPU-oj kaj specialigitaj procesoroj kiel NVIDIA PTX;
  • Parta subteno por la normo estis efektivigita por C kaj C++ Malfermu MP 5.0 (Malferma Multi-Processing), kiu difinas la API kaj metodojn por apliki paralelajn programajn metodojn por C, C++ kaj Fortran-lingvoj sur multkernaj kaj hibridaj sistemoj (CPU+GPU/DSP) kun komuna memoro kaj vektorigaj unuoj (SIMD) ;
  • Novaj avertoj estis aldonitaj por la C-lingvo: "-Vadreso-de-pakita-membro" (nevicigita montrila valoro al pakita membro de strukturo aŭ unio) kaj
    «-Wabsoluta-valoro" (dum aliro al funkcioj por kalkulado de absoluta valoro, se ekzistas pli taŭga funkcio por la specifita argumento, ekzemple, fabs(3.14) devus esti uzata anstataŭ abs(3.14). Novaj avertoj aldonitaj por C++: "-Wdeprecated-copy",
    "-Winit-list-vivdaŭro", "-Wredundant-move", "-Wpessimizing-move" kaj "-Wclass-conversion". Multaj antaŭe disponeblaj avertoj estis vastigitaj;

  • Aldonita eksperimenta subteno por parto de la estonta C-lingva normo, kodita C2x. Por ebligi C2x-subtenon, uzu la opciojn "-std=c2x" kaj "-std=gnu2x" (por ebligi GNU-etendaĵojn). La normo estas ankoraŭ en frua stadio de evoluo, do, de siaj kapabloj, nur la esprimo _Static_assert kun unu argumento estas subtenata (_Static_assert kun du argumentoj estas normigita en C11);
  • Subteno por la C++17-normo estis deklarita stabila. En la fasado, la lingvokapabloj de C++17 estas plene efektivigitaj, kaj en libstdc++, la bibliotekfunkcioj difinitaj en la normo estas proksimaj al plena efektivigo;
  • Daŭrigis efektivigo elementoj de la estonta C++2a normo. Ekzemple, la kapablo inkludi intervalojn dum inicialigo estis aldonita, etendaĵoj por lambda esprimoj estis efektivigitaj, subteno por malplenaj membroj de datumstrukturoj kaj verŝajnaj/neprobablaj atributoj estis aldonita, la kapablo voki virtualajn funkciojn en kondiĉaj esprimoj estis disponigita. , ktp.
    Por ebligi C++2a-subtenon, uzu la opciojn "-std=c++2a" kaj "-std=gnu++2a". Aldonitaj bitaj kaj versioj titoldosieroj al libstdc++ por C++ 2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible kaj std::type_identity trajtoj, std::midpoint, std::lerp funkcioj , std::bind_front,
    std::visit, std::is_constant_evaluated kaj std::assume_aligned, aldonis subtenon por la char8_t-tipo, efektivigis la kapablon kontroli la prefikson kaj sufikson de ĉenoj (starts_with, ends_with);

  • Aldonita subteno por novaj ARM-procesoroj
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE kaj Neoverse N1. Aldonita subteno por instrukcioj enkondukitaj en Armv8.3-A por labori kun kompleksaj nombroj, pseŭdo-hazarda nombrogenerado (rng) kaj memoretikedado (memtag), same kiel instrukcioj por blokado de atakoj ligitaj al konjekta ekzekuto kaj funkciado de la branĉa prognozunuo. . Por la arkitekturo AArch64, protekta reĝimo estis aldonita intersekcoj de stako kaj amaso ("-fstack-kolizio-protekto"). Por uzi la funkciojn de la arkitekturo Armv8.5-A, la opcio "-march=armv8.5-a" estis aldonita

  • Ĝi inkluzivas backend por generi kodon por AMD-GPUoj bazitaj sur la GCN-mikroarkitekturo. La efektivigo estas nuntempe limigita al la kompilo de unu-fadenaj aplikoj (subteno por farado de plur-fadenaj kalkuloj per OpenMP kaj OpenACC estos ofertita poste) kaj subteno por GPU Fiji kaj Vega 10;
  • Aldonita nova backend por procesoroj OpenRISC;
  • Aldonita backend por procesoroj C-SKY V2, produktita de la ĉina samnoma kompanio por diversaj konsumaj aparatoj;
  • Ĉiuj komandliniaj opcioj, kiuj funkciigas bajtajn valorojn, subtenas la sufiksojn kb, KiB, MB, MiB, GB kaj GiB;
  • Efektivigita la opcio “-flive-patching=[inline-only-static|inline-clone]” ebligas al vi atingi sekuran kompilon por vivflaĉaj sistemoj pro plurnivela kontrolo pri la uzo de interprocedura (PERFONO) optimumigoj;
  • Aldonita "--completion" opcio por fajna kontrolo de opciokompletigo kiam vi uzas bash;
  • La diagnozaj iloj disponigas ekranojn de fontteksto-eltiraĵoj indikante la linionumeron kaj vide markante rilatajn informojn, kiel ekzemple operandospecoj. Por malŝalti la montradon de linionumeroj kaj etikedoj, la opcioj "-fno-diagnostics-show-line-numbers" kaj "-fno-diagnostics-show-labels" estas provizitaj;

    Liberigo de la GCC 9 kompililo

  • Vastigita iloj por diagnozi erarojn en C++-kodo, plibonigita legebleco de informoj pri la kaŭzoj de eraroj kaj reliefigo de problemaj parametroj;

    Liberigo de la GCC 9 kompililo

  • Aldonita opcio "-fdiagnostics-format=json", kiu ebligas generi diagnozan eligon en maŝinlegebla formato (JSON);
  • Aldonitaj novaj profilaj opcioj "-fprofile-filter-files" kaj "-fprofile-exclude-files" por elekti fontdosierojn por esti prilaboritaj;
  • AddressSanitizer disponigas generacion de pli kompakta konfirmkodo por aŭtomataj variabloj, kiu reduktas la memorkonsumon de la plenumebla dosiero estanta kontrolita;
  • Plibonigita eligo en "-fopt-info» (detalaj informoj pri aldonitaj optimumigoj). Aldonitaj novaj prefiksoj "optimumigita" kaj "maltrafitaj", krom la antaŭe disponebla prefikso "noto". Aldonita eligo de informoj pri decidiĝo pri enlinia disvolvado kaj vektorizado de cikloj;
  • Aldonita la opcio "-fsave-optimization-record", kiam specifite, GCC konservas la SRCFILE.opt-record.json.gz dosieron kun priskribo de decidoj pri la uzo de iuj optimumigoj. La nova opcio diferencas de la "-fopt-info" reĝimo inkludante pliajn metadatenojn, kiel informojn pri la profilo kaj enliniaj ĉenoj;
  • Aldonitaj opcioj "-fipa-stack-alignment" kaj "-fipa-reference-addressable" por kontroli stakan vicigon kaj la uzon de adresreĝimoj (nurskriba aŭ legi-preciza) por senmovaj variabloj dum interproceduraj optimumoj;
  • Novaj enkonstruitaj funkcioj estas lanĉitaj por kontroli atributan ligadon same kiel konduton ligitan al branĉoprognozo kaj konjekta instrukcio-ekzekuto: "__konstruita_havas_atributon","__enkonstruita_atendi_kun_probablo"Kaj"__enkonstruita_konjekta_sekura_valoro". Nova atributo estis aldonita por funkcioj, variabloj kaj tipoj kopii;
  • Plena subteno por nesinkrona enigo/eligo estis efektivigita por la Fortran-lingvo;
  • Subteno por platformoj Solaris 10 (*-*-solaris2.10) kaj Cell/BE (Cell Broadband Engine SPU) estas malrekomendita kaj estos forigita en la venonta grava eldono. Subteno por Armv2, Armv3, Armv5 kaj Armv5E arkitekturoj estis nuligita. Subteno por Intel MPX (Memory Protection Extensions) estis nuligita.

fonto: opennet.ru

Aldoni komenton