Izdanje GCC 12 kompajlerskog paketa

Nakon godinu dana razvoja, pušten je besplatni paket kompajlera GCC 12.1, prvo značajno izdanje u novoj grani GCC 12.x. U skladu s novom šemom numeriranja izdanja, u procesu razvoja korištena je verzija 12.0, a neposredno prije izdanja GCC 12.1, grana GCC 13.0 se već razgranala, na osnovu čega će sljedeće veliko izdanje, GCC 13.1, biti biti formiran. Projekat će 23. maja proslaviti 35 godina od formiranja prvog izdanja GCC-a.

Glavne promjene:

  • Dodata podrška za CTF (Compact Type Format) format za otklanjanje grešaka, koji obezbeđuje kompaktno skladištenje informacija o C tipovima, vezama između funkcija i simbolima za otklanjanje grešaka. Kada je ugrađen u ELF objekte, format dozvoljava korištenje EFL tablica znakova kako bi se izbjeglo dupliciranje podataka.
  • Podrška za format skladištenja informacija za otklanjanje grešaka "STABS", kreiran 1980-ih, je zastarjela.
  • Nastavlja se rad na proširenju podrške za buduće C2X i C++23 standarde za C i C++ jezike. Na primjer, dodana je podrška za izraz “if consteval”; dozvoljeno korištenje auto u argumentima funkcije (“f(auto(g()))”); upotreba neliteralnih varijabli, goto i oznaka je dozvoljena u funkcijama deklariranim kao constexpr; dodata podrška za višedimenzionalne operatore indeksa operator[]; u if, for i switch, mogućnosti inicijalizacijskih blokova su proširene (“za (koristeći T = int; T e : v)”).
  • Standardna biblioteka C++ je poboljšala podršku za eksperimentalne dijelove C++20 i C++23 standarda. Dodata podrška za std::move_only_function, , std::basic_string::resize_and_overwrite, , i std::invoke_r. Dozvoljeno korištenje std::unique_ptr, std::vector, std::basic_string, std::optional i std::varijanta u funkcijama constexpr.
  • Fortran frontend pruža punu podršku za TS 29113 specifikaciju, koja opisuje mogućnosti za osiguravanje prenosivosti između Fortrana i C koda.
  • Dodata podrška za ekstenziju __builtin_shufflevector(vec1, vec2, index1, index2, ...) prethodno dodanu u Clang, koja nudi jedan poziv za izvođenje uobičajenih vektorskih operacija nasumice i nasumice.
  • Kada se koristi nivo optimizacije "-O2", vektorizacija je podrazumevano omogućena (omogućeni su režimi -ftree-vectorize i -fvect-cost-model=vrlo jeftini). Vrlo jeftin model dozvoljava vektorizaciju samo ako vektorski kod može u potpunosti zamijeniti skalarni kod koji se vektorizira.
  • Dodan način rada "-ftrivial-auto-var-init" kako bi se omogućila eksplicitna inicijalizacija varijabli na steku radi praćenja problema i blokiranja ranjivosti povezanih s upotrebom neinicijaliziranih varijabli.
  • Za jezike C i C++ dodana je ugrađena funkcija __builtin_dynamic_object_size za određivanje veličine objekta, kompatibilna sa sličnom funkcijom iz Clanga.
  • Za jezike C i C++ dodana je podrška za atribut „nedostupan“ (na primjer, možete označiti funkcije koje će generirati grešku ako ih pokušate koristiti).
  • Za C i C++ jezike, dodata je podrška za direktive preprocesiranja “#elifdef” i “#elifndef”.
  • Dodata "-Wbidi-chars" zastavica za prikaz upozorenja ako se UTF-8 znakovi koriste pogrešno, mijenjajući redoslijed u kojem se prikazuje dvosmjerni tekst.
  • Dodata "-Warray-compare" zastavica za prikaz upozorenja kada pokušavate da uporedite dva operanda koji se odnose na nizove.
  • Implementacija OpenMP 5.0 i 5.1 (Open Multi-Processing) standarda, koji definišu API i metode za primenu metoda paralelnog programiranja na višejezgarnim i hibridnim (CPU+GPU/DSP) sistemima sa zajedničkom memorijom i jedinicama vektorizacije (SIMD) , nastavilo se.
  • Poboljšana implementacija OpenACC 2.6 specifikacije paralelnog programiranja, koja definiše alate za oslobađanje operacija na GPU-ovima i specijalizovanim procesorima kao što je NVIDIA PTX.
  • Podrška za proširene instrukcije Intel AVX86-FP512 i tip _Float16 dodata je u pozadinu generisanja koda za arhitekturu x16.
  • Za arhitekturu x86, dodata je zaštita od ranjivosti u procesorima uzrokovanih spekulativnim izvršavanjem instrukcija nakon bezuslovnih operacija skoka naprijed. Problem se javlja zbog preventivne obrade instrukcija neposredno nakon instrukcije grananja u memoriji (SLS, Straight Line Speculation). Da bi se omogućila zaštita, predlaže se opcija “-mharden-sls”.
  • Dodata detekcija upotrebe neinicijaliziranih varijabli eksperimentalnom statičkom analizatoru. Dodata početna podrška za analizu asemblerskog koda u inline umetcima. Poboljšano praćenje memorije. Kod za obradu switch izraza je ponovo napisan.
  • Dodato 30 novih poziva libgccjit, zajedničkoj biblioteci za ugrađivanje generatora koda u druge procese i korištenje za JIT kompajliranje bajt koda u mašinski kod.
  • Podrška za mehanizam CO-RE (Compile Once - Run Everywhere) je dodata u pozadinu za generiranje BPF bajt koda, koji vam omogućava da kompajlirate kod eBPF programa za Linux kernel samo jednom i koristite poseban univerzalni loader koji prilagođava učitan program u trenutni kernel i format BPF tipova). CO-RE rješava problem prenosivosti kompajliranih eBPF programa, koji su se ranije mogli koristiti samo u verziji kernela za koju su kompajlirani, budući da se pozicija elemenata u strukturama podataka mijenja od verzije do verzije.
  • RISC-V backend dodaje podršku za nove ekstenzije arhitekture skupa instrukcija zba, zbb, zbc i zbs, kao i ISA ekstenzije za vektorske i skalarne kriptografske operacije. Podrazumevano je obezbeđena podrška za specifikaciju RISC-V ISA 20191213. Oznaka -mtune=thead-c906 je dodata da omogući optimizacije za T-HEAD c906 jezgre.
  • Podrška za tip __int128_t/integer(kind=16) je dodana u pozadinu generisanja koda za AMD GPU-ove zasnovane na GCN mikroarhitekturi. Moguće je koristiti do 40 radnih grupa po računarskoj jedinici (CU) i do 16 frontova instrukcija (talasni front, skup niti koje paralelno izvršava SIMD Engine) po grupi. Ranije je bila dozvoljena samo jedna ivica instrukcije po CU.
  • NVPTX backend, dizajniran za generiranje koda korištenjem arhitekture skupa instrukcija NVIDIA PTX (Parallel Thread Execution), dodao je mogućnost korištenja oznaka “-march”, “-mptx” i “-march-map”. Implementirana podrška za PTX ISA sm_53, sm_70, sm_75 i sm_80. Zadana arhitektura je sm_30.
  • U pozadini za PowerPC / PowerPC64 / RS6000 procesore, implementacije ugrađenih funkcija su prepisane. Ugrađene funkcije __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_t_t_t_.
  • Podrška za Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) i Arm Cortex-X710 (cortex-x2). Dodata podrška za nove opcije ARMv2 arhitekture za upotrebu sa opcijom "-march": armv8-a, armv8.7-a, armv8.8-a. Dodata implementacija C funkcija ugrađenih u kompajler (Intrinsics) za atomsko učitavanje i spremanje podataka u memoriju, na osnovu upotrebe proširenih ARM instrukcija (ls9). Dodata podrška za ubrzanje funkcija memcpy, memmove i memset pomoću mopsoption ARM ekstenzije.
  • Dodan je novi način provjere “-fsanitize=shadow-call-stack” (ShadowCallStack), koji je trenutno dostupan samo za AArch64 arhitekturu i radi kada se gradi kod s opcijom “-ffixed-r18”. Režim pruža zaštitu od prepisivanja povratne adrese iz funkcije u slučaju prekoračenja bafera na steku. Suština zaštite je da se povratna adresa sačuva u zasebnom steku „senka“ nakon prenosa kontrole na funkciju i preuzimanja ove adrese pre izlaska iz funkcije.

izvor: opennet.ru

Dodajte komentar