Рэліз набору кампілятараў GCC 11

Пасля года распрацоўкі апублікаваны рэліз вольнага набору кампілятараў GCC 11.1, першы значны выпуск у новай галінцы GCC 11.x. У адпаведнасці з новай схемай нумарацыі выпускаў, версія 11.0/11.1 выкарыстоўвалася ў працэсе распрацоўкі, а незадоўга да выхаду GCC 12.0/12.1 ужо адгалінулася галінка GCC XNUMX, на базе якой будзе сфарміраваны наступны значны рэліз GCC XNUMX.

GCC 11.1 адметны пераходам на выкарыстанне па змаўчанні фармату адладкавых файлаў DWARF 5, уключэннем па змаўчанні стандарту C++17 («-std=gnu++17»), значным паляпшэннем падтрымкі стандарту C++20, эксперыментальнай падтрымкай C++23, паляпшэннямі, звязанымі з будучым стандартам мовы Сі (C2x), новымі аптымізацыямі прадукцыйнасці.

Асноўныя змены:

  • Рэжым па змаўчанні для мовы C++ пераключаны на выкарыстанне стандарту C++17 (-std=gnu++17) замест раней прапанаванага C++14. Магчыма выбарачнае адключэнне новых паводзін C++17 пры апрацоўцы шаблонаў, у якіх у якасці параметру выкарыстоўваюцца іншыя шаблоны (-fno-new-ttp-matching).
  • Дададзена падтрымка апаратнага паскарэння працы прылады 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 Intermediate Language).
  • Пашыраны магчымасці рэжыму ThreadSanitizer (-fsanitize=thread), прызначанага для выяўлення стану гонкі пры сумесным доступе да адных і тых жа дадзеных з розных нітак шматструменнага прыкладання. У новым выпуску дададзеная падтрымка альтэрнатыўных runtime і асяродкаў, а таксама падтрымка адладкавай прылады 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, control-flow graph).
  • У аптымізатары рэалізавана магчымасць пераўтварэння ў выраз switch серыі ўмоўных аперацый, у якіх параўноўваецца адна і тая ж зменная. У далейшым выраз switch можа быць закадаваны з ужываннем інструкцый бітавага тэставання (для кіравання падобным пераўтварэннем дададзена опцыя "-fbit-tests").
  • Палепшаны міжпрацэдурныя аптымізацыі. Дададзены новы праход IPA-modref (-fipa-modref) для адсочвання пабочных эфектаў пры выкліку функцый і павышэння дакладнасці аналізу. Палепшана рэалізацыя праходу IPA-ICF (-fipa-icf), у якім скарочана спажыванне памяці пры кампіляцыі і павялічана колькасць уніфікаваных функцый, для якіх выконваецца аб'яднанне ідэнтычных блокаў кода. У праходзе IPA-CP (Interprocedural constant propagation) палепшана эўрыстыка па прагназаванні з улікам вядомых меж і асаблівасцяў працы цыклаў.
  • У рэалізацыі аптымізацый на этапе звязвання (LTO) фармат байткода аптымізаваны для скарачэння памеру і павышэння хуткасці апрацоўкі. Зменшана пікавае спажыванне памяці на этапе звязвання.
  • У механізме аптымізацыі на аснове вынікаў прафілявання кода (PGO - Profile-guided optimization), які дазваляе генераваць больш аптымальны код на аснове аналізу асаблівасцяў выканання, скарочаны памер файлаў з дадзенымі GCOV за кошт больш кампактнага пакавання нулявых лічыльнікаў. Палепшаны рэжым "-fprofile-values", дзякуючы адсочванню большай колькасці параметраў пры ўскосных выкліках.
  • Прадоўжана рэалізацыя стандарту OpenMP 5.0 (Open Multi-Processing), які вызначае API і спосабы прымянення метадаў паралельнага праграмавання на шмат'ядравых і гібрыдных (CPU+GPU/DSP) сістэмах з агульнай памяццю і блокамі вектарызацыі (SIMD). Дададзена пачатковая падтрымка дырэктывы allocate і магчымасць выкарыстання неаднародных цыклаў у канструкцыях OpenMP. Рэалізавана падтрымка зменнай асяроддзі OMP_TARGET_OFFLOAD.
  • Палепшана якая прадстаўляецца для моў C, C++ і Fortran рэалізацыя спецыфікацыі раўналежнага праграмавання OpenACC 2.6, вызначальнай сродкі для вынасу аперацый (offloading) на GPU і спецыялізаваныя працэсары, такія як NVIDIA PTX.
  • Для моў сямейства Сі рэалізаваны новы атрыбут "no_stack_protector", прызначаны для пазнакі функцый для якіх не варта ўключаць абарону стэка ("-fstack-protector"). Атрыбут «malloc» пашыраны падтрымкай ідэнтыфікацыі пар выклікаў для вылучэння і вызвалення памяці (allocator/deallocator), што выкарыстоўваецца ў статычным аналізатары для вызначэння тыпавых памылак працы з памяццю (уцечкі памяці, выкарыстанне пасля вызвалення, падвойны выклік функцыі free і да т.п.) і ў папярэджаннях кампілятара "-Wmismatched-dealloc", "-Wmismatched-new-delete" і "-Wfree-nonheap-object", якія інфармуюць аб няўзгодненасці аперацый вызвалення і вылучэнні памяці.
  • Для мовы Сі дададзены новыя папярэджанні:
    • "-Wmismatched-dealloc" (уключаны па змаўчанні) - папярэджвае аб аперацыях вызвалення памяці ў якіх выкарыстоўваецца паказальнік, які не спалучаецца з функцыямі вылучэння памяці.
    • "-Wsizeof-array-div" (уключаецца пры ўказанні "-Wall") – папярэджвае аб дзяленні двух аператараў sizeof, калі дзельнік не адпавядае памеру элемента масіва.
    • "-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_60559_EXT__, INFINITY, NFINITY, ITY і DEC_NAN, NaN=макрасы для FloatN, _FloatNx і _DecimalN, магчымасць указання пазнак пераходу да аб'яваў і ў канцы састаўных аператараў.
  • Для C++ рэалізаваная порцыя змен і навін, прапанаваных у стандарце C++20, уключаючы віртуальныя функцыі «consteval virtual», псеўдадэструктары канчатка жыццёвага цыклу аб'ектаў, выкарыстанне класа enum і вылічэнне памеру масіва ў выразе «new».
  • Для C++ дададзена эксперыментальная падтрымка некаторых паляпшэнняў, якія развіваюцца для будучага стандарту C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu++2b). Напрыклад, з'явілася падтрымка літаральнага суфікса "zu" для знакавых значэнняў size_t.
  • У libstdc++ палепшаная падтрымка стандарту C++17, уключаючы з'яўленне рэалізацыі std::from_chars і std::to_chars для тыпаў з якая плавае коскі. Рэалізаваны новыя элементы стандарту C++20, уключаючы std::bit_cast, std::source_location, атамарныя аперацыі wait і notify, , , , , а таксама элементы будучага стандарту C++23 (std::to_underlying, std::is_scoped_enum). Дададзена эксперыментальная падтрымка тыпаў для раўналежнай апрацоўкі дадзеных (SIMD, Data-Parallel Types). Паскорана рэалізацыя 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.
  • Дададзена падтрымка выкарыстання SIMD-інструкцый Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) і MVE (AArch32 M-profile) для аўтавектарызацыі аперацый, якія выконваюць складанне, адніманне, множанне і варыянты складання/аднімання над комплекснымі лікамі. Для ARM дададзена пачатковая падтрымка аўтавектарызацыі з выкарыстаннем набору інструкцый MVE.
  • Для ARM-платформаў прадстаўлены поўны набор убудаваных у кампілятар Сі-функцый (Intrinsics), якія замяняюцца на пашыраныя вектарныя інструкцыі (SIMD), які ахоплівае ўсе інструкцыі NEON, дакументаваныя ў спецыфікацыі ACLE Q3 2020.
  • У бэкенд для генерацыі кода для GPU AMD на базе мікраархітэктуры GCN дададзеная падтрымка GPU gfx908.
  • Дададзена падтрымка новых працэсараў і рэалізаваных у іх новых пашырэнняў набору:
    • Intel Sapphire Rapids (-march=sapphirerapids, уключае падтрымку інструкцый MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX.
    • Intel Alderlake (-march = alderlake, уключае падтрымку інструкцый CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI і HRESET).
    • Intel Rocketlake (-march = rocketlake, аналаг Rocket Lake без падтрымкі SGX).
    • AMD Zen 3 (-march = znver3).
  • Для сістэм IA-32/x86-64 на базе працэсараў Intel дададзеная падтрымка новых працэсарных інструкцый TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, 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 з парадкам прытрымлівання байт "big-endian". Дададзена опцыя "-misa-spec=*" для выбару версіі спецыфікацыі архітэктуры набору каманд RISC-V. Дададзена падтрымка AddressSanitizer і абароны стэка пры дапамозе канарэечных пазнак.
  • Прадоўжана ўдасканаленне рэжыму статычнага аналізу "-fanalyzer", які выконвае рэсурсаёмісты міжпрацэдурны аналіз шляхоў выканання кода і патокаў даных у праграме. Рэжым здольны на этапе кампіляцыі выяўляць такія праблемы, як падвойны выклік функцыі free() для адной вобласці памяці, уцечкі файлавых дэскрыптараў, разнайменаванне і перадачу нулявых паказальнікаў, зварот да вызваленых блокаў памяці, выкарыстанне неініцыялізаваных значэнняў і да т.п. У новай версіі:
    • Цалкам перапісаны код для адсочвання стану праграмы. Вырашаны праблемы з праверкай вельмі вялікіх Сі-файлаў.
    • Дададзена пачатковая падтрымка C++.
    • Аналіз вылучэння і вызваленні памяці абстрагаваны ад пэўных функцый malloc і free, і зараз падтрымлівае new/delete і new[]/delete[].
    • Дададзеныя новыя папярэджанні: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const і -Wanalyzer-write-to-string-literal.
    • Дададзены новыя адладкавыя опцыі -fdump-analyzer-json і -fno-analyzer-feasibility.
    • Рэалізаваная магчымасць пашырэння аналізатара праз убудовы да GCC (напрыклад, падрыхтаваны плягін для праверкі некарэктнага выкарыстання глабальнага блакавання (GIL) у CPython).

Крыніца: opennet.ru

Дадаць каментар