Aasta pärast arendust on avaldatud vabade GCC 12.1 kompilaatorite komplekti väljaanne, mis on esimene oluline väljalase uues GCC 12.x harus. Uute versioonite numbreerimise süsteemi kohaselt kasutati versiooni 12.0 arenduses ning enne GCC 12.1 väljalaskmist harunes juba GCC 13.0 haru, mille alusel moodustatakse järgmist olulist väljaannet GCC 13.1. 23. mail tähistab projekt 35 aastat oma esimese GCC väljaande ilmumisest.
Peamised muudatused:
- Lisatud on tugi CTF (Compact Type Format) silumisvormingule, mis tagab C-tüüpide, funktsioonidevaheliste seoste ja silumis sümbolite teabe kompaktse salvestamise. ELF-objektidesse integreerimisel võimaldab formaat kasutada EFL sümbolite tabeleid andmete dubleerimise vältimiseks.
- Silumisinfot salvestava vormingu „STABS” tugi on kuulutatud vananenuks, mis loodi 1980. aastatel.
- Jätkub töö tulevaste C2X ja C++23 standardite toe laiendamiseks C ja C++ keeltele. Näiteks on lisatud toetust väljendile "if consteval"; lubatud on auto kasutamine funktsiooni argumentides ("f(auto(g()))"); lubatud on mitteliteriaalsete muutujate, goto ja siltide kasutamine funktsioonides, mis on deklareeritud kui constexpr; on lisatud tugi mitmemõõtmeliste indeksoperaatorite operator[] jaoks; if, for ja switch struktuuride algatamisblokkide võimaluste laiendamine ("for (using T = int; T e : v)").
- C++ standardraamatukogus on paranenud eksperimenteerivate C++20 ja C++23 standardite osade tugi. Lisatud on tugi std::move_only_function, , std::basic_string::resize_and_overwrite, , ja std::invoke_r. constexpr-funktsioonides on lubatud std::unique_ptr, std::vector, std::basic_string, std::optional ja std::variant kasutamine.
- Fortran keele frontendis on tagatud täielik toetus spetsifikatsioonile TS 29113, mis kirjeldab Fortran ja C keele vahelise ülekantavuse tagamise võimalusi.
- On lisatud tugi laiendusele __builtin_shufflevector(vec1, vec2, index1, index2, …), mis on varem Clangis lisatud ja pakub ühtset kutsumist tavaliste vektori operatsioonide segamise ja sulandumise täitmiseks.
- Optimeerimistasandi „-O2“ kasutamisel on vaikimisi aktiveeritud vektoriseerimise rakendamine (aktiveeritud režiimid -ftree-vectorize ja -fvect-cost-model=very-cheap). „Very-cheap“ mudel lubab vektoriseerimist ainult siis, kui vektorkood suudab täielikult asendada vektoriseeritud skalaarkoodi.
- Lisatud režiim „-ftrivial-auto-var-init“, mis hõlmab võimalust kohaliku muutujate jaotuse algseisundit, et tuvastada probleeme ja takistada haavatavusi, mis on seotud mittealgatatud muutujate kasutamisega.
- C ja C++ keelte jaoks on lisatud sisemine funktsioon __builtin_dynamic_object_size objekti suuruse määramiseks, mis on ühilduv Clangi sarnaste funktsioonidega.
- C ja C++ keelte jaoks on lisatud toetust atribuudile „unavailable“ (näiteks võib funktsioone märgistada, mille kasutamise korral ilmneb viga).
- C ja C++ keelte jaoks on lisatud toimetamisdirektiivide toimetamine „#elifdef“ ja „#elifndef“.
- Lisatud lipp „-Wbidi-chars“, mis kuvab hoiatuse, kui UTF-8 märke, mis muudavad vastupidise teksti kuvamise, kasutatakse valesti.
- Lisatud lipp «-Warray-compare», et kuvada hoiatust, kui üritatakse võrrelda kahte operandit, mis viitavad massiividele.
- Jätkatud OpenMP 5.0 ja 5.1 (Open Multi-Processing) standardite rakendamist, mis määratlevad API ja meetodid paralleelse programmeerimise rakendamiseks mitme tuumaga ja hübriidsetes (CPU+GPU/DSP) süsteemides, kus on jagatud mälu ja vektoriseerimise plokid (SIMD).
- Parandatud OpenACC 2.6 paralleelse programmeerimise spetsifitseerimise rakendust, mis määratleb vahendid GPU-le ja spetsialiseeritud protsessoritele, nagu NVIDIA PTX, tööde edastamiseks (offloading).
- x86 arhitektuuri koodigeneratsiooni tagaküljel on lisatud toetus laienenud Intel AVX512-FP16 ja _Float16 tüübi käskudele.
- x86 arhitektuuri puhul on lisatud kaitse protsessorite haavatavuste eest, mis on põhjustatud spekulatiivsetest käskude täitmistest pärast tingimusteta otsepöörde operatsioone. Probleem tuleneb käskude eelprotsessimisest, mis järgneb käskudele otse mälus (SLS, Straight Line Speculation). Kaitse aktiveerimiseks on pakutud võimalus «-mharden-sls».
- Katses statilise analüsaatori juurde on lisatud määratlemine mitte algatatud muutuja kasutamiseks. Lisatud esialgne toetus assembleri koodi analüüsimiseks inline-insertingutes. Parandatud mälu oleku jälgimist. Ümber kirjutatud kood switch-lause töötlemiseks.
- Lisatud 30 uut väljakutset libgccjit'isse, jagatud teeki koodi generaatori integreerimiseks teistesse protsessidesse ja JIT-kompileerimiseks, et muuta bytekood masinkoodiks.
- BPF bytekoodi genereerimise taustsüsteemi on lisatud CO-RE (Compile Once — Run Everywhere) mehhanismi tugi, mis võimaldab eBPF programmide koodi koguda Linuxi kerneli jaoks vaid üks kord ja kasutada spetsiaalset universaalset laadijat, mis kohandab laaditavat programmi jooksvale kernelile ja BTF (BPF Tüübi Formaadi) tüüpidele. CO-RE lahendab varem kompileeritud eBPF programmide ülekandmise probleemi, mis varem said töötada ainult selle kerneli versiooniga, mille jaoks nad olid kompileeritud, kuna andmestruktuuride elementide positsioonid muutuvad versioonide vahel.
- RISC-V arhitektuuri taustal on lisatud toetust uut tüüpi käsu komplekti laiendustele zba, zbb, zbc ja zbs, samuti ISA laiendustele vektorite ja skalaarkrüptograafiliste operatsioonide jaoks. Vaikimisi on tagatud RISC-V ISA spetsifikatsiooni 20191213 toetus. Lisatud on -mtune=thead-c906 lipp, mis aktiveerib T-HEAD c906 tuumade optimeerimised.
- AMD GPU koodi genereerimise taustal, mis põhineb GCN mikrotehnoloogial, on lisatud toetus tüübile __int128_t/integer(kind=16). Nüüd on võimalik kasutada kuni 40 töörühma ühe arvutusploki (CU) kohta ja kuni 16 instruktsioonide rinda (wavefront, ühtne kudumine, paralleelselt töötavad SIMD ajamid) rühma kohta. Varem oli lubatud kasutada ainult üht instruktsioonide rinda CU-s.
- NVPTX taustal, mis on mõeldud koodi genereerimiseks NVIDIA PTX (Parallel Thread Execution) käsu komplekti arhitektuuri abil, on lisatud võimalus kasutada lippe „-march”, „-mptx” ja „-march-map”. Toetatud on PTX ISA sm_53, sm_70, sm_75 ja sm_80. Vaikimisi kasutatakse arhitektuuri sm_30.
- PowerPC / PowerPC64 / RS6000 protsessorite taustal on uuendatud sisseehitatud funktsioonide teostusi. On dokumenteeritud sisseehitatud funktsioonid __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar ja __builtin_set_tfiar.
- ARM/AArch64 arhitektuuri taustal on lisatud toetus CPU Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) ja Arm Cortex-X2 (cortex-x2). Lisatud on uued ARMv8 arhitektuuri variandid, mida saab kasutada valikus „-march”: armv8.7-a, armv8.8-a, armv9-a. On lisatud C keele kompilatsioonis sisseehitatud funktsioonide (Intrinsics) teostustus, et toetada andmete aatomaarve ja salvestamist mällu, tuginedes laiendatud ARM käskudele (ls64). Funktsioonide memcpy, memmove ja memset kiirus on parandatud ARM laienduse mopsoption abil.
- Lisatud on uus kontrollrežiim «-fsanitize=shadow-call-stack» (ShadowCallStack), mis on hetkel saadaval ainult AArch64 arhitektuuril ning töötab koodi kompileerimisel valikuga «-ffixed-r18». See režiim pakub kaitset funktsioonist tagasikutsumise aadressi ülekirjutamise eest, kui virnas toimub üleujutus. Kaitse sisu seisneb tagasikutsumise aadressi säilitamises eraldi «varjatud» virnas ning selle aadressi väljavõtmises funktsioonist lahkumisel.
Allikas: opennet.ru
