Lëshimi i paketës së përpiluesit GCC 12

Pas një viti zhvillimi, paketa pa pagesë e përpiluesit GCC 12.1 është lëshuar, lëshimi i parë domethënës në degën e re GCC 12.x. Në përputhje me skemën e re të numërimit të lëshimeve, versioni 12.0 u përdor në procesin e zhvillimit dhe pak para lëshimit të GCC 12.1, dega GCC 13.0 tashmë ishte degëzuar, në bazë të së cilës versioni tjetër kryesor, GCC 13.1, do të të formohet. Më 23 maj, projekti do të festojë 35 vjet nga formimi i edicionit të parë të GCC.

Ndryshimet kryesore:

  • Mbështetje e shtuar për formatin e korrigjimit CTF (Compact Type Format), i cili siguron ruajtje kompakte të informacionit rreth llojeve C, lidhjet midis funksioneve dhe simboleve të korrigjimit. Kur futet në objektet ELF, formati lejon përdorimin e tabelave të karaktereve EFL për të shmangur dyfishimin e të dhënave.
  • Mbështetja për formatin e ruajtjes së informacionit të korrigjimit "STABS", i krijuar në vitet 1980, është zhvlerësuar.
  • Puna vazhdon për të zgjeruar mbështetjen për standardet e ardhshme C2X dhe C++23 për gjuhët C dhe C++. Për shembull, është shtuar mbështetja për shprehjen "if consteval"; lejohet të përdoret automatik në argumentet e funksionit (“f(auto(g()))”); Përdorimi i variablave jo-literale, goto dhe etiketave lejohet në funksionet e deklaruara si constexpr; mbështetje e shtuar për operatorët e indekseve shumëdimensionale[]; në qoftë se, for dhe switch, aftësitë e blloqeve të inicializimit janë zgjeruar (“for (duke përdorur T = int; T e : v)”).
  • Biblioteka standarde C++ ka përmirësuar mbështetjen për seksionet eksperimentale të standardeve C++20 dhe C++23. Mbështetje e shtuar për std::move_only_function, , std::basic_string::resize_and_overwrite, , dhe std::invoke_r. Lejohet të përdoret std::unique_ptr, std::vector, std::string_bazik, std::optional dhe std::variant në funksionet constexpr.
  • Pjesa e përparme e Fortran ofron mbështetje të plotë për specifikimin TS 29113, i cili përshkruan aftësitë për të siguruar transportueshmëri midis kodit Fortran dhe C.
  • Mbështetja e shtuar për shtesën __builtin_shufflector(vec1, vec2, index1, index2, ...) e shtuar më parë në Clang, e cila ofron një thirrje të vetme për të kryer operacione të zakonshme të riorganizimit dhe riorganizimit të vektorit.
  • Kur përdoret niveli i optimizimit "-O2", vektorizimi aktivizohet si parazgjedhje (modalitetet -ftre-vectorize dhe -fvect-cost-model=shumë lirë janë të aktivizuara). Modeli shumë i lirë lejon vektorizimin vetëm nëse kodi vektorial mund të zëvendësojë plotësisht kodin skalar që vektorizohet.
  • U shtua modaliteti "-ftrivial-auto-var-init" për të mundësuar inicializimin e qartë të variablave në rafte për të gjurmuar çështjet dhe për të bllokuar dobësitë që lidhen me përdorimin e variablave të painitializuar.
  • Për gjuhët C dhe C++, një funksion i integruar __builtin_dynamic_object_size është shtuar për të përcaktuar madhësinë e një objekti, i pajtueshëm me një funksion të ngjashëm nga Clang.
  • Për gjuhët C dhe C++, është shtuar mbështetja për atributin "i padisponueshëm" (për shembull, mund të shënoni funksione që do të gjenerojnë një gabim nëse përpiqeni t'i përdorni).
  • Për gjuhët C dhe C++, është shtuar mbështetje për direktivat e parapërpunimit "#elifdef" dhe "#elifndef".
  • U shtua flamuri "-Wbidi-chars" për të shfaqur një paralajmërim nëse karakteret UTF-8 përdoren gabimisht, duke ndryshuar rendin në të cilin shfaqet teksti me dy drejtime.
  • U shtua flamuri "-Warray-compare" për të shfaqur një paralajmërim kur përpiqeni të krahasoni dy operandë që u referohen vargjeve.
  • Zbatimi i standardeve OpenMP 5.0 dhe 5.1 (Open Multi-Processing), të cilat përcaktojnë API-në dhe metodat për aplikimin e metodave të programimit paralel në sistemet multi-core dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe njësi vektorizimi (SIMD). , ka vazhduar.
  • Implementimi i përmirësuar i specifikimit të programimit paralel OpenACC 2.6, i cili përcakton mjetet për shkarkimin e operacioneve në GPU dhe procesorë të specializuar si NVIDIA PTX.
  • Mbështetja për udhëzimet e zgjeruara Intel AVX86-FP512 dhe lloji _Float16 është shtuar në backend-in e gjenerimit të kodit për arkitekturën x16.
  • Për arkitekturën x86, është shtuar mbrojtja kundër dobësive në procesorë të shkaktuar nga ekzekutimi spekulativ i udhëzimeve pas operacioneve të pakushtëzuara të kërcimit përpara. Problemi ndodh për shkak të përpunimit parandalues ​​të udhëzimeve menjëherë pas udhëzimit të degës në memorie (SLS, Spekulimi i Linjës së Drejtë). Për të mundësuar mbrojtjen, propozohet opsioni “-mharden-sls”.
  • U shtua zbulimi i përdorimit të variablave të painitializuar në analizuesin statik eksperimental. U shtua mbështetje fillestare për analizimin e kodit të montimit në insertet inline. Përmirësimi i gjurmimit të kujtesës. Kodi për përpunimin e shprehjeve të çelësit është rishkruar.
  • U shtuan 30 thirrje të reja në libgccjit, një bibliotekë e përbashkët për futjen e një gjeneruesi kodi në procese të tjera dhe përdorimin e tij për të përpiluar bytekodin JIT në kodin e makinës.
  • Mbështetja për mekanizmin CO-RE (Compile Once - Run Everywhere) është shtuar në backend për gjenerimin e bytekodit BPF, i cili ju lejon të përpiloni kodin e programeve eBPF për kernelin Linux vetëm një herë dhe të përdorni një ngarkues të veçantë universal që përshtat programi i ngarkuar në kernelin aktual dhe Formatin e Llojeve BPF). CO-RE zgjidh problemin e transportueshmërisë së programeve të përpiluara eBPF, të cilat më parë mund të përdoreshin vetëm në versionin e kernelit për të cilin ishin përpiluar, pasi pozicioni i elementeve në strukturat e të dhënave ndryshon nga versioni në version.
  • Backend-i RISC-V shton mbështetje për shtesat e reja të arkitekturës së grupit të instruksioneve zba, zbb, zbc dhe zbs, si dhe shtesat ISA për operacionet kriptografike vektoriale dhe skalare. Si parazgjedhje, ofrohet mbështetje për specifikimin RISC-V ISA 20191213. Flamuri -mtune=thead-c906 është shtuar për të mundësuar optimizimet për bërthamat T-HEAD c906.
  • Mbështetja për llojin __int128_t/integer(lloj=16) është shtuar në bazën e gjenerimit të kodit për GPU-të AMD bazuar në mikroarkitekturën GCN. Është e mundur të përdoren deri në 40 grupe pune për njësi llogaritëse (CU) dhe deri në 16 fronte instruksionesh (ballë valësh, një grup fijesh të ekzekutuara paralelisht nga Motori SIMD) për grup. Më parë, lejohej vetëm një avantazh udhëzues për CU.
  • Backend-i NVPTX, i krijuar për të gjeneruar kode duke përdorur arkitekturën e grupit të instruksioneve NVIDIA PTX (Parallel Thread Execution), ka shtuar aftësinë për të përdorur flamujt "-marsh", "-mptx" dhe "-marsh-map". Mbështetje e implementuar për PTX ISA sm_53, sm_70, sm_75 dhe sm_80. Arkitektura e paracaktuar është sm_30.
  • Në backend për procesorët PowerPC / PowerPC64 / RS6000, zbatimet e funksioneve të integruara janë rishkruar. Funksionet e integruara __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar dhe __builtin_set_tfhar janë dokumentuar.
  • Mbështetje për Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) dhe Arm Cortex-X710 (cortex- x2). Mbështetje e shtuar për opsionet e reja të arkitekturës ARMv2 për përdorim me opsionin "-marsh": armv8-a, armv8.7-a, armv8.8-a. Shtuar implementimin e funksioneve C të integruara në përpilues (Intrinsics) për ngarkimin atomik dhe ruajtjen e të dhënave në memorie, bazuar në përdorimin e udhëzimeve të zgjeruara të ARM (ls9). Mbështetje e shtuar për përshpejtimin e funksioneve memcpy, memmove dhe memset duke përdorur shtesën mopsoption ARM.
  • U shtua një modalitet i ri kontrolli “-fsanitize=shadow-call-stack” (ShadowCallStack), i cili aktualisht është i disponueshëm vetëm për arkitekturën AArch64 dhe funksionon kur ndërtohet kodi me opsionin “-fixed-r18”. Modaliteti siguron mbrojtje kundër mbishkrimit të adresës së kthimit nga një funksion në rast të tejmbushjes së buferit në pirg. Thelbi i mbrojtjes është ruajtja e adresës së kthimit në një pirg të veçantë "hije" pas transferimit të kontrollit në një funksion dhe marrjes së kësaj adrese përpara se të dilni nga funksioni.

Burimi: opennet.ru

Shto një koment