Vydání sady kompilátorů GCC 12

Po roce vývoje byla vydána bezplatná sada kompilátorů GCC 12.1, první významné vydání v nové větvi GCC 12.x. V souladu s novým schématem číslování verzí byla ve vývojovém procesu použita verze 12.0 a krátce před vydáním GCC 12.1 se již větev GCC 13.0 rozvětvila, na základě čehož by měla vzniknout další hlavní verze GCC 13.1. být tvořen. Projekt oslaví 23. května 35 let od vzniku prvního vydání GCC.

Hlavní změny:

  • Přidána podpora pro formát ladění CTF (Compact Type Format), který poskytuje kompaktní ukládání informací o typech C, spojení mezi funkcemi a symboly ladění. Při vložení do objektů ELF umožňuje formát použití tabulek znaků EFL, aby se zabránilo duplikaci dat.
  • Podpora formátu úložiště informací pro ladění „STABS“, vytvořeného v 1980. letech, byla ukončena.
  • Pokračuje práce na rozšíření podpory budoucích standardů C2X a C++23 pro jazyky C a C++. Například byla přidána podpora pro výraz „if consteval“; povoleno používat auto v argumentech funkce („f(auto(g()))“); použití neliterárních proměnných, goto a návěští je povoleno ve funkcích deklarovaných jako constexpr; přidána podpora pro operátory vícerozměrných indexů operátor[]; v if, for a switch byly rozšířeny možnosti inicializačních bloků („for (pomocí T = int; T e : v)“).
  • Standardní knihovna C++ zlepšila podporu pro experimentální části standardů C++20 a C++23. Přidána podpora funkcí std::move_only_function, , std::basic_string::resize_and_overwrite, , a std::invoke_r. Povoleno používat std::unique_ptr, std::vector, std::basic_string, std::volitelné a std::variant ve funkcích constexpr.
  • Frontend Fortran poskytuje plnou podporu pro specifikaci TS 29113, která popisuje možnosti pro zajištění přenositelnosti mezi Fortran a C kódem.
  • Přidána podpora pro rozšíření __builtin_shufflevector(vec1, vec2, index1, index2, ...), dříve přidané do Clang, které nabízí jediné volání pro provádění běžných operací vektorového míchání a míchání.
  • Při použití úrovně optimalizace "-O2" je vektorizace standardně povolena (režimy -ftree-vectorize a -fvect-cost-model=velmi levné jsou povoleny). Velmi levný model umožňuje vektorizaci pouze v případě, že vektorový kód může zcela nahradit vektorizovaný skalární kód.
  • Přidán režim „-ftrivial-auto-var-init“, který umožňuje explicitní inicializaci proměnných v zásobníku pro sledování problémů a blokování zranitelností spojených s používáním neinicializovaných proměnných.
  • Pro jazyky C a C++ byla přidána vestavěná funkce __builtin_dynamic_object_size pro určení velikosti objektu, kompatibilní s podobnou funkcí z Clang.
  • Pro jazyky C a C++ byla přidána podpora pro atribut „unavailable“ (například můžete označit funkce, které při pokusu o jejich použití vygenerují chybu).
  • Pro jazyky C a C++ byla přidána podpora direktiv předběžného zpracování „#elifdef“ a „#elifndef“.
  • Přidán příznak "-Wbidi-chars" pro zobrazení varování, pokud jsou znaky UTF-8 použity nesprávně, čímž se mění pořadí, ve kterém se zobrazuje obousměrný text.
  • Přidán příznak "-Warray-compare" pro zobrazení varování při pokusu o porovnání dvou operandů, které odkazují na pole.
  • Implementace standardů OpenMP 5.0 a 5.1 (Open Multi-Processing), které definují 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.
  • Vylepšená implementace specifikace paralelního programování OpenACC 2.6, která definuje nástroje pro odlehčení operací na GPU a specializovaných procesorech, jako je NVIDIA PTX.
  • Do backendu pro generování kódu pro architekturu x86 byla přidána podpora rozšířených instrukcí Intel AVX512-FP16 a typu _Float16.
  • Pro architekturu x86 byla přidána ochrana proti zranitelnostem procesorů způsobeným spekulativním prováděním instrukcí po operacích nepodmíněných skoků vpřed. Problém nastává z důvodu preemptivního zpracování instrukcí bezprostředně následujících po instrukci větve v paměti (SLS, Straight Line Speculation). Pro aktivaci ochrany je navržena možnost „-mharden-sls“.
  • Do experimentálního statického analyzátoru přidána detekce použití neinicializovaných proměnných. Přidána počáteční podpora pro analýzu kódu sestavení v inline insertech. Vylepšené sledování paměti. Kód pro zpracování výrazů přepínače byl přepsán.
  • Přidáno 30 nových volání do libgccjit, sdílené knihovny pro vložení generátoru kódu do jiných procesů a jeho použití k JIT kompilaci bajtkódu do strojového kódu.
  • Do backendu pro generování BPF bytecode byla přidána podpora mechanismu CO-RE (Compile Once - Run Everywhere), který umožňuje zkompilovat kód programů eBPF pro linuxové jádro pouze jednou a použít speciální univerzální zavaděč, který přizpůsobí načtený program do aktuálního jádra a formátu BPF Types). CO-RE řeší problém přenositelnosti kompilovaných programů eBPF, které dříve mohly být použity pouze ve verzi jádra, pro které byly zkompilovány, protože pozice prvků v datových strukturách se verze od verze mění.
  • Backend RISC-V přidává podporu pro nová rozšíření architektury instrukční sady zba, zbb, zbc a zbs, stejně jako rozšíření ISA pro vektorové a skalární kryptografické operace. Standardně je poskytována podpora pro specifikaci RISC-V ISA 20191213. Byl přidán příznak -mtune=thead-c906, který umožňuje optimalizace pro jádra T-HEAD c906.
  • Podpora pro typ __int128_t/integer(kind=16) byla přidána do backendu pro generování kódu pro GPU AMD založené na mikroarchitektuře GCN. Je možné použít až 40 pracovních skupin na výpočetní jednotku (CU) a až 16 front instrukcí (wavefront, sada vláken paralelně vykonávaných SIMD Engine) na skupinu. Dříve byla povolena pouze jedna hrana instrukce na CU.
  • Backend NVPTX, navržený pro generování kódu pomocí architektury instrukční sady NVIDIA PTX (Parallel Thread Execution), přidal možnost používat příznaky „-march“, „-mptx“ a „-march-map“. Implementována podpora pro PTX ISA sm_53, sm_70, sm_75 a sm_80. Výchozí architektura je sm_30.
  • V backendu pro procesory PowerPC / PowerPC64 / RS6000 byly přepsány implementace vestavěných funkcí. Vestavěné funkce __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __tfihartin_set_tbuiltin a_set_tbuiltin_set
  • Podpora pro Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) a Arm Cortex-X710 (cortex-x2). Přidána podpora pro nové možnosti architektury ARMv2 pro použití s ​​volbou „-march“: armv8-a, armv8.7-a, armv8.8-a. Přidána implementace funkcí C vestavěných do kompilátoru (Intrinsics) pro atomické načítání a ukládání dat do paměti na základě použití rozšířených instrukcí ARM (ls9). Přidána podpora pro zrychlení funkcí memcpy, memmove a memset pomocí rozšíření mopsoption ARM.
  • Přidán nový režim kontroly „-fsanitize=shadow-call-stack“ (ShadowCallStack), který je aktuálně dostupný pouze pro architekturu AArch64 a funguje při sestavování kódu s volbou „-ffixed-r18“. Režim poskytuje ochranu proti přepsání návratové adresy z funkce v případě přetečení vyrovnávací paměti na zásobníku. Podstatou ochrany je uložení návratové adresy do samostatného „stínového“ zásobníku po přenesení řízení na funkci a získání této adresy před ukončením funkce.

Zdroj: opennet.ru

Přidat komentář