Vydání sady kompilátorů GCC 11

Po roce vývoje byla vydána bezplatná sada kompilátorů GCC 11.1, první významné vydání v nové větvi GCC 11.x. V souladu s novým schématem číslování verzí byla ve vývojovém procesu použita verze 11.0 a krátce před vydáním GCC 11.1 se již rozvětvila větev GCC 12.0, ze které se vytvoří další hlavní vydání, GCC 12.1.

GCC 11.1 je pozoruhodný svým přechodem na používání formátu ladicích souborů DWARF 5 ve výchozím nastavení, výchozím zahrnutím standardu C++17 („-std=gnu++17“), významným vylepšením podpory pro C++20 standard, experimentální podpora pro C++23, vylepšení související s budoucím standardem jazyka C (C2x), nové optimalizace výkonu.

Hlavní změny:

  • Výchozí režim jazyka C++ byl přepnut na použití standardu C++17 (-std=gnu++17) namísto dříve nabízeného C++14. Je možné selektivně zakázat nové chování C++17 při zpracování šablon, které používají jiné šablony jako parametr (-fno-new-ttp-matching).
  • Přidána podpora hardwarové akcelerace nástroje AddressSanitizer, která umožňuje zjišťovat fakta o přístupu k uvolněným paměťovým oblastem, překračování hranic přidělené vyrovnávací paměti a některé další typy chyb při práci s pamětí. Hardwarová akcelerace je v současnosti dostupná pouze pro architekturu AArch64 a je zaměřena na použití při kompilaci linuxového jádra. Pro povolení hardwarové akcelerace AddressSanitizer při sestavování komponent uživatelského prostoru byl přidán příznak "-fsanitize=hwaddress" a příznak jádra "-fsanitize=kernel-hwaddress".
  • Při generování ladicích informací se standardně používá formát DWARF 5, který oproti předchozím verzím umožňuje generovat o 25 % kompaktnější ladicí data. Plná podpora DWARF 5 vyžaduje alespoň binutils verze 2.35.2. Formát DWARF 5 je podporován v ladicích nástrojích od GDB 8.0, valgrind 3.17.0, elfutils 0.172 a dwz 0.14. Chcete-li generovat ladicí soubory pomocí jiných verzí DWARF, můžete použít volby "-gdwarf-2", "-gdwarf-3" a "-gdwarf-4".
  • Požadavky na kompilátory, které lze použít k sestavení GCC, byly zvýšeny. Kompilátor nyní musí podporovat standard C++11 (dříve bylo vyžadováno C++98), tzn. Jestliže GCC 10 stačilo k sestavení GCC 3.4, pak je nyní k sestavení GCC 11 potřeba alespoň GCC 4.8.
  • Byly změněny názvy a umístění souborů pro ukládání výpisů, dočasných souborů a dalších informací nezbytných pro optimalizaci LTO. Takové soubory jsou nyní vždy uloženy v aktuálním adresáři, pokud není cesta výslovně změněna pomocí voleb "-dumpbase", "-dumpdir" a "-save-temps=*".
  • Podpora binárního formátu BRIG pro použití s ​​jazykem HSAIL (Heterogeneous System Architecture Intermediate Language) byla zastaralá a bude brzy odstraněna.
  • Schopnosti režimu ThreadSanitizer (-fsanitize=thread) byly rozšířeny a byly navrženy tak, aby detekovaly závody při sdílení stejných dat z různých vláken vícevláknové aplikace. Nová verze přidává podporu pro alternativní běhová prostředí a prostředí a také podporu pro ladicí nástroj KCSAN (Kernel Concurrency Sanitizer), který je navržen tak, aby dynamicky zjišťoval závodní podmínky v jádře Linuxu. Přidány nové možnosti "-param tsan-distinguish-volatile" a "-param tsan-instrument-func-entry-exit".
  • Čísla sloupců v diagnostických zprávách nyní neodrážejí počet bajtů od začátku řádku, ale ve skutečnosti čísla sloupců, která berou v úvahu vícebajtové znaky a znaky zabírající několik pozic v řádku (například znak 🙂 zabírá dvě pozice a je zakódován ve 4 bajtech). Podobně se znaky tabulátoru nyní považují za určitý počet mezer (lze konfigurovat pomocí volby -ftabstop, výchozí 8). Pro obnovení starého chování je navržena volba “-fdiagnostics-column-unit=byte” a pro určení počáteční hodnoty (číslování od 0 nebo 1) - volba “-fdiagnostics-column-origin=”.
  • Vektorizér bere v úvahu celý obsah funkce a přidává možnosti zpracování spojené s průniky a odkazy na předchozí bloky v grafu řízení toku (CFG, graf řízení toku).
  • Optimalizátor implementuje schopnost převést řadu podmíněných operací, které porovnávají stejnou proměnnou, na výraz přepínače. Přepínací výraz lze později zakódovat pomocí instrukcí pro testování bitů (pro řízení takového převodu byla přidána možnost „-fbit-tests“).
  • Vylepšené meziprocedurální optimalizace. Přidán nový průchod IPA-modref (-fipa-modref) pro sledování vedlejších účinků při volání funkcí a zlepšení přesnosti analýzy. Vylepšená implementace IPA-ICF pass (-fipa-icf), která snižuje spotřebu paměti při kompilaci a zvyšuje počet unifikovaných funkcí, pro které jsou kombinovány identické bloky kódu. V průchodu IPA-CP (Interprocedural konstantní propagace) byla heuristika predikce vylepšena s ohledem na známé hranice a vlastnosti smyček.
  • V Linking Time Optimizations (LTO) je formát bajtového kódu optimalizován pro zmenšení velikosti a zvýšení rychlosti zpracování. Snížená špičková spotřeba paměti během fáze vazby.
  • V optimalizačním mechanismu založeném na výsledcích profilování kódu (PGO - Profile-guided optimization), který umožňuje generování optimálnějšího kódu na základě analýzy prováděcích funkcí, je velikost souborů s GCOV daty snížena díky kompaktnějšímu balení nulových čítačů. . Vylepšený režim "-fprofile-values" sledováním více parametrů u nepřímých volání.
  • Implementace standardu OpenMP 5.0 (Open Multi-Processing), který definuje API a metody pro aplikaci 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). pokračoval. Přidána počáteční podpora pro direktivu alokace a možnost používat heterogenní smyčky v konstrukcích OpenMP. Implementována podpora pro proměnnou prostředí OMP_TARGET_OFFLOAD.
  • Byla vylepšena implementace specifikace paralelního programování OpenACC 2.6 poskytovaná pro jazyky C, C++ a Fortran, která definuje nástroje pro odlehčení operací na GPU a specializovaných procesorech, jako je NVIDIA PTX.
  • Pro jazyky C byl implementován nový atribut „no_stack_protector“, určený k označení funkcí, pro které by ochrana zásobníku neměla být povolena („-fstack-protector“). Atribut „malloc“ byl rozšířen o podporu identifikace dvojic volání pro alokaci a uvolnění paměti (allocator/deallocator), který se ve statickém analyzátoru používá k identifikaci typických chyb při práci s pamětí (úniky paměti, použití po uvolnění, double volání funkce free atd.) a ve varováních kompilátoru „-Wmismatched-dealloc“, „-Wmismatched-new-delete“ a „-Wfree-nonheap-object“, informujících o nesouladu mezi operacemi dealokace a alokace paměti.
  • Pro jazyk C byla přidána nová varování:
    • "-Wmismatched-dealloc" (ve výchozím nastavení povoleno) - varuje před operacemi uvolnění paměti, které používají ukazatel, který není kompatibilní s funkcemi alokace paměti.
    • "-Wsizeof-array-div" (povoleno, když je zadáno "-Wall") - Varuje před dělením dvou operátorů sizeof, pokud dělitel neodpovídá velikosti prvku pole.
    • "-Wstringop-overread" (ve výchozím nastavení povoleno) - varuje před voláním řetězcové funkce, která čte data z oblasti mimo hranice pole.
    • "-Wtsan" (ve výchozím nastavení povoleno) - Varuje před použitím funkcí (jako je std::atomic_thread_fence), které nejsou podporovány v ThreadSanitizer.
    • „-Warray-parameter“ a „-Wvla-parameter“ (povoleno při zadání „-Wall“) – varuje před přepsáním funkcí nekompatibilními deklaracemi argumentů spojených s poli s pevnou a proměnnou délkou.
    • Varování "-Wuninitialized" nyní detekuje pokusy o čtení z neinicializované dynamicky alokované paměti.
    • Varování "-Wfree-nonheap-object" rozšiřuje definici případů, kdy jsou funkce dealokace paměti volány s ukazatelem, který nebyl získán prostřednictvím funkcí dynamické alokace paměti.
    • Upozornění "-Wmaybe-uninitialized" rozšířilo detekci předávání ukazatelů na funkce, které odkazují na neinicializovaná místa v paměti.
  • Pro jazyk C byla implementována část nových funkcí vyvinutých v rámci standardu C2X (umožněné zadáním -std=c2x a -std=gnu2x): makra BOOL_MAX a BOOL_WIDTH, volitelná indikace názvů nepoužitých parametrů ve funkci definice (jako v C++), atribut „[ [nodiscard]]“, operátor preprocesoru „__has_c_attribute“, makra FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_SNAN_XNUMX, DBLEX LDBL_SNAN, DEC_INFINITY a DEC_NAN, NaN=makra pro FloatN , _FloatNx a _DecimalN, schopnost specifikovat značky skoků před deklaracemi a na konci složených příkazů.
  • Pro C++ byla implementována část změn a inovací navržených ve standardu C++20, včetně virtuálních funkcí „consteval virtual“, pseudo-destruktorů pro konec životního cyklu objektů, použití třídy enum a výpočet velikosti pole ve výrazu „nový“.
  • Pro C++ byla přidána experimentální podpora pro některá vylepšení vyvíjená pro budoucí standard C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Například je nyní podporována doslovná přípona „zu“ pro hodnoty size_t se znaménkem.
  • libstdc++ zlepšila podporu pro standard C++17, včetně zavedení implementací std::from_chars a std::to_chars pro typy s pohyblivou řádovou čárkou. Byly implementovány nové prvky standardu C++20, včetně std::bit_cast, std::source_location, atomické operace čekat a upozorňovat, , , , , stejně jako prvky budoucího standardu C++23 (std::to_underlying, std::is_scoped_enum). Přidána experimentální podpora typů pro paralelní zpracování dat (SIMD, Data-Parallel Types). Implementace std::uniform_int_distribution byla urychlena.
  • Odstraněn příznak kvality alfa z libgccjit, sdílené knihovny pro vkládání generátoru kódu do jiných procesů a jeho použití k organizaci JIT kompilace bajtového kódu do strojového kódu. Přidána možnost sestavit libgccjit pro MinGW.
  • Přidána podpora pro architekturu AArch64 Armv8-R (-march=armv8-r). Pro architektury AArch64 a ARM byla přidána podpora procesorů (parametry -mcpu a -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) a Arm Neoverse N2 (neoverse-n2). Byly také přidány CPU Fujitsu A64FX (a64fx) a Arm Cortex-R82 (cortex-r82), které podporují pouze architekturu AArch64.
  • Přidána podpora pro použití instrukcí SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) a MVE (AArch32 M-profile) pro autovektorizaci operací provádějících sčítání, odčítání, násobení a varianty sčítání/odčítání přes komplexní čísla. Přidána počáteční podpora autovektorizace pro ARM pomocí instrukční sady MVE.
  • Pro platformy ARM je k dispozici úplná sada funkcí jazyka C (Intrinsics) integrovaných do kompilátoru, nahrazená rozšířenými vektorovými instrukcemi (SIMD), které pokrývají všechny instrukce NEON zdokumentované ve specifikaci ACLE Q3 2020.
  • Do backendu byla přidána podpora pro GPU gfx908 pro generování kódu pro GPU AMD na základě mikroarchitektury GCN.
  • Přidána podpora pro nové procesory a v nich implementovaná nová rozšíření instrukční sady:
    • Intel Sapphire Rapids (-march=sapphirerapids, umožňuje podporu instrukcí MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INTX8 a AVNNI
    • Intel Alderlake (-march=alderlake, umožňuje podporu instrukcí CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI a HRESET).
    • Intel Rocketlake (-march=rocketlake, obdoba Rocket Lake bez podpory SGX).
    • AMD Zen 3 (-march=znver3).
  • Pro systémy IA-32/x86-64 založené na procesorech Intel byla přidána podpora nových instrukcí procesoru TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Přidána podpora pro příznaky "-march=x86-64-v[234]" pro výběr úrovní architektury x86-64 (v2 - pokrývá rozšíření SSE4.2, SSSE3, POPCNT a CMPXCHG16B; v3 - AVX2 a MOVBE; v4 - AVX-512 ).
  • Přidána podpora pro systémy RISC-V s pořadím bajtů big-endian. Přidána možnost "-misa-spec=*" pro výběr verze specifikace architektury instrukční sady RISC-V. Přidána podpora pro AddressSanitizer a ochranu zásobníku pomocí canary tagů.
  • Pokračující vylepšování režimu statické analýzy „-fanalyzer“, který provádí meziprocedurální analýzu cest provádění kódu a datových toků v programu, která je náročná na zdroje. Režim je schopen detekovat problémy ve fázi kompilace, jako jsou dvojitá volání funkce free() pro jednu oblast paměti, ú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. V nové verzi:
    • Kód pro sledování stavu programu byl kompletně přepsán. Problémy se skenováním velmi velkých souborů C byly vyřešeny.
    • Přidána počáteční podpora C++.
    • Analýza alokace a dealokace paměti byla abstrahována od specifických funkcí malloc a free a nyní podporuje new/delete a new[]/delete[].
    • Přidána nová varování: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const a -Wanalyzer-write-to-string-literal.
    • Přidány nové možnosti ladění -fdump-analyzer-json a -fno-analyzer-feasibility.
    • Byla implementována možnost rozšíření analyzátoru pomocí pluginů pro GCC (např. byl připraven plugin pro kontrolu nesprávného použití globálního zamykání (GIL) v CPythonu).

Zdroj: opennet.ru

Přidat komentář