Vydání sady kompilátorů GCC 9

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

GCC 9.1 se vyznačuje stabilizací podpory pro standard C++17, pokračující implementací schopností budoucího standardu C++20 (kódové označení C++2a), zahrnutím do frontendu pro jazyk D, částečnou podporou OpenMP 5.0 , téměř kompletní podpora OpenACC 2.5, zvýšení škálovatelnosti interprocedurálních optimalizací a optimalizací ve fázi vazby, rozšíření diagnostických nástrojů a přidání nových varování, backendy pro OpenRISC, C-SKY V2 a AMD GCN GPU.

hlavní změny:

  • Přidána podpora pro programovací jazyk D. GCC obsahuje frontend s kompilátorem GDC (Gnu D Compiler) a runtime knihovny (libphobos), které umožňují používat standardní GCC k sestavování programů v programovacím jazyce D. Proces povolení podpory jazyka D v GCC začalo v roce 2011, ale táhl dál kvůli nutnosti uvést kód do souladu s požadavky GCC a problémům s převodem práv duševního vlastnictví na společnost Digital Mars, která vyvíjí programovací jazyk D;
  • Vylepšení bylo provedeno v generátoru kódu. Například bylo implementováno použití různých strategií pro rozšiřování výrazů Switch (tabulka skoků, bitový test, rozhodovací strom) v závislosti na situacích. Přidána možnost transformovat lineární funkce, které zahrnují výraz Switch, pomocí optimalizace „-ftree-switch-conversion“ (například sada podmínek jako „případ 2: jak = 205; přerušení; případ 3: jak = 305; přerušení ;” bude převedeno na "100 * jak + 5";
  • Vylepšené meziprocedurální optimalizace. Nastavení inline nasazení bylo přizpůsobeno pro moderní kódové báze C++ a rozšířeno o nové parametry max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns a uninlined - čas na zamyšlení. Vylepšená přesnost a agresivita oddělení studeného/horkého kódu. Vylepšená škálovatelnost pro velmi velké překladové jednotky (například při aplikaci optimalizace ve fázi propojení s velkými programy);
  • 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. Možnost souhrnu "-fprofile-use" nyní zahrnuje optimalizační režimy "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" a "-ftree-loop-distribution". Odstraněno zahrnutí histogramů s počítadly do souborů, což zmenšilo velikost souborů s profily (histogramy se nyní generují za běhu při provádění optimalizací během propojování);
  • Vylepšené optimalizace doby propojení (LTO). Před generováním výsledku bylo zajištěno zjednodušení typů, což umožnilo výrazně snížit velikost souborů objektů LTO, snížit spotřebu paměti ve fázi vazby a zlepšit paralelizaci operací. Počet oddílů (-param lto-partitions) byl zvýšen z 32 na 128, což zlepšuje výkon na systémech s velkým počtem vláken CPU. Byl přidán parametr pro řízení počtu procesů optimalizace
    "-param lto-max-streaming-parallelism";

    Výsledkem je ve srovnání s GCC 8.3 optimalizace zavedené v GCC 9 povoleno zkrátit dobu kompilace Firefoxu 5 a LibreOffice 66 asi o 6.2.3 %. Velikost objektových souborů se snížila o 7 %. Doba vazby na 8jádrovém CPU se snížila o 11 %. Fáze sekvenční optimalizace fáze propojení je nyní o 28 % rychlejší a spotřebovává o 20 % méně paměti. Spotřeba paměti každého procesoru paralelizovaného stupně LTO klesla o 30 %;

  • Většina specifikací paralelního programování je implementována pro jazyky C, C++ a Fortran OpenACC 2.5, která definuje nástroje pro stahování operací na GPU a specializovaných procesorech, jako je NVIDIA PTX;
  • Částečná podpora standardu byla implementována pro C a C++ Otevřete MP 5.0 (Open Multi-Processing), který definuje API a metody aplikace metod paralelního programování pro jazyky C, C++ a Fortran na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorizačními jednotkami (SIMD) ;
  • Pro jazyk C byla přidána nová varování: "-Waddress-of-packed-member" (nezarovnaná hodnota ukazatele na sbalený člen struktury nebo sjednocení) a
    «-Wabsolutní-hodnota" (při přístupu k funkcím pro výpočet absolutní hodnoty, pokud pro zadaný argument existuje vhodnější funkce, například fabs(3.14) by se mělo použít místo abs(3.14). Pro C++ přidána nová varování: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" a "-Wclass-conversion". Mnoho dříve dostupných varování bylo rozšířeno;

  • Přidána experimentální podpora pro část budoucího standardu jazyka C s kódovým označením C2x. Chcete-li povolit podporu C2x, použijte volby "-std=c2x" a "-std=gnu2x" (pro povolení rozšíření GNU). Standard je stále v rané fázi vývoje, proto je z hlediska jeho schopností podporován pouze výraz _Static_assert s jedním argumentem (_Static_assert se dvěma argumenty je standardizován v C11);
  • Podpora standardu C++17 byla prohlášena za stabilní. Ve frontendu jsou plně implementovány jazykové možnosti C++17 a v libstdc++ se knihovní funkce definované ve standardu blíží plné implementaci;
  • Pokračování implementace prvky budoucího standardu C++2a. Například byla přidána možnost zahrnout rozsahy během inicializace, byla implementována rozšíření pro výrazy lambda, byla přidána podpora prázdných členů datových struktur a pravděpodobných/nepravděpodobných atributů, byla poskytnuta možnost volat virtuální funkce v podmíněných výrazech. , atd.
    Chcete-li povolit podporu C++2a, použijte možnosti "-std=c++2a" a "-std=gnu++2a". Přidány bitové a verze záhlaví souborů do libstdc++ pro C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a std::type_identity traits, std::midpoint,p , std::bind_front,
    std::visit, std::is_constant_evaluated a std::assume_aligned, přidána podpora pro typ char8_t, implementována možnost kontroly prefixu a přípony řetězců (začíná_s, končí_s);

  • Přidána podpora pro nové procesory ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE a Neoverse N1. Přidána podpora instrukcí představených v Armv8.3-A pro práci s komplexními čísly, generování pseudonáhodných čísel (rng) a označování paměti (memtag), stejně jako instrukce pro blokování útoků souvisejících se spekulativním prováděním a provozem jednotky predikce větví . Pro architekturu AArch64 byl přidán ochranný režim průsečíky stohů a hromad („-fstack-clash-protection“). Pro využití funkcí architektury Armv8.5-A byla přidána možnost „-march=armv8.5-a“.

  • Obsahuje backend pro generování kódu pro GPU AMD na základě mikroarchitektury GCN. Implementace je v současné době omezena na kompilaci jednovláknových aplikací (podpora pro provádění vícevláknových výpočtů přes OpenMP a OpenACC bude nabídnuta později) a podporu pro GPU Fiji a Vega 10;
  • Přidán nový backend pro procesory OpenRISC;
  • Přidán backend pro procesory C-SKY V2, vyráběný stejnojmennou čínskou společností pro různá spotřebitelská zařízení;
  • Všechny možnosti příkazového řádku, které obsluhují hodnoty bajtů, podporují přípony kb, KiB, MB, MiB, GB a GiB;
  • Realizováno možnost „-flive-patching=[inline-only-static|inline-clone]“ vám umožňuje dosáhnout bezpečné kompilace pro systémy s živými záplatami díky víceúrovňové kontrole používání interprocedurálních (IPA) optimalizace;
  • Přidána volba "--completion" pro jemné ovládání dokončení volby při použití bash;
  • Diagnostické nástroje poskytují zobrazení úryvků zdrojového textu s uvedením čísla řádku a vizuálního označení souvisejících informací, jako jsou typy operandů. Chcete-li zakázat zobrazování čísel řádků a štítků, jsou k dispozici možnosti „-fno-diagnostics-show-line-numbers“ a „-fno-diagnostics-show-labels“;

    Vydání sady kompilátorů GCC 9

  • Rozšířený nástroje pro diagnostiku chyb v kódu C++, zlepšená čitelnost informací o příčinách chyb a zvýraznění problematických parametrů;

    Vydání sady kompilátorů GCC 9

  • Přidána volba „-fdiagnostics-format=json“, která umožňuje generování diagnostického výstupu ve strojově čitelném formátu (JSON);
  • Přidány nové volby profilování „-fprofile-filter-files“ a „-fprofile-exclude-files“ pro výběr zdrojových souborů ke zpracování;
  • AddressSanitizer poskytuje generování kompaktnějšího ověřovacího kódu pro automatické proměnné, což snižuje spotřebu paměti kontrolovaného spustitelného souboru;
  • Vylepšený výstup v "-fopt-info» (podrobné informace o přidaných optimalizacích). Přidány nové předpony „optimalizováno“ a „zmeškané“ kromě dříve dostupné předpony „poznámka“. Přidán výstup informací o rozhodování o inline-rozkládání a vektorizaci cyklů;
  • Přidána možnost „-fsave-optimization-record“, pokud je zadána, GCC uloží soubor SRCFILE.opt-record.json.gz s popisem rozhodnutí o použití určitých optimalizací. Nová možnost se liší od režimu „-fopt-info“ tím, že zahrnuje další metadata, jako jsou informace o profilu a inline řetězcích;
  • Přidány volby „-fipa-stack-alignment“ a „-fipa-reference-addressable“ pro řízení zarovnání zásobníku a použití režimů adresování (pouze zápis nebo přesné čtení) pro statické proměnné během interprocedurálních optimalizací;
  • Jsou zavedeny nové vestavěné funkce pro řízení vazby atributů a také chování související s predikcí větví a prováděním spekulativních instrukcí: "__builtin_has_attribute","__builtin_expect_with_probability" A "__builtin_speculation_safe_value". Byl přidán nový atribut pro funkce, proměnné a typy kopie;
  • Pro jazyk Fortran byla implementována plná podpora asynchronního vstupu/výstupu;
  • Podpora pro platformy Solaris 10 (*-*-solaris2.10) a Cell/BE (Cell Broadband Engine SPU) byla ukončena a bude odstraněna v příští hlavní verzi. Podpora architektur Armv2, Armv3, Armv5 a Armv5E byla ukončena. Podpora pro Intel MPX (Memory Protection Extensions) byla ukončena.

Zdroj: opennet.ru

Přidat komentář