Po roce vývoje publikováno vydání bezplatné sady kompilátorů GCC 10.1, první hlavní vydání v nové větvi GCC 10.x. V souladu s nové schéma čísla vydání, ve vývojovém procesu byla použita verze 10.0 a krátce před vydáním GCC 10.1 se již rozvětvila větev GCC 11.0, na jejímž základě by se vytvořilo další významné vydání, GCC 11.1.
GCC 10.1 se vyznačuje implementací mnoha inovací v jazyce C++ vyvinutém pro standard C++20, vylepšeními souvisejícími s budoucím standardem jazyka C (C2x), novými optimalizacemi v backendech kompilátoru a experimentální podporou. režim statické analýzy. Během přípravy nové větve navíc projekt převedl repozitář z SVN na Git.
Přidat experimentální režim statické analýzy "-fanalyzátor“, která provádí meziprocedurální analýzu cest provádění kódu a datových toků v programu náročnou na zdroje. Režim je schopen detekovat problémy ve fázi kompilace, jako jsou dvojitá volání funkce free() pro jednu paměťovou oblast, úniky deskriptorů souborů, dereferencování a předávání nulových ukazatelů, přístup k uvolněným paměťovým blokům, používání neinicializovaných hodnot atd. Použití nového režimu pro kód OpenSSL již umožnilo identifikaci nebezpečná zranitelnost.
Vylepšené meziprocedurální optimalizace. Průchod IPA-SRA (Interprocedural Scalar Shared Replacement) byl přepracován tak, aby fungoval v době vazby a mimo jiné nyní odstraňuje vypočítané a vrácené nepoužité hodnoty. V režimu optimalizace "-O2" je povolena možnost "-finline-functions", která je přeladěna tak, aby upřednostňovala kompaktnější kód před výkonem provádění. Práce heuristiky pro nasazení inline funkcí byla urychlena. Heuristika inline expanze a klonování funkcí může nyní využívat informace o rozsazích hodnot k predikci účinnosti jednotlivých transformací. Pro C++ byla vylepšena přesnost typově založené analýzy aliasů.
Vylepšené optimalizace doby propojení (LTO). Přidán nový spustitelný soubor lto-skládka k resetování informací o objektových souborech pomocí bajtkódu LTO. Paralelní průchody LTO automaticky určují počet současně běžících úloh vytváření, a pokud je nelze určit, použijí informace o počtu jader CPU jako faktor paralelizace. Přidána možnost komprimovat bajtový kód LTO pomocí algoritmu zstd.
Byl vylepšen optimalizační mechanismus založený na výsledcích profilování kódu (PGO - Profile-guided optimization), který generuje optimálnější kód na základě analýzy charakteristik provádění kódu. Vylepšená údržba profilu během kompilace a oddělení kódu za tepla/za studena. Prostřednictvím možnosti "-fprofile-values» nyní může sledovat až 4 hodnoty profilu, například pro nepřímé hovory a poskytovat přesnější informace o profilu.
Specifikace paralelního programování implementovaná pro jazyky C, C++ a Fortran OpenACC 2.6, která definuje nástroje pro stahování operací na GPU a specializovaných procesorech, jako je NVIDIA PTX. Implementace standardu je téměř dokončena Otevřete MP 5.0 (Open Multi-Processing), která definuje API a metody aplikace metod paralelního programování na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorizačními jednotkami (SIMD). Přidané funkce, jako jsou podmínky lastprivate, příkazy skenování a smyčky, výrazy order a use_device_addr. U OpenMP a OpenACC byla přidána podpora pro operace snižování zátěže na GPU čtvrté generace (Fiji) a páté generace AMD Radeon (GCN) (VEGA 10/VEGA 20).
U jazyků rodiny C byla přidána funkce „access“, která popisuje přístup funkce k objektům předávaným odkazem nebo ukazatelem a přidružuje takové objekty k celočíselným argumentům obsahujícím informace o velikosti objektů. Pro práci ve spojení s „access“ je atribut „type“ implementován pro detekci nesprávného přístupu z uživatelských funkcí, například při zápisu hodnot do oblasti mimo hranice pole. Přidán je také atribut "symver", který spojuje symboly v souboru ELF s konkrétními čísly verzí.
Přidána nová upozornění:
„-Wstring-compare“ (zapnuto s „-Wextra“) – upozorňuje na přítomnost výrazů, ve kterých je nula porovnávána s výsledkem volání funkcí strcmp a strncmp, což je ekvivalentní konstantě kvůli skutečnosti, že délka jednoho argumentu je větší než velikost pole ve druhém argumentu .
"-Wzero-length-bounds" (povoleno s "-Warray-bounds") - varuje před přístupem k prvkům pole s nulovou délkou, což může vést k přepsání jiných dat.
Varování „-Warray-bounds“, „-Wformat-overflow“, „-Wrestrict“, „-Wreturn-local-addr“ a „-Wstringop-overflow“ byla rozšířena, aby se rozšířil počet situací mimo hranice. které jsou zpracovány.
Implementována možnost přímo specifikovat široké znaky v identifikátorech pomocí aktuálního kódování (ve výchozím nastavení UTF-8) namísto zápisu UCN (\uNNNN nebo \UNNNNNNNNN). Například:
statická konst int π = 3;
int get_naïve_pi() {
návrat π;
}
Pro jazyk C byla implementována část nových funkcí vyvinutých v rámci standardu C2X (umožněno zadáním -std=c2x a -std=gnu2x): pro definování atributů se objevila podpora syntaxe „[[]]“ jako v C++ (například [[gnu ::const]], [[deprecated]], [[fallthrough]] a [[možná_unused]]. Přidána podpora syntaxe "u8" pro definování konstant se znaky UTF-8.
Přidána nová makra do . Přidány substituce "%OB" a "%Ob" do strftime.
Ve výchozím nastavení používá C režim "-fno-common", který umožňuje efektivnější přístup ke globálním proměnným na některých platformách.
Pro C++ bylo implementováno asi 16 změn a inovací vyvinutých ve standardu C++20. Včetně přidaného klíčového slova „constinit“
a byla implementována podpora pro rozšíření šablon "koncept". Koncepty vám umožňují definovat sadu požadavků na parametry šablony, které v době kompilace omezují sadu argumentů, které lze přijmout jako parametry šablony. Tyto koncepty lze použít k zamezení logických nesrovnalostí mezi vlastnostmi datových typů použitých v šabloně a vlastnostmi datových typů vstupních parametrů.
G++ poskytuje detekci nedefinovaného chování způsobeného změnou konstantních objektů prostřednictvím constexpr. Snížená spotřeba paměti kompilátorem při výpočtu constexpr. Přidána nová varování „-Wmismatched-tags“ a „-Wredundant-tags“.
Byly navrženy nové možnosti příkazového řádku:
"-fallocation-dce" k odstranění nepotřebných párů operátorů "new" a "delete".
"-fprofile-partial-training" pro zakázání optimalizace velikosti pro kód, který nemá trénovací běh.
"-fprofile-reproducible pro řízení úrovně reprodukovatelnosti profilu.
"-fprofile-prefix-path" pro definování základního zdrojového adresáře sestavení používaného pro samostatné generování profilu (pro "-fprofile-generate=profile_dir" a "-fprofile-use=profile_dir").
V textu upozornění pro uvedené možnosti jsou uvedeny hypertextové odkazy, které vám umožní přejít do dokumentace k těmto možnostem. Náhrada URL je řízena pomocí volby "-fdiagnostics-urls".
Přidán operátor preprocesoru "__has_builtin“, který lze použít ke kontrole vestavěných funkcí.
Přidána nová vestavěná funkce „__builtin_roundeven“ s implementací funkce zaokrouhlení definované ve specifikaci ISO/IEC TS 18661, podobná „kulaté“, ale část zaokrouhlení větší než 0.5 nahoru (na větší hodnotu), menší než 0.5 - dolů (na nulu) a rovna 0.5 - počínaje paritou předposlední číslice.
Pro architekturu AArch64 byla přidána podpora pro rozšíření SVE2 a vylepšena podpora pro SVE (Scalable Vector Extension), včetně přidané podpory pro vestavěné funkce a typy SVE ACLE a použití vektorizace. Rozšířena byla podpora LSE (Large System Extensions) a TME (Transactional Memory Extension). Přidány nové instrukce navržené v Armv8.5-A a Armv8.6-A, včetně instrukcí pro generování náhodných čísel, zaokrouhlování, vázání paměťových značek,
bfloat16 a násobení matic. Přidána podpora procesoru
Arm Cortex-A77,
Arm Cortex-A76AE,
Arm Cortex-A65,
Arm Cortex-A65AE,
Rameno Cortex-A34 a
Marvell ThunderX3.
Přidána podpora pro ABI FDPIC (32bitové funkční ukazatele) pro ARM64. Přepracované a optimalizované zpracování 64bitových celočíselných operací. Přidána podpora CPU
Arm Cortex-A77,
Rameno Cortex-A76AE a
Rameno Cortex-M35P. Rozšířená podpora pro instrukce ACLE pro zpracování dat, včetně 32bitové SIMD, 16bitové násobení, latch aritmetiky a dalších optimalizací DSP algoritmů. Přidána experimentální podpora pro instrukce ACLE CDE (Custom Datapath Extension).
Výrazně vylepšené generování kódu a vektorizace v backendu pro GPU AMD na základě mikroarchitektury GCN.
Přidána podpora pro zařízení podobná XMEGA pro architekturu AVR
ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega , ATmega3208 3209, ATmega4808 a ATmega4809.
Pro architektury IA-32/x86-64 bylo přidáno nové rozšíření architektury instrukční sady Intel ENQCMD (-menqcmd). Přidána podpora pro procesory Intel Cooperlake (-march=cooperlake, zahrnuje rozšíření AVX512BF16 ISA) a Tigerlake (-march=tigerlake, zahrnuje rozšíření MOVDIRI, MOVDIR64B a AVX512VP2INTERSECT ISA).
Implementace HSAIL (Heterogeneous System Architecture Intermediate Language) pro heterogenní výpočetní systémy založené na architektuře HSA byla zastaralá a pravděpodobně bude v budoucí verzi odstraněna.