Liberazione di a suite di compilatori GCC 11

Dopu un annu di sviluppu, a liberazione di a suite di compilatore GCC 11.1 gratuitu hè stata liberata, a prima liberazione significativa in a nova filiera GCC 11.x. Sottu à u novu schema di numerazione di liberazione, a versione 11.0 hè stata aduprata durante u sviluppu, è pocu prima di a liberazione di GCC 11.1, u ramu GCC 12.0 era digià furcatu, da quale serà furmatu a prossima liberazione significativa di GCC 12.1.

GCC 11.1 hè notu per a so transizione à utilizà u formatu di file di debug DWARF 5 per difettu, l'inclusione predeterminata di u standard C++ 17 ("-std=gnu++17"), miglioramenti significativi in ​​supportu per u C++ 20. standard, supportu sperimentale per C ++ 23, migliure ligati à u futuru standard di lingua C (C2x), novi ottimisazioni di rendiment.

I cambiamenti principali:

  • U modu predeterminatu per a lingua C++ hè stata cambiata per utilizà u standard C++17 (-std=gnu++17) invece di u C++14 offrittu prima. Hè pussibule disattivà selettivamente u novu cumpurtamentu C ++ 17 quandu si tratta di mudelli chì utilizanu altri mudelli cum'è paràmetru (-fno-new-ttp-matching).
  • Aghjunghje supportu per l'accelerazione hardware di l'uttellu AddressSanitizer, chì permette di determinà i fatti di accede à e spazii di memoria liberati, andendu oltre i limiti di u buffer attribuitu, è qualchì altru tipu d'errore quandu travaglia cù memoria. L'accelerazione di u hardware hè attualmente dispunibule solu per l'architettura AArch64 è hè focu annantu à l'usu quandu si compila u kernel Linux. Per attivà l'accelerazione hardware di AddressSanitizer quandu custruiscenu cumpunenti di u spaziu di l'utilizatori, a bandiera "-fsanitize=hwaddress" hè stata aghjunta, è a bandiera di kernel "-fsanitize=kernel-hwaddress".
  • Quandu generà infurmazione di debugging, u formatu DWARF 5 hè utilizatu per difettu, chì, cumparatu cù e versioni precedenti, permette di generà 25% di dati di debugging più compacti. U supportu tutale per DWARF 5 richiede almenu a versione binutils 2.35.2. U furmatu DWARF 5 hè supportatu in i strumenti di debugging da GDB 8.0, valgrind 3.17.0, elfutils 0.172 è dwz 0.14. Per generà schedarii di debug cù altre versioni di DWARF, pudete aduprà l'opzioni "-gdwarf-2", "-gdwarf-3" è "-gdwarf-4".
  • I requisiti per i compilatori chì ponu esse utilizati per custruisce GCC sò stati aumentati. U compilatore deve avà sustene u standard C ++ 11 (precedentemente C ++ 98 era necessariu), i.e. Se GCC 10 era abbastanza per custruisce GCC 3.4, allora almenu GCC 11 hè avà necessariu per custruisce GCC 4.8.
  • U nome è u locu di i fugliali per salvà i dumps, i schedarii temporali è l'infurmazioni supplementari necessarii per l'ottimisazione LTO sò stati cambiati. Tali fugliali sò avà sempre salvati in u cartulare attuale, salvu chì u percorsu hè cambiatu esplicitamente cù l'opzioni "-dumpbase", "-dumpdir" è "-save-temps=".
  • U supportu per u formatu binariu BRIG per l'usu cù a lingua HSAIL (Eterogeneous System Architecture Intermediate Language) hè stata deprecata è sarà prestu sguassata.
  • E capacità di u modu ThreadSanitizer (-fsanitize=thread) sò state allargate, pensate per detectà e cundizioni di razza quandu sparte i stessi dati da diversi fili di una applicazione multi-thread. A nova versione aghjunghjenu supportu per runtimes è ambienti alternativi, è ancu supportu per l'uttellu di debugging KCSAN (Kernel Concurrency Sanitizer), pensatu per detectà dinamicamente e cundizioni di razza in u kernel Linux. Aghjunghjite novi opzioni "-param tsan-distinguish-volatile" è "-param tsan-instrument-func-entry-exit".
  • I numeri di colonna in i missaghji di diagnostichi ùn riflettenu avà micca u conte di byte da u principiu di a linea, ma in realtà i numeri di colonna chì piglianu in contu i caratteri multi-byte è i caratteri chì occupanu parechje pusizioni in a linea (per esempiu, u caratteru 🙂 occupa duie pusizioni è hè codificata in 4 byte). In listessu modu, i caratteri di tabulazione sò oghji trattati cum'è un certu nùmeru di spazii (configurable via l'opzione -ftabstop, default 8). Per restaurà u vechju cumpurtamentu, l'opzione "-fdiagnostics-column-unit = byte" hè pruposta, è per determinà u valore iniziale (numerazione da 0 o 1) - l'opzione "-fdiagnostics-column-origin=".
  • U vectorizer piglia in contu u cuntenutu sanu sanu di a funzione è aghjunghje capacità di trasfurmazioni assuciati cù intersezioni è riferimenti à i blocchi precedenti in u gràficu di cuntrollu di flussu (CFG, gràficu di cuntrollu di flussu).
  • L'ottimisatore implementa l'abilità di cunvertisce una seria di operazioni cundiziunali chì comparanu a listessa variabile in una espressione di switch. L'espressione di switch pò esse codificata più tardi usendu struzzioni di test di bit (l'opzione "-fbit-tests" hè stata aghjunta per cuntrullà tali cunversione).
  • Ottimisazioni interprocedurali mejorate. Aggiuntu un novu pass IPA-modref (-fipa-modref) per seguità l'effetti secundari quandu chjamanu funzioni è migliurà a precisione di l'analisi. Implementazione mejorata di u pass IPA-ICF (-fipa-icf), chì reduce u cunsumu di memoria durante a compilazione è aumenta u nùmeru di funzioni unificate per quale blocchi identichi di codice sò cumminati. In u passaghju IPA-CP (Propagazione constante interprocedurale), l'euristiche di prediczione sò state migliurate, tenendu in contu i cunfini cunnisciuti è e caratteristiche di i loops.
  • In Linking Time Optimizations (LTO), u furmatu di bytecode hè ottimizatu per riduce a dimensione è migliurà a velocità di trasfurmazioni. U cunsumu di memoria di punta ridutta durante a fase di ubligatoriu.
  • In u mecanismu di ottimisazione basatu annantu à i risultati di u prufilu di codice (PGO - Profile-guided optimization), chì permette di generà un codice più ottimale basatu annantu à l'analisi di e funzioni di esecuzione, a dimensione di i schedari cù dati GCOV hè ridutta per via di un imballaggio più compactu di contatori zero. . Modu "-fprofile-values" migliuratu da mantene a traccia di più paràmetri nantu à e chjama indirette.
  • L'implementazione di u standard OpenMP 5.0 (Open Multi-Processing), chì definisce l'API è i metudi per applicà metudi di prugrammazione parallela in sistemi multi-core è ibridi (CPU + GPU / DSP) cù unità di memoria è vectorizazione spartuti (SIMD), hà cuntinuò. Aghjunghje un supportu iniziale per a direttiva di allocazione è a capacità d'utilizà cicli eterogenei in custruzzioni OpenMP. Supportu implementatu per a variabile d'ambiente OMP_TARGET_OFFLOAD.
  • L'implementazione di a specificazione di prugrammazione parallela OpenACC 2.6 prevista per i linguaggi C, C++ è Fortran hè stata migliurata, chì definisce e strumenti per l'operazione di scaricamentu in GPU è processori specializati, cum'è NVIDIA PTX.
  • Per e lingue C, un novu attributu "no_stack_protector" hè statu implementatu, pensatu per marcà e funzioni per quale a prutezzione di stack ùn deve esse attivata ("-fstack-protector"). L'attributu "malloc" hè statu allargatu per sustene l'identificazione di coppie di chjama per l'assignazione è a liberazione di memoria (allocatore / deallocator), chì hè utilizatu in l'analizzatore staticu per identificà errori tipici in u travagliu cù a memoria (perdite di memoria, usu dopu a liberazione, doppia chjama à a funzione libera, etc.) è in l'avvisi di compilatore "-Wmismatched-dealloc", "-Wmismatched-new-delete" è "-Wfree-nonheap-object", chì informanu l'incoerenza trà l'operazione di deallocation di memoria è l'allocazione di memoria.
  • Novi avvirtimenti sò stati aghjunti per a lingua C:
    • "-Wmismatched-dealloc" (attivatu di manera predeterminata) - avvisa nantu à l'operazioni di dislocazione di memoria chì utilizanu un puntatore chì ùn hè micca cumpatibile cù e funzioni di allocazione di memoria.
    • "-Wsizeof-array-div" (attivatu quandu "-Wall" hè specificatu) - Avvisa nantu à a divisione di dui dimensioni di l'operatori se u divisore ùn currisponde à a dimensione di l'elementu array.
    • "-Wstringop-overread" (attivatu per difettu) - avvisa di chjamà una funzione di stringa chì leghje dati da una zona fora di u cunfini di l'array.
    • "-Wtsan" (attivatu per difettu) - Avvisa annantu à l'usu di funzioni (cum'è std::atomic_thread_fence) chì ùn sò micca supportati in ThreadSanitizer.
    • "-Warray-parameter" è "-Wvla-parameter" (attivatu quandu si specifica "-Wall") - avvisa annantu à l'annullamentu di e funzioni cù dichjarazioni incompatibili di argumenti assuciati cù array di lunghezza fissa è variabile.
    • L'avvertimentu "-Wuninitialized" rileva avà i tentativi di leghje da a memoria non inizializzata dinamicamente allocata.
    • L'avvertimentu "-Wfree-nonheap-object" allarga a definizione di i casi induve e funzioni di dislocazione di memoria sò chjamate cù un punteru micca ottenutu per e funzioni di assignazione di memoria dinamica.
    • L'avvertimentu "-Wmaybe-uninitialized" hà allargatu a rilevazione di passaghju di puntatori à e funzioni chì si riferenu à lochi di memoria non inizializzati.
  • Per a lingua C, una parte di e funzioni novi sviluppate in u quadru di u standard C2X hè stata implementata (attivata da a specificazione -std=c2x è -std=gnu2x): macros BOOL_MAX è BOOL_WIDTH, indicazione facultativa di nomi di parametri inutilizati in funzione. definizione (cum'è in C++), attributu "[ [nodiscard]]", operatore di preprocessore "__has_c_attribute", macros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559, __STDC_WANT_IEC_XNUMX_, DBL_FLT_SN_AN, DBL_IS_IEC_XNUMX, DBL_IS_IEC_XNUMX AN, DEC_INFINITY è DEC _NAN, NaN = macro per FloatN, _FloatNx è _DecimalN, capacità di specificà marchi di salto prima di dichjarazioni è à a fine di e dichjarazioni cumposti.
  • Per C ++, una parte di i cambiamenti è l'innuvazioni pruposti in u standard C ++ 20 hè stata implementata, cumprese funzioni virtuali "consteval virtuale", pseudo-distruttori per a fine di u ciclu di vita di l'uggetti, l'usu di a classa enum è calculà a dimensione di un array in l'espressione "nova".
  • Per u C++, u supportu sperimentale hè statu aghjuntu per alcune migliorie chì sò sviluppate per u futuru standard C++ 23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++ 2b). Per esempiu, ci hè issa supportu per u suffissu literale "zu" per i valori signati size_t.
  • libstdc++ hà migliuratu u supportu per u standard C++ 17, cumprese l'intruduzioni di std::from_chars è std::to_chars implementazioni per i tipi di virgule flottante. Implementatu novi elementi di u standard C++ 20, cumprese std::bit_cast, std::source_location, operazioni atomiche aspetta è notifica, , , , , è ancu elementi di u futuru standard C++ 23 (std::to_underlying, std::is_scoped_enum). Aghjunghje un supportu sperimentale per i tipi per u trattamentu di dati paralleli (SIMD, Tipi Paralleli di Dati). L'implementazione di std::uniform_int_distribution hè stata accelerata.
  • Eliminatu a bandiera di qualità alfa da libgccjit, una biblioteca cumuna per incrustà un generatore di codice in altri prucessi è l'utilizanu per urganizà a compilazione JIT di bytecode in codice macchina. Aggiunta a capacità di custruisce libgccjit per MinGW.
  • Aghjunghje supportu per l'architettura AArch64 Armv8-R (-march=armv8-r). Per l'architetture AArch64 è ARM, u supportu per i processori hè statu aghjuntu (parametri -mcpu è -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) è Arm Neoverse N2 (neoverse-n2). I CPU Fujitsu A64FX (a64fx) è Arm Cortex-R82 (cortex-r82) sò stati ancu aghjunti, supportendu solu l'architettura AArch64.
  • Aggiuntu supportu per l'usu di Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) è MVE (AArch32 M-profile) Istruzzioni SIMD per autovectorize operazioni chì facenu addizzioni, sottrazione, multiplicazione è varianti di addizione / sottrazione sopra numeri cumplessi. Aggiuntu supportu iniziale per l'autovectorization per ARM utilizendu u set di struzzioni MVE.
  • Per e piattaforme ARM, un inseme cumpletu di funzioni C integrate in compilatore (Intrinsics) hè furnitu, rimpiazzatu da istruzioni vettoriali estese (SIMD), chì copre tutte l'istruzzioni NEON documentate in a specificazione ACLE Q3 2020.
  • U supportu per a GPU gfx908 hè statu aghjuntu à u backend per generà codice per GPU AMD basatu nantu à a microarchitettura GCN.
  • Aghjunghje supportu per novi processori è novi estensioni di set di struzzioni implementate in elli:
    • Intel Sapphire Rapids (-march=sapphirerapids, permette u supportu per i MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-V16NI è istruzioni AVX.
    • Intel Alderlake (-march = alderlake, permette u supportu per CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI è HRESET instructions).
    • Intel Rocketlake (-march=rocketlake, simile à Rocket Lake senza supportu SGX).
    • AMD Zen 3 (-march=znver3).
  • Per i sistemi IA-32/x86-64 basati nantu à i prucessori Intel, u supportu per novi struzzioni di processore TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI hè statu aghjuntu.
  • Aghjunghje supportu per i bandieri "-march=x86-64-v[234]" per selezziunà i livelli di architettura x86-64 (v2 - copre estensioni SSE4.2, SSSE3, POPCNT è CMPXCHG16B; v3 - AVX2 è MOVBE; v4 - AVX-512 ).
  • Supportu aghjuntu per i sistemi RISC-V cù l'ordine di byte big-endian. Aggiunta l'opzione "-misa-spec="*" per selezziunà a versione di a specificazione di l'architettura di l'istruzzioni RISC-V. Aghjunghje supportu per AddressSanitizer è prutezzione di stack usendu tag canari.
  • Migliuramentu cuntinuatu di u modu di analisi statica "-fanalyzer", chì esegue l'analisi interprocedurale intensiva di risorse di i percorsi di esecuzione di codice è i flussi di dati in u prugramma. U modu hè capaci di detectà i prublemi in a fase di compilazione, cum'è chjama doppia à a funzione libera () per una zona di memoria, fughe di descriptori di file, dereferencing è passanu punters nulli, accede à blocchi di memoria liberati, utilizendu valori micca iniziali, etc. In a nova versione:
    • U codice per seguità u statu di u prugramma hè statu completamente riscritto. I prublemi cù scanning di schedari C assai grande sò stati risolti.
    • Aggiuntu supportu iniziale C ++.
    • L'allocazione di memoria è l'analisi di dislocazione hè stata astratta da e funzioni specifiche malloc è libere, è avà supporta new/delete è new[]/delete[].
    • Aghjunghjite novi avvisi: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const è -Wanalyzer-write-to-string-literal.
    • Aghjunghjite novi opzioni di debugging -fdump-analyzer-json è -fno-analyzer-feasibility.
    • L'abilità di allargà l'analizzatore attraversu plugins per GCC hè stata implementata (per esempiu, un plugin hè statu preparatu per verificà l'usu incorrectu di u bloccu globale (GIL) in CPython).

Source: opennet.ru

Add a comment