GCC 10 kompilaatorikomplekti väljalase

Pärast aastast arengut avaldatud tasuta kompilaatorite komplekti väljaandmine GCC 10.1, esimene suurem väljalase uues GCC 10.x harus. Kooskõlas uus skeem väljalaskenumbrid, arendusprotsessis kasutati versiooni 10.0 ning veidi enne GCC 10.1 väljaandmist oli juba hargnenud GCC 11.0 haru, mille alusel moodustuks järgmine oluline väljalase GCC 11.1.

GCC 10.1 on tähelepanuväärne paljude C++20 standardi jaoks välja töötatud C++ keele uuenduste, tulevase C keelestandardiga (C2x) seotud täiustuste, kompilaatori taustaprogrammide uute optimeerimiste ja eksperimentaalse toe poolest. staatilise analüüsi režiim. Lisaks viidi projektiga uue haru ettevalmistamise käigus hoidla SVN-ist üle Giti.

Kõik muutused:

  • Lisatud staatilise analüüsi eksperimentaalne režiim "-fanalüsaator“, mis teostab programmis koodi täitmisteede ja andmevoogude ressursimahukat protseduuridevahelist analüüsi. Režiim suudab kompileerimisetapis tuvastada probleeme, nagu topeltkutsed free()-funktsioonile ühe mälupiirkonna jaoks, failideskriptori lekked, viitamise tühistamine ja nullviite edastamine, vabastatud mäluplokkidele juurdepääs, initsialiseerimata väärtuste kasutamine jne. Uue režiimi kasutamine OpenSSL-koodi jaoks on juba võimaldanud tuvastada ohtlik haavatavus.
  • Täiustatud protseduuridevahelised optimeerimised. IPA-SRA (Interprocedural Scalar Shared Replacement) pääse on ümber kujundatud nii, et see töötaks sidumisajal ja muu hulgas eemaldab nüüd arvutatud ja tagastatud kasutamata väärtused. Optimeerimisrežiimis "-O2" on lubatud suvand "-finline-functions", mis häälestatakse ümber, et eelistada kompaktsemat koodi täitmise jõudlusele. Sisesise funktsiooni juurutamise heuristika tööd on kiirendatud. Sisesisene laiendamise ja funktsioonide kloonimise heuristika saab nüüd kasutada teavet väärtusvahemike kohta, et ennustada üksikute teisenduste tõhusust. C++ puhul on tüübipõhise aliase parsimise täpsust parandatud.
  • Täiustatud linkimisaja optimeerimised (LTO). Lisatud uus käivitatav fail lto-dump objektifailide teabe lähtestamiseks LTO baitkoodiga. Paralleelsed LTO passid määravad automaatselt üheaegselt töötavate make-ülesannete arvu ja kui neid ei saa kindlaks teha, kasutavad paralleelsustegurina teavet protsessori tuumade arvu kohta. Lisati võimalus LTO baitkoodi tihendamiseks zstd algoritmi abil.
  • Täiustatud on koodi profileerimise tulemustel põhinev optimeerimismehhanism (PGO – Profile-guided optimization), mis genereerib koodi täitmise tunnuste analüüsi põhjal optimaalsema koodi. Parem profiilihooldus kompileerimise ja kuuma/külma koodi eraldamise ajal. Valiku "-fprofiili väärtused» saab nüüd jälgida kuni 4 profiili väärtust, näiteks kaudsete kõnede jaoks ja täpsema profiiliteabe pakkumiseks.
  • C, C++ ja Fortrani keelte jaoks rakendatud paralleelse programmeerimise spetsifikatsioon OpenACC 2.6, mis määratleb tööriistad GPU-de ja spetsiaalsete protsessorite (nt NVIDIA PTX) toimingute mahalaadimiseks. Standardi rakendamine on peaaegu lõpule viidud Avage MP 5.0 (Open Multi-Processing), mis määratleb API ja meetodid paralleelse programmeerimise meetodite rakendamiseks mitmetuumalistes ja hübriidsüsteemides (CPU+GPU/DSP) ühismälu ja vektoriseerimisüksustega (SIMD). Lisatud funktsioonid, nagu viimase privaatsed tingimussõnad, skannimis- ja silmusjuhised, avaldised järjestamine ja use_device_addr. OpenMP ja OpenACC jaoks on lisatud tugi neljanda põlvkonna (Fidži) ja viienda põlvkonna AMD Radeoni (GCN) GPU-de (VEGA 10/VEGA 20) mahalaadimiseks.
  • C-perekonna keelte jaoks on lisatud funktsioon "juurdepääs", et kirjeldada funktsiooni juurdepääsu viite või osutiga edastatud objektidele ja seostada selliseid objekte täisarvu argumentidega, mis sisaldavad teavet objektide suuruse kohta. Koos funktsiooniga "juurdepääs" töötamiseks rakendatakse atribuut "tüüp", et tuvastada kasutaja funktsioonide ebaõige juurdepääs, näiteks väärtuste kirjutamisel massiivi piiridest väljapoole jäävale alale. Lisatud on ka atribuut "symver", et seostada ELF-faili sümboleid konkreetsete versiooninumbritega.
  • Lisatud uued hoiatused:
    • "-Wstring-compare" (lubatud "-Wextra" abil) - hoiatab avaldiste olemasolu eest, milles nulli võrreldakse funktsioonide strcmp ja strncmp kutsumise tulemusega, mis on samaväärne konstandiga, kuna pikkus ühe argumendi suurus on suurem kui teise argumendi massiivi suurus.
    • "-Wzero-length-bounds" (lubatud funktsiooniga "-Warray-bounds") – hoiatab nullpikkusega massiivielementidele juurdepääsu eest, mis võib viia muude andmete ülekirjutamiseni.
    • Hoiatusi "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" ja "-Wstringop-overflow" on laiendatud, et suurendada piiridest väljuvate olukordade arvu. mida käsitletakse.
  • Rakendatud on võimalus määrata identifikaatorites otse laiad tähemärgid, kasutades praegust kodeeringut (vaikimisi UTF-8), mitte UCN-i (\uNNNN või \UNNNNNNNN). Näiteks:

    staatiline konst int π = 3;
    int get_naive_pi() {
    tagasi π;
    }

  • C-keele jaoks on rakendatud osa C2X-standardis välja töötatud uutest funktsioonidest (lubatud määrates -std=c2x ja -std=gnu2x): ilmunud on „[[]]” süntaksi tugi atribuutide määratlemiseks nagu C++ (näiteks [[gnu ::const]], [[aegunud]], [[fallthrough]] ja [[maybe_unused]]. Lisatud on "u8" süntaksi tugi UTF-8 tähemärkidega konstantide määratlemiseks.
    Lisatud uued makrod . Strftime'ile on lisatud asendused "%OB" ja "%Ob".

  • C vaikerežiim on "-fno-common", mis võimaldab mõnel platvormil tõhusamat juurdepääsu globaalsetele muutujatele.
  • C++ jaoks on rakendatud umbes 16 muudatust ja uuendust, mis on välja töötatud C++20 standardis. Kaasa arvatud lisatud märksõna "constitin"
    ja mallilaiendite tugi on juurutatud "mõisted". Kontseptsioonid võimaldavad teil määratleda malli parameetrite nõuete komplekti, mis kompileerimise ajal piiravad argumentide kogumit, mida saab malli parameetritena aktsepteerida. Mõisteid saab kasutada malli sees kasutatavate andmetüüpide omaduste ja sisendparameetrite andmetüübi omaduste vahel loogiliste vastuolude vältimiseks.

  • G++ võimaldab tuvastada määratlemata käitumist, mis on põhjustatud konstantsete objektide muutmisest constexpri kaudu. Kompilaatori väiksem mälutarbimine constexpr arvutamisel. Lisatud uued hoiatused "-Wmismatched-tags" ja "-Wredundant-tags".
  • Pakutud on uued käsurea valikud:
    • "-fallocation-dce", et eemaldada mittevajalikud "new" ja "delete" operaatorite paarid.
    • "-fprofile-partial-training", et keelata selle koodi suuruse optimeerimine, millel pole treeningut.
    • "-fprofile-reprodutseeritav profiili reprodutseeritavuse taseme kontrollimiseks.
    • "-fprofile-prefix-path", et määratleda põhiallika ehituskataloog, mida kasutatakse eraldi profiilide genereerimiseks ("-fprofile-generate=profile_dir" ja "-fprofile-use=profile_dir" jaoks).
  • Mainitud valikute hoiatustekstis on hüperlingid, mis võimaldavad teil minna nende valikute dokumentatsiooni. URL-i asendamist juhitakse suvandi "-fdiagnostics-urls" abil.
  • Lisatud eeltöötlusoperaator "__on_ehitatud", mida saab kasutada sisseehitatud funktsioonide kontrollimiseks.
  • Lisatud on uus sisseehitatud funktsioon "__builtin_roundeven", mis kasutab ISO/IEC TS 18661 spetsifikatsioonis määratletud ümardamisfunktsiooni, mis sarnaneb "ringiga", kuid ümardab osa, mis on suurem kui 0.5 üles (suurema väärtuseni), alla 0.5 - alla (nullini) ja võrdne 0.5-ga - alustades eelviimase numbri paarsusest.
  • AArch64 arhitektuuri jaoks on lisatud SVE2 laienduse tugi ja täiustatud SVE (Scalable Vector Extension) tuge, sealhulgas on lisatud sisseehitatud SVE ACLE funktsioonide ja tüüpide tugi ning vektoriseerimise kasutamine. Laiendatud on LSE (Large System Extensions) ja TME (Transactional Memory Extension) tugi. Lisatud on Armv8.5-A ja Armv8.6-A pakutud uued juhised, sealhulgas juhised juhuslike arvude genereerimiseks, ümardamiseks, mälusiltide sidumiseks,
    bfloat16 ja maatrikskorrutis. Lisatud protsessori tugi
    Käepide Cortex-A77,
    Käepide Cortex-A76AE,
    Käepide Cortex-A65,
    Käepide Cortex-A65AE,
    Käevarre Cortex-A34 ja
    Marvell ThunderX3.

  • ARM32 jaoks on lisatud ABI FDPIC (64-bitised funktsiooniosutajad) tugi. 64-bitiste täisarvuliste operatsioonide ümberkujundatud ja optimeeritud töötlemine. Lisatud CPU tugi
    Käepide Cortex-A77,
    Arm Cortex-A76AE ja
    Käepide Cortex-M35P. Laiendatud tugi ACLE andmetöötlusjuhistele, sealhulgas 32-bitine SIMD, 16-bitine korrutamine, riivi aritmeetika ja muud DSP-algoritmi optimeerimised. Lisatud eksperimentaalne tugi ACLE CDE (Custom Datapath Extension) juhistele.

  • Märkimisväärselt täiustatud koodi genereerimine ja vektoriseerimine GCN-i mikroarhitektuuril põhinevate AMD GPU-de taustaprogrammis.
  • Lisatud tugi XMEGA-laadsetele seadmetele AVR-i arhitektuuri jaoks
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATtiny808, ATtiny809, ATmegame1608ATme1609, ATmegame3208ATme3209 4808, ATmega4809, ATmegaXNUMX XNUMX, ATmegaXNUMX ja ATmegaXNUMX.

  • IA-32/x86-64 arhitektuuride jaoks on lisatud uus Inteli ENQCMD käsukomplekti arhitektuuri laiendus (-menqcmd). Lisatud tugi Intel Cooperlake (-march=cooperlake, sisaldab laiendust AVX512BF16 ISA) ja Tigerlake (-march=tigerlake, sisaldab laiendusi MOVDIRI, MOVDIR64B ja AVX512VP2INTERSECT ISA) protsessoritele.
  • HSAIL-i (heterogeense süsteemiarhitektuuri vahekeele) rakendamine heterogeensete arvutisüsteemide jaoks, mis põhineb HSA arhitektuuril, on aegunud ja tõenäoliselt eemaldatakse see tulevases versioonis.

Allikas: opennet.ru

Lisa kommentaar