A GCC 11 fordítócsomag kiadása

Egy év fejlesztés után megjelent az ingyenes GCC 11.1 fordítócsomag, az első jelentős kiadás az új GCC 11.x ágban. Az új kiadásszámozási séma szerint a fejlesztés során a 11.0-s verziót használták, nem sokkal a GCC 11.1 megjelenése előtt pedig már elágazódott a GCC 12.0 ága, amelyből a GCC 12.1 következő jelentős kiadása alakul ki.

A GCC 11.1 figyelemre méltó az alapértelmezésben a DWARF 5 hibakereső fájlformátum használatára való átállás, a C++17 szabvány ("-std=gnu++17") alapértelmezett beépítése, valamint a C++20 támogatásának jelentős fejlesztése. szabvány, kísérleti támogatás a C++23-hoz, a leendő C nyelvi szabványhoz (C2x) kapcsolatos fejlesztések, új teljesítményoptimalizálások.

Nagy változások:

  • A C++ nyelv alapértelmezett üzemmódja a C++17 szabvány (-std=gnu++17) használatára vált a korábban felajánlott C++14 helyett. Az új C++17 viselkedés szelektíven letiltható olyan sablonok feldolgozásakor, amelyek paraméterként más sablonokat használnak (-fno-new-ttp-matching).
  • Hozzáadott támogatás az AddressSanitizer eszköz hardveres gyorsításához, amely lehetővé teszi a felszabadult memóriaterületek elérésének tényeit, a lefoglalt puffer határain túllépést, valamint néhány más típusú hibát a memóriával való munka során. A hardveres gyorsítás jelenleg csak az AArch64 architektúrához érhető el, és a Linux kernel fordításakor történő felhasználásra összpontosít. Az AddressSanitizer hardveres gyorsításának engedélyezéséhez felhasználói terület-összetevők felépítésekor a „-fsanitize=hwaddress” jelző, valamint a „-fsanitize=kernel-hwaddress” kerneljelző lett hozzáadva.
  • A hibakeresési információk generálásakor alapértelmezésben a DWARF 5 formátumot használják, amely a korábbi verziókhoz képest 25%-kal kompaktabb hibakeresési adat generálását teszi lehetővé. A DWARF 5 teljes támogatásához legalább a binutils 2.35.2-es verziója szükséges. A DWARF 5 formátumot a GDB 8.0, a valgrind 3.17.0, az elfutils 0.172 és a dwz 0.14 óta támogatja a hibakereső eszközök. Ha a DWARF más verzióival hibakereső fájlokat szeretne létrehozni, használja a "-gdwarf-2", "-gdwarf-3" és "-gdwarf-4" opciókat.
  • A GCC felépítéséhez használható fordítókkal szemben támasztott követelmények megemelkedtek. A fordítónak most már támogatnia kell a C++11 szabványt (korábban a C++98 volt szükséges), pl. Ha a GCC 10 elég volt a GCC 3.4 elkészítéséhez, akkor most legalább a GCC 11 szükséges a GCC 4.8 elkészítéséhez.
  • Módosult a dumpok, ideiglenes fájlok és az LTO optimalizálásához szükséges további információk mentésére szolgáló fájlok neve és helye. Az ilyen fájlok mostantól mindig az aktuális könyvtárba kerülnek mentésre, kivéve, ha az elérési út kifejezetten megváltozott a "-dumpbase", "-dumpdir" és "-save-temps=*" opciókkal.
  • A HSAIL (Heterogeneous System Architecture Intermediate Language) nyelvvel használható BRIG bináris formátum támogatása elavult, és hamarosan megszűnik.
  • A ThreadSanitizer mód (-fsanitize=thread) képességei kibővültek, és úgy lettek kialakítva, hogy felismerjék a versenykörülményeket, amikor ugyanazokat az adatokat egy többszálú alkalmazás különböző szálairól osztják meg. Az új kiadás támogatja az alternatív futási környezeteket és környezeteket, valamint támogatja a KCSAN (Kernel Concurrency Sanitizer) hibakereső eszközt, amelyet a versenyfeltételek dinamikus észlelésére terveztek a Linux kernelen belül. Új opciók hozzáadva: "-param tsan-distinguish-volatile" és "-param tsan-instrument-func-entry-exit".
  • A diagnosztikai üzenetek oszlopszámai most már nem a sor elejétől számított bájtszámot tükrözik, hanem valójában azokat az oszlopszámokat, amelyek figyelembe veszik a többbájtos karaktereket és a sorban több pozíciót elfoglaló karaktereket (például a 🙂 karakter két helyet foglal el és 4 bájtban van kódolva). Hasonlóképpen, a tabulátor karaktereket a rendszer bizonyos számú szóközként kezeli (az -ftabstop opcióval konfigurálható, alapértelmezés szerint 8). A régi viselkedés visszaállításához a „-fdiagnostics-column-unit=byte” opciót javasoljuk, a kezdeti érték meghatározásához pedig (0-tól vagy 1-től) a „-fdiagnostics-column-origin=” opciót.
  • A vektorizáló figyelembe veszi a függvény teljes tartalmát, és hozzáadja a metszéspontokhoz és a korábbi blokkokra való hivatkozásokhoz társított feldolgozási képességeket a vezérlőfolyamat grafikonon (CFG, control-flow graph).
  • Az optimalizáló olyan feltételes műveletek sorozatát valósítja meg, amelyek ugyanazt a változót hasonlítják össze kapcsolókifejezéssé. A jövőben a kapcsoló kifejezés bittesztelési utasításokkal kódolható (az „-fbit-tests” opció hozzáadásra került az ilyen átalakítás vezérlésére).
  • Továbbfejlesztett eljárások közötti optimalizálás. Új IPA-modref pass (-fipa-modref) került hozzáadásra a függvényhívások mellékhatásainak nyomon követésére és az elemzés pontosságának javítására. Az IPA-ICF pass (-fipa-icf) továbbfejlesztett megvalósítása, amely csökkenti a memóriafelhasználást a fordítás során, és növeli az egyesített funkciók számát, amelyekhez azonos kódblokkokat kombinálnak. Az IPA-CP (Interprocedurális állandó terjedés) lépésben az előrejelzési heurisztikát javították, figyelembe véve a hurkok ismert határait és jellemzőit.
  • A Linking Time Optimizations (LTO) programban a bájtkód formátum a méret csökkentése és a feldolgozási sebesség javítása érdekében van optimalizálva. Csökkentett csúcsmemória-fogyasztás a kötési fázisban.
  • A kódprofilozás eredményein alapuló optimalizálási mechanizmusban (PGO - Profile-guided optimization), amely a végrehajtási jellemzők elemzése alapján optimálisabb kód generálását teszi lehetővé, a GCOV adatokat tartalmazó fájlok mérete csökken a nulla számlálók kompaktabb csomagolásának köszönhetően. . Továbbfejlesztett "-fprofile-values" mód a közvetett hívások több paraméterének nyomon követésével.
  • Az OpenMP 5.0 (Open Multi-Processing) szabvány megvalósítása, amely meghatározza az API-t és a párhuzamos programozási módszerek alkalmazásának módszereit többmagos és hibrid (CPU+GPU/DSP) rendszereken osztott memóriával és vektorizációs egységekkel (SIMD) folytatta. Az allokációs direktíva kezdeti támogatása és a heterogén hurkok használatának képessége az OpenMP konstrukciókban. Bevezetett támogatás az OMP_TARGET_OFFLOAD környezeti változóhoz.
  • Javult a C, C++ és Fortran nyelvekhez biztosított OpenACC 2.6 párhuzamos programozási specifikáció megvalósítása, amely eszközöket határoz meg a GPU-k és speciális processzorok, például az NVIDIA PTX műveleteinek tehermentesítéséhez.
  • A C nyelveknél egy új „no_stack_protector” attribútumot vezettek be, amely azon függvények megjelölésére szolgál, amelyeknél a veremvédelem nem engedélyezhető („-fstack-protector”). A „malloc” attribútumot kibővítettük, hogy támogassa a memória lefoglalására és felszabadítására szolgáló híváspárok azonosítását (allokátor/leválasztó), amelyet a statikus elemző a memóriával való munka során előforduló tipikus hibák azonosítására használ (memóriaszivárgás, felszabadítás utáni használat, a szabad függvény dupla hívása stb.), valamint a fordítói figyelmeztetésekben a „-Wmismatched-dealloc”, „-Wmismatched-new-delete” és „-Wfree-nonheap-object”, a memóriafelszabadítási és a memóriafoglalási műveletek közötti inkonzisztenciáról tájékoztatva.
  • Új figyelmeztetések kerültek hozzáadásra a C nyelvhez:
    • "-Wmismatched-dealloc" (alapértelmezés szerint engedélyezve) – figyelmeztet azokra a memóriafelszabadítási műveletekre, amelyek olyan mutatót használnak, amely nem kompatibilis a memóriafoglalási funkciókkal.
    • "-Wsizeof-array-div" (engedélyezve, ha a "-Wall" meg van adva) - Figyelmeztet két sizeof operátor felosztására, ha az osztó nem egyezik a tömbelem méretével.
    • "-Wstringop-overread" (alapértelmezés szerint engedélyezve) – figyelmeztet egy karakterlánc-függvény meghívására, amely a tömbhatáron kívül eső területről olvas adatokat.
    • "-Wtsan" (alapértelmezés szerint engedélyezve) – Figyelmeztet a ThreadSanitizerben nem támogatott szolgáltatások (például std::atomic_thread_fence) használatára.
    • „-Warray-parameter” és „-Wvla-parameter” (engedélyezve a „-Wall” megadásakor) – figyelmeztet a függvények felülbírálására a fix és változó hosszúságú tömbökhöz társított argumentumok inkompatibilis deklarációival.
    • A "-Wuninitialized" figyelmeztetés mostantól észleli az olvasási kísérleteket az inicializálatlan, dinamikusan lefoglalt memóriából.
    • A "-Wfree-nonheap-object" figyelmeztetés kibővíti azon esetek definícióját, amikor a memóriafelszabadítási függvényeket olyan mutatóval hívják meg, amelyet nem a dinamikus memóriafoglalási függvényekkel kaptak meg.
    • A "-Wmaybe-initialized" figyelmeztetés kiterjesztette az átadandó mutatók észlelését olyan funkciókra, amelyek nem inicializált memóriahelyekre utalnak.
  • A C nyelv esetében a C2X szabvány keretein belül kifejlesztett új szolgáltatások egy része implementálásra került (a -std=c2x és -std=gnu2x megadásával engedélyezve): BOOL_MAX és BOOL_WIDTH makrók, a nem használt paraméterek nevének opcionális jelzése a függvényben. definíciók (mint a C++-ban), „[ [nodiscard]]” attribútum, „__has_c_attribute” előfeldolgozó operátor, makrók FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_BL_60559AN, IN, XNUMX LDBL_SNAN, DEC_INFINITY és DEC _NAN, NaN = makrók FloatN, _FloatNx és _DecimalN, ugrásjelek megadásának képessége a deklarációk előtt és az összetett utasítások végén.
  • A C++ esetében a C++20 szabványban javasolt változtatások és újítások egy része megvalósult, beleértve a „consteval virtual” virtuális függvényeket, az objektumok életciklusának végére szolgáló pszeudodestruktorokat, az enum osztály használatát, ill. egy tömb méretének kiszámítása az „új” kifejezésben.
  • A C++ esetében kísérleti támogatást adtunk a jövőbeli C++23 szabvány néhány fejlesztéséhez (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Például most már támogatott a „zu” szó szerinti utótag az előjeles size_t értékekhez.
  • A libstdc++ továbbfejlesztette a C++17 szabvány támogatását, beleértve az std::from_chars és std::to_chars megvalósításokat a lebegőpontos típusokhoz. A C++20 szabvány új elemeit implementáltuk, beleértve az std::bit_cast, std::source_location, atomi műveletek várakozás és értesítés, , , , , valamint a jövőbeli C++ 23-as szabvány (std::to_underlying, std::is_scoped_enum). Kísérleti támogatás hozzáadva a párhuzamos adatfeldolgozáshoz szükséges típusokhoz (SIMD, Data-Parallel Types). Az std::uniform_int_distribution megvalósítása felgyorsult.
  • Eltávolítottuk az alfa minőségjelzőt a libgccjit-ből, egy megosztott könyvtárból, amely kódgenerátort más folyamatokba ágyaz be, és arra használja, hogy a bájtkód JIT fordítását gépi kódba szervezze. Hozzáadtuk a libgccjit összeállításának lehetőségét a MinGW számára.
  • Támogatás hozzáadva az AArch64 Armv8-R architektúrához (-march=armv8-r). Az AArch64 és ARM architektúrákhoz hozzáadták a processzorok támogatását (-mcpu és -mtune paraméterek): 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) és Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) és Arm Cortex-R82 (cortex-r82) CPU-k is hozzáadásra kerültek, amelyek csak az AArch64 architektúrát támogatják.
  • Hozzáadott támogatás az Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) és MVE (AArch32 M-profil) SIMD utasításokhoz az összeadás, kivonás, szorzás és az összeadás/kivonás különböző változataihoz tartozó műveletek automatikus vektorizálásához komplex számok. Kezdeti támogatás hozzáadva az ARM automatikus vektorizálásához az MVE utasításkészlet használatával.
  • Az ARM-platformok esetében a fordítóba integrált C-függvények (Intrinsics) teljes készlete biztosított, amelyet kiterjesztett vektoros utasítások (SIMD) váltanak fel, és lefedik az ACLE Q3 2020 specifikációban dokumentált NEON-utasításokat.
  • A gfx908 GPU támogatása hozzáadásra került a háttérrendszerhez, amely a GCN mikroarchitektúrán alapuló kódot generál az AMD GPU-khoz.
  • Támogatás hozzáadva az új processzorokhoz és a bennük implementált új utasításkészlet-bővítményekhez:
    • Intel Sapphire Rapids (-march=sapphirerapids, lehetővé teszi a MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-TILE, AMX-BFX8, 16NIMX-BFXXNUMX, XNUMXNIMX-BFXXNUMX, XNUMXNIMX-BFXXNUMX-V.
    • Intel Alderlake (-march=alderlake, lehetővé teszi a CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI és HRESET utasítások támogatását).
    • Intel Rocketlake (-march=rocketlake, hasonló a Rocket Lake-hez SGX támogatás nélkül).
    • AMD Zen 3 (-march=znver3).
  • Az Intel processzorokra épülő IA-32/x86-64 rendszerekhez új processzorutasítások támogatása (TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI) bővült.
  • A "-march=x86-64-v[234]" jelzők támogatása az x86-64 architektúra szintek kiválasztásához (v2 - SSE4.2, SSSE3, POPCNT és CMPXCHG16B kiterjesztések; v3 - AVX2 és MOVBE; v4 - AVX-512 ) .
  • Hozzáadott támogatás a RISC-V rendszerekhez, nagy bájtsorrenddel. A "-misa-spec=*" opció hozzáadva a RISC-V utasításkészlet architektúra specifikációjának verziójának kiválasztásához. Az AddressSanitizer támogatása és a veremvédelem a kanári címkékkel.
  • A „-fanalyzer” statikus elemzési mód folyamatos fejlesztése, amely a programban található kódvégrehajtási útvonalak és adatfolyamok erőforrásigényes eljárásközi elemzését végzi. Az üzemmód képes a fordítási szakaszban felmerülő problémák észlelésére, mint például a free() függvény dupla hívása egy memóriaterületre, fájlleíró szivárgások, nulla mutatók hivatkozás megszüntetése és átadása, felszabadult memóriablokkok elérése, inicializálatlan értékek használata stb. Az új verzióban:
    • A program állapotának követésére szolgáló kódot teljesen átírták. A nagyon nagy C-fájlok szkennelésével kapcsolatos problémák megoldódtak.
    • Kezdeti C++ támogatás hozzáadva.
    • A memóriafoglalás és a felszabadítás elemzése elvonatkoztatott a konkrét malloc és free funkcióktól, és mostantól támogatja a new/delete és new[]/delete[] funkciót.
    • Új figyelmeztetések hozzáadva: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const és -Wanalyzer-write-to-string-literal.
    • Új hibakeresési beállítások -fdump-analyzer-json és -fno-analyzer-feasibility.
    • Megvalósították azt a képességet, hogy az elemző bővítményt bővítsenek a GCC-hez (például előkészítettek egy beépülő modult a globális zárolás (GIL) helytelen használatának ellenőrzésére a CPythonban).

Forrás: opennet.ru

Hozzászólás