GCC 11 kompilyatorlar to'plamining chiqarilishi

Bir yillik rivojlanishdan so'ng, bepul GCC 11.1 kompilyatorlar to'plami chiqarildi, bu yangi GCC 11.x filialidagi birinchi muhim nashr. Yangi nashrlarni raqamlash sxemasiga ko'ra, ishlab chiqish jarayonida 11.0 versiyasi ishlatilgan va GCC 11.1 chiqarilishidan biroz oldin GCC 12.0 filiali allaqachon ajratilgan bo'lib, undan GCC 12.1 ning keyingi muhim relizi hosil bo'ladi.

GCC 11.1 sukut bo'yicha DWARF 5 disk raskadrovka fayl formatidan foydalanishga o'tishi, C++ 17 standartining birlamchi qo'shilishi ("-std=gnu++17"), C++20 ni qo'llab-quvvatlashda sezilarli yaxshilanishlar bilan ajralib turadi. standart, C++ 23 uchun eksperimental yordam, kelajakdagi C tili standarti (C2x) bilan bog'liq yaxshilanishlar, yangi ishlash optimallashtirishlari.

Asosiy o'zgarishlar:

  • C++ tili uchun standart rejim ilgari taklif qilingan C++ 17 o‘rniga C++17 standartidan (-std=gnu++14) foydalanishga o‘tkazildi. Parametr sifatida boshqa shablonlardan foydalanadigan shablonlarni qayta ishlashda yangi C++17 xatti-harakatlarini tanlab o'chirib qo'yish mumkin (-fno-new-ttp-matching).
  • Bo'shatilgan xotira maydonlariga kirish, ajratilgan bufer chegarasidan tashqariga chiqish va xotira bilan ishlashda ba'zi boshqa turdagi xatolarni aniqlashga imkon beruvchi AddressSanitizer asbobini apparat tezlashtirish uchun qo'shimcha yordam. Uskuna tezlashuvi hozirda faqat AArch64 arxitekturasi uchun mavjud va Linux yadrosini kompilyatsiya qilishda foydalanishga qaratilgan. Foydalanuvchi maydoni komponentlarini yaratishda AddressSanitizer apparat tezlashuvini yoqish uchun “-fsanitize=hwaddress” bayrog‘i va “-fsanitize=kernel-hwaddress” yadro bayrog‘i qo‘shildi.
  • Nosozliklarni tuzatish ma'lumotlarini yaratishda sukut bo'yicha DWARF 5 formati ishlatiladi, bu avvalgi versiyalarga qaraganda 25% ixcham disk raskadrovka ma'lumotlarini yaratishga imkon beradi. DWARF 5-ni to'liq qo'llab-quvvatlash uchun kamida binutils 2.35.2 versiyasi kerak. DWARF 5 formati disk raskadrovka vositalarida GDB 8.0, valgrind 3.17.0, elfutils 0.172 va dwz 0.14 dan beri qo'llab-quvvatlanadi. DWARF ning boshqa versiyalari yordamida disk raskadrovka fayllarini yaratish uchun siz "-gdwarf-2", "-gdwarf-3" va "-gdwarf-4" opsiyalaridan foydalanishingiz mumkin.
  • GCC yaratish uchun ishlatilishi mumkin bo'lgan kompilyatorlarga qo'yiladigan talablar oshirildi. Endi kompilyator C++ 11 standartini qo'llab-quvvatlashi kerak (ilgari C++ 98 talab qilingan), ya'ni. Agar GCC 10 ni yaratish uchun GCC 3.4 yetarli boʻlsa, endi GCC 11 ni yaratish uchun kamida GCC 4.8 talab qilinadi.
  • Saqlash uchun fayllar nomi va joylashuvi, vaqtinchalik fayllar va LTO optimallashtirish uchun zarur bo'lgan qo'shimcha ma'lumotlar o'zgartirildi. Bunday fayllar endi "-dumpbase", "-dumpdir" va "-save-temps=*" parametrlari orqali aniq o'zgartirilmasa, har doim joriy katalogda saqlanadi.
  • HSAIL (Heterogen tizim arxitekturasi oraliq tili) tili bilan foydalanish uchun ikkilik BRIG formatini qo‘llab-quvvatlash bekor qilindi va tez orada o‘chirib tashlanadi.
  • ThreadSanitizer rejimining imkoniyatlari kengaytirildi (-fsanitize=thread) ko'p tarmoqli ilovaning turli mavzularidan bir xil ma'lumotlarni almashishda poyga sharoitlarini aniqlash uchun mo'ljallangan. Yangi versiya muqobil ish vaqtlari va muhitlarni qo'llab-quvvatlaydi, shuningdek, Linux yadrosidagi poyga sharoitlarini dinamik ravishda aniqlash uchun mo'ljallangan KCSAN (Yadro bir vaqtning o'zida sanitizer) disk raskadrovka vositasini qo'llab-quvvatlaydi. "-param tsan-distinguish-volatile" va "-param tsan-instrument-func-entry-exit" yangi variantlari qo'shildi.
  • Diagnostik xabarlardagi ustun raqamlari endi satr boshidan baytlar sonini emas, balki ko'p baytli belgilarni va satrda bir nechta pozitsiyalarni egallagan belgilarni hisobga olgan ustun raqamlarini aks ettiradi (masalan, 🙂 belgisi ikkita pozitsiyani egallaydi va 4 baytda kodlangan). Xuddi shunday, yorliq belgilari endi ma'lum miqdordagi bo'shliqlar sifatida ko'rib chiqiladi (-ftabstop opsiyasi orqali sozlanishi mumkin, standart 8). Eski xatti-harakatni tiklash uchun "-fdiagnostics-column-unit=bayt" opsiyasi taklif etiladi va boshlang'ich qiymatni aniqlash uchun (0 yoki 1 dan raqamlash) - "-fdiagnostics-column-origin=" varianti.
  • Vektorizator funktsiyaning butun mazmunini hisobga oladi va kesishmalar va oldingi bloklarga havolalar bilan bog'liq ishlov berish imkoniyatlarini qo'shadi (CFG, nazorat oqimi grafigi).
  • Optimallashtiruvchi bir xil o'zgaruvchini kalit ifodasiga solishtiradigan bir qator shartli operatsiyalarni aylantirish qobiliyatini amalga oshiradi. Switch ifodasi keyinchalik bit test ko'rsatmalari yordamida kodlanishi mumkin (bunday konvertatsiyani boshqarish uchun "-fbit-tests" opsiyasi qo'shilgan).
  • Protseduralararo optimallashtirishlar yaxshilandi. Funktsiyalarni chaqirishda nojo'ya ta'sirlarni kuzatish va tahlilning aniqligini yaxshilash uchun yangi IPA-modref o'tish (-fipa-modref) qo'shildi. IPA-ICF pass (-fipa-icf) ning takomillashtirilgan amalga oshirilishi, bu kompilyatsiya paytida xotira sarfini kamaytiradi va bir xil kod bloklari birlashtirilgan birlashtirilgan funktsiyalar sonini oshiradi. IPA-CP (protseduralararo doimiy tarqalish) o'tishida ma'lum chegaralar va halqalarning xususiyatlarini hisobga olgan holda bashorat evristikasi yaxshilandi.
  • Bog'lanish vaqtini optimallashtirishda (LTO) bayt-kod formati hajmni kamaytirish va ishlov berish tezligini yaxshilash uchun optimallashtirilgan. Bog'lanish bosqichida xotiraning maksimal iste'moli kamayadi.
  • Amalga oshirish xususiyatlarini tahlil qilish asosida yanada maqbul kodni yaratishga imkon beruvchi kodni profillash natijalariga asoslangan optimallashtirish mexanizmida (PGO - Profile-guided optimization), nol hisoblagichlarning yanada ixcham qadoqlanishi tufayli GCOV ma'lumotlariga ega fayllar hajmi kamayadi. . Bilvosita qo'ng'iroqlarda ko'proq parametrlarni kuzatib borish orqali yaxshilangan "-fprofile-values" rejimi.
  • Umumiy xotira va vektorlashtirish birliklari (SIMD) bilan ko'p yadroli va gibrid (CPU+GPU/DSP) tizimlarda parallel dasturlash usullarini qo'llashning API va usullarini belgilaydigan OpenMP 5.0 (Ochiq Multi-Processing) standartini joriy etish mavjud. davom etdi. Ajratish direktivasi uchun dastlabki yordam va OpenMP konstruktsiyalarida heterojen tsikllardan foydalanish qobiliyati qo'shildi. OMP_TARGET_OFFLOAD muhit oʻzgaruvchisi uchun qoʻllab-quvvatlandi.
  • C, C++ va Fortran tillari uchun taqdim etilgan OpenACC 2.6 parallel dasturlash spetsifikatsiyasini amalga oshirish takomillashtirildi, bu esa GPU va NVIDIA PTX kabi maxsus protsessorlarda yuk tushirish operatsiyalari vositalarini belgilaydi.
  • C tillari uchun yangi “no_stack_protector” atributi joriy etildi, u stek himoyasi yoqilmasligi kerak bo'lgan funksiyalarni belgilash uchun mo'ljallangan (“-fstack-protector”). "Malloc" atributi xotirani ajratish va bo'shatish uchun qo'ng'iroqlar juftligini aniqlashni qo'llab-quvvatlash uchun kengaytirildi (allocator/deallocator), u statik analizatorda xotira bilan ishlashda odatiy xatolarni aniqlash uchun ishlatiladi (xotira oqishlari, bo'shatilgandan keyin foydalanish, bepul funksiyaga ikki marta qo'ng'iroqlar va boshqalar) va kompilyator ogohlantirishlarida "-Wmismatched-dealloc", "-Wmismatched-new-delete" va "-Wfree-nonheap-object", xotirani ajratish va xotirani ajratish operatsiyalari o'rtasidagi nomuvofiqlik haqida xabar beradi.
  • C tili uchun yangi ogohlantirishlar qo'shildi:
    • "-Wmismatched-dealloc" (sukut bo'yicha yoqilgan) - xotirani ajratish funktsiyalari bilan mos kelmaydigan ko'rsatgichdan foydalanadigan xotirani ajratish operatsiyalari haqida ogohlantiradi.
    • "-Wsizeof-array-div" ("-Wall" ko'rsatilganda yoqiladi) - Agar bo'linuvchi massiv elementining o'lchamiga mos kelmasa, ikkita sizeof operatorini bo'lish haqida ogohlantiradi.
    • "-Wstringop-overread" (sukut bo'yicha yoqilgan) - massiv chegarasidan tashqaridagi hududdan ma'lumotlarni o'qiydigan string funktsiyasini chaqirish haqida ogohlantiradi.
    • "-Wtsan" (sukut bo'yicha yoqilgan) - ThreadSanitizer-da qo'llab-quvvatlanmaydigan xususiyatlardan (masalan, std::atomic_thread_fence) foydalanish haqida ogohlantiradi.
    • "-Warray-parameter" va "-Wvla-parameter" ("-Wall" ko'rsatilganda yoqilgan) - sobit va o'zgaruvchan uzunlikdagi massivlar bilan bog'liq argumentlarning mos kelmaydigan deklaratsiyasi bilan funktsiyalarni bekor qilish haqida ogohlantiradi.
    • "-Wuninitialized" ogohlantirishi endi ishga tushirilmagan dinamik ravishda ajratilgan xotiradan o'qishga urinishlarni aniqlaydi.
    • "-Wfree-nonheap-object" ogohlantirishi dinamik xotira ajratish funktsiyalari orqali olinmagan ko'rsatgich yordamida xotirani ajratish funktsiyalari chaqirilgan holatlar ta'rifini kengaytiradi.
    • "-Wmaybe-uninitialized" ogohlantirishi ishga tushirilmagan xotira joylariga ishora qiluvchi funksiyalarga ko'rsatgichlar o'tishni aniqlashni kengaytirdi.
  • C tili uchun C2X standarti doirasida ishlab chiqilgan yangi xususiyatlarning bir qismi amalga oshirildi (-std=c2x va -std=gnu2x belgilash orqali faollashtirilgan): BOOL_MAX va BOOL_WIDTH makroslari, funktsiyada foydalanilmagan parametrlar nomlarining ixtiyoriy ko'rsatilishi ta'riflar (C++ da bo'lgani kabi), atribut "[ [nodiscard]]", preprotsessor operatori "__has_c_attribute", makrolar FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_LTANFITY, FSN_LT_60559, FSN_LT_XNUMX, _SNAN, LDBL_SNAN, DEC_INFINITY va DEC _NAN, NaN=uchun makroslar FloatN, _FloatNx va _DecimalN, deklaratsiyalardan oldin va qo'shma bayonotlar oxirida o'tish belgilarini belgilash qobiliyati.
  • C++ uchun C++ 20 standartida taklif qilingan oʻzgartirish va yangiliklarning bir qismi, jumladan “consteval virtual” virtual funksiyalari, obʼyektlarning hayot tsiklining oxiri uchun psevdodestruktorlar, enum sinfidan foydalanish va "yangi" ifodada massiv hajmini hisoblash.
  • C++ uchun kelajakdagi C++23 standarti (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu) uchun ishlab chiqilayotgan baʼzi yaxshilanishlar uchun eksperimental yordam qoʻshildi. ++2b). Misol uchun, endi imzolangan size_t qiymatlari uchun "zu" so'zma-so'z qo'shimchasini qo'llab-quvvatlash mavjud.
  • libstdc++ std::from_chars va std::to_chars suzuvchi nuqta turlarini joriy etishni o‘z ichiga olgan C++17 standartini qo‘llab-quvvatlashni yaxshiladi. C++20 standartining yangi elementlari, jumladan std::bit_cast, std::source_location, atom operatsiyalari kutish va xabar berish, , , , , shuningdek, kelajakdagi C++ standarti 23 (std::to_underlying, std::is_scoped_enum). Parallel ma'lumotlarni qayta ishlash turlari uchun eksperimental yordam qo'shildi (SIMD, Data-Parallel Types). std::uniform_int_distribution dasturini amalga oshirish tezlashtirildi.
  • Kod generatorini boshqa jarayonlarga joylashtirish va undan JIT-ning mashina kodiga bayt-kod kompilyatsiyasini tashkil qilish uchun foydalanish uchun umumiy kutubxona bo'lgan libgccjit-dan alfa sifati bayrog'i olib tashlandi. MinGW uchun libgccjit yaratish qobiliyati qo'shildi.
  • AArch64 Armv8-R arxitekturasi uchun qoʻshimcha qoʻllab-quvvatlash (-march=armv8-r). AArch64 va ARM arxitekturalari uchun protsessorlarni qo'llab-quvvatlash qo'shildi (parametrlar -mcpu va -mtune): Arm Cortex-A78 (korteks-a78), Arm Cortex-A78AE (korteks-a78ae), Arm Cortex-A78C (korteks-a78c) , Arm Cortex- X1 (korteks-x1), Arm Neoverse V1 (neoverse-v1) va Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) va Arm Cortex-R82 (cortex-r82) protsessorlari ham qo'shildi, ular faqat AArch64 arxitekturasini qo'llab-quvvatlaydi.
  • Armv8.3-a (AAarch64/AArch32), SVE (AArch64), SVE2 (AArch64) va MVE (AAarch32 M-profili) SIMD ko'rsatmalaridan qo'shish, ayirish, ko'paytirish va qo'shish/ayirish variantlarini amalga oshiradigan operatsiyalarni avtovektorlashtirish uchun qo'shimcha yordam qo'shildi. murakkab sonlar. MVE ko'rsatmalar to'plamidan foydalangan holda ARM uchun avtovektorlashtirish uchun dastlabki yordam qo'shildi.
  • ARM platformalari uchun ACLE Q3 2020 spetsifikatsiyasida hujjatlashtirilgan barcha NEON koʻrsatmalarini qamrab oluvchi kengaytirilgan vektor koʻrsatmalari (SIMD) bilan almashtirilgan kompilyator bilan integratsiyalangan C funksiyalarining (Intrinsics) toʻliq toʻplami taqdim etiladi.
  • GCN mikroarxitekturasi asosidagi AMD GPU'lari uchun kod yaratish uchun gfx908 GPU-ni qo'llab-quvvatlash orqa qismga qo'shildi.
  • Yangi protsessorlar va ularda joriy qilingan yangi ko'rsatmalar to'plami kengaytmalari uchun qo'shimcha qo'llab-quvvatlash:
    • Intel Sapphire Rapids (-march=sapphirerapids, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TXLDTRK, AMT-TILEXNF va AMT-TILE-8V16, ko'rsatmalarini qo'llab-quvvatlash imkonini beradi.
    • Intel Alderlake (-march=alderlake, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI va HRESET ko'rsatmalarini qo'llab-quvvatlash imkonini beradi).
    • Intel Rocketlake (-march=rocketlake, SGX qo'llab-quvvatlamaydigan Rocket Lakega o'xshash).
    • AMD Zen 3 (-march=znver3).
  • Intel protsessorlariga asoslangan IA-32/x86-64 tizimlari uchun TXLDTRK, SERIALIZE, HRESET, UINTKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI yangi protsessor ko'rsatmalarini qo'llab-quvvatlash qo'shildi.
  • X86-64 arxitektura darajalarini tanlash uchun “-march=x234-86-v[64]” bayroqlari uchun qoʻshimcha yordam qoʻshildi (v2 - SSE4.2, SSSE3, POPCNT va CMPXCHG16B kengaytmalarini qamrab oladi; v3 - AVX2 va MOVBE; v4 - AVX-512 ).
  • Katta endian bayt tartibiga ega RISC-V tizimlari uchun qo'shimcha qo'llab-quvvatlash. RISC-V ko'rsatmalar to'plami arxitektura spetsifikatsiyasining versiyasini tanlash uchun "-misa-spec=*" opsiyasi qo'shildi. AddressSanitizer va kanareyka teglari yordamida stekni himoya qilish uchun qo'shimcha yordam qo'shildi.
  • Dasturda kodni bajarish yo'llari va ma'lumotlar oqimlarining resurs talab qiladigan protseduralararo tahlilini amalga oshiradigan "-fanalyzer" statik tahlil rejimini takomillashtirishni davom ettirish. Rejim kompilyatsiya bosqichidagi muammolarni aniqlashga qodir, masalan, bitta xotira maydoni uchun free() funksiyasiga ikki marta qo'ng'iroq qilish, fayl identifikatori oqish, nol ko'rsatkichlarni o'chirish va o'tkazish, bo'shatilgan xotira bloklariga kirish, ishga tushirilmagan qiymatlardan foydalanish va hokazo. Yangi versiyada:
    • Dastur holatini kuzatish uchun kod butunlay qayta yozildi. Juda katta C fayllarni skanerlash bilan bog'liq muammolar hal qilindi.
    • Dastlabki C++ qo'llab-quvvatlashi qo'shildi.
    • Xotirani ajratish va ajratish tahlili maxsus malloc va bepul funksiyalardan ajratilgan va endi yangi/oʻchirish va yangi[]/delete[] funksiyalarini qoʻllab-quvvatlaydi.
    • Yangi ogohlantirishlar qo'shildi: -Wanalyzer-shift-count-salbiy, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const va -Wanalyzer-write-to-string-literal.
    • Yangi disk raskadrovka imkoniyatlari qo'shildi -fdump-analyzer-json va -fno-analyzer-fisibility.
    • Analizatorni GCC uchun plaginlar orqali kengaytirish imkoniyati amalga oshirildi (masalan, CPython-da global qulflashning (GIL) noto'g'ri ishlatilishini tekshirish uchun plagin tayyorlangan).

Manba: opennet.ru

a Izoh qo'shish