Po roce vývoje byl vydán svobodný set kompilátorů GCC 15.1, první významné vydání v nové větvi GCC 15.x. V souladu s číslicovým schématem vydání byla verze 15.0 používána během vývoje, a krátce před vydáním GCC 15.1 již byla odštěpena větev GCC 16.0, na jejímž základě bude vytvořeno další významné vydání GCC 16.1.
Hlavní změny:
- Při kompilaci programů v jazyce C je ve výchozím nastavení použit standard C23 (přehled změn) s rozšířeními GNU („-std=gnu23“). Dříve byl ve výchozím nastavení používaný standard C17 — „-std=gnu17“. Tato změna může potenciálně způsobit problémy při sestavování stávajících projektů kvůli zavedení konstanty nullptr, typu _BitInt(n) a klíčových slov bool, true a false, které mohou kolidovat s identifikátory stejného jména definovanými v aplikacích.
- Byly implementovány možnosti standardu C23:
- Direktiva „#embed“, určená k vkládání binárních zdrojů do kódu.
- Atribut „unsequenced“, signalizující, že výsledek nezávisí na pořadí vykonávání.
- Atribut „reproducible“, udávající, že funkce vždy vrací stejný výsledek při stejných vstupních datech, t.j. nezávisí na jiných faktorech.
- Byly implementovány prvky budoucího standardu C2Y (-std=c2y a -std=gnu2y):
- Možnost deklarace proměnných v příkazu „if“, například „if (int x = get ()) {…}“.
- Podpora pojmenovávání cyklů pro odkazování na ně v kódu. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // jumps to CONT1 case 2: break outer; // jumps to CONT2 } // CONT1 } // CONT2
- Podpora specifikace rozsahů celých čísel ve výrazích „case“, například „case 1 … 10:“.
- Sufixy „i“ a „j“ pro označení imaginární části v komplexních číslech.
- Možnost použití operátorů „++“ a „—“ s komplexními čísly.
- Konstrukce „_Generic(type, expr1, expr2, …)“ pro výběr výrazu na základě typu operand.
- Podpora zpracování bytových polí jako jiných typů objektů, jako jsou struktury a unie.
- Podpora použití operátoru „alignof“ pro neúplná pole (deklarovaná bez specifikace velikosti, například „int a[]“).
- Byl přidán nový syntax pro osmické, hexadecimální a univerzální escape sekvence znaků. Místo „\u“, „\x“ a „\nnn“ byly navrženy sekvence „\u{}“, „\o{}“ a „\x{}“, v nichž lze uvádět libovolný počet číslic.
- Vestavěné funkce „__builtin_stdc_rotate_left“ a „__builtin_stdc_rotate_right“.
- Byly povoleny operace s nulovou délkou na ukazatelích NULL (např. „sizeof(*p)“).
- Ve front-endu pro jazyk C++ byly implementovány možnosti, které jsou rozvíjeny pro budoucí standard C++26:
- Variabilní operátor „friend“ („friend Ts…“).
- Možnost použití klíčového slova „constexpr“ se variantou operátoru „new“ (placement new) pro umístění objektu do předem alokované paměti během kompilace.
- Výstup chyby při odstraňování ukazatele na neúplný typ.
- Byla prohlášena za zastaralou syntaxe definice variabilních parametrů s třemi tečkami bez předchozí čárky (například, když je uvedeno „void e(int…)“ místo „void e(int, …)“).
- Indexování balíčku parametrů v šablonách.
- Atributy pro strukturované vazby;
- Syntaxe „= delete(„důvod“);“;
- Začlenění „@“, „$“ a „`“ do základní množiny znaků.
- Použití makra pro deklaraci modulů je zakázáno.
- Možnost aplikace strukturovaného vazby (structured binding) jako podmínky v operátorech if a switch.
- Byla zastavena podpora přímého porovnávání polí (např. „int arr1[5]; int arr2[5]; bool same = arr1 == arr2“).
- Mechanismus „#embed“ pro začlenění binárních zdrojů.
- Byla prohlášena za zastaralou šablonová třída is_trivial.
- Byly přidány možnosti C++23:
- Zákaz některých použití direktivy „export“ a povolení použití „export {}“.
- Podpora prodloužení životnosti dočasných objektů v cyklech „for“, které procházejí rozsahy.
- V knihovně libstdc++ byla provedena experimentální podpora modulů std a std.compat.
- Použití inicializátoru „{0}“ pro unie v kódu C a C++ nyní nezaručuje vymazání veškerého obsahu, ale vede k nulování prvního prvku unie. Pro vymazání celé unie by mělo být použito výraz „{}“, definované ve specifikaci C23, nebo by měla být uvedena volba „-fzero-init-padding-bits=unions“ pro obnovení starého chování.
- Byla zavedena podpora atributu „musttail“ ([[gnu::musttail]] a [[clang::musttail]]) pro garantované tail volání. Atribut se používá u výrazů return, ve kterých dochází k rekurzivnímu volání aktuální funkce, a zaručuje, že takové volání bude používat tail rekurzi, při které se nealokuje další paměť na zásobníku (vylučuje riziko vyčerpání paměti při velmi vysokém počtu volání).
- Byla implementována podpora atributu flag_enum ([[gnu::flag_enum]] a [[clang::flag_enum]]), který se používá u výčtů k indikaci, že se obsah používá v bitových operacích (vylučuje výstup varování v režimu „-Wswitch“).
- Byla přidána podpora atributu „counted_by“, pomocí kterého lze určit pole ve struktuře s flexibilním polem, které definuje počet prvků. Atribut může být použit ke zvýšení efektivity kontrol přetečení bufru.
- Byl přidán atribut „nonnull_if_nonzero“ pro funkce, který určuje, že některé parametry funkce s ukazateli mohou přijmout hodnotu NULL, pouze pokud je jiný parametr roven nule.
- Bylo povoleno používat rozšířené assemblerové vložky „asm (…)“ mimo funkce. V assemblerových vložkách je povoleno přepisovat paměť v červené zóně zásobníku (oblastech na vrcholu zásobníku).
- Kompilace kódu v C++ byla zrychlena díky vylepšenému hashování šablon.
- Byly přidány nové optimalizace. Byla implementována podpora vektorizace smyček, které obsahují kód pro předčasné vystoupení (např. prostřednictvím volání break nebo return), i když tyto smyčky manipulují s dynamicky přidělovanými poli nebo buffery, jejichž velikost není známa v době kompilace. Při zadání volby „-O2“ je povolena vektorizace některých snadno vektorizovatelných smyček, pro které nejsou k dispozici informace o počtu iterací (tripcount).
- Byl přidán režim inkrementální optimalizace při fázi slučování (LTO, Link-Time Optimization), který výrazně zkracuje čas rekompilace při použití LTO v situacích, kdy byly provedeny drobné změny v kódu (upravena jedna funkce). Pro zahrnutí inkrementálního režimu byla navržena volba „-flto-incremental“.
- Byla vylepšena kompilace velmi velkých vstupních souborů. Bylo implementováno sledování čísel sloupců přesahujících 4096. Byla zvýšena přesnost určení umístění chyb a varování ve velmi velkých souborech.
- Byla zlepšena přehlednost zpráv při diagnostice problémů. Například byl zajištěn výběr místa vzniku problému symboly „⚠️“, byla změněna struktura výstupu při chybách v šablonách C++, byly přidány tipy pro usnadnění přechodu na standard C23 a byla přepracována barevná schéma. Byla přidána možnost výstupu diagnostiky ve formátu Sarif (-fdiagnostics-format=sarif-file).
- Byla implementována knihovna libgdiagnostics, která umožňuje integrovat do projektů funkce GCC související s formátováním diagnostických zpráv (například je možné využít nástroje pro citace, zvýraznění a tipy na opravy).
- Byly přidány varování „-Wtrailing-whitespace“ a „-Wleading-whitespace“ pro odhalování zbývajících mezer na konci řádků a nadbytečných mezer na začátku řádků.
- Bylo přidáno varování „-Wheader-guard“ pro informování o problémech s makry strážícími hlavičkový soubor a zabraňujícími opětovnému zahrnutí hlavičkového souboru.
- Frontend pro jazyk D byl aktualizován na verzi 2.111.0.
- Frontend pro jazyk Fortran byl rozšířen o podporu nezáporných celých čísel.
- Byl zahrnut kompilátor pro jazyk COBOL — gcobol, který podporuje platformy x86-64 a AArch64 a není určen pro použití na 32-bitových systémech. Kompilátor implementuje specifikaci ISO/IEC 1989:2023 a prochází většinou testů NIST CCVS/85.
- Pokračuje implementace standardů OpenMP 5.0, 5.1, 5.2 a 6.0 (Open Multi-Processing), které definují API a způsoby použití metod paralelního programování na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorovými bloky (SIMD). Byla přidána podpora metadirektiv a konstrukcí tile, unroll, interop a dispatch. Pro některé GPU od AMD a NVIDIA byla přidána podpora unifikované sdílené paměti (zapíná se použitím unified_shared_memory v direktivě „requires“). Byla přidána podpora výrazu „self_maps“.
- Do backendu pro architekturu AArch64 byla přidána podpora platformy MinGW (aarch64-w64-mingw32). Bylo implementováno více než 20 rozšíření ARM8 a zlepšena podpora rozšíření ACLE (Arm C Language Extensions). Bylo provedeno mnoho vylepšení v generátoru kódu. Byla přidána podpora CPU:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (cortex-a725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (cortex-x925)
- Arm Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace (grace)
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (oryon-1)
- V backendu generace kódu pro GPU AMD Radeon (GCN) byla implementována podpora knihovny libstdc++ a přidána experimentální podpora generace kódu pro série zařízení gfx9-generic, gfx10-3-generic a gfx11-generic.
- Do backend architecture x86 byla přidána podpora rozšíření architektury instrukční sady Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Byla přidána podpora CPU Intel Diamond Rapids a Xeon Phi.
- Možnosti backendů pro platformy LoongArch a AVR byly rozšířeny.
- Byla odstraněna podpora cílové architektury nios2, používané v procesorech Nios II. Podpora ABI ILP32 (-mabi=ilp32) v portu pro AArch64 byla vyhlášena za zastaralou a bude odstraněna v příštím významném vydání.
Zdroj: opennet.ru
