Rilascio della suite di compilatori GCC 10

Dopo un anno di sviluppo pubblicato rilascio di un set gratuito di compilatori GCC 10.1, la prima major release nel nuovo ramo GCC 10.x. Secondo nuovo schema numeri di rilascio, nel processo di sviluppo è stata utilizzata la versione 10.0 e poco prima del rilascio di GCC 10.1 si era già ramificato il ramo GCC 11.0, sulla base del quale sarebbe stata formata la successiva versione significativa, GCC 11.1.

GCC 10.1 si distingue per l'implementazione di numerose innovazioni nel linguaggio C++ sviluppate per lo standard C++20, miglioramenti relativi al futuro standard del linguaggio C (C2x), nuove ottimizzazioni nei backend del compilatore e supporto sperimentale modalità di analisi statica. Inoltre, durante la preparazione di un nuovo ramo, il progetto ha trasferito il repository da SVN a Git.

Il principale modifiche:

  • Aggiunto modalità sperimentale di analisi statica "-fanalizzatore“, che esegue analisi interprocedurali ad alta intensità di risorse dei percorsi di esecuzione del codice e dei flussi di dati in un 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. L'utilizzo della nuova modalità per il codice OpenSSL ha già reso possibile l'identificazione vulnerabilità pericolosa.
  • Ottimizzazioni interprocedurali migliorate. Il passaggio IPA-SRA (Interprocedural Scalar Shared Sostituzione) è stato riprogettato per funzionare in fase di associazione e, tra le altre cose, ora rimuove i valori calcolati e restituiti inutilizzati. Nella modalità di ottimizzazione "-O2", è abilitata l'opzione "-finline-functions", che è stata risintonizzata per favorire un codice più compatto rispetto alle prestazioni di esecuzione. Il lavoro dell'euristica per l'implementazione delle funzioni inline è stato accelerato. Le euristiche di espansione in linea e clonazione di funzioni possono ora utilizzare informazioni sugli intervalli di valori per prevedere l'efficacia delle singole trasformazioni. Per C++, la precisione dell'analisi degli alias basata sul tipo è stata migliorata.
  • Ottimizzazioni del tempo di collegamento migliorate (LTO). Aggiunto nuovo eseguibile lto-dump per reimpostare le informazioni sui file oggetto con bytecode LTO. I passaggi LTO paralleli determinano automaticamente il numero di attività make eseguite simultaneamente e, se non possono essere determinate, utilizzano le informazioni sul numero di core della CPU come fattore di parallelizzazione. Aggiunta la possibilità di comprimere il bytecode LTO utilizzando l'algoritmo zstd.
  • È stato migliorato il meccanismo di ottimizzazione basato sui risultati della profilazione del codice (PGO - Profile-guided optimization), che genera codice più ottimale in base all'analisi delle caratteristiche di esecuzione del codice. Migliorata la manutenzione del profilo durante la compilazione e la separazione del codice hot/cold. Tramite l'opzione "-fprofile-valori» ora può monitorare fino a 4 valori di profilo, ad esempio per le chiamate indirette e fornire informazioni sul profilo più precise.
  • Specifica di programmazione parallela implementata per i linguaggi C, C++ e Fortran OpenACC 2.6, che definisce gli strumenti per scaricare le operazioni su GPU e processori specializzati come NVIDIA PTX. L’implementazione dello standard è quasi completata Apri MP 5.0 (Open Multi-Processing), che definisce le API e le modalità di applicazione dei metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e unità di vettorizzazione (SIMD). Aggiunte funzionalità come condizionali lastprivate, direttive di scansione e loop, espressioni order e use_device_addr. Per OpenMP e OpenACC, è stato aggiunto il supporto per le operazioni di offload sulle GPU AMD Radeon (GCN) di quarta generazione (Fiji) e quinta generazione (VEGA 10/VEGA 20).
  • Per i linguaggi della famiglia C è stata aggiunta la funzione “access” per descrivere l’accesso della funzione agli oggetti passati per riferimento o puntatore e per associare tali oggetti ad argomenti interi contenenti informazioni sulla dimensione degli oggetti. Per funzionare insieme ad "access", l'attributo "type" è implementato per rilevare accessi errati da parte di funzioni utente, ad esempio, quando si scrivono valori in un'area esterna ai limiti dell'array. È stato inoltre aggiunto l'attributo "symver" per associare i simboli in un file ELF a numeri di versione specifici.
  • Aggiunti nuovi avvisi:
    • “-Wstring-compare” (abilitato con “-Wextra”) - avvisa della presenza di espressioni in cui lo zero viene confrontato con il risultato della chiamata delle funzioni strcmp e strncmp, che equivale a una costante a causa del fatto che la lunghezza di un argomento è maggiore della dimensione dell'array nel secondo argomento.
    • "-Wzero-length-bounds" (abilitato con "-Warray-bounds") - avvisa dell'accesso a elementi dell'array di lunghezza zero, che potrebbe portare alla sovrascrittura di altri dati.
    • Gli avvisi “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” e “-Wstringop-overflow” sono stati ampliati per espandere il numero di situazioni fuori limite che vengono gestiti.
  • Implementata la possibilità di specificare direttamente caratteri estesi negli identificatori utilizzando la codifica corrente (UTF-8 per impostazione predefinita) anziché la notazione UCN (\uNNNN o \UNNNNNNNN). Per esempio:

    cost statica int π = 3;
    int get_naïve_pi() {
    restituire π;
    }

  • Per il linguaggio C è stata implementata una parte delle nuove funzionalità sviluppate all'interno dello standard C2X (abilitate specificando -std=c2x e -std=gnu2x): è apparso il supporto alla sintassi “[[]]” per la definizione degli attributi come in C++ (ad esempio, [[gnu ::const]], [[deprecated]], [[fallthrough]] e [[maybe_unused]]. Aggiunto il supporto per la sintassi "u8" per definire costanti con caratteri UTF-8.
    Aggiunte nuove macro a . Aggiunte sostituzioni "%OB" e "%Ob" a strftime.

  • Per impostazione predefinita, C utilizza la modalità "-fno-common", che consente un accesso più efficiente alle variabili globali su alcune piattaforme.
  • Per C++ sono state implementate circa 16 modifiche e innovazioni, sviluppate nello standard C++20. Inclusa la parola chiave aggiunta “constinit”
    ed è stato implementato il supporto per le estensioni dei modelli "concetto". I concetti consentono di definire un insieme di requisiti dei parametri del modello che, in fase di compilazione, limitano l'insieme di argomenti che possono essere accettati come parametri del modello. I concetti possono essere utilizzati per evitare incoerenze logiche tra le proprietà dei tipi di dati utilizzati all'interno del modello e le proprietà del tipo di dati dei parametri di input.

  • G++ fornisce il rilevamento di comportamenti indefiniti causati dalla modifica di oggetti costanti tramite constexpr. Ridotto il consumo di memoria da parte del compilatore durante il calcolo di constexpr. Aggiunti nuovi avvisi "-Wmismatched-tags" e "-Wredundant-tags".
  • Sono state proposte nuove opzioni della riga di comando:
    • "-fallocation-dce" per rimuovere le coppie non necessarie di operatori "new" e "delete".
    • "-fprofile-partial-training" per disabilitare l'ottimizzazione delle dimensioni per il codice che non dispone di un'esecuzione del training.
    • "-fprofile-reproducible per controllare il livello di riproducibilità del profilo.
    • "-fprofile-prefix-path" per definire la directory di build dell'origine di base utilizzata per la generazione di profili separata (per "-fprofile-generate=profile_dir" e "-fprofile-use=profile_dir").
  • Nel testo di avviso relativo alle opzioni citate vengono forniti collegamenti ipertestuali che consentono di accedere alla documentazione di tali opzioni. La sostituzione dell'URL viene controllata utilizzando l'opzione "-fdiagnostics-urls".
  • Aggiunto operatore del preprocessore "__ha_integrato", che può essere utilizzato per verificare le funzioni integrate.
  • Aggiunta una nuova funzione integrata "__builtin_roundeven" con un'implementazione della funzione di arrotondamento definita nella specifica ISO/IEC TS 18661, simile a "round", ma arrotondando la parte maggiore di 0.5 (a un valore maggiore), inferiore a 0.5 - decrescente (fino a zero), e pari a 0.5 - a partire dalla parità della penultima cifra.
  • Per l'architettura AArch64, è stato aggiunto il supporto per l'estensione SVE2 ed è stato migliorato il supporto per SVE (Scalable Vector Extension), incluso il supporto aggiunto per le funzioni e i tipi SVE ACLE integrati e l'uso della vettorizzazione. Il supporto per LSE (Large System Extensions) e TME (Transactional Memory Extension) è stato ampliato. Aggiunte nuove istruzioni proposte in Armv8.5-A e Armv8.6-A, incluse istruzioni per la generazione di numeri casuali, arrotondamento, associazione di tag di memoria,
    bfloat16 e moltiplicazione di matrici. Aggiunto supporto per il processore
    Braccio Cortex-A77,
    Braccio Cortex-A76AE,
    Braccio Cortex-A65,
    Braccio Cortex-A65AE,
    Braccio Cortex-A34 e
    Marvell ThunderX3.

  • Aggiunto supporto per ABI FDPIC (puntatori a funzioni a 32 bit) per ARM64. Elaborazione riprogettata e ottimizzata delle operazioni con numeri interi a 64 bit. Aggiunto supporto CPU
    Braccio Cortex-A77,
    Braccio Cortex-A76AE e
    Braccio Cortex-M35P. Supporto esteso per le istruzioni di elaborazione dati ACLE, tra cui SIMD a 32 bit, moltiplicazione a 16 bit, aritmetica del latch e altre ottimizzazioni dell'algoritmo DSP. Aggiunto supporto sperimentale per le istruzioni ACLE CDE (Custom Datapath Extension).

  • Generazione e vettorizzazione del codice notevolmente migliorate nel backend per GPU AMD basate sulla microarchitettura GCN.
  • Aggiunto il supporto per dispositivi simili a XMEGA per l'architettura AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 e ATmegaXNUMX.

  • Una nuova estensione dell'architettura del set di istruzioni Intel ENQCMD (-menqcmd) è stata aggiunta per le architetture IA-32/x86-64. Aggiunto supporto per CPU Intel Cooperlake (-march=cooperlake, include l'estensione ISA AVX512BF16) e Tigerlake (-march=tigerlake, include le estensioni ISA MOVDIRI, MOVDIR64B e AVX512VP2INTERSECT).
  • Un'implementazione dell'HSAIL (Heterogeneous System Architecture Intermediate Language) per sistemi informatici eterogenei basati sull'architettura HSA è stata deprecata e sarà probabilmente rimossa in una versione futura.

Fonte: opennet.ru

Aggiungi un commento