Dopo un anno di sviluppo, è stato pubblicato il rilascio della suite di compilatori GCC 15.1, il primo importante rilascio nella nuova serie GCC 15.x. Secondo lo schema di numerazione delle versioni, la versione 15.0 è stata utilizzata nel processo di sviluppo, e poco prima del rilascio di GCC 15.1 è già stata biforcata la serie GCC 16.0, da cui verrà formata la prossima importante versione, GCC 16.1.
Principali modifiche:
- Quando si compilano programmi in linguaggio C, il criterio di default attivato è lo standard C23 (panoramica delle modifiche) con le estensioni GNU ("-std=gnu23"). In precedenza, lo standard di default era C17 - "-std=gnu17". Questa modifica potrebbe causare problemi nella compilazione di progetti esistenti a causa dell'inclusione della costante nullptr, del tipo _BitInt(n) e delle parole chiave bool, true e false, che potrebbero entrare in conflitto con identificatori omonimi definiti nelle applicazioni.
- Sono state implementate le funzionalità dello standard C23:
- La direttiva "#embed", destinata a incorporare nel codice risorse binarie.
- L'attributo "unsequenced", che segnala che il risultato non dipende dall'ordine d'esecuzione.
- L'attributo «reproducible» indica che la funzione restituisce sempre lo stesso risultato con gli stessi input, ovvero non dipende da altri fattori.
- Sono stati implementati gli elementi del futuro standard C2Y (-std=c2y e -std=gnu2y):
- Possibilità di dichiarare variabili nell'operatore «if», ad esempio, «if (int x = get ()) {…}».
- Supporto per assegnare nomi ai cicli per fare riferimento a essi nel codice. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // salta a CONT1 case 2: break outer; // salta a CONT2 } // CONT1 } // CONT2
- Supporto per specificare intervalli di valori interi nelle espressioni «case», ad esempio, «case 1 … 10:».
- Suffissi «i» e «j» per indicare la parte immaginaria nei numeri complessi.
- Possibilità di usare gli operatori «++» e «—» con numeri complessi.
- Costruzione «_Generic(type, expr1, expr2, …)» per selezionare l'espressione in base al tipo dell'operando.
- Supporto per accedere agli array di byte come altri tipi di oggetti, come strutture e unioni.
- Supporto per applicare l'operatore «alignof» a array incompleti (dichiarati senza specificare la dimensione, ad esempio, «int a[]»).
- È stata aggiunta una nuova sintassi per le sequenze di escape di caratteri ottali, esadecimali e universali. Invece di «\u», «\x» e «\nnn», sono state introdotte le sequenze «\u{}», «\o{}» e «\x{}», in cui è possibile specificare un numero arbitrario di cifre.
- Funzioni incorporate «__builtin_stdc_rotate_left» e «__builtin_stdc_rotate_right».
- Sono consentite operazioni di lunghezza zero su puntatori NULL (ad esempio, «sizeof(*p)»).
- Nel frontend per il linguaggio C++ sono state implementate funzionalità sviluppate per il futuro standard C++26:
- Operatore variabile «friend» («friend Ts…»).
- Possibilità di utilizzare la parola chiave «constexpr» con la variante dell'operatore «new» (placement new) per allocare un oggetto in memoria precedentemente riservata durante la compilazione.
- Visualizzazione di un errore quando si elimina un puntatore a un tipo incompleto.
- È stato dichiarato obsoleto il syntax per definire parametri variabili con i puntini di sospensione senza una virgola precedente (ad esempio, quando si dichiara «void e(int…)» invece di «void e(int, …)»).
- Indicizzazione del pacchetto di parametri nei template.
- Attributi per le binding strutturate;
- Sintassi ‘= delete(«motivo»)’;
- Inclusione di «@», «$» e «`» nel set di caratteri di base.
- È vietato l'uso di macro per la dichiarazione di moduli.
- Possibilità di utilizzare il binding strutturato (structured binding) come condizione negli operatori if e switch.
- Sostegno al confronto diretto tra array annullato (ad esempio, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Meccanismo «#embed» per l'incorporamento di risorse binarie.
- Dichiarato obsoleto il template class is_trivial.
- Aggiunte le funzionalità C++23:
- Divieto di alcune applicazioni della direttiva «export» e autorizzazione all'uso di «export {}».
- Supporto per l'estensione della vita degli oggetti temporanei nei cicli «for» che iterano su intervalli.
- Nel library libstdc++ è stata implementata una supporto sperimentale per i moduli std e std.compat.
- L'uso dell'inizializzatore «{0}» per le unioni nel codice C e C++ non garantisce più la pulizia di tutto il contenuto, ma porta a zero il primo elemento dell'unione. Per pulire l'intera unione, utilizzare l'espressione «{}», definita nella specifica C23, o specificare l'opzione «-fzero-init-padding-bits=unions» per ripristinare il comportamento precedente.
- È stata implementata la supporto dell'attributo «musttail» ([[gnu::musttail]] e [[clang::musttail]]) per garantire le chiamate in coda. L'attributo si applica alle espressioni return in cui viene effettuata una chiamata ricorsiva alla funzione corrente e garantisce che tale chiamata utilizzi la ricorsione in coda, senza allocare memoria aggiuntiva nello stack (escludendo il rischio di esaurimento della memoria con un numero molto elevato di chiamate).
- È stata implementata la supporto dell'attributo flag_enum ([[gnu::flag_enum]] e [[clang::flag_enum]]), applicabile alle enumerazioni per indicare che il contenuto viene utilizzato nelle operazioni bitwise (escludendo l'emissione di un avviso in modalità «-Wswitch»).
- È stata aggiunta la supporto dell'attributo «counted_by», tramite il quale è possibile specificare un campo nella struttura con un array flessibile che definisce il numero di elementi. L'attributo può essere utilizzato per migliorare l'efficienza dei controlli di overflow del buffer.
- Per le funzioni è stato aggiunto l'attributo «nonnull_if_nonzero», che definisce che alcuni parametri della funzione con puntatori possono accettare il valore NULL solo se un altro parametro è uguale a zero.
- È consentito utilizzare inserimenti assembler avanzati «asm (…)» al di fuori delle funzioni. Negli inserimenti assembler è consentito sovrascrivere la memoria nella zona rossa dello stack (l'area in cima allo stack).
- La compilazione del codice in C++ è stata accelerata grazie a un miglioramento dell'hashing dei template.
- Sono state aggiunte nuove ottimizzazioni. È stata implementata la supporto per la vettorizzazione dei cicli che contengono codice per uscita anticipata (ad esempio, tramite invocazione di break o return), anche se tali cicli manipolano array o buffer allocati dinamicamente, il cui dimensionamento non è noto al momento della compilazione. Attivando l'opzione «-O2» si include la vettorizzazione di alcuni cicli facilmente vettorizzabili, per i quali non ci sono informazioni sul numero di iterazioni (tripcount).
- È stata aggiunta una modalità di ottimizzazione incrementale in fase di collegamento (LTO, Link-Time Optimization), che riduce significativamente il tempo di ricompilazione quando si utilizzano LTO in situazioni in cui sono state effettuate modifiche minori al codice (ad esempio, modificata una funzione). Per attivare la modalità incrementale, è stata proposta l'opzione «-flto-incremental».
- Migliorata la compilazione di file di input molto grandi. Implementato il tracciamento dei numeri di colonna superiori a 4096. Aumentata la precisione nella segnalazione delle posizioni di errori e avvertimenti in file di grandi dimensioni.
- Migliorata la chiarezza dei rapporti nella diagnosi dei problemi. Ad esempio, il punto di origine del problema è evidenziato con il simbolo «⚠️», modificato il layout di output in caso di errori nei template C++, aggiunti suggerimenti per facilitare la transizione allo standard C23, rinnovata la schema dei colori. Aggiunta la possibilità di output della diagnostica in formato Sarif (-fdiagnostics-format=sarif-file).
- Implementata la libreria libgdiagnostics, che permette di integrare nelle proprie progetti le funzionalità di GCC relative alla formattazione dei messaggi diagnostici (ad esempio, è possibile utilizzare strumenti di citazione, evidenziazione e suggerimenti per le correzioni).
- Aggiunti gli avvertimenti «-Wtrailing-whitespace» e «-Wleading-whitespace» per identificare gli spazi residui alla fine delle righe e gli spazi eccessivi all'inizio delle righe.
- Aggiunto l'avvertimento «-Wheader-guard» per informare su problemi nei macro di protezione dei file di intestazione che prevengono l'inclusione ripetuta del file di intestazione.
- Il frontend per il linguaggio D è stato aggiornato alla versione 2.111.0.
- Nel frontend per il linguaggio Fortran è stata aggiunta la supporto per numeri interi senza segno.
- È stato incluso il compilatore per il linguaggio COBOL — gcobol, che supporta le piattaforme x86-64 e AArch64 ed è progettato per non essere utilizzato su sistemi a 32 bit. Il compilatore implementa la specifica ISO/IEC 1989:2023 e supera gran parte dei test NIST CCVS/85.
- Seguita l'implementazione degli standard OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), che definiscono API e modalità di utilizzo dei metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD). Aggiunto supporto per metadirettive e costrutti tile, unroll, interop e dispatch. Per alcune GPU AMD e NVIDIA è stato aggiunto il supporto per la memoria condivisa unificata (attivata tramite l'indicazione unified_shared_memory nella direttiva 'requires'). Aggiunto supporto per l'espressione 'self_maps'.
- Nel backend per l'architettura AArch64 è stata aggiunta la supporto per la piattaforma MinGW (aarch64-w64-mingw32). Implementate oltre 20 estensioni ARM8 e migliorato il supporto per l'estensione ACLE (Arm C Language Extensions). Apportati numerosi miglioramenti al generatore di codice. Aggiunto supporto 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)
- Nel backend per la generazione di codice per GPU AMD Radeon (GCN) è stata implementata la supporto per la libreria libstdc++ e aggiunta supporto sperimentale per la generazione di codice per le serie di dispositivi gfx9-generic, gfx10-3-generic e gfx11-generic.
- Nel backend per l'architettura x86 è stato aggiunto il supporto per le estensioni dell'architettura del set di istruzioni Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. È stato aggiunto supporto per CPU Intel Diamond Rapids e Xeon Phi.
- Le capacità dei backend per le piattaforme LoongArch e AVR sono state ampliate.
- È stato rimosso il supporto per l'architettura target nios2, utilizzata nelle CPU Nios II. È stata dichiarata obsoleta e sarà rimossa nella prossima versione importante il supporto ABI ILP32 (-mabi=ilp32) nel port per AArch64.
Fonte: opennet.ru
