Vydanie sady kompilátorov GCC 12

Po roku vývoja bola vydaná bezplatná sada kompilátorov GCC 12.1, prvé významné vydanie v novej vetve GCC 12.x. V súlade s novou schémou číslovania verzií bola vo vývoji použitá verzia 12.0 a krátko pred vydaním GCC 12.1 sa vetva GCC 13.0 už rozvetvila, na základe ktorej by sa malo rozvetviť ďalšie hlavné vydanie, GCC 13.1. byť formovaný. Projekt oslávi 23. mája 35 rokov od vzniku prvého vydania GCC.

Hlavné zmeny:

  • Pridaná podpora pre formát ladenia CTF (Compact Type Format), ktorý poskytuje kompaktné ukladanie informácií o typoch C, prepojeniach medzi funkciami a symboloch ladenia. Keď je formát vložený do objektov ELF, umožňuje použitie tabuliek znakov EFL, aby sa zabránilo duplicite údajov.
  • Podpora formátu ukladania informácií o ladení „STABS“, ktorý bol vytvorený v 1980. rokoch minulého storočia, bola zastaraná.
  • Pokračuje práca na rozširovaní podpory pre budúce štandardy C2X a C++23 pre jazyky C a C++. Napríklad bola pridaná podpora pre výraz „if consteval“; povolené používať auto v argumentoch funkcie („f(auto(g()))“); používanie premenných, ktoré nie sú doslovné, goto a návestia je povolené vo funkciách deklarovaných ako constexpr; pridaná podpora operátorov multidimenzionálnych indexových operátorov[]; v if, for a switch boli rozšírené možnosti inicializačných blokov („for (pomocou T = int; T e : v)“).
  • Štandardná knižnica C++ zlepšila podporu pre experimentálne časti štandardov C++20 a C++23. Pridaná podpora pre funkciu std::move_only_function, , std::basic_string::zmena_veľkosti_a_prepísanie, , a std::invoke_r. Vo funkciách constexpr je povolené používať std::unique_ptr, std::vector, std::basic_string, std::voliteľné a std::variant.
  • Frontend Fortran poskytuje plnú podporu pre špecifikáciu TS 29113, ktorá popisuje možnosti na zabezpečenie prenosnosti medzi Fortran a C kódom.
  • Pridaná podpora pre rozšírenie __builtin_shufflevector(vec1, vec2, index1, index2, ...), ktoré bolo predtým pridané do Clang, ktoré ponúka jediné volanie na vykonávanie bežných operácií vektorového miešania a miešania.
  • Pri použití úrovne optimalizácie "-O2" je vektorizácia štandardne povolená (režimy -ftree-vectorize a -fvect-cost-model=veľmi lacné sú povolené). Veľmi lacný model umožňuje vektorizáciu iba vtedy, ak vektorový kód dokáže úplne nahradiť vektorizovaný skalárny kód.
  • Pridaný režim „-ftrivial-auto-var-init“, ktorý umožňuje explicitnú inicializáciu premenných v zásobníku na sledovanie problémov a blokovanie zraniteľností spojených s používaním neinicializovaných premenných.
  • Pre jazyky C a C++ bola pridaná vstavaná funkcia __builtin_dynamic_object_size na určenie veľkosti objektu, kompatibilná s podobnou funkciou z Clang.
  • Pre jazyky C a C++ bola pridaná podpora pre atribút “unavailable” (napríklad môžete označiť funkcie, ktoré pri pokuse o ich použitie vygenerujú chybu).
  • Pre jazyky C a C++ bola pridaná podpora pre direktívy predbežného spracovania “#elifdef” a “#elifndef”.
  • Pridaný príznak "-Wbidi-chars" na zobrazenie varovania, ak sú znaky UTF-8 použité nesprávne, čím sa mení poradie, v ktorom sa zobrazuje obojsmerný text.
  • Pridaný príznak "-Warray-compare" na zobrazenie varovania pri pokuse o porovnanie dvoch operandov, ktoré odkazujú na polia.
  • Implementácia štandardov OpenMP 5.0 a 5.1 (Open Multi-Processing), ktoré definujú 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) , pokračoval.
  • Vylepšená implementácia špecifikácie paralelného programovania OpenACC 2.6, ktorá definuje nástroje na znižovanie záťaže na GPU a špecializovaných procesoroch, ako je NVIDIA PTX.
  • Do backendu generovania kódu pre architektúru x86 bola pridaná podpora rozšírených inštrukcií Intel AVX512-FP16 a typu _Float16.
  • Pre architektúru x86 bola pridaná ochrana proti zraniteľnostiam v procesoroch spôsobených špekulatívnym vykonávaním inštrukcií po operáciách bezpodmienečného skoku vpred. Problém nastáva z dôvodu preventívneho spracovania inštrukcií bezprostredne nasledujúcich za inštrukciou vetvenia v pamäti (SLS, Straight Line Speculation). Na aktiváciu ochrany sa navrhuje možnosť „-mharden-sls“.
  • Do experimentálneho statického analyzátora bola pridaná detekcia použitia neinicializovaných premenných. Pridaná počiatočná podpora pre analýzu kódu zostavy v inline vložkách. Vylepšené sledovanie pamäte. Kód na spracovanie výrazov prepínača bol prepísaný.
  • Pridaných 30 nových volaní do libgccjit, zdieľanej knižnice na vloženie generátora kódu do iných procesov a jeho použitie na kompiláciu bajtového kódu JIT do strojového kódu.
  • Do backendu na generovanie bajtkódu BPF bola pridaná podpora mechanizmu CO-RE (Compile Once - Run Everywhere), ktorý umožňuje skompilovať kód programov eBPF pre linuxové jadro iba raz a použiť špeciálny univerzálny zavádzač, ktorý prispôsobí načítaný program na aktuálne jadro a formát typov BPF). CO-RE rieši problém prenosnosti skompilovaných programov eBPF, ktoré sa predtým dali použiť len vo verzii jadra, pre ktoré boli skompilované, keďže pozícia prvkov v dátových štruktúrach sa z verzie na verziu mení.
  • Backend RISC-V pridáva podporu pre nové rozšírenia architektúry inštrukčnej sady zba, zbb, zbc a zbs, ako aj rozšírenia ISA pre vektorové a skalárne kryptografické operácie. Štandardne je poskytovaná podpora pre špecifikáciu RISC-V ISA 20191213. Bol pridaný príznak -mtune=thead-c906, ktorý umožňuje optimalizáciu pre jadrá T-HEAD c906.
  • Podpora pre typ __int128_t/integer(kind=16) bola pridaná do backendu generovania kódu pre GPU AMD založené na mikroarchitektúre GCN. Je možné použiť až 40 pracovných skupín na výpočtovú jednotku (CU) a až 16 frontov inštrukcií (wavefront, sada vlákien vykonávaných paralelne SIMD Engine) na skupinu. Predtým bola povolená iba jedna hrana inštrukcie na CU.
  • Backend NVPTX, navrhnutý na generovanie kódu pomocou architektúry inštrukčnej sady NVIDIA PTX (Parallel Thread Execution), pridal možnosť používať príznaky „-march“, „-mptx“ a „-march-map“. Implementovaná podpora pre PTX ISA sm_53, sm_70, sm_75 a sm_80. Predvolená architektúra je sm_30.
  • V backende pre procesory PowerPC / PowerPC64 / RS6000 boli prepísané implementácie vstavaných funkcií. Vstavané funkcie __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __tfihartin_set_set_tbuiltin a_set_set_tbuiltin_set
  • Podpora pre Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) a Arm Cortex-X710 (cortex-x2). Pridaná podpora pre nové možnosti architektúry ARMv2 na použitie s možnosťou „-march“: armv8-a, armv8.7-a, armv8.8-a. Pridaná implementácia funkcií jazyka C zabudovaných do kompilátora (Intrinsics) pre atómové načítanie a ukladanie dát do pamäte, na základe použitia rozšírených inštrukcií ARM (ls9). Pridaná podpora pre zrýchlenie funkcií memcpy, memmove a memset pomocou rozšírenia mopsoption ARM.
  • Pridaný nový režim kontroly „-fsanitize=shadow-call-stack“ (ShadowCallStack), ktorý je momentálne dostupný len pre architektúru AArch64 a funguje pri vytváraní kódu s možnosťou „-ffixed-r18“. Režim poskytuje ochranu proti prepísaniu návratovej adresy z funkcie v prípade pretečenia vyrovnávacej pamäte na zásobníku. Podstatou ochrany je uloženie návratovej adresy do samostatného „tieňového“ zásobníka po prenose riadenia na funkciu a načítaní tejto adresy pred ukončením funkcie.

Zdroj: opennet.ru

Pridať komentár