GCC 10 -kääntäjäpaketin julkaisu

Vuoden kehitystyön jälkeen julkaistu ilmaisen kääntäjien julkaisun GCC 10.1, ensimmäinen merkittävä julkaisu uudessa GCC 10.x -haarassa. Mukaisesti uusi järjestelmä julkaisunumerot, kehitysprosessissa käytettiin versiota 10.0 ja vähän ennen GCC 10.1:n julkaisua oli jo haarautunut GCC 11.0 -haara, jonka pohjalta muodostuisi seuraava merkittävä julkaisu, GCC 11.1.

GCC 10.1 on huomionarvoinen monien C++20-standardia varten kehitetyn C++-kielen innovaatioiden, tulevaan C-kielistandardiin (C2x) liittyvien parannusten, kääntäjien taustaohjelmien uusien optimointien ja kokeellisen tuen ansiosta. staattinen analyysitila. Lisäksi uuden haaran valmistelun aikana projekti siirsi arkiston SVN:stä Gitiin.

Pääasiallinen muutokset:

  • lisättyä staattisen analyysin kokeellinen tapa "-fanalysaattori", joka suorittaa resurssiintensiivisen prosessien välisen analyysin koodin suorituspoluista ja tietovirroista ohjelmassa. Tila pystyy havaitsemaan ongelmia käännösvaiheessa, kuten free()-funktion kaksoiskutsut yhdelle muistialueelle, tiedostokuvausvuodot, viittauksen purkaminen ja nollaosoittimien välittäminen, vapautuneiden muistilohkojen käyttö, alustamattomien arvojen käyttö jne. Uuden tilan käyttö OpenSSL-koodille on jo mahdollistanut tunnistamisen vaarallinen haavoittuvuus.
  • Parannetut prosessien väliset optimoinnit. IPA-SRA (Interprocedural Scalar Shared Replacement) -passi on suunniteltu uudelleen toimimaan sidosaikana ja muun muassa poistaa nyt lasketut ja palautetut käyttämättömät arvot. Optimointitilassa "-O2" on käytössä "-finline-functions" -vaihtoehto, joka on viritetty uudelleen suosimaan kompaktimpaa koodia suorituskyvyn sijaan. Inline-funktion käyttöönoton heuristiikan työtä on nopeutettu. Inline-laajennus- ja funktiokloonausheuristiikka voi nyt käyttää arvoalueita koskevia tietoja ennustaakseen yksittäisten muunnosten tehokkuutta. C++:ssa tyyppipohjaisen aliaksen jäsennyksen tarkkuutta on parannettu.
  • Enhanced Linking Time Optimizations (LTO). Lisätty uusi suoritettava tiedosto lto-dump objektitiedostojen tietojen nollaaminen LTO-tavukoodilla. Rinnakkaiset LTO-passit määrittävät automaattisesti samanaikaisesti suoritettavien make-tehtävien lukumäärän, ja jos niitä ei voida määrittää, käyttävät rinnakkaistekijänä tietoja suorittimen ytimien määrästä. Lisätty mahdollisuus pakata LTO-tavukoodi zstd-algoritmilla.
  • Koodiprofiloinnin tuloksiin perustuvaa optimointimekanismia (PGO - Profile-guided optimization) on parannettu, mikä luo optimaalisemman koodin koodin suorituksen ominaisuuksien analyysin perusteella. Parannettu profiilin ylläpito kokoamisen ja kuuman/kylmän koodin erottelun aikana. vaihtoehdon kautta "-fprofile-arvot» voi nyt valvoa jopa 4 profiilin arvoa, esimerkiksi epäsuorille puheluille ja tarkempien profiilitietojen antamiseen.
  • Rinnakkaisohjelmointispesifikaatio toteutettu C-, C++- ja Fortran-kielille OpenACC 2.6, joka määrittelee työkalut toimintojen purkamiseen GPU:illa ja erikoisprosessoreilla, kuten NVIDIA PTX. Standardin käyttöönotto on lähes valmis Avaa MP 5.0 (Open Multi-Processing), joka määrittelee API:n ja menetelmät rinnakkaisten ohjelmointimenetelmien soveltamiseen moniytimisissä ja hybridijärjestelmissä (CPU+GPU/DSP), joissa on jaettu muisti ja vektorointiyksiköt (SIMD). Lisätty ominaisuuksia, kuten lastprivate-ehdot, tarkistus- ja silmukkakäskyt, järjestys- ja use_device_addr-lausekkeet. OpenMP:lle ja OpenACC:lle on lisätty tuki neljännen sukupolven (Fidži) ja viidennen sukupolven AMD Radeon (GCN) -grafiikkasuorittimien (VEGA 10/VEGA 20) purkamiseen.
  • C-perheen kielille "access"-funktio on lisätty kuvaamaan funktion pääsyä viittauksella tai osoittimella välitettyihin objekteihin ja liittämään tällaiset objektit kokonaislukuargumentteihin, jotka sisältävät tietoa objektien koosta. Toimiakseen yhdessä "access" kanssa "type"-attribuutti toteutetaan havaitsemaan virheelliset käyttöoikeudet käyttäjän toiminnoista, esimerkiksi kun kirjoitetaan arvoja taulukon rajojen ulkopuolelle. Lisätty on myös "symver"-attribuutti, joka yhdistää ELF-tiedoston symbolit tiettyihin versionumeroihin.
  • Uusia varoituksia lisätty:
    • "-Wstring-compare" (käytössä "-Wextran" kanssa) - varoittaa lausekkeiden olemassaolosta, joissa nollaa verrataan strcmp- ja strncmp-funktioiden kutsumisen tulokseen, mikä vastaa vakiota, koska pituus yhden argumentin koko on suurempi kuin toisen argumentin taulukon koko.
    • "-Wzero-length-bounds" (käytössä "-Warray-bounds" -toiminnolla) - varoittaa nollapituisten taulukkoelementtien käyttämisestä, mikä voi johtaa muiden tietojen korvaamiseen.
    • Varoituksia "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" ja "-Wstringop-overflow" on laajennettu rajan ylittävien tilanteiden määrän lisäämiseksi. joita käsitellään.
  • Otettu käyttöön mahdollisuus määrittää suoraan leveät merkit tunnisteisiin käyttämällä nykyistä koodausta (oletuksena UTF-8) UCN-merkinnän (\uNNNN tai \UNNNNNNNN) sijaan. Esimerkiksi:

    staattinen vakio int π = 3;
    int get_naive_pi() {
    paluu π;
    }

  • C-kielelle osa C2X-standardissa kehitetyistä uusista ominaisuuksista on otettu käyttöön (otettu käyttöön määrittämällä -std=c2x ja -std=gnu2x): "[[]]"-syntaksin tuki on ilmestynyt määritteiden määrittämiseen kuten C++ (esimerkiksi [[gnu ::const]], [[vanhentunut]], [[fallthrough]] ja [[maybe_unused]]. Lisätty tuki "u8"-syntaksille UTF-8-merkkejä sisältävien vakioiden määrittämiseen.
    Lisätty uusia makroja kohteeseen . Lisätty strftimeen "%OB" ja "%Ob" korvaukset.

  • C:n oletustila on "-fno-common", mikä mahdollistaa tehokkaamman pääsyn globaaleihin muuttujiin joillakin alustoilla.
  • C++:ssa on toteutettu noin 16 muutosta ja innovaatiota, jotka on kehitetty C++20-standardissa. Sisältää lisätyn avainsanan "constitin"
    ja mallilaajennusten tuki on otettu käyttöön "käsitteitä". Käsitteiden avulla voit määrittää joukon malliparametrivaatimuksia, jotka käännöshetkellä rajoittavat argumenttien määrää, jotka voidaan hyväksyä malliparametreiksi. Käsitteitä voidaan käyttää välttämään loogisia epäjohdonmukaisuuksia mallissa käytettyjen tietotyyppien ominaisuuksien ja syöteparametrien tietotyyppiominaisuuksien välillä.

  • G++ havaitsee määrittelemättömän toiminnan, joka johtuu vakioobjektien muuttamisesta constexprin kautta. Kääntäjän vähemmän muistin kulutusta laskettaessa constexpr. Lisätty uudet varoitukset "-Wmismatched-tags" ja "-Wredundant-tags".
  • Uusia komentorivivaihtoehtoja on ehdotettu:
    • "-fallocation-dce" poistaa tarpeettomat "new"- ja "delete"-operaattoriparit.
    • "-fprofile-partial-training" poistaa koon optimoinnin käytöstä koodille, jolla ei ole harjoitusajoa.
    • "-fprofile-toistettava profiilin toistettavuuden tason hallitsemiseksi.
    • "-fprofile-prefix-path" määrittää peruslähdekoodihakemiston, jota käytetään erilliseen profiilien luomiseen ("-fprofile-generate=profile_dir" ja "-fprofile-use=profile_dir").
  • Mainittujen vaihtoehtojen varoitustekstissä on hyperlinkkejä, joiden avulla voit siirtyä näiden vaihtoehtojen dokumentaatioon. URL-osoitteiden korvaamista ohjataan "-fdiagnostics-urls"-vaihtoehdolla.
  • Lisätty esikäsittelyoperaattori "__has_builtin", jota voidaan käyttää sisäänrakennettujen toimintojen tarkistamiseen.
  • Lisätty uusi sisäänrakennettu funktio "__builtin_roundeven", joka toteuttaa ISO/IEC TS 18661 -spesifikaatiossa määritellyn pyöristystoiminnon, samanlainen kuin "pyöristys", mutta pyöristävä osa on suurempi kuin 0.5 ylöspäin (suurempaan arvoon), alle 0.5 - alas (nollaan) ja yhtä suuri kuin 0.5 - alkaen toiseksi viimeisen numeron pariteetista.
  • AArch64-arkkitehtuuriin on lisätty tuki SVE2-laajennukselle ja SVE (Scalable Vector Extension) -tuki on parannettu, mukaan lukien lisätty tuki sisäänrakennetuille SVE ACLE -toiminnoille ja -tyypeille sekä vektorisoinnin käyttö. Tukea LSE:lle (Large System Extensions) ja TME:lle (Transactional Memory Extension) on laajennettu. Lisätty Armv8.5-A:ssa ja Armv8.6-A:ssa ehdotetut uudet ohjeet, mukaan lukien ohjeet satunnaislukujen luomiseen, pyöristykseen, muistilappujen sitomiseen,
    bfloat16 ja matriisikerto. Lisätty prosessorin tuki
    Käsivarsi Cortex-A77,
    Varsi Cortex-A76AE,
    Käsivarsi Cortex-A65,
    Varsi Cortex-A65AE,
    Käsivarsi Cortex-A34 ja
    Marvell ThunderX3.

  • Lisätty tuki ABI FDPIC:lle (32-bittiset toimintoosoittimet) ARM64:lle. Uudelleen suunniteltu ja optimoitu 64-bittisten kokonaislukutoimintojen käsittely. Lisätty CPU-tuki
    Käsivarsi Cortex-A77,
    Käsivarsi Cortex-A76AE ja
    Varsi Cortex-M35P. Laajennettu tuki ACLE-tiedonkäsittelyohjeille, mukaan lukien 32-bittinen SIMD, 16-bittinen kertolasku, salpa-aritmetiikka ja muut DSP-algoritmien optimoinnit. Lisätty kokeellinen tuki ACLE CDE (Custom Datapath Extension) -ohjeille.

  • Merkittävästi parannettu koodin luominen ja vektorointi GCN-mikroarkkitehtuuriin perustuvien AMD-grafiikkasuorittimien taustajärjestelmässä.
  • Lisätty tuki XMEGA-kaltaisille laitteille AVR-arkkitehtuurille
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmegame808ATme809, ATmegame1608ATme1609 3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX ja ATmegaXNUMX.

  • Uusi Intel ENQCMD -käskysarjan arkkitehtuurilaajennus (-menqcmd) on lisätty IA-32/x86-64-arkkitehtuureille. Lisätty tuki Intel Cooperlake (-march=cooperlake, sisältää AVX512BF16 ISA-laajennuksen) ja Tigerlake (-march=tigerlake, sisältää MOVDIRI-, MOVDIR64B- ja AVX512VP2INTERSECT ISA -laajennukset) suorittimille.
  • HSAIL (Heterogeneous System Architecture Intermediate Language) -toteutus heterogeenisille laskentajärjestelmille, jotka perustuvat HSA-arkkitehtuuriin, on vanhentunut ja todennäköisesti poistetaan tulevassa julkaisussa.

Lähde: opennet.ru

Lisää kommentti