Liberigo de la GCC 12 kompililo

Post jaro da evoluo, la senpaga kompililo GCC 12.1 estis publikigita, la unua signifa eldono en la nova GCC 12.x branĉo. Konforme al la nova eldonaĵa numera skemo, versio 12.0 estis uzata en la evoluprocezo, kaj baldaŭ antaŭ la eldono de GCC 12.1, la branĉo GCC 13.0 jam disbranĉiĝis, surbaze de kiu la sekva grava eldono, GCC 13.1, estus. esti formita. La 23-an de majo, la projekto festos 35 jarojn ekde la formado de la unua eldono de GCC.

Ĉefaj ŝanĝoj:

  • Aldonita subteno por la sencimiga formato CTF (Compact Type Format), kiu disponigas kompaktan stokadon de informoj pri C-tipoj, ligojn inter funkcioj kaj sencimigaj simboloj. Se enkonstruite en ELF-objektoj, la formato permesas la uzon de EFL-karaktertabeloj por eviti datenmultobligon.
  • Subteno por la "STABS" sencimiga informstoka formato, kreita en la 1980-aj jaroj, estis malrekomendita.
  • Laboro daŭre vastigas subtenon por estontaj C2X kaj C++23-normoj por la C kaj C++-lingvoj. Ekzemple, subteno por la "se consteval" esprimo estis aldonita; permesite uzi aŭton en funkcio-argumentoj (“f(auto(g()))”); la uzo de ne-laŭvortaj variabloj, goto kaj etikedoj estas permesita en funkcioj deklaritaj kiel constexpr; aldonita subteno por plurdimensiaj indeksaj operatoroj operatoro[]; en se, por kaj ŝaltilo, la kapabloj de inicialigblokoj estis vastigitaj ("por (uzante T = int; T e : v)").
  • La C++ Norma Biblioteko plibonigis subtenon por la eksperimentaj sekcioj de la C++20 kaj C++23-normoj. Aldonita subteno por std::move_only_function, , std::basic_string::resize_and_overwrite, , kaj std::invoke_r. Permesita uzi std::unique_ptr, std::vector, std::basic_string, std::laŭvola kaj std::variant en konstexpr-funkcioj.
  • La fasado de Fortran provizas plenan subtenon por la specifo TS 29113, kiu priskribas kapablojn por certigi porteblon inter Fortran kaj C-kodo.
  • Aldonita subteno por la etendaĵo __builtin_shufflevector(vec1, vec2, index1, index2, ...) antaŭe aldonita al Clang, kiu ofertas ununuran vokon por plenumi oftajn vektorajn miksadojn kaj operaciojn.
  • Kiam oni uzas la "-O2" optimumigan nivelon, vektorizado estas ebligita defaŭlte (la -ftree-vectorize kaj -fvect-cost-model=tre malmultekostaj reĝimoj estas ebligitaj). La tre malmultekosta modelo permesas vektorigon nur se la vektorkodo povas tute anstataŭigi la skalaran kodon estantan vektorigita.
  • Aldonita "-ftrivial-auto-var-init" reĝimo por ebligi eksplicitan inicialigon de variabloj sur la stako por spuri problemojn kaj bloki vundeblecojn asociitajn kun la uzo de nekomencigitaj variabloj.
  • Por C kaj C++ lingvoj, enkonstruita funkcio __builtin_dynamic_object_size estis aldonita por determini la grandecon de objekto, kongrua kun simila funkcio de Clang.
  • Por la lingvoj C kaj C++, subteno por la atributo "nehavebla" estis aldonita (ekzemple, vi povas marki funkciojn kiuj generos eraron se vi provas uzi ilin).
  • Por C kaj C++-lingvoj, subteno por antaŭprilaboraj direktivoj "#elifdef" kaj "#elifndef" estis aldonita.
  • Aldonita "-Wbidi-chars" flago por montri averton se UTF-8-signoj estas malĝuste uzataj, ŝanĝante la ordon en kiu dudirekta teksto estas montrata.
  • Aldonita flago "-Warray-compare" por montri averton kiam oni provas kompari du operantojn kiuj rilatas al tabeloj.
  • La efektivigo de la OpenMP 5.0 kaj 5.1 (Open Multi-Processing) normoj, kiuj difinas la API kaj metodojn por aplikado de paralelaj programaj metodoj sur plurkernaj kaj hibridaj (CPU+GPU/DSP) sistemoj kun komuna memoro kaj vektorigaj unuoj (SIMD) , daŭris.
  • Plibonigita efektivigo de la specifo de paralela programado OpenACC 2.6, kiu difinas ilojn por malŝarĝi operaciojn sur GPUoj kaj specialigitaj procesoroj kiel NVIDIA PTX.
  • Subteno por plilongigitaj instrukcioj Intel AVX86-FP512 kaj la _Float16-tipo estis aldonita al la koda generacia backend por la x16-arkitekturo.
  • Por la arkitekturo x86, protekto estis aldonita kontraŭ vundeblecoj en procesoroj kaŭzitaj de konjekta plenumo de instrukcioj post senkondiĉaj antaŭensaltaj operacioj. La problemo okazas pro preventa prilaborado de instrukcioj tuj sekvante la branĉinstrukcion en memoro (SLS, Straight Line Speculation). Por ebligi protekton, la opcio "-mharden-sls" estas proponita.
  • Aldonita detekto de la uzo de neinicialigitaj variabloj al la eksperimenta senmova analizilo. Aldonita komenca subteno por analizado de asembleokodo en enliniaj enigaĵoj. Plibonigita memorspurado. La kodo por prilaborado de ŝaltilesprimoj estis reverkita.
  • Aldonitaj 30 novaj vokoj al libgccjit, komuna biblioteko por enkonstrui kodgeneratoron en aliajn procezojn kaj uzi ĝin por JIT kompili bajtkodon en maŝinkodon.
  • Subteno por la mekanismo CO-RE (Compile Once - Run Everywhere) estis aldonita al la backend por generi BPF-bajtkodon, kiu ebligas vin kompili la kodon de eBPF-programoj por la Linukso-kerno nur unufoje kaj uzi specialan universalan ŝargilon kiu adaptas la ŝarĝita programo al la nuna kerno kaj BPF Types Format). CO-RE solvas la problemon de porteblo de kompilitaj eBPF-programoj, kiuj antaŭe povus esti uzataj nur en la versio de la kerno por kiu ili estis kompilitaj, ĉar la pozicio de elementoj en datumstrukturoj ŝanĝiĝas de versio al versio.
  • La backend RISC-V aldonas subtenon por novaj instrukciaĵaj arkitekturaj etendaĵoj zba, zbb, zbc kaj zbs, same kiel ISA-etendaĵojn por vektoraj kaj skalaj kriptografiaj operacioj. Defaŭlte, subteno por la specifo RISC-V ISA 20191213 estas provizita. La flago -mtune=thead-c906 estis aldonita por ebligi optimumojn por T-HEAD c906-kernoj.
  • Subteno por la __int128_t/integer(kind=16) tipo estis aldonita al la koda generado de backend por AMD-GPUoj bazitaj sur la GCN-mikroarkitekturo. Eblas uzi ĝis 40 laborgrupojn per komputila unuo (CU) kaj ĝis 16 instrukciofrontoj (ondfronto, aro de fadenoj ekzekutitaj paralele de la SIMD-Motoro) per grupo. Antaŭe, nur unu instrukranĝo per CU estis permesita.
  • La NVPTX-backend, desegnita por generi kodon uzante la arkitekturon de instrukcioj de NVIDIA PTX (Parallel Thread Execution), aldonis la kapablon uzi la flagojn "-march", "-mptx" kaj "-march-map". Efektivigita subteno por PTX ISA sm_53, sm_70, sm_75 kaj sm_80. La defaŭlta arkitekturo estas sm_30.
  • En la backend por PowerPC / PowerPC64 / RS6000 procesoroj, la efektivigoj de enkonstruitaj funkcioj estis reverkitaj. La enkonstruitaj funkcioj __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar, estas enkonstruitaj __builtin_set_tfhartin __tfiar.
  • Subteno por Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) kaj Arm Cortex-X710 (cortex-x2). Aldonita subteno por novaj ARMv2-arkitekturopcioj por uzo kun la "-march" opcio: armv8-a, armv8.7-a, armv8.8-a. Aldonita efektivigo de C-funkcioj konstruitaj en la kompililon (Intrinsics) por atomŝarĝado kaj konservado de datumoj en memoron, surbaze de la uzo de plilongigitaj ARM-instrukcioj (ls9). Aldonita subteno por akceli la memcpy, memmove kaj memset funkcioj uzante la mopsoption ARM etendo.
  • Aldonis novan kontrolreĝimon "-fsanitize=shadow-call-stack" (ShadowCallStack), kiu nuntempe estas nur disponebla por la AArch64-arkitekturo kaj funkcias dum konstruado de kodo kun la opcio "-ffixed-r18". La reĝimo disponigas protekton kontraŭ anstataŭigo de la revenadreso de funkcio en la okazaĵo de bufrotrofluo sur la stako. La esenco de la protekto estas konservi la revenadreson en aparta "ombra" stako post translokado de kontrolo al funkcio kaj reakiro de ĉi tiu adreso antaŭ ol eliri la funkcion.

fonto: opennet.ru

Aldoni komenton