Izdaja zbirke prevajalnikov GCC 10

Po letu razvoja objavljeno izdaja brezplačnega kompleta prevajalnikov GCC 10.1, prva večja izdaja v novi veji GCC 10.x. V skladu z nova shema številke izdaje je bila v razvojnem procesu uporabljena različica 10.0, malo pred izidom GCC 10.1 pa se je že odcepila veja GCC 11.0, na podlagi katere bo nastala naslednja pomembna izdaja GCC 11.1.

GCC 10.1 je znan po izvajanju številnih inovacij v jeziku C++, razvitem za standard C++20, izboljšavah, povezanih s prihodnjim standardom jezika C (C2x), novih optimizacijah v ozadju prevajalnika in eksperimentalni podpori način statične analize. Poleg tega je med pripravo nove veje projekt prenesel repozitorij iz SVN v Git.

Glavni Spremembe:

  • Dodano eksperimentalni način statične analize "-analizator“, ki izvaja medproceduralno analizo poti izvajanja kode in podatkovnih tokov v programu, ki zahteva veliko virov. Način je sposoben zaznati težave na stopnji prevajanja, kot so dvojni klici funkcije free() za eno pomnilniško območje, uhajanje deskriptorjev datotek, dereferenciranje in posredovanje ničelnih kazalcev, dostopanje do sproščenih pomnilniških blokov, uporaba neinicializiranih vrednosti itd. Uporaba novega načina za kodo OpenSSL je že omogočila identifikacijo nevarna ranljivost.
  • Izboljšane medproceduralne optimizacije. Prehod IPA-SRA (Interprocedural Scalar Shared Replacement) je bil preoblikovan tako, da deluje v času povezovanja in med drugim zdaj odstranjuje izračunane in vrnjene neuporabljene vrednosti. V načinu optimizacije »-O2« je omogočena možnost »-finline-functions«, ki je nastavljena tako, da daje prednost kompaktnejši kodi pred zmogljivostjo izvajanja. Delo hevristike za uvajanje inline funkcij je bilo pospešeno. Hevristike razširitve in kloniranja funkcij zdaj lahko uporabljajo informacije o razponih vrednosti za napovedovanje učinkovitosti posameznih transformacij. Za C++ je bila izboljšana natančnost razčlenjevanja vzdevkov na podlagi tipa.
  • Izboljšana optimizacija časa povezovanja (LTO). Dodana nova izvršljiva datoteka lto-odlagati za ponastavitev informacij o objektnih datotekah z bajtno kodo LTO. Vzporedni prehodi LTO samodejno določijo število istočasno zagnanih nalog ustvarjanja in, če jih ni mogoče določiti, uporabijo informacije o številu jeder CPU kot dejavnik paralelizacije. Dodana možnost stiskanja bajtne kode LTO z uporabo algoritma zstd.
  • Izboljšan je optimizacijski mehanizem na podlagi rezultatov profiliranja kode (PGO – Profile-guided optimization), ki generira bolj optimalno kodo na podlagi analize značilnosti izvajanja kode. Izboljšano vzdrževanje profila med prevajanjem in ločevanjem vroče/hladne kode. Preko možnosti "-fprofilne-vrednosti» zdaj lahko spremlja do 4 vrednosti profila, na primer za posredne klice in zagotavljanje natančnejših informacij o profilu.
  • Specifikacija vzporednega programiranja, implementirana za jezike C, C++ in Fortran OpenACC 2.6, ki definira orodja za operacije razbremenitve na grafičnih procesorjih in specializiranih procesorjih, kot je NVIDIA PTX. Implementacija standarda je skoraj končana Odprite MP 5.0 (Open Multi-Processing), ki definira API in metode uporabe metod vzporednega programiranja na večjedrnih in hibridnih (CPU+GPU/DSP) sistemih s skupnim pomnilnikom in vektorizacijskimi enotami (SIMD). Dodane funkcije, kot so pogojniki lastprivate, direktive skeniranja in zanke, izrazi order in use_device_addr. Za OpenMP in OpenACC je bila dodana podpora za operacije razbremenitve na grafičnih procesorjih AMD Radeon (GCN) četrte generacije (Fiji) in pete generacije (VEGA 10/VEGA 20).
  • Za jezike družine C je bila dodana funkcija »dostop« za opis dostopa funkcije do predmetov, posredovanih s sklicevanjem ali kazalcem, in za povezovanje takih predmetov s celimi argumenti, ki vsebujejo informacije o velikosti predmetov. Za delo v povezavi z »dostopom« je implementiran atribut »type« za zaznavanje napačnega dostopa uporabniških funkcij, na primer pri pisanju vrednosti v območje zunaj meja matrike. Dodan je tudi atribut "symver" za povezovanje simbolov v datoteki ELF z določenimi številkami različice.
  • Dodana nova opozorila:
    • “-Wstring-compare” (omogočeno z “-Wextra”) - opozori na prisotnost izrazov, v katerih se nič primerja z rezultatom klica funkcij strcmp in strncmp, kar je enakovredno konstanti zaradi dejstva, da je dolžina enega argumenta je večja od velikosti matrike v drugem argumentu.
    • »-Wzero-length-bounds« (omogočeno z »-Warray-bounds«) – opozarja na dostop do elementov polja ničelne dolžine, kar lahko privede do prepisovanja drugih podatkov.
    • Opozorila »-Warray-bounds«, »-Wformat-overflow«, »-Wrestrict«, »-Wreturn-local-addr« in »-Wstringop-overflow« so bila razširjena, da se poveča število situacij izven meja ki se obravnavajo.
  • Implementirana možnost neposrednega določanja širokih znakov v identifikatorjih z uporabo trenutnega kodiranja (privzeto UTF-8) namesto zapisa UCN (\uNNNN ali \UNNNNNNNN). Na primer:

    statična const int π = 3;
    int get_naïve_pi() {
    vrnitev π;
    }

  • Za jezik C je bil implementiran del novih funkcij, razvitih v okviru standarda C2X (omogočeno z določitvijo -std=c2x in -std=gnu2x): pojavila se je podpora za sintakso "[[]]" za definiranje atributov kot v C++ (na primer [[gnu ::const]], [[deprecated]], [[fallthrough]] in [[maybe_unused]]. Dodana podpora za sintakso »u8« za definiranje konstant z znaki UTF-8.
    Dodani novi makri v . Dodane zamenjave »%OB« in »%Ob« v strftime.

  • C privzeto uporablja način "-fno-common", ki omogoča učinkovitejši dostop do globalnih spremenljivk na nekaterih platformah.
  • Za C++ je bilo implementiranih približno 16 sprememb in novosti, razvitih v standardu C++20. Vključno z dodano ključno besedo »constinit«
    in podpora za razširitve predlog je bila implementirana "konceptov". Koncepti vam omogočajo, da definirate nabor zahtev za parametre predloge, ki v času prevajanja omejujejo nabor argumentov, ki jih je mogoče sprejeti kot parametre predloge. Koncepte je mogoče uporabiti za izogibanje logičnim neskladjem med lastnostmi podatkovnih tipov, uporabljenih v predlogi, in lastnostmi podatkovnega tipa vhodnih parametrov.

  • G++ zagotavlja zaznavanje nedefiniranega vedenja, ki ga povzroči spreminjanje konstantnih objektov prek constexpr. Zmanjšana poraba pomnilnika s strani prevajalnika pri izračunu constexpr. Dodana nova opozorila »-Wmismatched-tags« in »-Wredundant-tags«.
  • Predlagane so bile nove možnosti ukazne vrstice:
    • "-fallocation-dce" za odstranitev nepotrebnih parov operatorjev "new" in "delete".
    • "-fprofile-partial-training", da onemogočite optimizacijo velikosti za kodo, ki nima izvajanja usposabljanja.
    • "-fprofile-reproducible za nadzor stopnje ponovljivosti profila.
    • "-fprofile-prefix-path" za določitev osnovnega izvornega gradbenega imenika, ki se uporablja za ločeno generiranje profila (za "-fprofile-generate=profile_dir" in "-fprofile-use=profile_dir").
  • V opozorilnem besedilu za omenjene možnosti so navedene hiperpovezave, ki vam omogočajo dostop do dokumentacije za te možnosti. Zamenjava URL-jev je nadzorovana z možnostjo "-fdiagnostics-urls".
  • Dodan operater predprocesorja "__ima_vgrajeno", ki ga lahko uporabite za preverjanje vgrajenih funkcij.
  • Dodana je nova vgrajena funkcija "__builtin_roundeven" z implementacijo funkcije zaokroževanja, opredeljene v specifikaciji ISO/IEC TS 18661, podobno kot "round", vendar del zaokroževanja večji od 0.5 navzgor (na večjo vrednost), manj kot 0.5 - navzdol (na nič) in enako 0.5 - začenši s pariteto predzadnje števke.
  • Za arhitekturo AArch64 je bila dodana podpora za razširitev SVE2 in izboljšana je bila podpora za SVE (Scalable Vector Extension), vključno z dodano podporo za vgrajene funkcije in vrste SVE ACLE ter uporabo vektorizacije. Podpora za LSE (Large System Extensions) in TME (Transactional Memory Extension) je bila razširjena. Dodana nova navodila, predlagana v Armv8.5-A in Armv8.6-A, vključno z navodili za generiranje naključnih števil, zaokroževanje, vezavo pomnilniške oznake,
    bfloat16 in matrično množenje. Dodana podpora za procesor
    Roka Cortex-A77,
    Roka Cortex-A76AE,
    Roka Cortex-A65,
    Roka Cortex-A65AE,
    Roka Cortex-A34 in
    Marvell ThunderX3.

  • Dodana podpora za ABI FDPIC (32-bitni funkcijski kazalci) za ARM64. Preoblikovana in optimizirana obdelava 64-bitnih celoštevilskih operacij. Dodana podpora za procesor
    Roka Cortex-A77,
    Roka Cortex-A76AE in
    Roka Cortex-M35P. Razširjena podpora za navodila za obdelavo podatkov ACLE, vključno z 32-bitnim SIMD, 16-bitnim množenjem, zaskočno aritmetiko in drugimi optimizacijami algoritmov DSP. Dodana eksperimentalna podpora za navodila ACLE CDE (Custom Datapath Extension).

  • Znatno izboljšano generiranje kode in vektorizacija v ozadju za grafične procesorje AMD, ki temeljijo na mikroarhitekturi GCN.
  • Dodana podpora za naprave, podobne XMEGA, za arhitekturo AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609 3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX in ATmegaXNUMX.

  • Nova razširitev arhitekture nabora navodil Intel ENQCMD (-menqcmd) je bila dodana za arhitekture IA-32/x86-64. Dodana podpora za procesorje Intel Cooperlake (-march=cooperlake, vključuje razširitev ISA AVX512BF16) in Tigerlake (-march=tigerlake, vključuje razširitve MOVDIRI, MOVDIR64B in AVX512VP2INTERSECT ISA).
  • Implementacija HSAIL (heterogeneous System Architecture Intermediate Language) za heterogene računalniške sisteme, ki temeljijo na arhitekturi HSA, je bila opuščena in bo verjetno odstranjena v prihodnji izdaji.

Vir: opennet.ru

Dodaj komentar