Rilascio della suite di compilatori GCC 11

Dopo un anno di sviluppo è stata rilasciata la release della suite del compilatore GCC 11.1 gratuita, la prima release significativa nel nuovo branch GCC 11.x. Con il nuovo schema di numerazione delle versioni, durante lo sviluppo è stata utilizzata la versione 11.0 e, poco prima del rilascio di GCC 11.1, era già stato eseguito il fork del ramo GCC 12.0, da cui si formerà la prossima versione significativa di GCC 12.1.

GCC 11.1 si distingue per il passaggio all'utilizzo predefinito del formato file di debug DWARF 5, l'inclusione predefinita dello standard C++17 ("-std=gnu++17"), miglioramenti significativi nel supporto per C++20 standard, supporto sperimentale per C++23, miglioramenti relativi al futuro standard del linguaggio C (C2x), nuove ottimizzazioni delle prestazioni.

Principali modifiche:

  • La modalità predefinita per il linguaggio C++ è stata modificata per utilizzare lo standard C++17 (-std=gnu++17) invece del C++14 offerto in precedenza. È possibile disabilitare selettivamente il nuovo comportamento C++17 durante l'elaborazione di modelli che utilizzano altri modelli come parametro (-fno-new-ttp-matching).
  • Aggiunto il supporto per l'accelerazione hardware dello strumento AddressSanitizer, che consente di determinare i fatti di accesso alle aree di memoria liberate, il superamento dei limiti del buffer allocato e alcuni altri tipi di errori quando si lavora con la memoria. L'accelerazione hardware è attualmente disponibile solo per l'architettura AArch64 ed è focalizzata sull'uso durante la compilazione del kernel Linux. Per abilitare l'accelerazione hardware di AddressSanitizer durante la creazione di componenti dello spazio utente, è stato aggiunto il flag "-fsanitize=hwaddress" e il flag del kernel "-fsanitize=kernel-hwaddress".
  • Quando si generano informazioni di debug, viene utilizzato per impostazione predefinita il formato DWARF 5 che, rispetto alle versioni precedenti, consente di generare dati di debug più compatti del 25%. Il supporto completo per DWARF 5 richiede almeno la versione 2.35.2 di binutils. Il formato DWARF 5 è supportato negli strumenti di debug a partire da GDB 8.0, valgrind 3.17.0, elfutils 0.172 e dwz 0.14. Per generare file di debug utilizzando altre versioni di DWARF, puoi utilizzare le opzioni "-gdwarf-2", "-gdwarf-3" e "-gdwarf-4".
  • I requisiti per i compilatori che possono essere utilizzati per creare GCC sono stati aumentati. Il compilatore deve ora supportare lo standard C++11 (prima era richiesto C++98), cioè Se GCC 10 è stato sufficiente per creare GCC 3.4, ora è necessario almeno GCC 11 per creare GCC 4.8.
  • Sono stati modificati il ​​nome e la posizione dei file per il salvataggio dei dump, dei file temporanei e delle informazioni aggiuntive necessarie per l'ottimizzazione LTO. Tali file ora vengono sempre salvati nella directory corrente a meno che il percorso non venga modificato esplicitamente tramite le opzioni "-dumpbase", "-dumpdir" e "-save-temps=*".
  • Il supporto per il formato binario BRIG da utilizzare con il linguaggio HSAIL (Heterogeneous System Architecture Intermediate Language) è stato deprecato e verrà presto rimosso.
  • Sono state ampliate le funzionalità della modalità ThreadSanitizer (-fsanitize=thread), progettata per rilevare condizioni di competizione quando si condividono gli stessi dati da thread diversi di un'applicazione multi-thread. La nuova versione aggiunge il supporto per runtime e ambienti alternativi, nonché il supporto per lo strumento di debug KCSAN (Kernel Concurrency Sanitizer), progettato per rilevare dinamicamente le condizioni di competizione all'interno del kernel Linux. Aggiunte nuove opzioni "-param tsan-distinguish-volatile" e "-param tsan-instrument-func-entry-exit".
  • I numeri di colonna nei messaggi diagnostici ora non riflettono il conteggio dei byte dall'inizio della riga, ma in realtà i numeri di colonna che tengono conto dei caratteri multibyte e dei caratteri che occupano più posizioni nella riga (ad esempio, il carattere 🙂 occupa due posizioni e è codificato in 4 byte). Allo stesso modo, i caratteri di tabulazione ora vengono trattati come un certo numero di spazi (configurabili tramite l'opzione -ftabstop, predefinito 8). Per ripristinare il vecchio comportamento, viene proposta l'opzione “-fdiagnostics-column-unit=byte” e per determinare il valore iniziale (numerazione da 0 o 1) - l'opzione “-fdiagnostics-column-origin=”.
  • Il vettorizzatore tiene conto dell'intero contenuto della funzione e aggiunge capacità di elaborazione associate a intersezioni e riferimenti a blocchi precedenti nel grafico del flusso di controllo (CFG, grafico del flusso di controllo).
  • L'ottimizzatore implementa la capacità di convertire una serie di operazioni condizionali che confrontano la stessa variabile in un'espressione switch. In futuro, l'espressione switch potrà essere codificata utilizzando istruzioni di test dei bit (è stata aggiunta l'opzione “-fbit-tests” per controllare tale conversione).
  • Ottimizzazioni interprocedurali migliorate. Aggiunto un nuovo passaggio IPA-modref (-fipa-modref) per tenere traccia degli effetti collaterali quando si chiamano funzioni e migliorare la precisione dell'analisi. Migliorata l'implementazione del pass IPA-ICF (-fipa-icf), che riduce il consumo di memoria durante la compilazione e aumenta il numero di funzioni unificate per le quali vengono combinati blocchi di codice identici. Nel passaggio IPA-CP (Interprocedural Constant Propagation), le euristiche di previsione sono state migliorate, tenendo conto dei limiti e delle caratteristiche noti dei loop.
  • In Linking Time Optimizations (LTO), il formato del bytecode è ottimizzato per ridurre le dimensioni e migliorare la velocità di elaborazione. Ridotto il consumo massimo di memoria durante la fase di associazione.
  • Nel meccanismo di ottimizzazione basato sui risultati della profilazione del codice (PGO - Ottimizzazione guidata dal profilo), che consente di generare un codice più ottimale in base all'analisi delle caratteristiche di esecuzione, la dimensione dei file con dati GCOV è ridotta grazie al confezionamento più compatto dei contatori zero . Modalità "-fprofile-values" migliorata tenendo traccia di più parametri sulle chiamate indirette.
  • L'implementazione dello standard OpenMP 5.0 (Open Multi-Processing), che definisce le API e le modalità per applicare metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e unità di vettorizzazione (SIMD), ha continuò. Aggiunto il supporto iniziale per la direttiva allocate e la possibilità di utilizzare cicli eterogenei nei costrutti OpenMP. Supporto implementato per la variabile di ambiente OMP_TARGET_OFFLOAD.
  • È stata migliorata l'implementazione della specifica di programmazione parallela OpenACC 2.6 prevista per i linguaggi C, C++ e Fortran, che definisce strumenti per scaricare le operazioni su GPU e processori specializzati, come NVIDIA PTX.
  • Per i linguaggi C è stato implementato un nuovo attributo “no_stack_protector”, progettato per contrassegnare le funzioni per le quali la protezione dello stack non deve essere abilitata (“-fstack-protector”). L'attributo "malloc" è stato ampliato per supportare l'identificazione di coppie di chiamate per l'allocazione e la liberazione della memoria (allocatore/deallocatore), che viene utilizzato nell'analizzatore statico per identificare errori tipici nell'utilizzo della memoria (perdite di memoria, utilizzo dopo la liberazione, doppie chiamate alla funzione free, ecc.) e negli avvisi del compilatore “-Wmismatched-dealloc”, “-Wmismatched-new-delete” e “-Wfree-nonheap-object”, che informano sull'incoerenza tra le operazioni di deallocazione e allocazione della memoria.
  • Sono stati aggiunti nuovi avvisi per il linguaggio C:
    • "-Wmismatched-dealloc" (abilitato per impostazione predefinita): avvisa delle operazioni di deallocazione della memoria che utilizzano un puntatore non compatibile con le funzioni di allocazione della memoria.
    • "-Wsizeof-array-div" (abilitato quando è specificato "-Wall") - Avverte di dividere due operatori sizeof se il divisore non corrisponde alla dimensione dell'elemento dell'array.
    • "-Wstringop-overread" (abilitato per impostazione predefinita) - avverte di chiamare una funzione di stringa che legge i dati da un'area esterna al limite dell'array.
    • "-Wtsan" (abilitato per impostazione predefinita): avvisa sull'utilizzo di funzionalità (come std::atomic_thread_fence) che non sono supportate in ThreadSanitizer.
    • "-Warray-parameter" e "-Wvla-parameter" (abilitati quando si specifica "-Wall") - avvisa dell'override di funzioni con dichiarazioni incompatibili di argomenti associati ad array a lunghezza fissa e variabile.
    • L'avviso "-Wuninitialized" ora rileva i tentativi di lettura dalla memoria allocata dinamicamente non inizializzata.
    • L'avviso "-Wfree-nonheap-object" espande la definizione dei casi in cui le funzioni di deallocazione della memoria vengono chiamate con un puntatore non ottenuto tramite funzioni di allocazione dinamica della memoria.
    • L'avviso "-Wmaybe-uninitialized" ha ampliato il rilevamento del passaggio di puntatori a funzioni che fanno riferimento a posizioni di memoria non inizializzate.
  • Per il linguaggio C è stata implementata una parte delle nuove funzionalità sviluppate nell'ambito dello standard C2X (abilitate specificando -std=c2x e -std=gnu2x): macro BOOL_MAX e BOOL_WIDTH, indicazione opzionale dei nomi dei parametri non utilizzati in funzione definizioni (come in C++), attributo "[ [nodiscard]]", operatore del preprocessore "__has_c_attribute", macro FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC_INFINITY e DEC_NAN, NaN=macro per FloatN , _FloatNx e _DecimalN, possibilità di specificare i segni di salto prima delle dichiarazioni e alla fine delle istruzioni composte.
  • Per C++ sono state implementate una parte delle modifiche e innovazioni proposte nello standard C++20, tra cui le funzioni virtuali “consteval virtual”, pseudo-distruttori per la fine del ciclo di vita degli oggetti, l'uso della classe enum e calcolare la dimensione di un array nell'espressione “new”.
  • Per C++ è stato aggiunto il supporto sperimentale per alcuni miglioramenti in fase di sviluppo per il futuro standard C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Ad esempio, ora è disponibile il supporto per il suffisso letterale “zu” per i valori size_t con segno.
  • libstdc++ ha migliorato il supporto per lo standard C++17, inclusa l'introduzione delle implementazioni std::from_chars e std::to_chars per i tipi a virgola mobile. Sono stati implementati nuovi elementi dello standard C++20, tra cui std::bit_cast, std::source_location, operazioni atomiche di attesa e notifica, , , , , nonché elementi del futuro standard C++23 (std::to_underlying, std::is_scoped_enum). Aggiunto il supporto sperimentale per i tipi per l'elaborazione parallela dei dati (SIMD, Data-Parallel Types). L'implementazione di std::uniform_int_distribution è stata accelerata.
  • Rimosso il flag di qualità alfa da libgccjit, una libreria condivisa per incorporare un generatore di codice in altri processi e utilizzarlo per organizzare la compilazione JIT di bytecode in codice macchina. Aggiunta la possibilità di creare libgccjit per MinGW.
  • Aggiunto il supporto per l'architettura AArch64 Armv8-R (-march=armv8-r). Per le architetture AArch64 e ARM è stato aggiunto il supporto ai processori (parametri -mcpu e -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex-X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) e Arm Neoverse N2 (neoverse-n2). Sono state aggiunte anche le CPU Fujitsu A64FX (a64fx) e Arm Cortex-R82 (cortex-r82), che supportano solo l'architettura AArch64.
  • Aggiunto il supporto per l'utilizzo delle istruzioni SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) e MVE (AArch32 M-profile) per autovettorizzare operazioni che eseguono addizione, sottrazione, moltiplicazione e varianti di addizione/sottrazione su numeri complessi. Aggiunto il supporto iniziale per l'autovettorizzazione per ARM utilizzando il set di istruzioni MVE.
  • Per le piattaforme ARM, viene fornito un set completo di funzioni C integrate nel compilatore (Intrinsics), sostituite da istruzioni vettoriali estese (SIMD), che coprono tutte le istruzioni NEON documentate nella specifica ACLE Q3 2020.
  • Il supporto per GPU gfx908 è stato aggiunto al backend per generare codice per GPU AMD basate sulla microarchitettura GCN.
  • Aggiunto supporto per nuovi processori e nuove estensioni del set di istruzioni implementate in essi:
    • Intel Sapphire Rapids (-march=sapphirerapids, abilita il supporto per le istruzioni MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 e AVX-VNNI.
    • Intel Alderlake (-march=alderlake, abilita il supporto per le istruzioni CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI e HRESET).
    • Intel Rocketlake (-march=rocketlake, simile a Rocket Lake senza supporto SGX).
    • AMD Zen 3 (-marzo=znver3).
  • Per i sistemi IA-32/x86-64 basati su processori Intel, è stato aggiunto il supporto per le nuove istruzioni del processore TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Aggiunto il supporto per i flag "-march=x86-64-v[234]" per selezionare i livelli di architettura x86-64 (v2 - copre le estensioni SSE4.2, SSSE3, POPCNT e CMPXCHG16B; v3 - AVX2 e MOVBE; v4 - AVX-512 ).
  • Aggiunto supporto per i sistemi RISC-V con ordine dei byte big-endian. Aggiunta l'opzione "-misa-spec=*" per selezionare la versione della specifica dell'architettura del set di istruzioni RISC-V. Aggiunto supporto per AddressSanitizer e protezione dello stack utilizzando i tag canary.
  • Miglioramento continuo della modalità di analisi statica "-fanalyzer", che esegue un'analisi interprocedurale ad alta intensità di risorse dei percorsi di esecuzione del codice e dei flussi di dati nel programma. La modalità è in grado di rilevare problemi in fase di compilazione, come doppie chiamate alla funzione free() per un'area di memoria, perdite di descrittori di file, dereferenziazione e passaggio di puntatori nulli, accesso a blocchi di memoria liberati, utilizzo di valori non inizializzati, ecc. Nella nuova versione:
    • Il codice per tracciare lo stato del programma è stato completamente riscritto. Sono stati risolti i problemi con la scansione di file C di grandi dimensioni.
    • Aggiunto il supporto C++ iniziale.
    • L'analisi dell'allocazione e deallocazione della memoria è stata estratta dalle specifiche funzioni malloc e free e ora supporta new/delete e new[]/delete[].
    • Aggiunti nuovi avvisi: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const e -Wanalyzer-write-to-string-literal.
    • Aggiunte nuove opzioni di debug -fdump-analyzer-json e -fno-analyzer-feasibility.
    • È stata implementata la possibilità di estendere l'analizzatore tramite plugin per GCC (ad esempio è stato preparato un plugin per verificare l'uso non corretto del global lock (GIL) in CPython).

Fonte: opennet.ru

Aggiungi un commento