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.
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.