Izdaja zbirke prevajalnikov GCC 11

Po enem letu razvoja je bil izdan brezplačen prevajalnik GCC 11.1, prva pomembna izdaja v novi veji GCC 11.x. V skladu z novo shemo številčenja izdaj je bila v razvojnem procesu uporabljena različica 11.0, malo pred izidom GCC 11.1 pa se je že odcepila veja GCC 12.0, iz katere bo nastala naslednja večja izdaja GCC 12.1.

GCC 11.1 je znan po prehodu na privzeto uporabo formata datoteke za odpravljanje napak DWARF 5, privzeti vključitvi standarda C++17 (»-std=gnu++17«), pomembnih izboljšavah v podpori za C++20 standard, eksperimentalna podpora za C++23, izboljšave, povezane s prihodnjim standardom jezika C (C2x), nove optimizacije delovanja.

Večje spremembe:

  • Privzeti način za jezik C++ je bil spremenjen na uporabo standarda C++17 (-std=gnu++17) namesto predhodno ponujenega C++14. Možno je selektivno onemogočiti novo vedenje C++17 pri obdelavi predlog, ki uporabljajo druge predloge kot parameter (-fno-new-ttp-matching).
  • Dodana je podpora za strojno pospeševanje orodja AddressSanitizer, ki vam omogoča ugotavljanje dejstev dostopanja do sproščenih pomnilniških območij, preseganja meja dodeljenega medpomnilnika in nekaterih drugih vrst napak pri delu s pomnilnikom. Strojno pospeševanje je trenutno na voljo samo za arhitekturo AArch64 in je osredotočeno na uporabo pri prevajanju jedra Linuxa. Za omogočanje strojnega pospeševanja AddressSanitizer pri gradnji komponent uporabniškega prostora je bila dodana zastavica "-fsanitize=hwaddress" in zastavica jedra "-fsanitize=kernel-hwaddress".
  • Pri generiranju razhroščevalnih informacij je privzeto uporabljen format DWARF 5, ki v primerjavi s prejšnjimi različicami omogoča generiranje 25% bolj kompaktnih razhroščevalnih podatkov. Popolna podpora za DWARF 5 zahteva vsaj binutils različico 2.35.2. Format DWARF 5 je podprt v orodjih za odpravljanje napak od GDB 8.0, valgrind 3.17.0, elfutils 0.172 in dwz 0.14. Za ustvarjanje datotek za odpravljanje napak z drugimi različicami DWARF-a lahko uporabite možnosti "-gdwarf-2", "-gdwarf-3" in "-gdwarf-4".
  • Zahteve za prevajalnike, ki se lahko uporabljajo za izdelavo GCC, so bile povečane. Prevajalnik mora zdaj podpirati standard C++11 (prej je bil potreben C++98), tj. Če je bil GCC 10 dovolj za gradnjo GCC 3.4, potem je zdaj za gradnjo GCC 11 potreben vsaj GCC 4.8.
  • Ime in lokacija datotek za shranjevanje izpisov, začasnih datotek in dodatnih informacij, potrebnih za optimizacijo LTO, sta bila spremenjena. Takšne datoteke so zdaj vedno shranjene v trenutnem imeniku, razen če je pot izrecno spremenjena z možnostmi "-dumpbase", "-dumpdir" in "-save-temps=*".
  • Podpora za binarno obliko zapisa BRIG za uporabo z jezikom HSAIL (heterogeneous System Architecture Intermediate Language) je bila opuščena in bo kmalu odstranjena.
  • Zmogljivosti načina ThreadSanitizer (-fsanitize=thread) so bile razširjene, namenjene zaznavanju pogojev tekmovanja pri skupni rabi istih podatkov iz različnih niti večnitne aplikacije. Nova izdaja dodaja podporo za alternativne čase izvajanja in okolja ter podporo za orodje za odpravljanje napak KCSAN (Kernel Concurrency Sanitizer), zasnovano za dinamično zaznavanje pogojev tekmovanja v jedru Linuxa. Dodani novi možnosti "-param tsan-distinguish-volatile" in "-param tsan-instrument-func-entry-exit".
  • Številke stolpcev v diagnostičnih sporočilih zdaj ne odražajo števila bajtov od začetka vrstice, temveč dejansko številke stolpcev, ki upoštevajo večbajtne znake in znake, ki zasedajo več položajev v vrstici (na primer znak 🙂 zaseda dva položaja in je kodiran v 4 bajtih). Podobno se tabulatorski znaki zdaj obravnavajo kot določeno število presledkov (nastavljivo z možnostjo -ftabstop, privzeto 8). Za obnovitev starega obnašanja je predlagana možnost “-fdiagnostics-column-unit=byte” in za določitev začetne vrednosti (oštevilčenje od 0 ali 1) - možnost “-fdiagnostics-column-origin=”.
  • Vektorizator upošteva celotno vsebino funkcije in doda zmožnosti obdelave, povezane s presečišči in sklici na prejšnje bloke v grafu nadzornega toka (CFG, graf nadzornega toka).
  • Optimizator implementira zmožnost pretvorbe niza pogojnih operacij, ki primerjajo isto spremenljivko, v preklopni izraz. Preklopni izraz je mogoče pozneje kodirati z uporabo navodil za testiranje bitov (za nadzor takšne pretvorbe je bila dodana možnost »-fbit-tests«).
  • Izboljšane medproceduralne optimizacije. Dodan je nov prehod IPA-modref (-fipa-modref) za sledenje neželenim učinkom pri klicanju funkcij in izboljšanje natančnosti analize. Izboljšana izvedba prehoda IPA-ICF (-fipa-icf), ki zmanjša porabo pomnilnika med prevajanjem in poveča število poenotenih funkcij, za katere so združeni enaki bloki kode. V prehodu IPA-CP (Interprocedural constant propagation) je bila hevristika napovedi izboljšana ob upoštevanju znanih meja in značilnosti zank.
  • V povezovalnih časovnih optimizacijah (LTO) je format bajtne kode optimiziran za zmanjšanje velikosti in izboljšanje hitrosti obdelave. Zmanjšana največja poraba pomnilnika med fazo vezave.
  • V mehanizmu optimizacije na podlagi rezultatov profiliranja kode (PGO - Profile-guided optimization), ki omogoča generiranje bolj optimalne kode na podlagi analize izvedbenih funkcij, je velikost datotek s podatki GCOV zmanjšana zaradi kompaktnejšega pakiranja ničelnih števcev. . Izboljšan način "-fprofile-values" s spremljanjem več parametrov pri posrednih klicih.
  • Implementacija standarda OpenMP 5.0 (Open Multi-Processing), ki definira API in metode za uporabo metod vzporednega programiranja na večjedrnih in hibridnih (CPU+GPU/DSP) sistemih s skupnim pomnilnikom in vektorizacijskimi enotami (SIMD), je nadaljevano. Dodana začetna podpora za direktivo allocate in možnost uporabe heterogenih zank v konstruktih OpenMP. Implementirana podpora za spremenljivko okolja OMP_TARGET_OFFLOAD.
  • Izboljšana je izvedba specifikacije vzporednega programiranja OpenACC 2.6 za jezike C, C++ in Fortran, ki določa orodja za razbremenitvene operacije na grafičnih procesorjih in specializiranih procesorjih, kot je NVIDIA PTX.
  • Za jezike C je bil implementiran nov atribut »no_stack_protector«, zasnovan za označevanje funkcij, za katere zaščita sklada ne bi smela biti omogočena (»-fstack-protector«). Atribut “malloc” je razširjen tako, da podpira identifikacijo parov klicev za dodeljevanje in sproščanje pomnilnika (allocator/deallocator), ki se uporablja v statičnem analizatorju za identifikacijo tipičnih napak pri delu s pomnilnikom (puščanje pomnilnika, uporaba po sprostitvi, dvojni klici funkcije free itd.) in v opozorilih prevajalnika »-Wmismatched-dealloc«, »-Wmismatched-new-delete« in »-Wfree-nonheap-object«, ki obveščajo o nedoslednosti med operacijami sprostitve pomnilnika in dodeljevanja pomnilnika.
  • Za jezik C so bila dodana nova opozorila:
    • "-Wmismatched-dealloc" (privzeto omogočeno) - opozarja na operacije sprostitve pomnilnika, ki uporabljajo kazalec, ki ni združljiv s funkcijami dodeljevanja pomnilnika.
    • »-Wsizeof-array-div« (omogočeno, ko je določeno »-Wall«) – opozori na delitev dveh operatorjev sizeof, če se delitelj ne ujema z velikostjo elementa matrike.
    • "-Wstringop-overread" (privzeto omogočeno) - opozori na klic funkcije niza, ki bere podatke iz območja zunaj meje polja.
    • "-Wtsan" (privzeto omogočeno) - opozarja na uporabo funkcij (kot je std::atomic_thread_fence), ki niso podprte v ThreadSanitizerju.
    • “-Warray-parameter” in “-Wvla-parameter” (omogočeno pri podajanju “-Wall”) - opozarja na preglasitev funkcij z nezdružljivimi deklaracijami argumentov, povezanih z nizi s fiksno in spremenljivo dolžino.
    • Opozorilo "-Wuninitialized" zdaj zazna poskuse branja iz neinicializiranega dinamično dodeljenega pomnilnika.
    • Opozorilo "-Wfree-nonheap-object" razširja definicijo primerov, ko so funkcije za sprostitev pomnilnika klicane s kazalcem, ki ni bil pridobljen s funkcijami za dinamično dodeljevanje pomnilnika.
    • Opozorilo »-Wmaybe-uninitialized« je razširilo zaznavanje podajanja kazalcev na funkcije, ki se nanašajo na neinicializirane pomnilniške lokacije.
  • Za jezik C je implementiran del novih funkcij, razvitih v okviru standarda C2X (omogočeno z določitvijo -std=c2x in -std=gnu2x): makra BOOL_MAX in BOOL_WIDTH, izbirna navedba imen neuporabljenih parametrov v funkciji definicije (kot v C++), atribut “[ [nodiscard]]”, predprocesorski operater "__has_c_attribute", makri FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559_EXT__, INFINITY, NAN, FLT_SNAN, DBL_SNAN, LDBL_SNAN, DEC_INFINITY in DEC _NAN, NaN=makri za FloatN, _FloatNx in _DecimalN, možnost podajanja oznak za skok pred deklaracijami in na koncu sestavljenih stavkov.
  • Za C++ je bil implementiran del sprememb in novosti, predlaganih v standardu C++20, vključno z virtualnimi funkcijami »consteval virtual«, psevdodestruktorji za konec življenjskega cikla objektov, uporabo razreda enum in izračun velikosti matrike v "novem" izrazu.
  • Za C++ je bila dodana eksperimentalna podpora za nekatere izboljšave, ki se razvijajo za prihodnji standard C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Na primer, zdaj obstaja podpora za dobesedno pripono »zu« za predpisane vrednosti size_t.
  • libstdc++ ima izboljšano podporo za standard C++17, vključno z uvedbo implementacij std::from_chars in std::to_chars za vrste s plavajočo vejico. Implementirani novi elementi standarda C++20, vključno s std::bit_cast, std::source_location, atomskimi operacijami čakanje in obveščanje, , , , , kot tudi elementi prihodnji standard C++ 23 (std::to_underlying, std::is_scoped_enum). Dodana eksperimentalna podpora za vrste za vzporedno obdelavo podatkov (SIMD, Data-Parallel Types). Implementacija std::uniform_int_distribution je bila pospešena.
  • Odstranjena je zastavica kakovosti alfa iz libgccjit, knjižnice v skupni rabi za vdelavo generatorja kode v druge procese in njegovo uporabo za organizacijo prevajanja JIT bajtne kode v strojno kodo. Dodana možnost gradnje libgccjit za MinGW.
  • Dodana podpora za arhitekturo AArch64 Armv8-R (-march=armv8-r). Za arhitekturi AArch64 in ARM je dodana podpora za procesorje (parametra -mcpu in -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) in Arm Neoverse N2 (neoverse-n2). Dodana sta bila tudi procesorja Fujitsu A64FX (a64fx) in Arm Cortex-R82 (cortex-r82), ki podpirata samo arhitekturo AArch64.
  • Dodana podpora za uporabo navodil SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) in MVE (AArch32 M-profil) za samodejno vektorizacijo operacij, ki izvajajo seštevanje, odštevanje, množenje in različice seštevanja/odštevanja preko kompleksna števila. Dodana začetna podpora za samodejno vektorizacijo za ARM z uporabo nabora navodil MVE.
  • Za platforme ARM je na voljo celoten nabor funkcij C (Intrinsics), integriranih v prevajalnik, ki jih nadomestijo razširjena vektorska navodila (SIMD), ki zajemajo vsa navodila NEON, dokumentirana v specifikaciji ACLE Q3 2020.
  • Podpora za GPE gfx908 je bila dodana v zaledje za generiranje kode za GPE AMD, ki temelji na mikroarhitekturi GCN.
  • Dodana podpora za nove procesorje in nove razširitve nabora ukazov, implementirane v njih:
    • Intel Sapphire Rapids (-march=sapphirerapids, omogoča podporo za navodila MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF16 in AVX-VNNI.
    • Intel Alderlake (-march=alderlake, omogoča podporo za navodila CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI in HRESET).
    • Intel Rocketlake (-march=rocketlake, podobno kot Rocket Lake brez podpore SGX).
    • AMD Zen 3 (-march=znver3).
  • Za sisteme IA-32/x86-64, ki temeljijo na procesorjih Intel, je dodana podpora za nova navodila procesorja TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Dodana podpora za zastavice "-march=x86-64-v[234]" za izbiro ravni arhitekture x86-64 (v2 - zajema razširitve SSE4.2, SSSE3, POPCNT in CMPXCHG16B; v3 - AVX2 in MOVBE; v4 - AVX-512 ) .
  • Dodana podpora za sisteme RISC-V z vrstnim redom bajtov velikega konca. Dodana možnost "-misa-spec=*" za izbiro različice specifikacije arhitekture nabora ukazov RISC-V. Dodana podpora za AddressSanitizer in zaščito skladov z uporabo oznak Canary.
  • Nadaljnje izboljšanje načina statične analize »-fanalyzer«, ki izvaja medproceduralno analizo poti izvajanja kode in tokov podatkov v programu, ki zahteva veliko virov. Način je sposoben zaznati težave na stopnji prevajanja, kot so dvojni klici funkcije free() za eno pomnilniško območje, uhajanje deskriptorjev datotek, dereferenciranje in posredovanje ničelnih kazalcev, dostopanje do sproščenih pomnilniških blokov, uporaba neinicializiranih vrednosti itd. V novi različici:
    • Koda za sledenje stanju programa je bila popolnoma prepisana. Težave s skeniranjem zelo velikih datotek C so bile odpravljene.
    • Dodana začetna podpora za C++.
    • Analiza dodeljevanja in sprostitve pomnilnika je bila povzeta iz posebnih funkcij malloc in free ter zdaj podpira new/delete in new[]/delete[].
    • Dodana nova opozorila: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const in -Wanalyzer-write-to-string-literal.
    • Dodani novi možnosti odpravljanja napak -fdump-analyzer-json in -fno-analyzer-feasibility.
    • Implementirana je bila možnost razširitve analizatorja prek vtičnikov za GCC (pripravljen je bil npr. vtičnik za preverjanje nepravilne uporabe globalnega zaklepanja (GIL) v CPython).

Vir: opennet.ru

Dodaj komentar