Нашри маҷмӯи компилятори GCC 11

Пас аз як соли рушд, нашри маҷмӯи компилятори ройгони GCC 11.1 бароварда шуд, ки аввалин нашри муҳим дар филиали нави GCC 11.x. Тибқи нақшаи рақамгузории нави релиз, версияи 11.0 ҳангоми таҳия истифода мешуд ва чанде пеш аз нашри GCC 11.1, филиали GCC 12.0 аллакай ҷудо шуда буд, ки аз он версияи муҳими навбатии GCC 12.1 ташаккул меёбад.

GCC 11.1 бо гузаштан ба истифодаи формати файли ислоҳи DWARF 5 ба таври нобаёнӣ, дохилкунии пешфарз стандарти C++17 (“-std=gnu++17”), беҳбудиҳои назаррас дар дастгирии C++20 намоён аст. стандартӣ, дастгирии таҷрибавӣ барои C++ 23, такмили марбут ба стандарти ояндаи забони C (C2x), оптимизатсияи нави иҷроиш.

Тағйироти асосӣ:

  • Ҳолати пешфарз барои забони C++ ба истифодаи стандарти C++17 (-std=gnu++17) ба ҷои C++14, ки қаблан пешниҳод шуда буд, иваз карда шудааст. Ҳангоми коркарди қолибҳое, ки қолабҳои дигарро ҳамчун параметр истифода мебаранд (-fno-new-ttp-matching) рафтори нави C++17-ро интихобан ғайрифаъол кардан мумкин аст.
  • Дастгирии иловагии суръатбахшии сахтафзори абзори AddressSanitizer, ки ба шумо имкон медиҳад, ки далелҳои дастрасии минтақаҳои хотираи озодшуда, берун аз ҳудуди буфери ҷудошуда ва баъзе дигар хатогиҳоро ҳангоми кор бо хотира муайян кунед. Шитоби сахтафзор ҳоло танҳо барои меъмории AArch64 дастрас аст ва ба истифода ҳангоми тартиб додани ядрои Linux нигаронида шудааст. Барои фаъол кардани суръатбахшии сахтафзори AddressSanitizer ҳангоми сохтани ҷузъҳои фазои корбар, парчами "-fsanitize=hwaddress" ва парчами ядро ​​"-fsanitize=kernel-hwaddress" илова карда шудааст.
  • Ҳангоми тавлиди иттилооти ислоҳи хатогӣ, формати DWARF 5 ба таври нобаёнӣ истифода мешавад, ки дар муқоиса бо версияҳои қаблӣ имкон медиҳад, ки 25% маълумоти паймоне аз ислоҳи ислоҳот тавлид шавад. Дастгирии пурраи DWARF 5 ҳадди аққал версияи binutils 2.35.2-ро талаб мекунад. Формати DWARF 5 дар абзорҳои ислоҳкунӣ аз GDB 8.0, valgrind 3.17.0, elfutils 0.172 ва dwz 0.14 дастгирӣ карда мешавад. Барои тавлиди файлҳои ислоҳӣ бо истифода аз версияҳои дигари DWARF, шумо метавонед имконоти "-gdwarf-2", "-gdwarf-3" ва "-gdwarf-4" -ро истифода баред.
  • Талабот ба компиляторҳое, ки метавонанд барои сохтани GCC истифода шаванд, зиёд карда шуданд. Компилятор ҳоло бояд стандарти C++ 11-ро дастгирӣ кунад (қаблан C++ 98 лозим буд), яъне. Агар GCC 10 барои сохтани GCC 3.4 кифоя бошад, пас барои сохтани GCC 11 ҳадди аққал GCC 4.8 лозим аст.
  • Ном ва ҷойгиршавии файлҳо барои захира кардани партовҳо, файлҳои муваққатӣ ва маълумоти иловагӣ, ки барои оптимизатсияи LTO заруранд, тағир дода шуданд. Чунин файлҳо ҳоло ҳамеша дар феҳристи ҷорӣ нигоҳ дошта мешаванд, агар роҳ ба таври возеҳ тавассути имконоти "-dumpbase", "-dumpdir" ва "-save-temps=*" тағир наёбад.
  • Дастгирии формати бинарии BRIG барои истифода бо забони HSAIL (Heterogeneous System Architecture Architecture Intermediate Language) бекор карда шудааст ва ба зудӣ хориҷ карда мешавад.
  • Имкониятҳои режими ThreadSanitizer (-fsanitize=thread) васеъ карда шудаанд, ки барои муайян кардани шароити мусобиқа ҳангоми мубодилаи як маълумот аз риштаҳои гуногуни замимаи бисёрсоҳавӣ тарҳрезӣ шудаанд. Нашри нав дастгирии вақтҳои алтернативӣ ва муҳитҳо, инчунин дастгирии асбоби ислоҳи KCSAN (Kernel Concurrency Sanitizer), ки барои ба таври динамикӣ ошкор кардани шароити мусобиқа дар ядрои Linux пешбинӣ шудааст, илова мекунад. Вариантҳои нави "-param tsan-distinguish-volatile" ва "-param tsan-instrument-func-entry-exit" илова карда шуданд.
  • Рақамҳои сутунҳо дар паёмҳои ташхисӣ акнун на шумораи байтҳоро аз аввали сатр, балки дар асл рақамҳои сутунҳоеро инъикос мекунанд, ки аломатҳои чандбайтӣ ва аломатҳои чанд мавқеъро дар сатр ишғол мекунанд (масалан, аломати 🙂 ду мавқеъро ишғол мекунад ва дар 4 байт рамзгузорӣ шудааст). Ба ҳамин монанд, аломатҳои ҷадвал ҳоло ҳамчун шумораи муайяни ҷойҳо баррасӣ карда мешаванд (тавассути опсияи -ftabstop танзим карда мешавад, пешфарз 8). Барои барқарор кардани рафтори кӯҳна, опсияи "-fdiagnostics-column-unit=byte" ва барои муайян кардани арзиши ибтидоӣ (рақамгузорӣ аз 0 ё 1) - опсияи "-fdiagnostics-column-origin=" пешниҳод карда мешавад.
  • Векторизатор тамоми мундариҷаи функсияро ба инобат мегирад ва қобилиятҳои коркарди марбут ба чорроҳаҳо ва истинодҳо ба блокҳои қаблиро дар графи ҷараёни назорат (CFG, графи назорат) илова мекунад.
  • Оптимизатор қобилияти табдил додани як қатор амалҳои шартиро, ки ҳамон як тағирёбандаро ба ифодаи гузариш муқоиса мекунанд, амалӣ мекунад. Ифодаи гузаришро баъдтар бо истифода аз дастурҳои санҷиши бит рамзгузорӣ кардан мумкин аст (барои назорати чунин табдилдиҳӣ опсияи “-fbit-tests” илова карда шудааст).
  • Мукаммалгардонии оптимизатсияи байнипроцессуалӣ. Барои пайгирии таъсири тараф ҳангоми занг задан ба функсияҳо ва беҳтар кардани дақиқии таҳлил як гузаргоҳи нави IPA-modref (-fipa-modref) илова карда шуд. Татбиқи мукаммали гузариш IPA-ICF (-fipa-icf), ки масрафи хотираро ҳангоми тартибдиҳӣ коҳиш медиҳад ва шумораи функсияҳои ягонаро, ки барои онҳо блокҳои якхелаи код муттаҳид мешаванд, зиёд мекунад. Дар гузариши IPA-CP (Interprocedural Continent Propagation), эвристикаи пешгӯӣ бо назардошти сарҳадҳои маълум ва хусусиятҳои ҳалқаҳо такмил дода шудааст.
  • Дар Linking Time Optimizations (LTO), формати байткод барои кам кардани андоза ва беҳтар кардани суръати коркард оптимизатсия карда шудааст. Дар марҳилаи ҳатмӣ истеъмоли ҳадди аксари хотира кам карда шуд.
  • Дар механизми оптимизатсия дар асоси натиҷаҳои профилсозии код (PGO - Optimization Profile Guided), ки имкон медиҳад коди оптималӣ дар асоси таҳлили хусусиятҳои иҷро тавлид карда шавад, андозаи файлҳо бо маълумоти GCOV аз ҳисоби бастабандии зичтари ҳисобкунакҳои сифр кам карда мешавад. . Реҷаи беҳтаршудаи "-fprofile-values" тавассути пайгирии параметрҳои бештар дар зангҳои ғайримустақим.
  • Амалисозии стандарти OpenMP 5.0 (Open Multi-Processing), ки API ва усулҳои татбиқи усулҳои барномасозии параллелӣ дар системаҳои бисёраслӣ ва гибридӣ (CPU+GPU/DSP) бо хотираи муштарак ва воҳидҳои векторизатсия (SIMD)-ро муайян мекунад. давом дод. Дастгирии ибтидоӣ барои дастури ҷудокунӣ ва қобилияти истифодаи ҳалқаҳои гетерогенӣ дар конструксияҳои OpenMP илова карда шуд. Дастгирии амалӣ барои тағирёбандаи муҳити OMP_TARGET_OFFLOAD.
  • Татбиқи мушаххасоти барномасозии параллелии OpenACC 2.6, ки барои забонҳои C, C++ ва Fortran пешбинӣ шудааст, такмил дода шудааст, ки асбобҳоро барои борфарорӣ дар GPU ва протсессори махсус, ба монанди NVIDIA PTX муайян мекунад.
  • Барои забонҳои C, атрибути нави "no_stack_protector" амалӣ карда шудааст, ки барои нишон додани функсияҳое тарҳрезӣ шудааст, ки барои онҳо муҳофизати стек набояд фаъол карда шавад (“-fstack-protector”). Аттрибути "malloc" барои дастгирии муайянкунии ҷуфтҳои зангҳо барои ҷудо кардан ва озод кардани хотира (аллокатор/деаллокатор), ки дар анализатори статикӣ барои муайян кардани хатогиҳои маъмулӣ дар кор бо хотира истифода мешавад (хуриши хотира, истифода пас аз озодкунӣ, зангҳои дукарата ба функсияи озод ва ғ.) ва дар огоҳиҳои компилятор "-Wmismatched-dealloc", "-Wmismatched-new-delete" ва "-Wfree-nonheap-object", хабар медиҳад, ки дар бораи номувофиқатӣ байни ҷудокунии хотира ва амалиёти тақсимоти хотира.
  • Барои забони C огоҳиҳои нав илова карда шуданд:
    • "-Wmismatched-dealloc" (бо нобаёнӣ фаъол аст) - дар бораи амалиёти ҷудокунии хотира, ки ишораеро истифода мебаранд, ки бо функсияҳои тақсимоти хотира мувофиқ нестанд, огоҳ мекунад.
    • "-Wsizeof-array-div" (вақте ки "-Wall" муайян карда мешавад, фаъол аст) - Огоҳӣ медиҳад, ки ду оператори андозаи андозаи тақсимкунанда ба андозаи элементи массив мувофиқат накунад.
    • "-Wstringop-overread" (бо нобаёнӣ фаъол аст) - дар бораи даъват кардани функсияи сатр, ки маълумотро аз минтақаи берун аз ҳудуди массив мехонад, огоҳ мекунад.
    • "-Wtsan" (бо нобаёнӣ фаъол аст) - Огоҳӣ дар бораи истифодаи хусусиятҳо (ба монанди std::atomic_thread_fence), ки дар ThreadSanitizer дастгирӣ намешаванд.
    • "-Warray-parameter" ва "-Wvla-parameter" (ҳангоми муайян кардани "-Wall" фаъол аст) - дар бораи бекор кардани функсияҳо бо эъломияҳои номувофиқи аргументҳои марбут ба массивҳои собит ва тағирёбандаи дарозӣ огоҳ мекунад.
    • Огоҳии "-Wuninitialized" ҳоло кӯшиши хонданро аз хотираи ба таври динамикӣ ҷудошуда муайян мекунад.
    • Огоҳии "-Wfree-nonheap-object" таърифи ҳолатҳоеро васеъ мекунад, ки дар он функсияҳои ҷудокунии хотира бо нишондиҳандае даъват карда мешаванд, ки тавассути функсияҳои тақсимоти динамикии хотира ба даст намеояд.
    • Огоҳии "-Wmaybe-uninitialized" ошкоркунии интиқоли ишораҳоро ба функсияҳое, ки ба маконҳои хотираи оғознашуда ишора мекунанд, васеъ кардааст.
  • Барои забони Си, як қисми хусусиятҳои наве, ки дар доираи стандарти C2X таҳия шудаанд, амалӣ карда шуданд (бо нишон додани -std=c2x ва -std=gnu2x фаъол карда шудааст): макросҳои BOOL_MAX ва BOOL_WIDTH, зикри ихтиёрии номҳои параметрҳои истифоданашуда дар функсия таърифҳо (ба монанди дар C++), аттрибути "[ [nodiscard]]", оператори пешазпросессори "__has_c_attribute", макросҳо FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559ANF, FSN_LT_XNUMX, _SNAN, LDBL_SNAN, DEC_INFINITY ва DEC _NAN, NaN=макросҳо барои FloatN, _FloatNx ва _DecimalN, қобилияти муайян кардани аломатҳои ҷаҳиш пеш аз эъломияҳо ва дар охири изҳороти мураккаб.
  • Барои C++, як қисми тағирот ва навовариҳои дар стандарти C++20 пешниҳодшуда, аз ҷумла функсияҳои виртуалии “consteval virtual”, псевдодеструкторҳо барои анҷоми давраи ҳаёти объектҳо, истифодаи синфи enum ва ҳисоб кардани андозаи массив дар ифодаи "нав".
  • Барои C++, дастгирии таҷрибавӣ барои баъзе такмилҳое, ки барои стандарти ояндаи C++23 таҳия карда мешаванд, илова карда шудааст (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2б). Масалан, ҳоло барои арзишҳои имзошудаи size_t суффикси аслии "zu" дастгирӣ карда мешавад.
  • libstdc++ дастгирии стандарти C++17-ро беҳтар кардааст, аз ҷумла ҷорӣ намудани татбиқи std::from_chars ва std::to_chars барои намудҳои нуқтаи шинокунанда. Унсурҳои нави стандарти C++20 амалӣ карда шуданд, аз ҷумла std::bit_cast, std::source_location, амалиёти атомӣ интизоранд ва огоҳ мекунанд, , , , , инчунин унсурҳои ояндаи C ++ стандарти 23 (std :: to_underlying, std :: is_scoped_enum). Дастгирии таҷрибавӣ барои намудҳои коркарди параллелӣ (SIMD, Types Data-Parallel) илова карда шуд. Татбиқи std::uniform_int_distribution суръат гирифт.
  • Парчами сифати алфа аз libgccjit, китобхонаи муштарак барои ворид кардани генератори код ба равандҳои дигар ва истифодаи он барои ташкили JIT-и байткод ба рамзи мошин хориҷ карда шуд. Қобилияти сохтани libgccjit барои MinGW илова карда шуд.
  • Дастгирии иловашуда барои меъмории AArch64 Armv8-R (-march = armv8-r). Барои меъмории AArch64 ва ARM, дастгирии протсессорҳо илова карда шудааст (параметрҳои -mcpu ва -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) ва Arm Neoverse N2 (neoverse-n2). CPU-ҳои Fujitsu A64FX (a64fx) ва Arm Cortex-R82 (cortex-r82) низ илова карда шудаанд, ки танҳо меъмории AArch64-ро дастгирӣ мекунанд.
  • Дастгирии иловашуда барои истифодаи Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) ва MVE (AArch32 M-profili) SIMD барои автовекторизатсияи амалҳои анҷом додани илова, тарҳ, зарб ва вариантҳои илова/тарҳ аз болои рақамҳои мураккаб. Дастгирии ибтидоӣ барои автовекторизатсия барои ARM бо истифода аз маҷмӯи дастурҳои MVE илова карда шуд.
  • Барои платформаҳои ARM, маҷмӯи пурраи функсияҳои бо компилятор ҳамгирошудаи C (Intrinsics) пешниҳод карда мешавад, ки бо дастурҳои васеъи векторӣ (SIMD) иваз карда шудаанд, ки ҳамаи дастурҳои NEON-ро дар мушаххасоти ACLE Q3 2020 ҳуҷҷатгузорӣ мекунанд.
  • Дастгирии gfx908 GPU ба пуштибонӣ барои тавлиди код барои GPU-ҳои AMD дар асоси микроархитектураи GCN илова карда шудааст.
  • Дастгирии иловашуда барои протсессорҳои нав ва васеъшавии маҷмӯи дастурҳои нав, ки дар онҳо татбиқ карда шудаанд:
    • Intel Sapphire Rapids (-march=sapphirerapids, имкон медиҳад, ки дастурҳои MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TXLDTRK, AMT-TILEXINF ва дастурҳои AMT-TILEXINF-ро дастгирӣ кунанд.
    • Intel Alderlake (-march=alderlake, имкон медиҳад, ки дастурҳои CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI ва HRESET-ро дастгирӣ кунанд).
    • Intel Rocketlake (-марш = rocketlake, монанд ба Лейк Рокет бе дастгирии SGX).
    • AMD Zen 3 (-март = znver3).
  • Барои системаҳои IA-32/x86-64 дар асоси протсессори Intel, дастгирии дастурҳои нави протсессор TXLDTRK, SERIALIZE, HRESET, UINTKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI илова карда шудааст.
  • Дастгирии иловашуда барои парчамҳои "-march=x86-64-v[234]" барои интихоби сатҳҳои меъмории x86-64 (v2 - васеъшавии SSE4.2, SSSE3, POPCNT ва CMPXCHG16B; v3 - AVX2 ва MOVBE; v4 - AVX-512 ).
  • Дастгирии иловашуда барои системаҳои RISC-V бо тартиби байтҳои калон. Иловаи "-misa-spec=*" барои интихоби версияи мушаххасоти меъмории маҷмӯи дастурҳои RISC-V. Дастгирии иловашуда барои AddressSanitizer ва муҳофизати стек бо истифода аз барчаспҳои канарӣ.
  • Идомаи такмили режими таҳлили статикии "-fanalyzer", ки таҳлили байнипросессуалҳои пуршиддати роҳҳои иҷрои код ва ҷараёни маълумотро дар барнома иҷро мекунад. Режим қодир аст, ки мушкилотро дар марҳилаи компиляция муайян кунад, ба монанди зангҳои дукарата ба функсияи free() барои як минтақаи хотира, ихроҷи тавсифи файл, аз истинод ва интиқоли нишондиҳандаҳои нул, дастрасӣ ба блокҳои хотираи озод, истифодаи арзишҳои ибтидонашуда ва ғайра. Дар версияи нав:
    • Рамзи пайгирии ҳолати барнома комилан аз нав навишта шудааст. Мушкилот бо сканкунии файлҳои хеле калон C ҳал карда шуданд.
    • Дастгирии ибтидоии C++ илова карда шуд.
    • Таҳлили тақсимоти хотира ва тақсимоти хотира аз функсияҳои мушаххаси malloc ва озод абстракт карда шудааст ва ҳоло нав/нест кардан ва нав[]/нест[]-ро дастгирӣ мекунад.
    • Огоҳиҳои нав илова карда шуданд: -Wanalyzer-shift-count-манфӣ, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const ва -Wanalyzer-write-to-string-literal.
    • Вариантҳои нави ислоҳи хатогӣ илова карда шуданд -fdump-analyzer-json ва -fno-analyzer-feasibility.
    • Имконияти васеъ кардани анализатор тавассути плагинҳо барои GCC амалӣ карда шуд (масалан, плагин барои тафтиши истифодаи нодурусти қулфи глобалӣ (GIL) дар CPython омода шудааст).

Манбаъ: opennet.ru

Илова Эзоҳ