GCC 12 kompilaatorikomplekti väljalase

Pärast aastast arendustööd on välja antud tasuta kompilaatorite komplekt GCC 12.1, mis on esimene oluline väljalase uues GCC 12.x harus. Vastavalt uuele väljalasete nummerdamisskeemile kasutati arendusprotsessis versiooni 12.0 ning veidi enne GCC 12.1 väljaandmist oli juba hargnenud GCC 13.0 haru, mille alusel saabub järgmine suurem väljalase GCC 13.1. kujunema. 23. mail täitub projektiga 35 aastat GCC esimese väljaande moodustamisest.

Peamised muudatused:

  • Lisatud on CTF-i (Compact Type Format) silumisvormingu tugi, mis võimaldab kompaktselt salvestada teavet C-tüüpide, funktsioonide vaheliste ühenduste ja silumissümbolite kohta. ELF-objektidesse manustatud vorming võimaldab andmete dubleerimise vältimiseks kasutada EFL-i märgitabeleid.
  • 1980. aastatel loodud silumisinfo salvestusvormingu "STABS" tugi on aegunud.
  • Töö jätkub tulevaste C2X ja C++23 standardite toe laiendamiseks C- ja C++ keelte jaoks. Näiteks on lisatud avaldise “if consteval” tugi; funktsiooni argumentides lubatud kasutada autot (“f(auto(g()))”); mitteliteraalsete muutujate, goto ja siltide kasutamine on lubatud funktsioonides, mis on deklareeritud kui constexpr; lisatud tugi mitmemõõtmeliste indeksioperaatorite operaatorile[]; in if, for ja switch, initsialiseerimisplokkide võimalusi on laiendatud (“for (kasutades T = int; T e : v)”).
  • C++ Standard Library on täiustanud C++20 ja C++23 standardite eksperimentaalsete osade tuge. Lisatud on funktsioonide std::move_only_function, , std::basic_string::resize_and_overwrite, , ja std::invoke_r tugi. Funktsioonides constexpr on lubatud kasutada std::unique_ptr, std::vector, std::basic_string, std::valikuline ja std::variant.
  • Fortrani kasutajaliides toetab täielikult TS 29113 spetsifikatsiooni, mis kirjeldab võimalusi kaasaskantavuse tagamiseks Fortrani ja C koodi vahel.
  • Lisatud on tugi laiendusele __builtin_shufflevector(vec1, vec2, index1, index2, ...), mis on varem lisatud Clangile, mis pakub ühtset kõnet tavaliste vektorite segamise ja segamise toimingute tegemiseks.
  • Optimeerimistaseme "-O2" kasutamisel on vektoriseerimine vaikimisi lubatud (režiimid -ftree-vectorize ja -fvect-cost-model=very-cheap on lubatud). Väga odav mudel võimaldab vektoriseerimist ainult siis, kui vektorkood suudab täielikult asendada vektoriseeritava skalaarkoodi.
  • Lisatud režiim "-ftrivial-auto-var-init", et võimaldada virnas olevate muutujate selgesõnalist lähtestamist, et jälgida probleeme ja blokeerida initsialiseerimata muutujate kasutamisega seotud haavatavusi.
  • C- ja C++-keelte jaoks on objekti suuruse määramiseks lisatud sisseehitatud funktsioon __builtin_dynamic_object_size, mis ühildub Clangi sarnase funktsiooniga.
  • C- ja C++-keelte jaoks on lisatud atribuudi “unavailable” tugi (näiteks saate märkida funktsioone, mis tekitavad tõrke, kui proovite neid kasutada).
  • C- ja C++-keelte jaoks on lisatud eeltöötlusdirektiivide “#elifdef” ja “#elifndef” tugi.
  • Lisatud lipp "-Wbidi-chars", et kuvada hoiatus, kui UTF-8 märke kasutatakse valesti, muutes kahesuunalise teksti kuvamise järjekorda.
  • Lisatud lipp "-Warray-compare", et kuvada hoiatus, kui proovite võrrelda kahte massiividele viitavat operandi.
  • OpenMP 5.0 ja 5.1 (Open Multi-Processing) standardite juurutamine, mis määratlevad API ja meetodid paralleelsete programmeerimismeetodite rakendamiseks mitmetuumalistes ja hübriidsüsteemides (CPU+GPU/DSP) ühismälu ja vektoriseerimisüksustega (SIMD) , on jätkunud.
  • OpenACC 2.6 paralleelse programmeerimise spetsifikatsiooni täiustatud rakendamine, mis määratleb tööriistad GPU-de ja spetsiaalsete protsessorite (nt NVIDIA PTX) toimingute mahalaadimiseks.
  • Laiendatud juhiste tugi Intel AVX86-FP512 ja tüüp _Float16 on lisatud x16 arhitektuuri koodi genereerimise taustaprogrammi.
  • X86 arhitektuuri jaoks on lisatud kaitse protsessorite haavatavuste vastu, mis on põhjustatud käskude spekulatiivsest täitmisest pärast tingimusteta edasiliikumise toiminguid. Probleem ilmneb käskude ennetava töötlemise tõttu, mis järgneb vahetult mälus olevale harukäsule (SLS, Straight Line Speculation). Kaitse lubamiseks pakutakse valikut "-mharden-sls".
  • Eksperimentaalsele staatilisele analüsaatorile on lisatud initsialiseerimata muutujate kasutamise tuvastamine. Lisatud esialgne tugi koostekoodi analüüsimiseks reasiseses lisades. Täiustatud mälu jälgimine. Switchi avaldiste töötlemise kood on ümber kirjutatud.
  • Lisati 30 uut väljakutset libgccjitile, jagatud teegile koodigeneraatori manustamiseks teistesse protsessidesse ja selle kasutamiseks JIT-i baitkoodi kompileerimiseks masinkoodiks.
  • BPF-i baitkoodi genereerimiseks on taustaprogrammi lisatud mehhanismi CO-RE (Compile Once - Run Everywhere) tugi, mis võimaldab Linuxi kerneli jaoks eBPF-i programmide koodi ainult ühe korra kompileerida ja kasutada spetsiaalset universaalset laadijat, mis kohandab laaditud programm praegusesse kerneli ja BPF tüüpide vormingusse). CO-RE lahendab kompileeritud eBPF-programmide kaasaskantavuse probleemi, mida varem sai kasutada ainult selles kerneli versioonis, mille jaoks need kompileeriti, kuna elementide asukoht andmestruktuurides muutub versiooniti.
  • RISC-V taustaprogramm lisab toe uutele käsukomplekti arhitektuuri laiendustele zba, zbb, zbc ja zbs, samuti ISA laiendustele vektor- ja skalaarkrüptograafiliste operatsioonide jaoks. Vaikimisi pakutakse tuge spetsifikatsioonile RISC-V ISA 20191213. T-HEAD c906 tuumade optimeerimise võimaldamiseks on lisatud lipp -mtune=thead-c906.
  • GCN-i mikroarhitektuuril põhineva AMD GPU-de koodi genereerimise taustaprogrammi on lisatud __int128_t/integer(kind=16) tüübi tugi. Ühe arvutusüksuse (CU) kohta on võimalik kasutada kuni 40 töögruppi ja kuni 16 käsufronti (lainefront, SIMD Engine'i paralleelselt teostatav lõimede komplekt). Varem oli lubatud ainult üks käsuserv CU kohta.
  • NVPTX taustaprogramm, mis on loodud koodi genereerimiseks NVIDIA PTX (Parallel Thread Execution) käsukomplekti arhitektuuri abil, on lisanud võimaluse kasutada lippe "-march", "-mptx" ja "-march-map". Rakendatud on PTX ISA sm_53, sm_70, sm_75 ja sm_80 tugi. Vaikearhitektuur on sm_30.
  • Sisseehitatud funktsioonide juurutused on PowerPC/PowerPC64/RS6000 protsessorite taustaprogrammis ümber kirjutatud. Sisseehitatud funktsioonid __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_texasru, __builtin_set_set.tfiar_set.
  • Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) ja Arm Cortex-X710 (cortex-x2) tugi. Lisatud on tugi uutele ARMv2 arhitektuurisuvanditele kasutamiseks koos valikuga "-march": armv8-a, armv8.7-a, armv8.8-a. Lisatud kompilaatorisse sisseehitatud C-funktsioonide juurutamine (intrinsics) andmete aatomi laadimiseks ja mällu salvestamiseks, mis põhineb laiendatud ARM-i juhiste (ls9) kasutamisel. Lisatud tugi funktsioonide memcpy, memmove ja memset kiirendamiseks, kasutades laiendust mopsoption ARM.
  • Lisati uus kontrollrežiim "-fsanitize=shadow-call-stack" (ShadowCallStack), mis on praegu saadaval ainult AArch64 arhitektuuri jaoks ja töötab koodi ehitamisel valikuga "-ffixed-r18". Režiim pakub kaitset funktsiooni tagastusaadressi ülekirjutamise eest virna puhvri ületäitumise korral. Kaitsmise olemus seisneb tagastusaadressi salvestamises eraldi "vari" virna pärast juhtimise üleandmist funktsioonile ja selle aadressi hankimist enne funktsioonist väljumist.

Allikas: opennet.ru

Lisa kommentaar