Dopo un anno di sviluppo è stata rilasciata la versione 13.1 del set di compilatori GCC, il primo importante rilascio nella nuova serie GCC 13.x. In base al nuovo schema di numerazione delle versioni, la versione 13.0 è stata utilizzata durante lo sviluppo, e poco prima del rilascio di GCC 13.1 è già stata creata la branca GCC 14.0, sulla quale sarà basato il prossimo importante rilascio GCC 14.1.
Principali modifiche:
- È stato aggiunto a GCC un front-end per la compilazione di programmi nel linguaggio di programmazione Modula-2. Viene supportata la compilazione di codice conforme ai dialetti PIM2, PIM3 e PIM4, così come allo standard ISO adottato per questo linguaggio.
- Nel repository dei sorgenti di GCC è stato aggiunto un front-end con l'implementazione del compilatore per il linguaggio Rust, sviluppato dal progetto gccrs (GCC Rust). Attualmente, il front-end è etichettato come sperimentale e disabilitato per impostazione predefinita. Una volta portato a compimento (previsto per la prossima versione), l'insieme di strumenti standard di GCC potrà essere utilizzato per compilare programmi in Rust senza la necessità di installare il compilatore rustc, costruito utilizzando le tecnologie LLVM.
- Nel meccanismo di ottimizzazione durante la fase di collegamento (LTO) è stata aggiunta la supporto per il jobserver, un server di gestione dei lavori supportato dal progetto GNU make per ottimizzare l'esecuzione della compilazione parallela in più thread. In GCC, il jobserver viene utilizzato per parallelizzare i lavori durante l'ottimizzazione LTO nel contesto dell'intero programma (WPA, Analisi dell'intero programma). Per interagire con il jobserver, per impostazione predefinita vengono utilizzati i channel nominati (—jobserver-style=fifo).
- Nel analizzatore statico (-fanalyzer) sono state introdotte 20 nuove verifiche diagnostiche, tra cui «-Wanalyzer-out-of-bounds», «-Wanalyzer-allocation-size», «-Wanalyzer-deref-before-check», «-Wanalyzer-infinite-recursion», «-Wanalyzer-jump-through-null», «-Wanalyzer-va-list-leak».
- È stata implementata la possibilità di generare diagnostica nel formato SARIF, basato su JSON. Questo nuovo formato può essere utilizzato per ottenere i risultati dell'analisi statica (GCC -fanalyzer) e per ottenere informazioni su avvertimenti e errori. L'attivazione avviene tramite l'opzione «-fdiagnostics-format=sarif-stderr|sarif-file|json-stderr|json|json-file», dove le opzioni con «json» portano all'output in una variante di formato JSON specifica per GCC.
- Sono state implementate alcune funzionalità definite nello standard C23, come la costante nullptr per la definizione di puntatori nulli, semplificazioni nell'uso delle liste con un numero variabile di argomenti (variadic), estensioni delle capacità delle enumerazioni, l'attributo noreturn, l'uso consentito di constexpr e auto nella definizione degli oggetti, gli operatori typeof e typeof_unqual, le nuove parole chiave alignas, alignof, bool, false, static_assert, thread_local e true, e la possibilità di specificare parentesi vuote durante l'inizializzazione.
- Sono state implementate alcune funzionalità definite nello standard C++23, come la possibilità di posizionare etichette alla fine delle espressioni composite, la compatibilità con il tipo char8_t, la direttiva del preprocessore #warning, le sequenze di escape divise (\u{}, \o{}, \x{}) e nominate (‘\N{LATIN CAPITAL LETTER A}’), static operator(), static operator[], l'operatore di uguaglianza all'interno delle espressioni, l'esclusione di alcune restrizioni nell'utilizzo di constexpr, e il supporto per UTF-8 nei testi sorgente.
- Nella libstdc++ è stata migliorata la supporto sperimentale per gli standard C++20 e C++23, ad esempio, è stata aggiunta la supporto per il file di intestazione e std::format, sono state ampliate le funzionalità del file di intestazione , sono stati aggiunti tipi di dati a virgola mobile, implementati i file di intestazione e .
- Sono stati aggiunti nuovi attributi di funzione per documentare che un file descriptor viene passato in una variabile intera: «__attribute__((fd_arg(N)))», «__attribute__((fd_arg_read(N)))» e «__attribute__((fd_arg_write(N)))». Gli attributi specificati possono essere utilizzati nell'analizzatore statico (-fanalyzer) per identificare un uso errato dei file descriptor.
- È stato aggiunto un nuovo attributo «__attribute__((assume(EXPR)))», con il quale è possibile informare il compilatore che l'espressione è vera e che il compilatore può utilizzare questo fatto senza calcolare l'espressione.
- È stato aggiunto il flag «-fstrict-flex-arrays=[level]» per scegliere il comportamento nella gestione di un elemento array flessibile nelle strutture (Flexible Array Members, un array di dimensione indefinita alla fine di una struttura, ad esempio, «int b[]»).
- Aggiunta l'opzione «-Wenum-int-mismatch» per generare avvisi in caso di discrepanze tra il tipo enum e il tipo intero.
- Nel frontend per il linguaggio Fortran è stata implementata una completa supporto alla finalizzazione.
- Nel frontend per il linguaggio Go è stata aggiunta la supporto per funzioni e tipi generici (generics), garantendo la compatibilità con i pacchetti per il linguaggio Go 1.18.
- Nel backend per l'architettura AArch64 è stata implementata la supporto per CPU Ampere-1A (ampere1a), Arm Cortex-A715 (cortex-a715), Arm Cortex-X1C (cortex-x1c), Arm Cortex-X3 (cortex-x3) e Arm Neoverse V2 (neoverse-v2). Nella opzione «-march=» sono state aggiunte le supporto per gli argomenti «armv9.1-a», «armv9.2-a» e «armv9.3-a». È stata aggiunta la supporto per le estensioni della CPU FEAT_LRCPC, FEAT_CSSC e FEAT_LSE2.
- Nel backend per l'architettura ARM è stata aggiunta la supporto per CPU STAR-MC1 (star-mc1), Arm Cortex-X1C (cortex-x1c) e Arm Cortex-M85 (cortex-m85).
- Nel backend per l'architettura x86 è stata aggiunta la supporto per i processori Intel Raptor Lake, Meteor Lake, Sierra Forest, Grand Ridge, Emerald Rapids, Granite Rapids, e anche per i processori AMD Zen 4 (znver4). Sono state implementate le estensioni dell'architettura del set di istruzioni AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT, CMPccXADD, AMX-FP16, PREFETCHI, RAO-INT e AMX-COMPLEX nei processori Intel. Per i linguaggi C e C++ sui sistemi con SSE2 è stato fornito il tipo __bf16.
- Nel backend della generazione di codice per GPU AMD Radeon (GCN) è stata implementata la possibilità di utilizzare gli acceleratori AMD Instinct MI200 per migliorare le prestazioni di OpenMP/OpenACC. È stata migliorata la vettorializzazione utilizzando le istruzioni SIMD.
- Sono state ampliate significativamente le funzionalità del backend per la piattaforma LoongArch.
- Nel backend per l'architettura RISC-V è stato aggiunto il supporto per la CPU T-Head’s XuanTie C906 (thead-c906). È stato implementato il supporto per i gestori vettoriali definiti nella specifica RISC-V Vector Extension Intrinsic 0.11. Aggiunto il supporto per 30 estensioni delle specifiche RISC-V.
- Nella generazione di oggetti condivisi con l'opzione «-shared», è cessata l'aggiunta di codice di avvio dopo l'aggiunta dell'ambiente per calcoli in virgola mobile se sono attivate le ottimizzazioni «-Ofast», «-ffast-math» o «-funsafe-math-optimizations».
- Il supporto per il formato di debug DWARF è stato implementato in quasi tutte le configurazioni.
- Aggiunta l'opzione «-gz=zstd» per la compressione delle informazioni di debug utilizzando l'algoritmo Zstandard. È cessato il supporto per la modalità di compressione delle informazioni di debug obsoleta «-gz=zlib-gnu».
- È stato aggiunto il supporto iniziale per OpenMP 5.2 (Open Multi-Processing) e continuata l'implementazione degli standard OpenMP 5.0 e 5.1, che definiscono API e modalità di applicazione dei metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD).
- È stato interrotto il supporto per il vecchio formato di memorizzazione delle informazioni di debug "STABS" (incluso con le opzioni -gstabs e -gxcoff), creato negli anni '80 e utilizzato nel debugger dbx.
- È stato dichiarato obsoleto il supporto per Solaris 11.3 (il codice per il supporto di questa piattaforma sarà rimosso nella prossima versione).
Fonte: opennet.ru
