Versione del set di compilatori GCC 12

Dopo un anno di sviluppo, è stata rilasciata la versione 12.1 del compilatore GCC, il primo importante rilascio della nuova serie GCC 12.x. Secondo il nuovo schema di numerazione delle versioni, la versione 12.0 è stata utilizzata durante lo sviluppo, e poco prima del rilascio di GCC 12.1 è stata già creata la ramificazione GCC 13.0, da cui sarà generato il prossimo importante rilascio, GCC 13.1. Il 23 maggio il progetto celebrerà 35 anni dalla pubblicazione della prima versione di GCC.

Principali modifiche:

  • È stato aggiunto il supporto per il formato di debug CTF (Compact Type Format), che consente una memorizzazione compatta delle informazioni sui tipi C, le relazioni tra funzioni e i simboli di debug. Se integrato negli oggetti ELF, il formato permette di utilizzare le tabelle dei simboli EFL per evitare la duplicazione dei dati.
  • È stata dichiarata obsoleta la supporto per il formato di memorizzazione delle informazioni di debug "STABS", sviluppato negli anni '80.
  • Prosegue il lavoro per estendere il supporto agli standard futuri C2X e C++23 per i linguaggi C e C++. Ad esempio, è stata aggiunta la supporto per l'espressione «if consteval»; è ora consentito l'uso di auto negli argomenti delle funzioni («f(auto(g()))»); è permesso l'uso di variabili non letterali, goto e etichette in funzioni dichiarate come constexpr; è stato aggiunto il supporto per operatori di indice multidimensionali operator[]; in if, for e switch sono state ampliate le funzionalità dei blocchi di inizializzazione («for (using T = int; T e : v)»).
  • Nella libreria standard C++ è stato migliorato il supporto per le sezioni sperimentali degli standard C++20 e C++23. È stato aggiunto il supporto per std::move_only_function, , std::basic_string::resize_and_overwrite, , e std::invoke_r. È consentito l'uso in funzioni constexpr di std::unique_ptr, std::vector, std::basic_string, std::optional e std::variant.
  • Nel frontend per il linguaggio Fortran è stato fornito il supporto completo per la specifica TS 29113, che descrive le capacità di garantire portabilità tra codice scritto nei linguaggi Fortran e C.
  • È stato aggiunto il supporto per l'estensione __builtin_shufflevector(vec1, vec2, index1, index2, …), precedentemente aggiunta in Clang e che offre una chiamata unica per eseguire operazioni di vettore comuni di permutazione e miscelazione.
  • Utilizzando il livello di ottimizzazione «-O2», la vettorizzazione è abilitata per impostazione predefinita (sono attivati i modi -ftree-vectorize e -fvect-cost-model=very-cheap). Il modello «very-cheap» consente la vettorizzazione solo se il codice vettoriale può sostituire completamente il codice scalare vettorializzato.
  • È stata aggiunta la modalità «-ftrivial-auto-var-init» che abilita l'inizializzazione esplicita delle variabili nello stack per il monitoraggio dei problemi e per la prevenzione delle vulnerabilità legate all'uso di variabili non inizializzate.
  • Per i linguaggi C e C++ è stata aggiunta la funzione integrata __builtin_dynamic_object_size per determinare la dimensione di un oggetto, compatibile con una funzione simile di Clang.
  • Per i linguaggi C e C++ è stato aggiunto il supporto per l'attributo «unavailable» (ad esempio, si possono contrassegnare le funzioni che genereranno un errore nel tentativo di utilizzo).
  • Per i linguaggi C e C++ è stato aggiunto il supporto per le direttive di preprocessing «#elifdef» e «#elifndef».
  • È stato aggiunto il flag «-Wbidi-chars» per generare un avviso in caso di uso errato dei caratteri UTF-8 che alterano l'ordine di visualizzazione del testo bidirezionale.
  • È stata aggiunta l'opzione «-Warray-compare» per mostrare un avviso quando si tenta di confrontare due operandi che fanno riferimento a degli array.
  • Continua l'implementazione degli standard OpenMP 5.0 e 5.1 (Open Multi-Processing), che definiscono API e modalità di utilizzo di metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD).
  • Migliorata l'implementazione della specifica di programmazione parallela OpenACC 2.6, che definisce i mezzi per l'offloading delle operazioni su GPU e processori specializzati, come NVIDIA PTX.
  • Nel backend di generazione del codice per l'architettura x86 è stata aggiunta la supporto per le istruzioni estese Intel AVX512-FP16 e per il tipo _Float16.
  • Per l'architettura x86 è stata introdotta una protezione contro le vulnerabilità nei processori, causate dall'esecuzione speculativa di istruzioni dopo operazioni di salto incondizionato. Questo problema si verifica a causa dell'elaborazione anticipata di istruzioni che seguono immediatamente il comando di salto in memoria (SLS, Straight Line Speculation). È stata proposta l'opzione «-mharden-sls» per attivare la protezione.
  • Nell'analizzatore statico sperimentale è stata aggiunta la definizione dell'uso di variabili non inizializzate. È stata introdotta un'iniziale supporto per l'analisi del codice assembly nelle inserzioni inline. È stato migliorato il tracciamento dello stato della memoria. È stato riscritto il codice per la gestione delle espressioni switch.
  • Aggiunti 30 nuove chiamate in libgccjit, una libreria condivisa per l'integrazione di un generatore di codice in altri processi e per l'organizzazione della compilazione JIT del bytecode in codice macchina.
  • Nel backend per la generazione del bytecode BPF è stato aggiunto il supporto per il meccanismo CO-RE (Compile Once — Run Everywhere), che consente di compilare il codice dei programmi eBPF per il kernel Linux una sola volta e di utilizzare un caricatore universale speciale, che adatta il programma caricato al kernel attuale e ai formati BTF (BPF Type Format). CO-RE risolve il problema della portabilità dei programmi eBPF compilati, che in precedenza potevano essere utilizzati solo nella versione del kernel per cui erano stati compilati, poiché la posizione degli elementi nelle strutture dati cambia da versione a versione.
  • Nel backend per l'architettura RISC-V è stata aggiunta la supporto per le nuove estensioni dell'architettura del set di istruzioni zba, zbb, zbc e zbs, oltre alle estensioni ISA per le operazioni crittografiche vettoriali e scalari. È stata assicurata, di default, la supporto per la specifica RISC-V ISA 20191213. È stata aggiunta l'opzione -mtune=thead-c906, che include le ottimizzazioni per i core T-HEAD c906.
  • Nel backend di generazione del codice per GPU AMD basate sull'architettura micro GCN è stata aggiunta la supporto per il tipo __int128_t/integer(kind=16). È stata resa possibile l'utilizzo di fino a 40 gruppi di lavoro per blocco computazionale (CU) e fino a 16 fronti di istruzioni (wavefront, insieme di thread, eseguiti in parallelo dal SIMD Engine) per gruppo. In precedenza era consentito l'uso di un solo fronte di istruzioni per CU.
  • Nel backend NVPTX, progettato per la generazione di codice utilizzando l'architettura del set di istruzioni NVIDIA PTX (Parallel Thread Execution), è stata aggiunta la possibilità di utilizzare i flag "-march", "-mptx" e "-march-map". È stata implementata la supporto per PTX ISA sm_53, sm_70, sm_75 e sm_80. Di default, viene utilizzata l'architettura sm_30.
  • Nel backend per i processori PowerPC / PowerPC64 / RS6000 sono state riscritte le implementazioni delle funzioni integrate. Sono state documentate le funzioni integrate __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar e __builtin_set_tfiar.
  • Nel backend per l'architettura ARM/AArch64 è stata aggiunta la supporto per la CPU Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) e Arm Cortex-X2 (cortex-x2). È stata aggiunta la supporto per nuove varianti dell'architettura ARMv8 da utilizzare nell'opzione «-march»: armv8.7-a, armv8.8-a, armv9-a. È stata implementata una funzione intrinseca per il caricamento e il salvataggio atomico dei dati in memoria, basata sull'uso di istruzioni avanzate ARM (ls64). È stata aggiunta la supporto per l'accelerazione delle funzioni memcpy, memmove e memset tramite l'estensione ARM mopsoption.
  • È stata aggiunta una nuova modalità di verifica «-fsanitize=shadow-call-stack» (ShadowCallStack), disponibile al momento solo per l'architettura AArch64 e funziona durante la compilazione del codice con l'opzione «-ffixed-r18». Questa modalità fornisce protezione contro la sovrascrittura dell'indirizzo di ritorno dalla funzione in caso di overflow del buffer nello stack. La protezione consiste nel mantenere l'indirizzo di ritorno in un «stack ombra» separato dopo aver trasferito il controllo alla funzione e nel recuperare questo indirizzo prima di uscire dalla funzione.

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster