Lansarea suitei de compilare GCC 11

După un an de dezvoltare, a fost lansată lansarea suitei gratuite de compilare GCC 11.1, prima lansare semnificativă din noua ramură GCC 11.x. În cadrul noii scheme de numerotare a versiunilor, versiunea 11.0 a fost folosită în timpul dezvoltării și, cu puțin timp înainte de lansarea GCC 11.1, a fost deja bifurcată ramura GCC 12.0, din care va fi formată următoarea versiune semnificativă a GCC 12.1.

GCC 11.1 se remarcă prin tranziția la utilizarea implicită a formatului de fișier de depanare DWARF 5, includerea implicită a standardului C++17 (“-std=gnu++17”), îmbunătățiri semnificative în suportul pentru C++20 standard, suport experimental pentru C++23, îmbunătățiri legate de viitorul standard al limbajului C (C2x), noi optimizări de performanță.

Principalele modificări:

  • Modul implicit pentru limbajul C++ a fost schimbat pentru a utiliza standardul C++17 (-std=gnu++17) în loc de C++14 oferit anterior. Este posibil să dezactivați selectiv noul comportament C++17 atunci când procesați șabloane care folosesc alte șabloane ca parametru (-fno-new-ttp-matching).
  • S-a adăugat suport pentru accelerarea hardware a instrumentului AddressSanitizer, care vă permite să determinați faptele de accesare a zonelor de memorie eliberate, depășind limitele bufferului alocat și alte tipuri de erori atunci când lucrați cu memorie. Accelerarea hardware este în prezent disponibilă numai pentru arhitectura AArch64 și se concentrează pe utilizarea la compilarea nucleului Linux. Pentru a activa accelerarea hardware AddressSanitizer la construirea componentelor spațiului utilizator, a fost adăugat steagul „-fsanitize=hwaddress” și steag-ul kernel „-fsanitize=kernel-hwaddress”.
  • La generarea informațiilor de depanare, se folosește implicit formatul DWARF 5, care, în comparație cu versiunile anterioare, permite generarea de date de depanare cu 25% mai compacte. Suportul complet pentru DWARF 5 necesită cel puțin versiunea binutils 2.35.2. Formatul DWARF 5 este acceptat în instrumentele de depanare începând cu GDB 8.0, valgrind 3.17.0, elfutils 0.172 și dwz 0.14. Pentru a genera fișiere de depanare folosind alte versiuni de DWARF, puteți utiliza opțiunile „-gdwarf-2”, „-gdwarf-3” și „-gdwarf-4”.
  • Cerințele pentru compilatoare care pot fi utilizate pentru a construi GCC au fost crescute. Compilatorul trebuie să accepte acum standardul C++11 (anterior era necesar C++98), adică Dacă GCC 10 a fost suficient pentru a construi GCC 3.4, atunci cel puțin GCC 11 este acum necesar pentru a construi GCC 4.8.
  • Numele și locația fișierelor pentru salvarea depozitelor, fișierelor temporare și informații suplimentare necesare pentru optimizarea LTO au fost schimbate. Astfel de fișiere sunt acum întotdeauna salvate în directorul curent, cu excepția cazului în care calea este schimbată în mod explicit prin opțiunile „-dumpbase”, „-dumpdir” și „-save-temps=".
  • Suportul pentru formatul binar BRIG pentru utilizarea cu limbajul HSAIL (Limbaj intermediar al arhitecturii sistemelor heterogene) a fost retras și va fi în curând eliminat.
  • Capacitățile modului ThreadSanitizer (-fsanitize=thread) au fost extinse, concepute pentru a detecta condițiile de cursă atunci când partajați aceleași date din fire diferite ale unei aplicații cu mai multe fire. Noua versiune adaugă suport pentru runtime și medii alternative, precum și suport pentru instrumentul de depanare KCSAN (Kernel Concurrency Sanitizer), conceput pentru a detecta dinamic condițiile de cursă în nucleul Linux. S-au adăugat noi opțiuni „-param tsan-distinguish-volatile” și „-param tsan-instrument-func-entry-exit”.
  • Numerele coloanelor din mesajele de diagnosticare reflectă acum nu numărul de octeți de la începutul liniei, ci de fapt numerele de coloană care iau în considerare caracterele pe mai mulți octeți și caracterele care ocupă mai multe poziții în linie (de exemplu, caracterul 🙂 ocupă două poziții și este codificat în 4 octeți). De asemenea, caracterele tabulatoare sunt acum tratate ca un anumit număr de spații (configurabil prin opțiunea -ftabstop, implicit 8). Pentru a restabili vechiul comportament, se propune opțiunea „-fdiagnostics-column-unit=byte” și pentru a determina valoarea inițială (numerotare de la 0 sau 1) - opțiunea „-fdiagnostics-column-origin=”.
  • Vectorizatorul ia în considerare întregul conținut al funcției și adaugă capacități de procesare asociate cu intersecții și referințe la blocuri anterioare în graficul control-flow (CFG, control-flow graph).
  • Optimizatorul implementează capacitatea de a converti o serie de operații condiționate care compară aceeași variabilă într-o expresie de comutare. Expresia comutatoare poate fi codificată ulterior folosind instrucțiuni de testare a biților (opțiunea „-fbit-tests” a fost adăugată pentru a controla o astfel de conversie).
  • Optimizări interprocedurale îmbunătățite. S-a adăugat o nouă trecere IPA-modref (-fipa-modref) pentru a urmări efectele secundare la apelarea funcțiilor și pentru a îmbunătăți acuratețea analizei. Implementare îmbunătățită a trecerii IPA-ICF (-fipa-icf), care reduce consumul de memorie în timpul compilării și crește numărul de funcții unificate pentru care sunt combinate blocuri identice de cod. În trecerea IPA-CP (Propagare constantă interprocedurală), euristica de predicție a fost îmbunătățită, ținând cont de limitele și caracteristicile cunoscute ale buclelor.
  • În Linking Time Optimizations (LTO), formatul bytecode este optimizat pentru a reduce dimensiunea și pentru a îmbunătăți viteza de procesare. Reducerea consumului maxim de memorie în timpul fazei de legare.
  • În mecanismul de optimizare bazat pe rezultatele profilării codului (PGO – Profile-guided optimization), care permite generarea unui cod mai optim pe baza analizei caracteristicilor de execuție, dimensiunea fișierelor cu date GCOV este redusă datorită ambalării mai compacte a contoarelor zero. . Modul „-fprofile-values” îmbunătățit prin urmărirea mai multor parametri la apelurile indirecte.
  • Implementarea standardului OpenMP 5.0 (Open Multi-Processing), care definește API-ul și metodele de aplicare a metodelor de programare paralelă pe sisteme multi-core și hibride (CPU+GPU/DSP) cu memorie partajată și unități de vectorizare (SIMD), a a continuat. S-a adăugat suport inițial pentru directiva de alocare și capacitatea de a utiliza bucle eterogene în constructele OpenMP. S-a implementat suport pentru variabila de mediu OMP_TARGET_OFFLOAD.
  • Implementarea specificației de programare paralelă OpenACC 2.6 prevăzută pentru limbajele C, C++ și Fortran a fost îmbunătățită, care definește instrumente pentru operațiunile de descărcare pe GPU-uri și procesoare specializate, precum NVIDIA PTX.
  • Pentru limbajele C, a fost implementat un nou atribut „no_stack_protector”, conceput pentru a marca funcțiile pentru care protecția stivei nu ar trebui să fie activată („-fstack-protector”). Atributul „malloc” a fost extins pentru a sprijini identificarea perechilor de apeluri pentru alocarea și eliberarea memoriei (alocator/dealocator), care este utilizat în analizorul static pentru a identifica erorile tipice în lucrul cu memoria (scurgeri de memorie, utilizare după eliberare, apeluri duble la funcția free etc.) și în avertismentele compilatorului „-Wmismatched-dealloc”, „-Wmismatched-new-delete” și „-Wfree-nonheap-object”, informând despre inconsecvența dintre operațiunile de dealocare a memoriei și de alocare a memoriei.
  • Au fost adăugate noi avertismente pentru limbajul C:
    • „-Wmismatched-dealloc” (activat implicit) - avertizează despre operațiunile de dealocare a memoriei care utilizează un pointer care nu este compatibil cu funcțiile de alocare a memoriei.
    • „-Wsizeof-array-div” (activat când este specificat „-Wall”) - Avertizează despre împărțirea a doi operatori sizeof dacă divizorul nu se potrivește cu dimensiunea elementului de matrice.
    • „-Wstringop-overread” (activat implicit) - avertizează despre apelarea unei funcții șir care citește date dintr-o zonă din afara limitei matricei.
    • „-Wtsan” (activat implicit) - Avertizează despre utilizarea caracteristicilor (cum ar fi std::atomic_thread_fence) care nu sunt acceptate în ThreadSanitizer.
    • „-Warray-parameter” și „-Wvla-parameter” (activat când se specifică „-Wall”) - avertizează despre suprascrierea funcțiilor cu declarații incompatibile de argumente asociate cu matrice de lungime fixă ​​și variabilă.
    • Avertismentul „-Wuniinitialized” detectează acum încercările de citire din memoria alocată dinamic neinițializată.
    • Avertismentul „-Wfree-nonheap-object” extinde definiția cazurilor în care funcțiile de dealocare a memoriei sunt apelate cu un pointer neobținut prin funcțiile de alocare dinamică a memoriei.
    • Avertismentul „-Wmaybe-uninitialized” a extins detectarea transmiterii de pointeri către funcții care se referă la locații de memorie neinițializate.
  • Pentru limbajul C a fost implementată o porțiune de noi caracteristici dezvoltate în cadrul standardului C2X (activate prin specificarea -std=c2x și -std=gnu2x): macro-urile BOOL_MAX și BOOL_WIDTH, indicarea opțională a numelor parametrilor neutilizați în funcție definiții (ca în C++), atribut „[ [nodiscard]]”, operator de preprocesor „__has_c_attribute”, macrocomenzi FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559, NAND_FLTSN_AN, INFEX_AN_XNUMX, DBL_IS_IEC_XNUMX _SNAN, DEC_INFINITY și DEC_NAN, NaN=macro pentru FloatN , _FloatNx și _DecimalN, capacitatea de a specifica semne de salt înainte de declarații și la sfârșitul instrucțiunilor compuse.
  • Pentru C++, a fost implementată o parte din modificările și inovațiile propuse în standardul C++20, inclusiv funcții virtuale „consteval virtual”, pseudo-destructori pentru sfârșitul ciclului de viață al obiectelor, utilizarea clasei enum și calcularea dimensiunii unui tablou în expresia „nouă”.
  • Pentru C++, a fost adăugat suport experimental pentru unele îmbunătățiri dezvoltate pentru viitorul standard C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). De exemplu, acum există suport pentru sufixul literal „zu” pentru valorile size_t semnate.
  • libstdc++ a îmbunătățit suportul pentru standardul C++17, inclusiv introducerea implementărilor std::from_chars și std::to_chars pentru tipurile în virgulă mobilă. Au fost implementate noi elemente ale standardului C++20, inclusiv std::bit_cast, std::source_location, operațiuni atomice wait and notify, , , , , precum și elemente ale viitorului standard C++23 (std::to_underlying, std::is_scoped_enum). S-a adăugat suport experimental pentru tipuri pentru procesarea paralelă a datelor (SIMD, Data-Parallel Types). Implementarea std::uniform_int_distribution a fost accelerată.
  • S-a eliminat marcajul de calitate alfa din libgccjit, o bibliotecă partajată pentru încorporarea unui generator de cod în alte procese și pentru a-l folosi pentru a organiza compilarea JIT a bytecode în codul mașinii. S-a adăugat capacitatea de a construi libgccjit pentru MinGW.
  • S-a adăugat suport pentru arhitectura AArch64 Armv8-R (-march=armv8-r). Pentru arhitecturile AArch64 și ARM, a fost adăugat suport pentru procesoare (parametri -mcpu și -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) și Arm Neoverse N2 (neoverse-n2). Au fost adăugate procesoare Fujitsu A64FX (a64fx) și Arm Cortex-R82 (cortex-r82), care acceptă doar arhitectura AArch64.
  • S-a adăugat suport pentru utilizarea instrucțiunilor SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) și MVE (AArch32 M-profile) pentru a autovectoriza operațiuni care efectuează adunări, scăderi, înmulțiri și variante de adunare/scădere peste numere complexe. S-a adăugat suport inițial pentru autovectorizarea pentru ARM folosind setul de instrucțiuni MVE.
  • Pentru platformele ARM, este furnizat un set complet de funcții C integrate în compilator (Intrinseci), înlocuite cu instrucțiuni vectoriale extinse (SIMD), care acoperă toate instrucțiunile NEON documentate în specificația ACLE Q3 2020.
  • Suportul pentru GPU gfx908 a fost adăugat la backend pentru generarea de cod pentru GPU-urile AMD bazate pe microarhitectura GCN.
  • S-a adăugat suport pentru noile procesoare și noi extensii de set de instrucțiuni implementate în ele:
    • Intel Sapphire Rapids (-march=sapphirerapids, permite suportul pentru MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BV16NI și instrucțiunile AV.X-VXNUMXN)
    • Intel Alderlake (-march=alderlake, permite suportul pentru instrucțiunile CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI și HRESET).
    • Intel Rocketlake (-march=rocketlake, similar cu Rocket Lake fără suport SGX).
    • AMD Zen 3 (-march=znver3).
  • Pentru sistemele IA-32/x86-64 bazate pe procesoare Intel, a fost adăugat suport pentru noile instrucțiuni de procesor TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • S-a adăugat suport pentru semnalizatoarele „-march=x86-64-v[234]” pentru a selecta nivelurile de arhitectură x86-64 (v2 - acoperă extensiile SSE4.2, SSSE3, POPCNT și CMPXCHG16B; v3 - AVX2 și MOVBE; v4 - AVX-512 ) .
  • S-a adăugat suport pentru sistemele RISC-V cu ordinea octeților big-endian. S-a adăugat opțiunea „-misa-spec=*” pentru a selecta versiunea specificației arhitecturii setului de instrucțiuni RISC-V. S-a adăugat suport pentru AddressSanitizer și protecția stivei folosind etichete Canary.
  • Îmbunătățirea continuă a modului de analiză statică „-fanalyzer”, care efectuează analize interprocedurale care necesită resurse intensive a căilor de execuție a codului și a fluxurilor de date din program. Modul este capabil să detecteze probleme în etapa de compilare, cum ar fi apeluri duble la funcția free() pentru o zonă de memorie, scurgeri de descriptori de fișiere, dereferențierea și trecerea de pointeri nuli, accesarea blocurilor de memorie eliberate, utilizarea valorilor neinițializate etc. În noua versiune:
    • Codul pentru urmărirea stării programului a fost complet rescris. Problemele legate de scanarea fișierelor C foarte mari au fost rezolvate.
    • S-a adăugat suport inițial C++.
    • Analiza alocării și dealocarii memoriei a fost extrasă din funcțiile specifice malloc și free și acum acceptă new/delete și new[]/delete[].
    • S-au adăugat noi avertismente: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const și -Wanalyzer-write-to-string-literal.
    • S-au adăugat noi opțiuni de depanare -fdump-analyzer-json și -fno-analyzer-feasibility.
    • A fost implementată capacitatea de extindere a analizorului prin pluginuri pentru GCC (de exemplu, a fost pregătit un plugin pentru a verifica utilizarea incorectă a blocării globale (GIL) în CPython).

Sursa: opennet.ru

Adauga un comentariu