Izdanje paketa prevoditelja GCC 10

Nakon godinu dana razvoja objavljen izdavanje besplatnog skupa prevoditelja GCC 10.1, prvo veće izdanje u novoj grani GCC 10.x. U skladu s nova shema brojevima izdanja, u procesu razvoja korištena je verzija 10.0, a neposredno prije izlaska GCC 10.1 već se razgranala grana GCC 11.0 na temelju koje će nastati sljedeće značajno izdanje, GCC 11.1.

GCC 10.1 poznat je po implementaciji mnogih inovacija u jeziku C++ razvijenih za standard C++20, poboljšanjima koja se odnose na budući standard jezika C (C2x), novim optimizacijama u pozadini prevoditelja i eksperimentalnoj podršci način statičke analize. Osim toga, tijekom pripreme nove grane, projekt je prenio repozitorij iz SVN-a u Git.

Glavni promjena:

  • Dodano eksperimentalni način statičke analize "-analizator“, koji provodi resursno intenzivnu međuproceduralnu analizu putova izvršenja koda i tokova podataka u programu. Način je sposoban detektirati probleme u fazi kompilacije, kao što su dvostruki pozivi funkciji free() za jedno memorijsko područje, curenje deskriptora datoteke, dereferenciranje i prosljeđivanje null pokazivača, pristup oslobođenim memorijskim blokovima, korištenje neinicijaliziranih vrijednosti, itd. Korištenje novog načina rada za OpenSSL kod već je omogućilo identifikaciju opasna ranjivost.
  • Poboljšane interproceduralne optimizacije. Prolaz IPA-SRA (Interprocedural Scalar Shared Replacement) redizajniran je za rad u vrijeme povezivanja i, između ostalog, sada uklanja izračunate i vraćene neiskorištene vrijednosti. U načinu optimizacije "-O2" omogućena je opcija "-finline-functions", koja je ponovno podešena da daje prednost kompaktnijem kodu u odnosu na performanse izvršenja. Ubrzan je rad heuristike za implementaciju ugrađene funkcije. Inline proširenje i heuristika kloniranja funkcija sada mogu koristiti informacije o rasponima vrijednosti za predviđanje učinkovitosti pojedinačnih transformacija. Za C++ poboljšana je točnost raščlanjivanja aliasa na temelju tipa.
  • Poboljšana optimizacija vremena povezivanja (LTO). Dodana nova izvršna datoteka baciti za resetiranje informacija o objektnim datotekama s LTO bajt kodom. Paralelni LTO prolazi automatski određuju broj istovremeno pokrenutih make zadataka i, ako se ne mogu odrediti, koriste informacije o broju CPU jezgri kao faktor paralelizacije. Dodana je mogućnost komprimiranja LTO bajtkoda pomoću zstd algoritma.
  • Unaprijeđen je mehanizam optimizacije temeljen na rezultatima profiliranja koda (PGO - Profile-guided optimization) koji generira optimalniji kod na temelju analize karakteristika izvršavanja koda. Poboljšano održavanje profila tijekom kompilacije i toplo/hladno odvajanje koda. Preko opcije "-fprofil-vrijednosti» sada može pratiti do 4 vrijednosti profila, na primjer za neizravne pozive i pružanje preciznijih informacija o profilu.
  • Specifikacija paralelnog programiranja implementirana za jezike C, C++ i Fortran OpenACC 2.6, koji definira alate za operacije rasterećenja na GPU-ovima i specijaliziranim procesorima kao što je NVIDIA PTX. Implementacija standarda je skoro gotova Otvorite MP 5.0 (Open Multi-Processing), koji definira API i metode primjene metoda paralelnog programiranja na višejezgrenim i hibridnim (CPU+GPU/DSP) sustavima s dijeljenom memorijom i vektorizacijskim jedinicama (SIMD). Dodane značajke kao što su uvjeti lastprivate, direktive za skeniranje i petlju, izrazi order i use_device_addr. Za OpenMP i OpenACC dodana je podrška za operacije rasterećenja na GPU-ovima četvrte (Fiji) i pete generacije AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • Za jezike obitelji C dodana je funkcija "pristup" kako bi se opisao pristup funkcije objektima proslijeđenim referencom ili pokazivačem i za povezivanje takvih objekata s cjelobrojnim argumentima koji sadrže informacije o veličini objekata. Za rad u kombinaciji s "pristupom", implementiran je atribut "vrsta" za otkrivanje netočnog pristupa korisničkih funkcija, na primjer, prilikom pisanja vrijednosti u područje izvan granica polja. Također je dodan atribut "symver" za povezivanje simbola u ELF datoteci s određenim brojevima verzije.
  • Dodana nova upozorenja:
    • “-Wstring-compare” (omogućeno s “-Wextra”) - upozorava na prisutnost izraza u kojima se nula uspoređuje s rezultatom poziva funkcija strcmp i strncmp, što je ekvivalentno konstanti zbog činjenice da je duljina jednog argumenta je veći od veličine niza u drugom argumentu.
    • "-Wzero-length-bounds" (omogućeno s "-Warray-bounds") - upozorava na pristup elementima niza nulte duljine, što može dovesti do prepisivanja drugih podataka.
    • Upozorenja "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" i "-Wstringop-overflow" proširena su kako bi se povećao broj situacija izvan granica kojima se rukuje.
  • Implementirana je mogućnost izravnog određivanja širokih znakova u identifikatorima pomoću trenutnog kodiranja (UTF-8 prema zadanim postavkama) umjesto UCN notacije (\uNNNN ili \UNNNNNNNN). Na primjer:

    static const int π = 3;
    int get_naïve_pi() {
    povratak π;
    }

  • Za jezik C implementiran je dio novih značajki razvijenih unutar standarda C2X (omogućeno navođenjem -std=c2x i -std=gnu2x): pojavila se podrška za sintaksu “[[]]” za definiranje atributa kao u C++ (na primjer, [[gnu ::const]], [[deprecated]], [[fallthrough]] i [[maybe_unused]]. Dodana podrška za "u8" sintaksu za definiranje konstanti s UTF-8 znakovima.
    Dodane nove makronaredbe u . Dodane su zamjene "%OB" i "%Ob" u strftime.

  • Zadani način za C je "-fno-common", koji omogućuje učinkovitiji pristup globalnim varijablama na nekim platformama.
  • Za C++ je implementirano oko 16 promjena i inovacija, razvijenih u standardu C++20. Uključujući dodanu ključnu riječ "constinit"
    i implementirana je podrška za proširenja predložaka "koncepti". Koncepti vam omogućuju da definirate skup zahtjeva za parametre predloška koji, u vrijeme kompilacije, ograničavaju skup argumenata koji se mogu prihvatiti kao parametri predloška. Koncepti se mogu koristiti za izbjegavanje logičkih nedosljednosti između svojstava tipova podataka korištenih unutar predloška i svojstava tipa podataka ulaznih parametara.

  • G++ omogućuje otkrivanje nedefiniranog ponašanja uzrokovanog promjenom konstantnih objekata kroz constexpr. Smanjena potrošnja memorije od strane kompajlera pri izračunavanju constexpr. Dodana su nova upozorenja "-Wmismatched-tags" i "-Wredundant-tags".
  • Predložene su nove opcije naredbenog retka:
    • "-fallocation-dce" za uklanjanje nepotrebnih parova operatora "new" i "delete".
    • "-fprofile-partial-training" za onemogućavanje optimizacije veličine koda koji nema pokretanje obuke.
    • "-fprofile-reproducible za kontrolu razine ponovljivosti profila.
    • "-fprofile-prefix-path" za definiranje osnovnog izvornog direktorija za izgradnju koji se koristi za zasebno generiranje profila (za "-fprofile-generate=profile_dir" i "-fprofile-use=profile_dir").
  • U tekstu upozorenja za spomenute opcije nalaze se hiperveze koje vam omogućuju odlazak na dokumentaciju za te opcije. Zamjenom URL-a upravlja se pomoću opcije "-fdiagnostics-urls".
  • Dodan operator pretprocesora "__ima_ugrađeno", koji se može koristiti za provjeru ugrađenih funkcija.
  • Dodana je nova ugrađena funkcija "__builtin_roundeven" s implementacijom funkcije zaokruživanja definirane u specifikaciji ISO/IEC TS 18661, slično "round", ali dio zaokruživanja veći od 0.5 prema gore (na veću vrijednost), manji od 0.5 - dolje (na nulu), a jednako 0.5 - počevši od pariteta pretposljednje znamenke.
  • Za AArch64 arhitekturu, dodana je podrška za SVE2 ekstenziju i poboljšana je podrška za SVE (Scalable Vector Extension), uključujući dodatnu podršku za ugrađene SVE ACLE funkcije i tipove, te korištenje vektorizacije. Podrška za LSE (Large System Extensions) i TME (Transactional Memory Extension) je proširena. Dodane su nove upute predložene u Armv8.5-A i Armv8.6-A, uključujući upute za generiranje nasumičnog broja, zaokruživanje, vezivanje memorijske oznake,
    bfloat16 i množenje matrice. Dodana podrška za procesor
    Arm Cortex-A77,
    Ruka Cortex-A76AE,
    Arm Cortex-A65,
    Ruka Cortex-A65AE,
    Arm Cortex-A34 i
    Marvell ThunderX3.

  • Dodana podrška za ABI FDPIC (32-bitni funkcijski pokazivači) za ARM64. Redizajnirana i optimizirana obrada 64-bitnih cjelobrojnih operacija. Dodana CPU podrška
    Arm Cortex-A77,
    Arm Cortex-A76AE i
    Ruka Cortex-M35P. Proširena podrška za ACLE upute za obradu podataka, uključujući 32-bitni SIMD, 16-bitno množenje, latch aritmetiku i druge optimizacije DSP algoritama. Dodana je eksperimentalna podrška za upute ACLE CDE (Custom Datapath Extension).

  • Značajno poboljšano generiranje koda i vektorizacija u pozadini za AMD GPU-ove temeljene na GCN mikroarhitekturi.
  • Dodana podrška za uređaje slične XMEGA za AVR arhitekturu
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609 3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX i ATmegaXNUMX.

  • Novo Intel ENQCMD proširenje arhitekture skupa instrukcija (-menqcmd) dodano je za IA-32/x86-64 arhitekture. Dodana podrška za procesore Intel Cooperlake (-march=cooperlake, uključuje AVX512BF16 ISA proširenje) i Tigerlake (-march=tigerlake, uključuje MOVDIRI, MOVDIR64B i AVX512VP2INTERSECT ISA proširenja).
  • Implementacija HSAIL-a (srednji jezik heterogene sistemske arhitekture) za heterogene računalne sustave temeljene na HSA arhitekturi je zastarjela i vjerojatno će biti uklonjena u budućem izdanju.

Izvor: opennet.ru

Dodajte komentar