Izdanje GCC 11 kompajlerskog paketa

Nakon godinu dana razvoja, pušten je besplatni paket kompajlera GCC 11.1, prvo značajno izdanje u novoj grani GCC 11.x. U skladu s novom šemom numeriranja izdanja, u procesu razvoja korištena je verzija 11.0, a neposredno prije izdanja GCC 11.1, grana GCC 12.0 se već razgranala, iz koje će se formirati sljedeće veliko izdanje, GCC 12.1.

GCC 11.1 je poznat po prelasku na korištenje DWARF 5 formata datoteke za otklanjanje grešaka prema zadanim postavkama, zadanom uključivanju C++17 standarda (“-std=gnu++17”), značajnim poboljšanjima u podršci za C++20 standard, eksperimentalna podrška za C++23, poboljšanja vezana za budući standard jezika C (C2x), nove optimizacije performansi.

Glavne promjene:

  • Podrazumevani režim za jezik C++ je prebačen da koristi C++17 standard (-std=gnu++17) umesto prethodno ponuđenog C++14. Moguće je selektivno onemogućiti novo ponašanje C++17 prilikom obrade predložaka koji koriste druge šablone kao parametar (-fno-new-ttp-matching).
  • Dodata podrška za hardversko ubrzanje alata AddressSanitizer, koji vam omogućava da odredite činjenice pristupa oslobođenim memorijskim područjima, prevazilaženje granica dodijeljenog bafera i neke druge vrste grešaka pri radu s memorijom. Hardversko ubrzanje je trenutno dostupno samo za AArch64 arhitekturu i fokusirano je na upotrebu pri kompajliranju Linux kernela. Za omogućavanje hardverskog ubrzanja AddressSanitizer-a prilikom izgradnje komponenti korisničkog prostora, dodana je zastavica "-fsanitize=hwaddress" i zastavica kernela "-fsanitize=kernel-hwaddress".
  • Prilikom generiranja informacija za otklanjanje grešaka, standardno se koristi DWARF 5 format, koji, u poređenju sa prethodnim verzijama, omogućava generiranje 25% kompaktnijih podataka za otklanjanje grešaka. Potpuna podrška za DWARF 5 zahtijeva najmanje binutils verziju 2.35.2. DWARF 5 format je podržan u alatima za otklanjanje grešaka od GDB 8.0, valgrind 3.17.0, elfutils 0.172 i dwz 0.14. Za generiranje datoteka za otklanjanje grešaka koristeći druge verzije DWARF-a, možete koristiti opcije "-gdwarf-2", "-gdwarf-3" i "-gdwarf-4".
  • Zahtjevi za kompajlere koji se mogu koristiti za izgradnju GCC-a su povećani. Kompajler sada mora podržavati C++11 standard (ranije je bio potreban C++98), tj. Ako je GCC 10 bio dovoljan za izgradnju GCC 3.4, tada je za izgradnju GCC 11 sada potreban barem GCC 4.8.
  • Promijenjen je naziv i lokacija datoteka za spremanje dumpova, privremenih datoteka i dodatnih informacija potrebnih za LTO optimizaciju. Takve datoteke se sada uvijek spremaju u trenutni direktorij osim ako se putanja eksplicitno ne promijeni putem opcija "-dumpbase", "-dumpdir" i "-save-temps=*".
  • Podrška za binarni format BRIG za upotrebu sa jezikom HSAIL (srednji jezik heterogene arhitekture sistema) je zastarjela i uskoro će biti uklonjena.
  • Mogućnosti ThreadSanitizer moda (-fsanitize=thread) su proširene, dizajnirane da otkriju uslove trke kada se dijele iste podatke iz različitih niti aplikacije sa više niti. Novo izdanje dodaje podršku za alternativna vremena izvođenja i okruženja, kao i podršku za KCSAN (Kernel Concurrency Sanitizer) alat za otklanjanje grešaka, dizajniran da dinamički detektuje uslove trke unutar Linux kernela. Dodane su nove opcije "-param tsan-distinguish-volatile" i "-param tsan-instrument-func-entry-exit".
  • Brojevi kolona u dijagnostičkim porukama sada ne odražavaju broj bajtova s ​​početka reda, već zapravo brojeve kolona koji uzimaju u obzir višebajtne znakove i znakove koji zauzimaju nekoliko pozicija u retku (na primjer, znak 🙂 zauzima dvije pozicije i je kodiran u 4 bajta). Isto tako, znakovi tabulatora se sada tretiraju kao određeni broj razmaka (podesivo preko opcije -ftabstop, zadana vrijednost 8). Za vraćanje starog ponašanja predlaže se opcija “-fdiagnostics-column-unit=byte”, a za određivanje početne vrijednosti (numeracija od 0 ili 1) - opcija “-fdiagnostics-column-origin=”.
  • Vektorizator uzima u obzir cjelokupni sadržaj funkcije i dodaje mogućnosti obrade povezane sa sjecištima i referencama na prethodne blokove u grafu kontrolnog toka (CFG, graf kontrolnog toka).
  • Optimizator implementira mogućnost pretvaranja niza uvjetnih operacija koje upoređuju istu varijablu u izraz prekidača. Izraz prekidača se kasnije može kodirati korištenjem instrukcija za testiranje bitova (dodata je opcija “-fbit-tests” za kontrolu takve konverzije).
  • Poboljšane interproceduralne optimizacije. Dodan je novi IPA-modref prolaz (-fipa-modref) za praćenje nuspojava prilikom pozivanja funkcija i poboljšanje tačnosti analize. Poboljšana implementacija IPA-ICF prolaza (-fipa-icf), koji smanjuje potrošnju memorije tokom kompilacije i povećava broj unificiranih funkcija za koje se kombiniraju identični blokovi koda. U IPA-CP (Interprocedural constant propagation) prolazu, heuristika predviđanja je poboljšana, uzimajući u obzir poznate granice i karakteristike petlji.
  • U Linking Time Optimizations (LTO), format bajtkoda je optimizovan za smanjenje veličine i poboljšanje brzine obrade. Smanjena vršna potrošnja memorije tokom faze povezivanja.
  • U mehanizmu optimizacije zasnovanom na rezultatima profiliranja koda (PGO - Profile-guided optimization), koji omogućava generisanje optimalnijeg koda na osnovu analize karakteristika izvršenja, veličina fajlova sa GCOV podacima je smanjena zbog kompaktnijeg pakovanja nultih brojača. . Poboljšan način rada "-fprofile-values" praćenjem više parametara indirektnih poziva.
  • Implementacija OpenMP 5.0 (Open Multi-Processing) standarda, koji definiše API i metode za primenu metoda paralelnog programiranja na višejezgarnim i hibridnim (CPU+GPU/DSP) sistemima sa deljenom memorijom i jedinicama vektorizacije (SIMD), ima nastavio. Dodata inicijalna podrška za alokacijsku direktivu i mogućnost korištenja heterogenih petlji u OpenMP konstrukcijama. Implementirana podrška za varijablu okruženja OMP_TARGET_OFFLOAD.
  • Poboljšana je implementacija OpenACC 2.6 specifikacije paralelnog programiranja za jezike C, C++ i Fortran, koja definira alate za preuzimanje operacija na GPU-ovima i specijaliziranim procesorima, kao što je NVIDIA PTX.
  • Za jezike C implementiran je novi atribut “no_stack_protector”, dizajniran da označi funkcije za koje zaštita steka ne bi trebala biti omogućena (“-fstack-protector”). “malloc” atribut je proširen kako bi podržao identifikaciju parova poziva za dodjelu i oslobađanje memorije (alocator/deallocator), koji se koristi u statičkom analizatoru za identifikaciju tipičnih grešaka u radu s memorijom (curenje memorije, korištenje nakon oslobađanja, dvostruki pozivi na funkciju free, itd.) i u upozorenjima kompajlera “-Wmismatched-dealloc”, “-Wmismatched-new-delete” i “-Wfree-nonheap-object”, obavještavajući o nekonzistentnosti između operacija raspodjele memorije i dodjele memorije.
  • Dodata su nova upozorenja za jezik C:
    • "-Wmismatched-dealloc" (omogućeno prema zadanim postavkama) - upozorava na operacije raspodjele memorije koje koriste pokazivač koji nije kompatibilan s funkcijama dodjele memorije.
    • "-Wsizeof-array-div" (omogućeno kada je naveden "-Wall") - Upozorava o podjeli dva operatora sizeof ako djelitelj ne odgovara veličini elementa niza.
    • "-Wstringop-overread" (omogućeno po defaultu) - upozorava na pozivanje string funkcije koja čita podatke iz područja izvan granice niza.
    • "-Wtsan" (omogućeno po defaultu) - Upozorava na korištenje funkcija (kao što je std::atomic_thread_fence) koje nisu podržane u ThreadSanitizeru.
    • “-Warray-parameter” i “-Wvla-parameter” (omogućeno kada se specificira “-Wall”) - upozorava na nadjačavanje funkcija s nekompatibilnim deklaracijama argumenata povezanih s nizovima fiksne i promjenjive dužine.
    • Upozorenje "-Wuninitialized" sada otkriva pokušaje čitanja iz neinicijalizirane dinamički dodijeljene memorije.
    • Upozorenje "-Wfree-nonheap-object" proširuje definiciju slučajeva kada se funkcije oslobađanja memorije pozivaju s pokazivačem koji nije dobiven kroz funkcije dinamičke dodjele memorije.
    • Upozorenje "-Wmaybe-uninitialized" proširilo je detekciju prosljeđivanja pokazivača na funkcije koje se odnose na neinicijalizirane memorijske lokacije.
  • Za jezik C implementiran je dio novih mogućnosti razvijenih u okviru C2X standarda (omogućeno specificiranjem -std=c2x i -std=gnu2x): makroi BOOL_MAX i BOOL_WIDTH, opciono označavanje imena neiskorištenih parametara u funkciji definicije (kao u C++), atribut “[ [nodiscard]]”, preprocesorski operator “__has_c_attribute”, makroi FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_INBLITY, DSNF, DSNF, DSN_IN, 60559 LDBL_SNAN, DEC_INFINITY i DEC _NAN, NaN=makroi za FloatN, _FloatNx i _DecimalN, mogućnost specificiranja znakova za skok prije deklaracija i na kraju složenih izraza.
  • Za C++ je implementiran dio promjena i inovacija predloženih u standardu C++20, uključujući virtualne funkcije „consteval virtual“, pseudo-destruktore za kraj životnog ciklusa objekata, korištenje enum klase i izračunavanje veličine niza u "novi" izrazu.
  • Za C++ je dodana eksperimentalna podrška za neka poboljšanja koja se razvijaju za budući C++23 standard (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Na primjer, sada postoji podrška za literalni sufiks “zu” za vrijednosti s oznakom size_t.
  • libstdc++ je poboljšao podršku za C++17 standard, uključujući uvođenje implementacija std::from_chars i std::to_chars za tipove s pomičnim zarezom. Implementirani novi elementi C++20 standarda, uključujući std::bit_cast, std::source_location, atomske operacije čekaju i obavijesti, , , , , kao i elemente budući C++ standard 23 (std::to_underlying, std::is_scoped_enum). Dodata eksperimentalna podrška za tipove za paralelnu obradu podataka (SIMD, Data-Parallel Types). Implementacija std::uniform_int_distribution je ubrzana.
  • Uklonjena je oznaka kvaliteta alfa iz libgccjit, dijeljene biblioteke za ugrađivanje generatora koda u druge procese i korištenje za organiziranje JIT kompilacije bajtkoda u mašinski kod. Dodata mogućnost izrade libgccjit za MinGW.
  • Dodata podrška za AArch64 Armv8-R arhitekturu (-march=armv8-r). Za AArch64 i ARM arhitekture, dodata je podrška za procesore (parametri -mcpu i -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) i Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) i Arm Cortex-R82 (cortex-r82) procesori su takođe dodati, podržavajući samo AArch64 arhitekturu.
  • Dodata podrška za korištenje Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) i MVE (AArch32 M-profil) SIMD instrukcija za autovektorizaciju operacija koje izvode sabiranje, oduzimanje, množenje i varijante sabiranja/oduzimanja preko kompleksni brojevi. Dodata početna podrška za autovektorizaciju za ARM koristeći MVE skup instrukcija.
  • Za ARM platforme, obezbeđen je pun skup C funkcija (Intrinsics) integrisanih u kompajler, zamenjenih proširenim vektorskim instrukcijama (SIMD), koje pokrivaju sve NEON instrukcije dokumentovane u specifikaciji ACLE Q3 2020.
  • Podrška za gfx908 GPU je dodata u pozadinu za generisanje koda za AMD GPU zasnovane na GCN mikroarhitekturi.
  • Dodata podrška za nove procesore i nova proširenja skupa instrukcija implementirana u njima:
    • Intel Sapphire Rapids (-march=sapphirerapids, omogućava podršku za MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-XBF8 i AMT-TILE, AMX-XXBINT.16 instrukcije
    • Intel Alderlake (-march=alderlake, omogućava podršku za CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI i HRESET uputstva).
    • Intel Rocketlake (-march=rocketlake, slično Rocket Lakeu bez SGX podrške).
    • AMD Zen 3 (-march=znver3).
  • Za IA-32/x86-64 sisteme bazirane na Intel procesorima, dodata je podrška za nove procesorske instrukcije TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Dodata podrška za "-march=x86-64-v[234]" zastavice za odabir nivoa x86-64 arhitekture (v2 - pokriva SSE4.2, SSSE3, POPCNT i CMPXCHG16B ekstenzije; v3 - AVX2 i MOVBE; v4 - AVX-512 ) .
  • Dodata podrška za RISC-V sisteme sa big-endian redoslijedom bajtova. Dodata opcija "-misa-spec=*" za odabir verzije specifikacije arhitekture skupa instrukcija RISC-V. Dodata podrška za AddressSanitizer i zaštita steka pomoću kanarskih oznaka.
  • Kontinuirano poboljšanje režima statičke analize “-fanalyzer”, koji vrši međuproceduralnu analizu sa velikim brojem resursa puteva izvršavanja koda i tokova podataka u programu. Režim je sposoban da otkrije probleme u fazi kompilacije, kao što su dvostruki pozivi funkcije free() za jedno memorijsko područje, curenje deskriptora datoteke, dereferenciranje i prosljeđivanje null pokazivača, pristup oslobođenim memorijskim blokovima, korištenje neinicijaliziranih vrijednosti itd. U novoj verziji:
    • Kod za praćenje stanja programa je potpuno prepisan. Problemi sa skeniranjem veoma velikih C datoteka su riješeni.
    • Dodata početna podrška za C++.
    • Analiza alokacije i oslobađanja memorije je apstrahovana od specifičnih malloc i free funkcija, i sada podržava new/delete i new[]/delete[].
    • Dodata nova upozorenja: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const i -Wanalyzer-write-to-string-literal.
    • Dodane su nove opcije za otklanjanje grešaka -fdump-analyzer-json i -fno-analyzer-feasibility.
    • Implementirana je mogućnost proširenja analizatora preko dodataka za GCC (na primjer, pripremljen je dodatak za provjeru netačne upotrebe globalnog zaključavanja (GIL) u CPython-u).

izvor: opennet.ru

Dodajte komentar