Lansarea suitei de compilare GCC 10

După un an de dezvoltare publicat lansarea unui set gratuit de compilatoare GCC 10.1, prima lansare majoră din noua ramură GCC 10.x. În conformitate cu noua schema numere de lansare, versiunea 10.0 a fost folosită în procesul de dezvoltare și, cu puțin timp înainte de lansarea GCC 10.1, ramura GCC 11.0 se ramificase deja, pe baza căreia urma să fie formată următoarea versiune semnificativă, GCC 11.1.

GCC 10.1 se remarcă prin implementarea multor inovații în limbajul C++ dezvoltat pentru standardul C++20, îmbunătățiri legate de viitorul standard al limbajului C (C2x), noi optimizări în backend-urile compilatorului și suport experimental modul de analiză statică. În plus, în timpul pregătirii unei noi ramuri, proiectul a transferat depozitul de la SVN la Git.

Principalul modificări:

  • Adăugat modul experimental de analiză statică"-fanalizator„, care efectuează o analiză interprocedurală intensivă în resurse a căilor de execuție a codului și a fluxurilor de date dintr-un 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. Utilizarea noului mod pentru codul OpenSSL a făcut deja posibilă identificarea vulnerabilitate periculoasă.
  • Optimizări interprocedurale îmbunătățite. Abonamentul IPA-SRA (Înlocuire partajată scalară interprocedurală) a fost reproiectat pentru a funcționa la momentul legării și, printre altele, acum elimină valorile neutilizate calculate și returnate. În modul de optimizare „-O2”, este activată opțiunea „-finline-functions”, care este reajustată pentru a favoriza un cod mai compact decât performanța de execuție. Lucrarea euristicii pentru implementarea funcției inline a fost accelerată. Expansiunea în linie și euristica clonării funcțiilor pot folosi acum informații despre intervalele de valori pentru a prezice eficacitatea transformărilor individuale. Pentru C++, acuratețea parsării alias-urilor bazate pe tipuri a fost îmbunătățită.
  • Optimizări îmbunătățite ale timpului de conectare (LTO). S-a adăugat un nou executabil lto-dump pentru a reseta informațiile despre fișierele obiect cu cod de octet LTO. Trecerile LTO paralele determină automat numărul de sarcini care rulează simultan și, dacă nu pot fi determinate, folosesc informații despre numărul de nuclee CPU ca factor de paralelizare. A fost adăugată capacitatea de a comprima codul de octeți LTO folosind algoritmul zstd.
  • Mecanismul de optimizare bazat pe rezultatele profilării codului (PGO - Profile-guided optimization) a fost îmbunătățit, ceea ce generează un cod mai optim pe baza unei analize a caracteristicilor execuției codului. Menținerea profilului îmbunătățită în timpul compilării și separării codului cald/rece. Prin opțiunea "-fprofile-valori» acum poate monitoriza până la 4 valori de profil, de exemplu pentru apeluri indirecte și oferind informații de profil mai precise.
  • Specificație de programare paralelă implementată pentru limbajele C, C++ și Fortran OpenACC 2.6, care definește instrumente pentru operațiunile de descărcare pe GPU-uri și procesoare specializate precum NVIDIA PTX. Implementarea standardului este aproape completă Deschideți MP 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). S-au adăugat funcții precum lastprivate conditionals, directive de scanare și buclă, expresii order și use_device_addr. Pentru OpenMP și OpenACC, a fost adăugat suport pentru operațiunile de descărcare pe GPU-uri AMD Radeon (GCN) de a patra generație (Fiji) și de generația a cincea (VEGA 10/VEGA 20).
  • Pentru limbajele familiei C, funcția „acces” a fost adăugată pentru a descrie accesul funcției la obiectele transmise prin referință sau pointer și pentru a asocia astfel de obiecte cu argumente întregi care conțin informații despre dimensiunea obiectelor. Pentru a funcționa împreună cu „acces”, atributul „tip” este implementat pentru a detecta accesul incorect de la funcțiile utilizatorului, de exemplu, atunci când scrieți valori într-o zonă în afara limitelor matricei. De asemenea, este adăugat atributul „symver” pentru a asocia simboluri într-un fișier ELF cu numere de versiune specifice.
  • Noi avertismente adăugate:
    • „-Wstring-compare” (activat cu „-Wextra”) - avertizează despre prezența expresiilor în care zero este comparat cu rezultatul apelării funcțiilor strcmp și strncmp, care este echivalent cu o constantă datorită faptului că lungimea a unui argument este mai mare decât dimensiunea tabloului din al doilea argument.
    • „-Wzero-length-bounds” (activat cu „-Warray-bounds”) - avertizează despre accesarea elementelor matricei de lungime zero, ceea ce poate duce la suprascrierea altor date.
    • Avertismentele „-Warray-bounds”, „-Wformat-overflow”, „-Wrestrict”, „-Wreturn-local-addr” și „-Wstringop-overflow” au fost extinse pentru a extinde numărul de situații în afara limitelor care sunt manipulate.
  • S-a implementat capacitatea de a specifica direct caractere largi în identificatori folosind codificarea curentă (UTF-8 în mod implicit) mai degrabă decât notația UCN (\uNNNN sau \UNNNNNNNN). De exemplu:

    static const int π = 3;
    int get_naïve_pi() {
    returnează π;
    }

  • Pentru limbajul C, a fost implementată o parte din noi caracteristici dezvoltate în standardul C2X (activate prin specificarea -std=c2x și -std=gnu2x): a apărut suport pentru sintaxa „[[]]” pentru definirea atributelor ca în C++ (de exemplu, [[gnu ::const]], [[deprecated]], [[fallthrough]] și [[maybe_unused]]. S-a adăugat suport pentru sintaxa „u8” pentru definirea constantelor cu caractere UTF-8.
    S-au adăugat noi macrocomenzi la . S-au adăugat substituții „%OB” și „%Ob” la strftime.

  • Modul implicit pentru C este „-fno-common”, ceea ce permite un acces mai eficient la variabilele globale pe unele platforme.
  • Pentru C++ au fost implementate aproximativ 16 modificări și inovații, dezvoltate în standardul C++20. Inclusiv cuvântul cheie adăugat „constinit”
    și a fost implementat suport pentru extensiile de șabloane "concepte". Conceptele vă permit să definiți un set de cerințe de parametri șablon care, în momentul compilării, limitează setul de argumente care pot fi acceptate ca parametri șablon. Conceptele pot fi folosite pentru a evita inconsecvențele logice între proprietățile tipurilor de date utilizate în șablon și proprietățile tipului de date ale parametrilor de intrare.

  • G++ oferă detectarea comportamentului nedefinit cauzat de schimbarea obiectelor constante prin constexpr. Consum redus de memorie de către compilator la calcularea constexpr. S-au adăugat noi avertismente „-Wmismatched-tags” și „-Wredundant-tags”.
  • Au fost propuse noi opțiuni pentru linia de comandă:
    • „-fallocation-dce” pentru a elimina perechile inutile de operatori „nou” și „ștergere”.
    • „-fprofile-partial-training” pentru a dezactiva optimizarea dimensiunii pentru codul care nu are o rulare de antrenament.
    • „-fprofile-reproducible pentru a controla nivelul de reproductibilitate a profilului.
    • „-fprofile-prefix-path” pentru a defini directorul de compilare sursă de bază utilizat pentru generarea de profil separat (pentru „-fprofile-generate=profile_dir” și „-fprofile-use=profile_dir”).
  • În textul de avertizare pentru opțiunile menționate sunt prevăzute hyperlinkuri care vă permit să accesați documentația pentru aceste opțiuni. Înlocuirea adreselor URL este controlată folosind opțiunea „-fdiagnostics-urls”.
  • S-a adăugat operator de preprocesor "__a_construit", care poate fi folosit pentru a verifica funcțiile încorporate.
  • S-a adăugat o nouă funcție încorporată „__builtin_roundeven” cu o implementare a funcției de rotunjire definită în specificația ISO/IEC TS 18661, similară cu „round”, dar rotunjirea părții mai mare de 0.5 în sus (la o valoare mai mare), mai mică de 0.5 - în jos (la zero) și egal cu 0.5 - începând de la paritatea penultimei cifre.
  • Pentru arhitectura AArch64, suportul pentru extensia SVE2 a fost adăugat și suportul pentru SVE (Scalable Vector Extension) a fost îmbunătățit, inclusiv suport adăugat pentru funcțiile și tipurile SVE ACLE încorporate și utilizarea vectorizării. Suportul pentru LSE (Large System Extensions) și TME (Transactional Memory Extension) a fost extins. S-au adăugat instrucțiuni noi propuse în Armv8.5-A și Armv8.6-A, inclusiv instrucțiuni pentru generarea numerelor aleatorii, rotunjire, legarea etichetelor de memorie,
    bfloat16 și înmulțirea matricei. S-a adăugat suport pentru procesor
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 și
    Marvell ThunderX3.

  • S-a adăugat suport pentru ABI FDPIC (indicatori de funcție pe 32 de biți) pentru ARM64. Procesare reproiectată și optimizată a operațiunilor cu numere întregi pe 64 de biți. S-a adăugat suport pentru procesor
    Arm Cortex-A77,
    Arm Cortex-A76AE și
    Braț Cortex-M35P. Suport extins pentru instrucțiunile de procesare a datelor ACLE, inclusiv SIMD pe 32 de biți, multiplicare pe 16 biți, aritmetică latch și alte optimizări ale algoritmului DSP. S-a adăugat suport experimental pentru instrucțiunile ACLE CDE (Custom Datapath Extension).

  • Generarea și vectorizarea codului îmbunătățite semnificativ în backend pentru GPU-urile AMD bazate pe microarhitectura GCN.
  • S-a adăugat suport pentru dispozitive asemănătoare XMEGA pentru arhitectura AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 și ATmegaXNUMX.

  • O nouă extensie de arhitectură a setului de instrucțiuni Intel ENQCMD (-menqcmd) a fost adăugată pentru arhitecturile IA-32/x86-64. S-a adăugat suport pentru procesoarele Intel Cooperlake (-march=cooperlake, include extensia AVX512BF16 ISA) și Tigerlake (-march=tigerlake, include extensiile MOVDIRI, MOVDIR64B și AVX512VP2INTERSECT ISA).
  • O implementare a HSAIL (Heterogeneous System Architecture Intermediate Language) pentru sistemele de calcul eterogene bazate pe arhitectura HSA a fost depreciată și va fi probabil eliminată într-o versiune viitoare.

Sursa: opennet.ru

Adauga un comentariu