GCC 12 kompiliatoriaus rinkinio išleidimas

Po metų kūrimo buvo išleistas nemokamas kompiliatorių rinkinys GCC 12.1, pirmasis reikšmingas naujojo GCC 12.x atšakos leidimas. Pagal naują leidimų numeravimo schemą, kūrimo procese buvo naudojama 12.0 versija, o prieš pat GCC 12.1 išleidimą jau buvo atsišakojusi GCC 13.0 šaka, kurios pagrindu bus išleista kita svarbi versija GCC 13.1. būti suformuotas. Gegužės 23 d. projektas švęs 35-ąsias pirmojo GCC leidimo sukūrimo metines.

Pagrindiniai pakeitimai:

  • Pridėtas CTF (Compact Type Format) derinimo formato palaikymas, kuriame kompaktiškai saugoma informacija apie C tipus, funkcijų ryšius ir derinimo simbolius. Įterpus į ELF objektus, formatas leidžia naudoti EFL simbolių lenteles, kad būtų išvengta duomenų dubliavimo.
  • „STABS“ derinimo informacijos saugojimo formato, sukurto devintajame dešimtmetyje, palaikymas buvo nebenaudojamas.
  • Toliau dirbama siekiant išplėsti būsimų C2X ir C++23 standartų palaikymą C ir C++ kalboms. Pavyzdžiui, pridėtas išraiškos „if consteval“ palaikymas; leidžiama naudoti automatinį funkcijos argumentuose („f(auto(g()))“); funkcijose, deklaruotose kaip constexpr, leidžiama naudoti nepažodinius kintamuosius, goto ir etiketes; papildomas daugiamačių indeksų operatorių operatorių palaikymas[]; in if, for ir switch, inicijavimo blokų galimybės buvo išplėstos („for (naudojant T = int; T e : v)“).
  • C++ standartinė biblioteka pagerino C++20 ir C++23 standartų eksperimentinių skyrių palaikymą. Pridėtas std::move_only_function, , std::basic_string::resize_and_overwrite, , ir std::invoke_r palaikymas. Constexpr funkcijose leidžiama naudoti std::unique_ptr, std::vector, std::basic_string, std::neprivaloma ir std::variant.
  • Fortran priekinė dalis visiškai palaiko TS 29113 specifikaciją, kuri apibūdina galimybes užtikrinti perkeliamumą tarp Fortran ir C kodų.
  • Pridėtas __builtin_shufflevector(vec1, vec2, index1, index2, ...) plėtinio, anksčiau pridėto prie Clang, palaikymas, kuris siūlo vieną iškvietimą atlikti įprastas vektorių maišymo ir maišymo operacijas.
  • Naudojant „-O2“ optimizavimo lygį, vektorizavimas įjungtas pagal numatytuosius nustatymus (įjungti režimai -ftree-vectorize ir -fvect-cost-model=very-cheap). Labai pigus modelis leidžia vektorizuoti tik tuo atveju, jei vektorinis kodas gali visiškai pakeisti vektorizuojamą skaliarinį kodą.
  • Pridėtas „-ftrivial-auto-var-init“ režimas, kad būtų galima aiškiai inicijuoti kintamuosius krūvoje, kad būtų galima sekti problemas ir blokuoti pažeidžiamumus, susijusius su neinicijuotų kintamųjų naudojimu.
  • C ir C++ kalboms buvo pridėta integruota funkcija __builtin_dynamic_object_size, kuri nustato objekto dydį, suderinama su panašia Clang funkcija.
  • C ir C++ kalboms pridėtas atributo „nepasiekiamas“ palaikymas (pavyzdžiui, galite pažymėti funkcijas, kurios sugeneruos klaidą, jei bandysite jas naudoti).
  • C ir C++ kalboms pridėtas išankstinio apdorojimo direktyvų „#elifdef“ ir „#elifndef“ palaikymas.
  • Pridėta vėliavėlė „-Wbidi-chars“, kad būtų rodomas įspėjimas, jei UTF-8 simboliai naudojami neteisingai, keičiant dvikrypčio teksto rodymo tvarką.
  • Pridėta vėliavėlė „-Warray-palyginti“, kad būtų rodomas įspėjimas, kai bandoma palyginti du operandus, kurie nurodo masyvus.
  • OpenMP 5.0 ir 5.1 (Open Multi-Processing) standartų, apibrėžiančių API ir lygiagrečio programavimo metodų taikymo kelių branduolių ir hibridinėse (CPU+GPU/DSP) sistemose su bendra atmintimi ir vektorizavimo blokais (SIMD) įdiegimas. , tęsėsi.
  • Pagerintas OpenACC 2.6 lygiagretaus programavimo specifikacijos, kuri apibrėžia GPU ir specializuotų procesorių, tokių kaip NVIDIA PTX, iškrovimo įrankius.
  • Išplėstinių instrukcijų palaikymas „Intel AVX86-FP512“ ir „_Float16“ tipas buvo pridėtas prie x16 architektūros kodo generavimo sistemos.
  • x86 architektūrai buvo pridėta apsauga nuo procesorių pažeidžiamumo, kurį sukelia spekuliatyvus komandų vykdymas po besąlyginių perėjimo į priekį operacijų. Problema kyla dėl prevencinio instrukcijų apdorojimo iškart po šakos instrukcijos atmintyje (SLS, Straight Line Speculation). Norint įjungti apsaugą, siūloma parinktis „-mharden-sls“.
  • Pridėtas nepainicijuotų kintamųjų naudojimo aptikimas prie eksperimentinio statinio analizatoriaus. Pridėtas pradinis palaikymas analizuojant surinkimo kodą įterptuose intarpuose. Patobulintas atminties sekimas. Perjungimo išraiškų apdorojimo kodas buvo perrašytas.
  • Pridėta 30 naujų iškvietimų į libgccjit, bendrinamą biblioteką, skirtą kodo generatoriui įterpti į kitus procesus ir naudoti jį JIT kompiliuoti baitinį kodą į mašinos kodą.
  • CO-RE (Compile Once - Run Everywhere) mechanizmo palaikymas buvo pridėtas prie BPF baito kodo generavimo mechanizmo, kuris leidžia tik vieną kartą kompiliuoti eBPF programų kodą Linux branduoliui ir naudoti specialų universalų įkroviklį, kuris pritaiko įkelta programa į dabartinį branduolį ir BPF tipų formatą). CO-RE išsprendžia sukompiliuotų eBPF programų, kurios anksčiau galėjo būti naudojamos tik toje branduolio versijoje, kuriai jos buvo sudarytos, perkeliamumo problemą, nes elementų padėtis duomenų struktūrose keičiasi priklausomai nuo versijos.
  • RISC-V užpakalinė programa prideda palaikymą naujiems instrukcijų rinkinio architektūros plėtiniams zba, zbb, zbc ir zbs, taip pat ISA plėtiniams vektorinėms ir skaliarinėms kriptografinėms operacijoms. Pagal numatytuosius nustatymus palaikoma specifikacija RISC-V ISA 20191213. Vėliava -mtune=thead-c906 buvo pridėta, kad būtų galima optimizuoti T-HEAD c906 branduolius.
  • __int128_t/integer(kind=16) tipo palaikymas buvo pridėtas prie kodo generavimo sistemos, skirtos AMD GPU, pagrįstos GCN mikroarchitektūra. Viename skaičiavimo bloke (CU) galima naudoti iki 40 darbo grupių ir iki 16 instrukcijų frontų (bangos frontas, gijų rinkinys, kurį lygiagrečiai vykdo SIMD variklis). Anksčiau vienai CU buvo leidžiama naudoti tik vieną komandos briauną.
  • NVPTX užpakalinė programa, sukurta generuoti kodą naudojant NVIDIA PTX (Parallel Thread Execution) instrukcijų rinkinio architektūrą, pridėjo galimybę naudoti „-march“, „-mptx“ ir „-march-map“ vėliavėles. Įdiegtas PTX ISA sm_53, sm_70, sm_75 ir sm_80 palaikymas. Numatytoji architektūra yra sm_30.
  • „PowerPC“ / „PowerPC64“ / „RS6000“ procesorių užpakalinėje programoje įtaisytųjų funkcijų diegimai buvo perrašyti. Integruotos funkcijos __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_texasru, __builtin_set_set_ed_fhart
  • Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) ir Arm Cortex-X710 (cortex-x2) palaikymas. Pridėtas palaikymas naujoms ARMv2 architektūros parinktims, skirtoms naudoti su "-march" parinktimi: armv8-a, armv8.7-a, armv8.8-a. Pridėtas C funkcijų įgyvendinimas, integruotas į kompiliatorių (Intrinsics), skirtas atominiam duomenų įkėlimui ir išsaugojimui į atmintį, remiantis išplėstinių ARM instrukcijų naudojimu (ls9). Pridėtas palaikymas pagreitinant memcpy, memmove ir memset funkcijas naudojant mopsoption ARM plėtinį.
  • Pridėtas naujas tikrinimo režimas „-fsanitize=shadow-call-stack“ („ShadowCallStack“), kuris šiuo metu pasiekiamas tik AArch64 architektūrai ir veikia, kai kuriamas kodas su parinktimi „-fixed-r18“. Režimas suteikia apsaugą nuo funkcijos grąžinimo adreso perrašymo, jei krūvoje perpildomas buferis. Apsaugos esmė – grąžinimo adreso išsaugojimas atskirame „šešėliniame“ krūvelėje, perdavus valdymą funkcijai ir gavus šį adresą prieš išeinant iš funkcijos.

Šaltinis: opennet.ru

Добавить комментарий