Izdaja zbirke prevajalnikov GCC 12

Po enem letu razvoja je bil izdan brezplačen prevajalnik GCC 12.1, prva pomembna izdaja v novi veji GCC 12.x. V skladu z novo shemo številčenja izdaj je bila v razvojnem procesu uporabljena različica 12.0, malo pred izidom GCC 12.1 pa se je že odcepila veja GCC 13.0, na podlagi katere bi nastala naslednja večja izdaja GCC 13.1. se oblikovati. 23. maja bo projekt praznoval 35 let od nastanka prve edicije GCC.

Večje spremembe:

  • Dodana podpora za format za odpravljanje napak CTF (Compact Type Format), ki zagotavlja kompaktno shranjevanje informacij o tipih C, povezavah med funkcijami in simbolih za odpravljanje napak. Ko je format vdelan v objekte ELF, omogoča uporabo tabel znakov EFL, da se prepreči podvajanje podatkov.
  • Podpora za format shranjevanja informacij za odpravljanje napak "STABS", ustvarjen v osemdesetih letih prejšnjega stoletja, je opuščena.
  • Nadaljuje se delo za razširitev podpore za prihodnje standarde C2X in C++23 za jezika C in C++. Dodana je bila na primer podpora za izraz »if consteval«; dovoljena uporaba samodejnega v argumentih funkcije (»f(auto(g()))«); uporaba neliteralnih spremenljivk, goto in oznak je dovoljena v funkcijah, deklariranih kot constexpr; dodana podpora za operatorje večdimenzionalnih indeksov operator[]; v if, for in switch so bile zmožnosti inicializacijskih blokov razširjene (»za (z uporabo T = int; T e : v)«).
  • Standardna knjižnica C++ ima izboljšano podporo za poskusne dele standardov C++20 in C++23. Dodana podpora za std::move_only_function, , std::basic_string::resize_and_overwrite, , in std::invoke_r. Dovoljena uporaba std::unique_ptr, std::vector, std::basic_string, std::optional in std::variant v funkcijah constexpr.
  • Frontend Fortran zagotavlja popolno podporo za specifikacijo TS 29113, ki opisuje zmožnosti za zagotavljanje prenosljivosti med Fortran in C kodo.
  • Dodana podpora za razširitev __builtin_shufflevector(vec1, vec2, index1, index2, ...), ki je bila prej dodana v Clang, ki ponuja en klic za izvajanje običajnih vektorskih shuffle in shuffle operacij.
  • Pri uporabi ravni optimizacije "-O2" je vektorizacija privzeto omogočena (načina -ftree-vectorize in -fvect-cost-model=very-cheap sta omogočena). Zelo poceni model omogoča vektorizacijo le, če lahko vektorska koda popolnoma nadomesti skalarno kodo, ki jo vektoriziramo.
  • Dodan je način "-ftrivial-auto-var-init", ki omogoča eksplicitno inicializacijo spremenljivk v skladu za sledenje težavam in blokiranje ranljivosti, povezanih z uporabo neinicializiranih spremenljivk.
  • Za jezika C in C++ je bila dodana vgrajena funkcija __builtin_dynamic_object_size za določanje velikosti predmeta, ki je združljiva s podobno funkcijo iz Clang.
  • Za jezika C in C++ je bila dodana podpora za atribut »nerazpoložljiv« (lahko na primer označite funkcije, ki bodo ustvarile napako, če jih poskusite uporabiti).
  • Za jezike C in C++ je bila dodana podpora za direktive o predprocesiranju »#elifdef« in »#elifndef«.
  • Dodana zastavica »-Wbidi-chars« za prikaz opozorila, če so znaki UTF-8 uporabljeni nepravilno, s čimer se spremeni vrstni red, v katerem je prikazano dvosmerno besedilo.
  • Dodana je zastavica »-Warray-compare« za prikaz opozorila pri poskusu primerjave dveh operandov, ki se nanašata na polja.
  • Implementacija standardov OpenMP 5.0 in 5.1 (Open Multi-Processing), ki definirata API in metode za uporabo metod vzporednega programiranja na večjedrnih in hibridnih (CPU+GPU/DSP) sistemih s skupnim pomnilnikom in vektorizacijskimi enotami (SIMD) , se je nadaljevalo.
  • Izboljšana izvedba specifikacije vzporednega programiranja OpenACC 2.6, ki definira orodja za operacije razbremenitve na grafičnih procesorjih in specializiranih procesorjih, kot je NVIDIA PTX.
  • Podpora za razširjena navodila Intel AVX86-FP512 in tip _Float16 je bila dodana zaledju za generiranje kode za arhitekturo x16.
  • Za arhitekturo x86 je bila dodana zaščita pred ranljivostmi v procesorjih, ki jih povzroči špekulativno izvajanje navodil po operacijah brezpogojnega skoka naprej. Težava se pojavi zaradi vnaprejšnje obdelave navodil, ki takoj sledijo navodilu razvejanja v pomnilniku (SLS, Straight Line Speculation). Za omogočanje zaščite je predlagana možnost »-mharden-sls«.
  • Eksperimentalnemu statičnemu analizatorju dodano zaznavanje uporabe neinicializiranih spremenljivk. Dodana začetna podpora za analizo kode sestavljanja v vstavkih v vrstici. Izboljšano sledenje spominu. Koda za obdelavo stikalnih izrazov je bila prepisana.
  • Dodanih je 30 novih klicev v libgccjit, knjižnico v skupni rabi za vdelavo generatorja kode v druge procese in njegovo uporabo za JIT prevajanje bajtne kode v strojno kodo.
  • Zaledju za generiranje bajtne kode BPF je bila dodana podpora za mehanizem CO-RE (Compile Once - Run Everywhere), ki vam omogoča, da kodo programov eBPF za jedro Linux prevedete le enkrat in uporabite poseben univerzalni nalagalnik, ki prilagodi naložen program v trenutno jedro in format vrst BPF). CO-RE rešuje problem prenosljivosti prevedenih programov eBPF, ki so se prej lahko uporabljali samo v različici jedra, za katero so bili prevedeni, saj se položaj elementov v podatkovnih strukturah od različice do različice spreminja.
  • Zaledje RISC-V dodaja podporo za nove razširitve arhitekture nabora ukazov zba, zbb, zbc in zbs ter razširitve ISA za vektorske in skalarne kriptografske operacije. Privzeto je na voljo podpora za specifikacijo RISC-V ISA 20191213. Dodana je bila zastavica -mtune=thead-c906, ki omogoča optimizacije za jedra T-HEAD c906.
  • Podpora za vrsto __int128_t/integer(kind=16) je bila dodana v zaledje za generiranje kode za grafične procesorje AMD, ki temeljijo na mikroarhitekturi GCN. Možno je uporabiti do 40 delovnih skupin na računalniško enoto (CU) in do 16 front ukazov (wavefront, nabor niti, ki jih vzporedno izvaja SIMD Engine) na skupino. Prej je bil dovoljen samo en ukazni rob na CU.
  • Zaledje NVPTX, zasnovano za ustvarjanje kode z uporabo arhitekture nabora ukazov NVIDIA PTX (Parallel Thread Execution), je dodalo možnost uporabe zastavic »-march«, »-mptx« in »-march-map«. Implementirana podpora za PTX ISA sm_53, sm_70, sm_75 in sm_80. Privzeta arhitektura je sm_30.
  • V ozadju za procesorje PowerPC / PowerPC64 / RS6000 so bile implementacije vgrajenih funkcij prepisane. Dokumentirane so vgrajene funkcije __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar in __builtin_set_tfiar.
  • Podpora za Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) in Arm Cortex-X710 (cortex-x2). Dodana podpora za nove možnosti arhitekture ARMv2 za uporabo z možnostjo "-march": armv8-a, armv8.7-a, armv8.8-a. Dodana implementacija funkcij C, vgrajenih v prevajalnik (Intrinsics) za atomsko nalaganje in shranjevanje podatkov v pomnilnik, ki temelji na uporabi razširjenih navodil ARM (ls9). Dodana podpora za pospeševanje funkcij memcpy, memmove in memset z uporabo razširitve mopsoption ARM.
  • Dodan nov način preverjanja »-fsanitize=shadow-call-stack« (ShadowCallStack), ki je trenutno na voljo samo za arhitekturo AArch64 in deluje pri gradnji kode z možnostjo »-ffixed-r18«. Način zagotavlja zaščito pred prepisovanjem povratnega naslova iz funkcije v primeru prepolnitve medpomnilnika v skladu. Bistvo zaščite je shraniti povratni naslov v ločenem "senčnem" skladu po prenosu nadzora na funkcijo in pridobiti ta naslov pred izhodom iz funkcije.

Vir: opennet.ru

Dodaj komentar