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

Vuoden kehitystyön jälkeen ilmainen GCC 11.1 -kääntäjäpaketti on julkaistu, ensimmäinen merkittävä julkaisu uudessa GCC 11.x -haarassa. Uuden julkaisunumerointimallin mukaan kehitystyössä käytettiin versiota 11.0, ja vähän ennen GCC 11.1:n julkaisua oli jo haarautunut GCC 12.0 -haara, josta muodostetaan seuraava merkittävä GCC 12.1 -julkaisu.

GCC 11.1 on huomionarvoinen siirtyessään käyttämään DWARF 5 -virheenkorjaustiedostomuotoa oletusarvoisesti, C++17-standardin oletusarvoisesti (“-std=gnu++17”), merkittävistä parannuksista C++20-tukeen. standardi, kokeellinen tuki C++23:lle, tulevaan C-kielistandardiin (C2x) liittyvät parannukset, uudet suorituskyvyn optimoinnit.

Suurimmat muutokset:

  • C++-kielen oletustila on vaihdettu käyttämään C++17-standardia (-std=gnu++17) aiemmin tarjotun C++14:n sijaan. On mahdollista poistaa valikoivasti käytöstä uusi C++17-käyttäytyminen, kun käsitellään malleja, jotka käyttävät muita malleja parametreina (-fno-new-ttp-matching).
  • Lisätty tuki AddressSanitizer-työkalun laitteistokiihdytykseen, jonka avulla voit määrittää tosiasiat vapautettujen muistialueiden käyttämisestä, varatun puskurin rajojen ylittämisestä ja joidenkin muuntyyppisten virheiden selvittämisestä muistin kanssa työskenneltäessä. Laitteistokiihdytys on tällä hetkellä saatavilla vain AArch64-arkkitehtuurille, ja se keskittyy käyttöön Linux-ytimen kääntämisessä. AddressSanitizer-laitteistokiihdytyksen ottamiseksi käyttöön käyttäjätilan komponentteja rakennettaessa on lisätty lippu "-fsanitize=hwaddress" ja ytimen lippu "-fsanitize=kernel-hwaddress".
  • Virheenkorjaustietoja luotaessa käytetään oletusarvoisesti DWARF 5 -muotoa, joka mahdollistaa 25 % kompaktimman virheenkorjausdatan luomisen aikaisempiin versioihin verrattuna. Täysi tuki DWARF 5:lle vaatii vähintään binutils version 2.35.2. DWARF 5 -muotoa tuetaan virheenkorjaustyökaluissa versioista GDB 8.0, valgrind 3.17.0, elfutils 0.172 ja dwz 0.14 lähtien. Luodaksesi virheenkorjaustiedostoja käyttämällä muita DWARF-versioita, voit käyttää vaihtoehtoja "-gdwarf-2", "-gdwarf-3" ja "-gdwarf-4".
  • Vaatimuksia kääntäjille, joita voidaan käyttää GCC:n rakentamiseen, on lisätty. Kääntäjän tulee nyt tukea C++11-standardia (aiemmin vaadittiin C++98), ts. Jos GCC 10 riitti rakentamaan GCC 3.4, niin ainakin GCC 11 vaaditaan nyt GCC 4.8:n rakentamiseen.
  • Kaavioiden, väliaikaisten tiedostojen ja LTO-optimointiin tarvittavien lisätietojen tallentamiseen tarkoitettujen tiedostojen nimi ja sijainti on muutettu. Tällaiset tiedostot tallennetaan nyt aina nykyiseen hakemistoon, ellei polkua ole nimenomaisesti muutettu "-dumpbase", "-dumpdir" ja "-save-temps=*"-vaihtoehdoilla.
  • Binäärimuodon BRIG tuki käytettäväksi HSAIL (Heterogeneous System Architecture Intermediate Language) -kielen kanssa on vanhentunut, ja se poistetaan pian.
  • ThreadSanitizer-tilan (-fsanitize=thread) ominaisuuksia on laajennettu, ja se on suunniteltu havaitsemaan kilpailuolosuhteet, kun jaetaan samoja tietoja monisäikeisen sovelluksen eri säikeistä. Uusi julkaisu lisää tuen vaihtoehtoisille suoritusajoille ja ympäristöille sekä tuen KCSAN (Kernel Concurrency Sanitizer) -virheenkorjaustyökalulle, joka on suunniteltu havaitsemaan dynaamisesti kilpailuolosuhteet Linux-ytimen sisällä. Lisätty uudet vaihtoehdot "-param tsan-distinguish-volatile" ja "-param tsan-instrument-func-entry-exit".
  • Diagnostisten viestien sarakenumerot eivät nyt heijasta tavumäärää rivin alusta, vaan itse asiassa sarakenumeroita, jotka ottavat huomioon monitavuiset merkit ja merkit, jotka ovat rivillä useilla paikoilla (esimerkiksi merkki 🙂 on kahdessa paikassa ja on koodattu 4 tavulla). Samoin sarkainmerkkejä käsitellään nyt tiettynä määränä välilyöntejä (konfiguroitavissa -ftabstop-vaihtoehdolla, oletusarvo 8). Vanhan toiminnan palauttamiseksi ehdotetaan vaihtoehtoa "-fdiagnostics-column-unit=byte" ja alkuarvon määrittämiseksi (numerot 0 tai 1) - "-fdiagnostics-column-origin=" -vaihtoehto.
  • Vektorisoija ottaa huomioon funktion koko sisällön ja lisää leikkauspisteisiin liittyvät käsittelyominaisuudet ja viittaukset aikaisempiin lohkoihin ohjausvirtauskaaviossa (CFG, ohjausvirtakuvaaja).
  • Optimoija toteuttaa kyvyn muuntaa sarjaa ehdollisia operaatioita, jotka vertaavat samaa muuttujaa kytkinlausekkeeksi. Kytkinlauseke voidaan myöhemmin koodata bittitestausohjeiden avulla ("-fbit-tests" -vaihtoehto on lisätty ohjaamaan tällaista muuntamista).
  • Parannetut prosessien väliset optimoinnit. Lisätty uusi IPA-modref-passi (-fipa-modref), joka seuraa sivuvaikutuksia funktioita kutsuttaessa ja parantaa analyysin tarkkuutta. Parannettu IPA-ICF-passin (-fipa-icf) toteutus, joka vähentää muistin kulutusta käännöksen aikana ja lisää yhdistettyjen toimintojen määrää, joille identtiset koodilohkot yhdistetään. IPA-CP (Interprocedural Constant Protation) -passissa ennusteheuristiikkaa on parannettu ottaen huomioon silmukoiden tunnetut rajat ja ominaisuudet.
  • Linking Time Optimizations (LTO) -sovelluksessa tavukoodimuoto on optimoitu koon pienentämiseksi ja käsittelynopeuden parantamiseksi. Vähentynyt huippumuistin kulutus sitomisvaiheen aikana.
  • Koodiprofiloinnin tuloksiin perustuvassa optimointimekanismissa (PGO - Profiiliohjattu optimointi), joka mahdollistaa optimaalisemman koodin generoinnin suoritusominaisuuksien analysoinnin perusteella, GCOV-dataa sisältävien tiedostojen koko pienenee nollalaskurien kompaktimman pakkauksen ansiosta. . Parannettu "-fprofile-values" -tila pitämällä kirjaa useammista parametreista epäsuorien puhelujen yhteydessä.
  • OpenMP 5.0 (Open Multi-Processing) -standardin käyttöönotto, 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). jatkui. Lisätty alustava tuki allokointidirektiiville ja mahdollisuus käyttää heterogeenisiä silmukoita OpenMP-rakenteissa. OMP_TARGET_OFFLOAD-ympäristömuuttujan tuki on otettu käyttöön.
  • C-, C++- ja Fortran-kielille tarjotun OpenACC 2.6 -rinnakkaisohjelmointimäärityksen toteutusta on parannettu, ja se määrittelee työkalut GPU- ja erikoisprosessorien, kuten NVIDIA PTX:n, purkamiseen.
  • C-kielille on otettu käyttöön uusi attribuutti "no_stack_protector", joka on suunniteltu merkitsemään toimintoja, joille pinon suojausta ei pitäisi ottaa käyttöön ("-fstack-protector"). "malloc"-attribuuttia on laajennettu tukemaan muistin varaamiseen ja vapauttamiseen tarkoitettujen kutsuparien tunnistamista (allokaattori/jakaja), jota käytetään staattisessa analysaattorissa tunnistamaan tyypillisiä virheitä muistin kanssa työskentelyssä (muistivuotoja, käyttö vapauttamisen jälkeen, kaksinkertaiset kutsut vapaalle toiminnolle jne.) ja kääntäjän varoituksissa "-Wmismatched-dealloc", "-Wmismatched-new-delete" ja "-Wfree-nonheap-object", jotka kertovat epäjohdonmukaisuudesta muistin purkamisen ja muistin allokoinnin välillä.
  • Uusia varoituksia on lisätty C-kielelle:
    • "-Wmismatched-dealloc" (oletusarvoisesti käytössä) - varoittaa muistinvaraustoiminnoista, jotka käyttävät osoitinta, joka ei ole yhteensopiva muistinvaraustoimintojen kanssa.
    • "-Wsizeof-array-div" (käytössä, kun "-Wall" on määritetty) - Varoittaa kahden sizeof-operaattorin jakamisesta, jos jakaja ei vastaa taulukon elementin kokoa.
    • "-Wstringop-overread" (oletusarvoisesti käytössä) - varoittaa merkkijonofunktion kutsumisesta, joka lukee tietoja taulukon rajan ulkopuolelta.
    • "-Wtsan" (oletuksena käytössä) - Varoittaa sellaisten ominaisuuksien (kuten std::atomic_thread_fence) käytöstä, joita ThreadSanitizer ei tue.
    • "-Warray-parameter" ja "-Wvla-parameter" (käytössä, kun määritetään "-Wall") - varoittaa funktioiden ohittamisesta yhteensopimattomilla kiinteä- ja muuttuvapituisiin taulukoihin liittyvillä argumenteilla.
    • "-Wuninitialized" -varoitus havaitsee nyt lukuyritykset alustamattomasta dynaamisesti varatusta muistista.
    • "-Wfree-nonheap-object" -varoitus laajentaa niiden tapausten määritelmää, joissa muistinvarausfunktioita kutsutaan osoittimella, jota ei saada dynaamisten muistinvarausfunktioiden kautta.
    • "-Wmaybe-initialized" -varoitus on laajentanut välittyvien osoittimien havaitsemista toimintoihin, jotka viittaavat alustamattomiin muistipaikkoihin.
  • C-kielelle on otettu käyttöön osa C2X-standardin puitteissa kehitetyistä uusista ominaisuuksista (otettu käyttöön määrittämällä -std=c2x ja -std=gnu2x): makrot BOOL_MAX ja BOOL_WIDTH, funktion käyttämättömien parametrien nimien valinnainen ilmoitus. määritelmät (kuten C++:ssa), attribuutti "[ [nodiscard]]", esiprosessorin operaattori "__has_c_attribute", makrot FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_BL_EXSN_60559, IN, XNUMX_FINT_XNUMX LDBL_SNAN, DEC_INFINITY ja DEC _NAN, NaN = makrot kohteelle FloatN, _FloatNx ja _DecimalN, kyky määrittää hyppymerkit ennen deklaraatioita ja yhdistelmäkäskyjen lopussa.
  • C++:ssa osa C++20-standardissa ehdotetuista muutoksista ja innovaatioista on toteutettu, mukaan lukien virtuaaliset toiminnot "consteval virtual", pseudodestruktorit esineiden elinkaaren loppuun, enum-luokan käyttö ja taulukon koon laskeminen "uudessa" lausekkeessa.
  • C++:lle on lisätty kokeellinen tuki joillekin tulevalle C++23-standardille kehitettäville parannuksille (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Esimerkiksi kirjaimellinen jälkiliite "zu" on nyt tuettu allekirjoitetuille size_t-arvoille.
  • libstdc++ on parantanut tukea C++17-standardille, mukaan lukien std::from_chars- ja std::to_chars-toteutukset liukulukutyypeille. Otettu käyttöön uusia C++20-standardin elementtejä, mukaan lukien std::bit_cast, std::source_location, atomioperaatiot odottavat ja ilmoittavat, , , , sekä elementit tuleva C++-standardi 23 (std::to_underlying, std::is_scoped_enum). Lisätty kokeellinen tuki rinnakkaisen tiedonkäsittelyn tyypeille (SIMD, Data-Parallel Types). Kohteen std::uniform_int_distribution käyttöönottoa on nopeutettu.
  • Poistettiin alfalaatulipun libgccjitistä, jaetusta kirjastosta koodigeneraattorin upottamiseen muihin prosesseihin ja sen käyttämiseen tavukoodin JIT-kääntämisen järjestämiseen konekoodiksi. Lisätty mahdollisuus rakentaa libgccjit MinGW:lle.
  • Lisätty tuki AArch64 Armv8-R -arkkitehtuurille (-march=armv8-r). AArch64- ja ARM-arkkitehtuureihin on lisätty tuki prosessoreille (parametrit -mcpu ja -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex-X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) ja Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) ja Arm Cortex-R82 (cortex-r82) CPU:t on myös lisätty, ja ne tukevat vain AArch64-arkkitehtuuria.
  • Lisätty tuki Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) ja MVE (AArch32 M-profiili) SIMD-käskyjen käyttämiselle yhteen-, vähennys-, kerto- ja yhteen-/vähennystoimintojen automaattiseen vektorointiin kompleksiluvut. Lisätty alkuperäinen tuki ARM:n automaattiseen vektorointiin käyttämällä MVE-käskysarjaa.
  • ARM-alustoille tarjotaan täydellinen joukko kääntäjiin integroituja C-toimintoja (Intrinsics), jotka on korvattu laajennetuilla vektoriohjeilla (SIMD), jotka kattavat kaikki ACLE Q3 2020 -spesifikaatiossa dokumentoidut NEON-ohjeet.
  • Tuki gfx908 GPU:lle on lisätty taustajärjestelmään koodin luomiseksi GCN-mikroarkkitehtuuriin perustuville AMD GPU:ille.
  • Lisätty tuki uusille prosessoreille ja niihin toteutetuille uusille käskysarjalaajennuksille:
    • Intel Sapphire Rapids (-march=sapphirerapids, mahdollistaa tuen seuraaville ohjeille: MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-AVFX8.V.
    • Intel Alderlake (-march=alderlake, mahdollistaa tuen CLDEMOTE-, PTWRITE-, WAITPKG-, SERIALIZE-, KEYLOCKER-, AVX-VNNI- ja HRESET-ohjeille).
    • Intel Rocketlake (-march=rocketlake, samanlainen kuin Rocket Lake ilman SGX-tukea).
    • AMD Zen 3 (-march=znver3).
  • Intel-prosessoreihin perustuviin IA-32/x86-64-järjestelmiin on lisätty tuki uusille prosessoriohjeille TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Lisätty tuki "-march=x86-64-v[234]"-lipuille x86-64-arkkitehtuuritasojen valitsemiseksi (v2 - kattaa SSE4.2-, SSSE3-, POPCNT- ja CMPXCHG16B-laajennukset; v3 - AVX2 ja MOVBE; v4 - AVX-512 ) .
  • Lisätty tuki RISC-V-järjestelmille, joissa on suuri tavujärjestys. Lisätty "-misa-spec=*" vaihtoehto, jolla valitaan RISC-V-käskysarjan arkkitehtuurimäärittelyn versio. Lisätty tuki AddressSanitizerille ja pinosuojaukselle kanariatunnisteiden avulla.
  • Staattisen analyysitilan "-fanalyzer" jatkuva parantaminen, joka suorittaa resurssiintensiivisen prosessien välisen analyysin koodin suorituspoluista ja tietovirroista ohjelmassa. Tila pystyy havaitsemaan ongelmia käännösvaiheessa, kuten kaksinkertaiset kutsut free()-funktiolle yhdelle muistialueelle, tiedostokuvausvuodot, viittausten poistaminen ja nollaosoittimien välittäminen, vapautuneiden muistilohkojen käyttö, alustamattomien arvojen käyttö jne. Uudessa versiossa:
    • Ohjelman tilan seurantakoodi on kirjoitettu kokonaan uudelleen. Ongelmat erittäin suurten C-tiedostojen skannauksessa on ratkaistu.
    • Lisätty alustava C++-tuki.
    • Muistin varaus- ja purkuanalyysi on irrotettu erityisistä malloc- ja free-funktioista, ja se tukee nyt uutta/poista ja uutta[]/delete[].
    • Lisätty uusia varoituksia: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const ja -Wanalyzer-write-to-string-literal.
    • Lisätty uusia virheenkorjausvaihtoehtoja -fdump-analyzer-json ja -fno-analyzer-feasibility.
    • Mahdollisuus laajentaa analysaattoria GCC-laajennusten avulla on otettu käyttöön (esimerkiksi on valmisteltu laajennus, joka tarkistaa globaalin lukituksen (GIL) virheellisen käytön CPythonissa).

Lähde: opennet.ru

Lisää kommentti