Vydanie sady kompilátorov GCC 10

Po roku vývoja zverejnená vydanie bezplatnej sady kompilátorov GCC 10.1, prvé veľké vydanie v novej vetve GCC 10.x. V súlade s nová schéma čísla vydania, vo vývoji bola použitá verzia 10.0 a krátko pred vydaním GCC 10.1 sa už vetva GCC 11.0 rozvetvila, na základe ktorej by sa vytvorilo ďalšie významné vydanie GCC 11.1.

GCC 10.1 sa vyznačuje implementáciou mnohých inovácií v jazyku C++ vyvinutom pre štandard C++20, vylepšeniami týkajúcimi sa budúceho štandardu jazyka C (C2x), novými optimalizáciami v backendoch kompilátora a experimentálnou podporou. režim statickej analýzy. Okrem toho počas prípravy novej pobočky projekt preniesol úložisko zo SVN na Git.

Hlavné zmeny:

  • Pridané experimentálny režim statickej analýzy "-fanalyzátor“, ktorá vykonáva interprocedurálnu analýzu ciest vykonávania kódu a dátových tokov v programe, ktorá je náročná na zdroje. Režim je schopný detekovať problémy vo fáze kompilácie, ako sú dvojité volania funkcie free() pre jednu oblasť pamäte, úniky deskriptorov súborov, dereferencovanie a odovzdávanie nulových ukazovateľov, prístup k uvoľneným pamäťovým blokom, používanie neinicializovaných hodnôt atď. Použitie nového režimu pre kód OpenSSL už umožnilo identifikovať nebezpečná zraniteľnosť.
  • Vylepšené interprocedurálne optimalizácie. Priechod IPA-SRA (Interprocedural Scalar Shared Replacement) bol prepracovaný tak, aby fungoval v čase viazania a okrem iného teraz odstraňuje vypočítané a vrátené nepoužité hodnoty. V režime optimalizácie „-O2“ je povolená možnosť „-finline-functions“, ktorá je preladená tak, aby uprednostňovala kompaktnejší kód pred výkonom vykonávania. Zrýchlila sa práca heuristiky pre nasadenie inline funkcií. Inline expanzia a heuristika klonovania funkcií teraz môže využívať informácie o rozsahoch hodnôt na predpovedanie účinnosti jednotlivých transformácií. Pre C++ bola vylepšená presnosť typovej analýzy aliasov.
  • Vylepšená optimalizácia doby prepojenia (LTO). Pridaný nový spustiteľný súbor lto-skládka na obnovenie informácií o objektových súboroch pomocou bajtkódu LTO. Paralelné priechody LTO automaticky určujú počet súčasne spustených úloh vytvárania a ak ich nemožno určiť, použijú informácie o počte jadier CPU ako faktor paralelizácie. Pridaná možnosť komprimovať bajtový kód LTO pomocou algoritmu zstd.
  • Vylepšený bol optimalizačný mechanizmus založený na výsledkoch profilovania kódu (PGO - Profile-guided optimization), ktorý generuje optimálnejší kód na základe analýzy charakteristík vykonávania kódu. Vylepšená údržba profilu počas kompilácie a oddelenie kódu za tepla/za studena. Cez možnosť "-fprofile-values» teraz dokáže monitorovať až 4 hodnoty profilu, napríklad pre nepriame hovory a poskytovanie presnejších informácií o profile.
  • Špecifikácia paralelného programovania implementovaná pre jazyky C, C++ a Fortran OpenACC 2.6, ktorá definuje nástroje na znižovanie záťaže na GPU a špecializovaných procesoroch, ako je NVIDIA PTX. Implementácia normy je takmer dokončená Otvorte MP 5.0 (Open Multi-Processing), ktorý definuje API a metódy aplikácie metód paralelného programovania na viacjadrové a hybridné (CPU+GPU/DSP) systémy so zdieľanou pamäťou a vektorizačnými jednotkami (SIMD). Pridané funkcie, ako napríklad podmienky lastprivate, príkazy skenovania a slučky, príkazy order a use_device_addr. Pre OpenMP a OpenACC bola pridaná podpora pre operácie znižovania záťaže na GPU štvrtej generácie (Fiji) a piatej generácie AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • Pre jazyky z rodiny C bola pridaná funkcia „prístup“, ktorá popisuje prístup funkcie k objektom odovzdaným odkazom alebo ukazovateľom a spája takéto objekty s celočíselnými argumentmi obsahujúcimi informácie o veľkosti objektov. Pre prácu v spojení s „access“ je atribút „type“ implementovaný na zistenie nesprávneho prístupu z užívateľských funkcií, napríklad pri zápise hodnôt do oblasti mimo hraníc poľa. Pridaný je aj atribút „symver“, ktorý spája symboly v súbore ELF so špecifickými číslami verzií.
  • Pridané nové upozornenia:
    • „-Wstring-compare“ (povolené s „-Wextra“) – upozorňuje na prítomnosť výrazov, v ktorých je nula porovnávaná s výsledkom volania funkcií strcmp a strncmp, čo je ekvivalentné konštante vzhľadom na skutočnosť, že dĺžka jedného argumentu je väčšia ako veľkosť poľa v druhom argumente .
    • "-Wzero-length-bounds" (povolené s "-Warray-bounds") - varuje pred prístupom k prvkom poľa s nulovou dĺžkou, čo môže viesť k prepísaniu iných údajov.
    • Varovania „-Warray-bounds“, „-Wformat-overflow“, „-Wrestrict“, „-Wreturn-local-addr“ a „-Wstringop-overflow“ boli rozšírené, aby sa rozšíril počet situácií mimo hraníc ktoré sú riešené.
  • Implementovaná možnosť priamo špecifikovať široké znaky v identifikátoroch pomocou aktuálneho kódovania (predvolene UTF-8) namiesto notácie UCN (\uNNNN alebo \UNNNNNNNNN). Napríklad:

    static const int π = 3;
    int get_naïve_pi() {
    návrat π;
    }

  • Pre jazyk C bola implementovaná časť nových funkcií vyvinutých v rámci štandardu C2X (umožnených zadaním -std=c2x a -std=gnu2x): objavila sa podpora syntaxe „[[]]“ pre definovanie atribútov ako v C++ (napríklad [[gnu ::const]], [[zastarané]], [[fallthrough]] a [[možno_unused]]. Pridaná podpora pre syntax "u8" na definovanie konštánt so znakmi UTF-8.
    Pridané nové makrá do . Do strftime boli pridané náhrady "%OB" a "%Ob".

  • Predvolený režim pre C je "-fno-common", ktorý umožňuje efektívnejší prístup ku globálnym premenným na niektorých platformách.
  • Pre C++ bolo implementovaných asi 16 zmien a inovácií vyvinutých v štandarde C++20. Vrátane pridaného kľúčového slova „constinit“
    a bola implementovaná podpora pre rozšírenia šablón "pojmov". Koncepty vám umožňujú definovať množinu požiadaviek na parametre šablóny, ktoré v čase kompilácie obmedzujú množinu argumentov, ktoré možno akceptovať ako parametre šablóny. Koncepty možno použiť na zabránenie logickým nezrovnalostiam medzi vlastnosťami typov údajov použitých v šablóne a vlastnosťami typu údajov vstupných parametrov.

  • G++ poskytuje detekciu nedefinovaného správania spôsobeného zmenou konštantných objektov cez constexpr. Znížená spotreba pamäte kompilátorom pri výpočte constexpr. Pridané nové upozornenia „-Wmismatched-tags“ a „-Wredundant-tags“.
  • Boli navrhnuté nové možnosti príkazového riadku:
    • "-fallocation-dce" na odstránenie nepotrebných párov operátorov "new" a "delete".
    • "-fprofile-partial-training" na zakázanie optimalizácie veľkosti pre kód, ktorý nemá spustený tréning.
    • "-fprofile-reprodukovateľné na kontrolu úrovne reprodukovateľnosti profilu.
    • "-fprofile-prefix-path" na definovanie základného zdrojového adresára zostavy používaného na samostatné generovanie profilu (pre "-fprofile-generate=profile_dir" a "-fprofile-use=profile_dir").
  • V texte upozornenia pre uvedené možnosti sú uvedené hypertextové odkazy, ktoré vám umožňujú prejsť na dokumentáciu k týmto možnostiam. Náhrada URL je riadená pomocou voľby "-fdiagnostics-urls".
  • Pridaný operátor preprocesora "__has_builtin“, ktorý možno použiť na kontrolu vstavaných funkcií.
  • Pridaná nová vstavaná funkcia „__builtin_roundeven“ s implementáciou funkcie zaokrúhľovania definovanej v špecifikácii ISO/IEC TS 18661, podobne ako „okrúhle“, ale časť zaokrúhľovania väčšia ako 0.5 nahor (na väčšiu hodnotu), menšia ako 0.5 - dole (na nulu) a rovná sa 0.5 - počnúc paritou predposlednej číslice.
  • Pre architektúru AArch64 bola pridaná podpora rozšírenia SVE2 a vylepšená podpora pre SVE (Scalable Vector Extension), vrátane pridanej podpory pre vstavané funkcie a typy SVE ACLE a využitie vektorizácie. Rozšírená bola podpora LSE (Large System Extensions) a TME (Transactional Memory Extension). Pridané nové inštrukcie navrhnuté v Armv8.5-A a Armv8.6-A, vrátane pokynov na generovanie náhodných čísel, zaokrúhľovanie, viazanie pamäťových značiek,
    bfloat16 a násobenie matice. Pridaná podpora procesora
    Arm Cortex-A77,
    Rameno Cortex-A76AE,
    Arm Cortex-A65,
    Rameno Cortex-A65AE,
    Rameno Cortex-A34 a
    Marvell ThunderX3.

  • Pridaná podpora pre ABI FDPIC (32-bitové funkčné ukazovatele) pre ARM64. Prepracované a optimalizované spracovanie 64-bitových celočíselných operácií. Pridaná podpora CPU
    Arm Cortex-A77,
    Rameno Cortex-A76AE a
    Rameno Cortex-M35P. Rozšírená podpora pre inštrukcie ACLE na spracovanie dát, vrátane 32-bit SIMD, 16-bitového násobenia, latch aritmetiky a ďalších optimalizácií DSP algoritmov. Pridaná experimentálna podpora pre inštrukcie ACLE CDE (Custom Datapath Extension).

  • Výrazne vylepšené generovanie kódu a vektorizácia v backende pre GPU AMD založené na mikroarchitektúre GCN.
  • Pridaná podpora pre zariadenia podobné XMEGA pre architektúru AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega,809megaAT1608mega1609megaAT3208 , ATmega3209 4808, ATmega4809 a ATmegaXNUMX.

  • Pre architektúry IA-32/x86-64 bolo pridané nové rozšírenie architektúry inštrukčnej sady Intel ENQCMD (-menqcmd). Pridaná podpora pre procesory Intel Cooperlake (-march=cooperlake, zahŕňa rozšírenie AVX512BF16 ISA) a Tigerlake (-march=tigerlake, zahŕňa rozšírenia MOVDIRI, MOVDIR64B a AVX512VP2INTERSECT ISA).
  • Implementácia HSAIL (Heterogeneous System Architecture Intermediate Language) pre heterogénne počítačové systémy založené na architektúre HSA bola zastaraná a pravdepodobne bude odstránená v budúcom vydaní.

Zdroj: opennet.ru

Pridať komentár