Izdanje GCC 10 kompajlerskog paketa

Nakon godinu dana razvoja objavljeno izdanje besplatnog skupa kompajlera GCC 10.1, prvo veliko izdanje u novoj grani GCC 10.x. U skladu sa nova šema izdanja, verzija 10.0 je korištena u procesu razvoja, a neposredno prije izlaska GCC 10.1, grana GCC 11.0 se već razgranala, na osnovu koje će se formirati sljedeće značajno izdanje, GCC 11.1.

GCC 10.1 je poznat po implementaciji mnogih inovacija u jeziku C++ razvijenih za standard C++20, poboljšanjima vezanim za budući standard jezika C (C2x), novim optimizacijama u pozadini kompajlera i eksperimentalnoj podršci način statičke analize. Pored toga, tokom pripreme nove grane, projekat je preneo spremište sa SVN-a na Git.

Glavni promjena:

  • Dodano eksperimentalni način statičke analize"-fanalizer“, koji vrši međuproceduralnu analizu puteva izvršavanja koda i tokova podataka u programu koji zahtijevaju resurse. Režim je sposoban da otkrije probleme u fazi kompilacije, kao što su dvostruki pozivi funkcije 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. Upotreba novog načina za OpenSSL kod je već omogućila identifikaciju opasna ranjivost.
  • Poboljšane interproceduralne optimizacije. IPA-SRA (Interprocedural Scalar Shared Replacement) prolaz je redizajniran da radi u vrijeme vezanja i, između ostalog, sada uklanja izračunate i vraćene neiskorištene vrijednosti. U režimu optimizacije "-O2", omogućena je opcija "-finline-functions", koja je ponovo podešena da daje prednost kompaktnijem kodu u odnosu na performanse izvršavanja. Rad heuristike za implementaciju inline funkcije je ubrzan. Inline ekspanzija i heuristika kloniranja funkcija sada mogu koristiti informacije o rasponima vrijednosti za predviđanje učinkovitosti pojedinačnih transformacija. Za C++, poboljšana je preciznost raščlanjivanja pseudonima zasnovanog na tipu.
  • Poboljšane optimizacije vremena povezivanja (LTO). Dodan novi izvršni fajl lto-dump da resetujete informacije o objektnim datotekama sa LTO bajt kodom. Paralelni LTO prolazi automatski određuju broj istovremeno pokrenutih zadataka izrade i, ako se ne mogu odrediti, koriste informacije o broju CPU jezgara kao faktor paralelizacije. Dodata mogućnost kompresije LTO bajtkoda pomoću zstd algoritma.
  • Poboljšan je mehanizam optimizacije na osnovu rezultata profilisanja koda (PGO - Profile-guided optimization), koji generiše optimalniji kod na osnovu analize karakteristika izvršavanja koda. Poboljšano održavanje profila tokom kompilacije i odvajanje toplog/hladnog koda. Preko opcije "-fvrijednosti-profila» sada može pratiti do 4 vrijednosti profila, na primjer za indirektne pozive i pružanje preciznijih informacija o profilu.
  • Specifikacija paralelnog programiranja implementirana za jezike C, C++ i Fortran OpenACC 2.6, koji definiše alate za preuzimanje operacija na GPU-ovima i specijalizovanim procesorima kao što je NVIDIA PTX. Implementacija standarda je skoro završena Otvorite MP 5.0 (Open Multi-Processing), koji definira API i metode primjene metoda paralelnog programiranja na višejezgarnim i hibridnim (CPU+GPU/DSP) sistemima sa zajedničkom memorijom i jedinicama za vektorizaciju (SIMD). Dodane funkcije kao što su lastprivate uvjeti, direktive skeniranja i petlje, izrazi reda i use_device_addr. Za OpenMP i OpenACC, dodata je podrška za operacije preuzimanja na GPU-ovima četvrte generacije (Fidži) i pete generacije AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • Za jezike porodice C, funkcija „pristup“ je dodana da opiše pristup funkcije objektima prosleđenim referencom ili pokazivačem i da poveže takve objekte sa cjelobrojnim argumentima koji sadrže informacije o veličini objekata. Za rad u kombinaciji s "access", atribut "type" implementiran je za otkrivanje neispravnog pristupa od korisničkih funkcija, na primjer, kada se upisuju vrijednosti u područje izvan granica niza. Takođe je dodat atribut "symver" za pridruživanje simbola u ELF datoteci sa određenim brojevima verzija.
  • Dodata su nova upozorenja:
    • “-Wstring-compare” (omogućeno sa “-Wextra”) - upozorava na prisustvo izraza u kojima se nula uspoređuje s rezultatom poziva strcmp i strncmp funkcija, što je ekvivalentno konstanti zbog činjenice da je dužina jednog argumenta je veći od veličine niza u drugom argumentu.
    • "-Wzero-length-bounds" (omogućeno sa "-Warray-bounds") - upozorava na pristup elementima niza nulte dužine, što može dovesti do prepisivanja drugih podataka.
    • Upozorenja “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” i “-Wstringop-overflow” su proširena kako bi se povećao broj situacija izvan granica kojima se rukuje.
  • Implementirana je mogućnost direktnog specificiranja širokih znakova u identifikatorima koristeći trenutno kodiranje (UTF-8 po defaultu) umjesto UCN notacije (\uNNNN ili \UNNNNNNNNN). Na primjer:

    static const int π = 3;
    int get_naive_pi() {
    return π;
    }

  • Za jezik C implementiran je dio novih funkcija razvijenih u okviru C2X standarda (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]]. Dodata podrška za "u8" sintaksu za definiranje konstanti sa UTF-8 znakovima.
    Dodani su novi makroi u . Dodane su zamjene "%OB" i "%Ob" u strftime.

  • Podrazumevani režim za C je "-fno-common", koji omogućava efikasniji pristup globalnim varijablama na nekim platformama.
  • Za C++ je implementirano oko 16 izmjena i inovacija razvijenih u C++20 standardu. Uključujući dodanu ključnu riječ “constinit”
    i implementirana je podrška za proširenja šablona "koncept". Koncepti vam omogućavaju da definirate skup zahtjeva parametara šablona koji, u vrijeme kompajliranja, ograničavaju skup argumenata koji se mogu prihvatiti kao parametri predloška. Koncepti se mogu koristiti da bi se izbjegle logičke nedosljednosti između svojstava tipova podataka koji se koriste unutar predloška i svojstava tipa podataka ulaznih parametara.

  • G++ omogućava otkrivanje nedefiniranog ponašanja uzrokovanog promjenom konstantnih objekata putem constexpr. Smanjena potrošnja memorije od strane kompajlera prilikom izračunavanja constexpr. Dodata su nova upozorenja "-Wmismatched-tags" i "-Wredundant-tags".
  • Predložene su nove opcije komandne linije:
    • "-fallocation-dce" za uklanjanje nepotrebnih parova "new" i "delete" operatora.
    • "-fprofile-partial-training" da onemogućite optimizaciju veličine za kod koji nema izvođenje obuke.
    • "-fprofile-reproducible za kontrolu nivoa ponovljivosti profila.
    • "-fprofile-prefix-path" za definiranje osnovnog izvornog direktorija izgradnje koji se koristi za odvojeno generiranje profila (za "-fprofile-generate=profile_dir" i "-fprofile-use=profile_dir").
  • U tekstu upozorenja za navedene opcije date su hiperveze koje vam omogućavaju da pređete na dokumentaciju za ove opcije. Zamjena URL-a se kontrolira pomoću opcije "-fdiagnostics-urls".
  • Dodan preprocesorski operator "__ima_ugrađen", 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 ISO/IEC TS 18661 specifikaciji, slično kao "round", ali dio zaokruživanja veći od 0.5 naviše (na veću vrijednost), manji od 0.5 - dolje (na nulu), i jednako 0.5 - počevši od pariteta pretposljednje cifre.
  • Za arhitekturu AArch64, dodata je podrška za ekstenziju SVE2 i poboljšana je podrška za SVE (Scalable Vector Extension), uključujući dodanu 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 nove instrukcije predložene u Armv8.5-A i Armv8.6-A, uključujući upute za generiranje slučajnih brojeva, zaokruživanje, povezivanje memorijskih oznaka,
    bfloat16 i množenje matrice. Dodata podrška za procesor
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 i
    Marvell ThunderX3.

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

  • Značajno poboljšano generiranje koda i vektorizacija u pozadini za AMD GPU zasnovane na GCN mikroarhitekturi.
  • Dodata podrška za uređaje slične XMEGA za AVR arhitekturu
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATtiny808, ATtiny809, ATmega1608, ATmega1609mega3208 3209, ATmega4808, ATmega4809 XNUMX, ATmegaXNUMX i ATmegaXNUMX.

  • Dodato je novo proširenje arhitekture Intel ENQCMD skupa instrukcija (-menqcmd) za IA-32/x86-64 arhitekture. Dodata podrška za Intel Cooperlake (-march=cooperlake, uključuje AVX512BF16 ISA ekstenziju) i Tigerlake (-march=tigerlake, uključuje MOVDIRI, MOVDIR64B i AVX512VP2INTERSECT ISA ekstenzije) CPU.
  • Implementacija HSAIL-a (srednji jezik heterogene arhitekture sistema) za heterogene računarske sisteme zasnovane na HSA arhitekturi je zastarjela i vjerovatno će biti uklonjena u budućem izdanju.

izvor: opennet.ru

Dodajte komentar