Vydání sady kompilátorů GCC 10

Po roce vývoje publikováno vydání bezplatné sady kompilátorů GCC 10.1, první hlavní vydání v nové větvi GCC 10.x. V souladu s nové schéma čísla vydání, ve vývojovém procesu byla použita verze 10.0 a krátce před vydáním GCC 10.1 se již rozvětvila větev GCC 11.0, na jejímž základě by se vytvořilo další významné vydání, GCC 11.1.

GCC 10.1 se vyznačuje implementací mnoha inovací v jazyce C++ vyvinutém pro standard C++20, vylepšeními souvisejícími s budoucím standardem jazyka C (C2x), novými optimalizacemi v backendech kompilátoru a experimentální podporou. režim statické analýzy. Během přípravy nové větve navíc projekt převedl repozitář z SVN na Git.

hlavní změny:

  • Přidat experimentální režim statické analýzy "-fanalyzátor“, která provádí meziprocedurální analýzu cest provádění kódu a datových toků v programu náročnou na zdroje. Režim je schopen detekovat problémy ve fázi kompilace, jako jsou dvojitá volání funkce free() pro jednu paměťovou oblast, úniky deskriptorů souborů, dereferencování a předávání nulových ukazatelů, přístup k uvolněným paměťovým blokům, používání neinicializovaných hodnot atd. Použití nového režimu pro kód OpenSSL již umožnilo identifikaci nebezpečná zranitelnost.
  • Vylepšené meziprocedurální optimalizace. Průchod IPA-SRA (Interprocedural Scalar Shared Replacement) byl přepracován tak, aby fungoval v době vazby a mimo jiné nyní odstraňuje vypočítané a vrácené nepoužité hodnoty. V režimu optimalizace "-O2" je povolena možnost "-finline-functions", která je přeladěna tak, aby upřednostňovala kompaktnější kód před výkonem provádění. Práce heuristiky pro nasazení inline funkcí byla urychlena. Heuristika inline expanze a klonování funkcí může nyní využívat informace o rozsazích hodnot k predikci účinnosti jednotlivých transformací. Pro C++ byla vylepšena přesnost typově založené analýzy aliasů.
  • Vylepšené optimalizace doby propojení (LTO). Přidán nový spustitelný soubor lto-skládka k resetování informací o objektových souborech pomocí bajtkódu LTO. Paralelní průchody LTO automaticky určují počet současně běžících úloh vytváření, a pokud je nelze určit, použijí informace o počtu jader CPU jako faktor paralelizace. Přidána možnost komprimovat bajtový kód LTO pomocí algoritmu zstd.
  • Byl vylepšen optimalizační mechanismus založený na výsledcích profilování kódu (PGO - Profile-guided optimization), který generuje optimálnější kód na základě analýzy charakteristik provádění kódu. Vylepšená údržba profilu během kompilace a oddělení kódu za tepla/za studena. Prostřednictvím možnosti "-fprofile-values» nyní může sledovat až 4 hodnoty profilu, například pro nepřímé hovory a poskytovat přesnější informace o profilu.
  • Specifikace paralelního programování implementovaná pro jazyky C, C++ a Fortran OpenACC 2.6, která definuje nástroje pro stahování operací na GPU a specializovaných procesorech, jako je NVIDIA PTX. Implementace standardu je téměř dokončena Otevřete MP 5.0 (Open Multi-Processing), která definuje API a metody aplikace metod paralelního programování na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorizačními jednotkami (SIMD). Přidané funkce, jako jsou podmínky lastprivate, příkazy skenování a smyčky, výrazy order a use_device_addr. U OpenMP a OpenACC byla přidána podpora pro operace snižování zátěže na GPU čtvrté generace (Fiji) a páté generace AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • U jazyků rodiny C byla přidána funkce „access“, která popisuje přístup funkce k objektům předávaným odkazem nebo ukazatelem a přidružuje takové objekty k celočíselným argumentům obsahujícím informace o velikosti objektů. Pro práci ve spojení s „access“ je atribut „type“ implementován pro detekci nesprávného přístupu z uživatelských funkcí, například při zápisu hodnot do oblasti mimo hranice pole. Přidán je také atribut "symver", který spojuje symboly v souboru ELF s konkrétními čísly verzí.
  • Přidána nová upozornění:
    • „-Wstring-compare“ (zapnuto s „-Wextra“) – upozorňuje na přítomnost výrazů, ve kterých je nula porovnávána s výsledkem volání funkcí strcmp a strncmp, což je ekvivalentní konstantě kvůli skutečnosti, že délka jednoho argumentu je větší než velikost pole ve druhém argumentu .
    • "-Wzero-length-bounds" (povoleno s "-Warray-bounds") - varuje před přístupem k prvkům pole s nulovou délkou, což může vést k přepsání jiných dat.
    • Varování „-Warray-bounds“, „-Wformat-overflow“, „-Wrestrict“, „-Wreturn-local-addr“ a „-Wstringop-overflow“ byla rozšířena, aby se rozšířil počet situací mimo hranice. které jsou zpracovány.
  • Implementována možnost přímo specifikovat široké znaky v identifikátorech pomocí aktuálního kódování (ve výchozím nastavení UTF-8) namísto zápisu UCN (\uNNNN nebo \UNNNNNNNNN). Například:

    statická konst int π = 3;
    int get_naïve_pi() {
    návrat π;
    }

  • Pro jazyk C byla implementována část nových funkcí vyvinutých v rámci standardu C2X (umožněno zadáním -std=c2x a -std=gnu2x): pro definování atributů se objevila podpora syntaxe „[[]]“ jako v C++ (například [[gnu ::const]], [[deprecated]], [[fallthrough]] a [[možná_unused]]. Přidána podpora syntaxe "u8" pro definování konstant se znaky UTF-8.
    Přidána nová makra do . Přidány substituce "%OB" a "%Ob" do strftime.

  • Ve výchozím nastavení používá C režim "-fno-common", který umožňuje efektivnější přístup ke globálním proměnným na některých platformách.
  • Pro C++ bylo implementováno asi 16 změn a inovací vyvinutých ve standardu C++20. Včetně přidaného klíčového slova „constinit“
    a byla implementována podpora pro rozšíření šablon "koncept". Koncepty vám umožňují definovat sadu požadavků na parametry šablony, které v době kompilace omezují sadu argumentů, které lze přijmout jako parametry šablony. Tyto koncepty lze použít k zamezení logických nesrovnalostí mezi vlastnostmi datových typů použitých v šabloně a vlastnostmi datových typů vstupních parametrů.

  • G++ poskytuje detekci nedefinovaného chování způsobeného změnou konstantních objektů prostřednictvím constexpr. Snížená spotřeba paměti kompilátorem při výpočtu constexpr. Přidána nová varování „-Wmismatched-tags“ a „-Wredundant-tags“.
  • Byly navrženy nové možnosti příkazového řádku:
    • "-fallocation-dce" k odstranění nepotřebných párů operátorů "new" a "delete".
    • "-fprofile-partial-training" pro zakázání optimalizace velikosti pro kód, který nemá trénovací běh.
    • "-fprofile-reproducible pro řízení úrovně reprodukovatelnosti profilu.
    • "-fprofile-prefix-path" pro definování základního zdrojového adresáře sestavení používaného pro samostatné generování profilu (pro "-fprofile-generate=profile_dir" a "-fprofile-use=profile_dir").
  • V textu upozornění pro uvedené možnosti jsou uvedeny hypertextové odkazy, které vám umožní přejít do dokumentace k těmto možnostem. Náhrada URL je řízena pomocí volby "-fdiagnostics-urls".
  • Přidán operátor preprocesoru "__has_builtin“, který lze použít ke kontrole vestavěných funkcí.
  • Přidána nová vestavěná funkce „__builtin_roundeven“ s implementací funkce zaokrouhlení definované ve specifikaci ISO/IEC TS 18661, podobná „kulaté“, ale část zaokrouhlení větší než 0.5 nahoru (na větší hodnotu), menší než 0.5 - dolů (na nulu) a rovna 0.5 - počínaje paritou předposlední číslice.
  • Pro architekturu AArch64 byla přidána podpora pro rozšíření SVE2 a vylepšena podpora pro SVE (Scalable Vector Extension), včetně přidané podpory pro vestavěné funkce a typy SVE ACLE a použití vektorizace. Rozšířena byla podpora LSE (Large System Extensions) a TME (Transactional Memory Extension). Přidány nové instrukce navržené v Armv8.5-A a Armv8.6-A, včetně instrukcí pro generování náhodných čísel, zaokrouhlování, vázání paměťových značek,
    bfloat16 a násobení matic. Přidána podpora procesoru
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Rameno Cortex-A34 a
    Marvell ThunderX3.

  • Přidána podpora pro ABI FDPIC (32bitové funkční ukazatele) pro ARM64. Přepracované a optimalizované zpracování 64bitových celočíselných operací. Přidána podpora CPU
    Arm Cortex-A77,
    Rameno Cortex-A76AE a
    Rameno Cortex-M35P. Rozšířená podpora pro instrukce ACLE pro zpracování dat, včetně 32bitové SIMD, 16bitové násobení, latch aritmetiky a dalších optimalizací DSP algoritmů. Přidána experimentální podpora pro instrukce ACLE CDE (Custom Datapath Extension).

  • Výrazně vylepšené generování kódu a vektorizace v backendu pro GPU AMD na základě mikroarchitektury GCN.
  • Přidána podpora pro zařízení podobná XMEGA pro architekturu AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega , ATmega3208 3209, ATmega4808 a ATmega4809.

  • Pro architektury IA-32/x86-64 bylo přidáno nové rozšíření architektury instrukční sady Intel ENQCMD (-menqcmd). Přidána podpora pro procesory Intel Cooperlake (-march=cooperlake, zahrnuje rozšíření AVX512BF16 ISA) a Tigerlake (-march=tigerlake, zahrnuje rozšíření MOVDIRI, MOVDIR64B a AVX512VP2INTERSECT ISA).
  • Implementace HSAIL (Heterogeneous System Architecture Intermediate Language) pro heterogenní výpočetní systémy založené na architektuře HSA byla zastaralá a pravděpodobně bude v budoucí verzi odstraněna.

Zdroj: opennet.ru

Přidat komentář