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

Пасля года распрацоўкі апублікаваны рэліз вольнага набору кампілятараў GCC 12.1, першы значны выпуск у новай галінцы GCC 12.x. У адпаведнасці з новай схемай нумарацыі выпускаў, версія 12.0 выкарыстоўвалася падчас распрацовак, а незадоўга да выхаду GCC 12.1 ужо адгалінулася галінка GCC 13.0, на базе якой будзе сфарміраваны наступны значны рэліз GCC 13.1. 23 траўня праект будзе адзначаць 35 гадоў з моманту фармавання першага выпуску GCC.

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

  • Дададзена падтрымка адладкавага фармату CTF (Compact Type Format), які забяспечвае кампактнае захоўванне звестак аб Сі-тыпах, сувязях паміж функцыямі і адладкавых сімвалах. Пры ўбудаванні ў ELF-аб'екты фармат дазваляе выкарыстоўваць табліцы сімвалаў EFL для пазбягання дублявання дадзеных.
  • Абвешчана састарэлай падтрымка фармату захоўвання адладкавай інфармацыі "STABS", створанага ў 1980-я гады.
  • Прадоўжана работа па пашырэнні падтрымкі будучых стандартаў C2X і C++23 для моў C і C++. Напрыклад, дададзена падтрымка выраза "if consteval"; дазволена выкарыстанне auto ў аргументах функцый ("f(auto(g()))"); дазволена выкарыстанне нелітэральных зменных, goto і пазнак у функцыях, абвешчаных як constexpr; дададзена падтрымка шматмерных індэксных аператараў operator[]; у if, for і switch пашыраны магчымасці блокаў ініцыялізацыі ("for (using T = int; T e : v)").
  • У стандартнай бібліятэцы C++ палепшана падтрымка эксперыментальных раздзелаў стандартаў C++20 і C++23. Дададзена падтрымка std::move_only_function, , std::basic_string::resize_and_overwrite, , і std::invoke_r. Дазволена выкарыстанне ў constexpr-функцыях std::unique_ptr, std::vector, std::basic_string, std::optional і std::variant.
  • У франтэндзе для мовы фортран прадстаўлена поўная падтрымка спецыфікацыі TS 29113, якая апісвае магчымасці па забеспячэнні пераноснасці паміж кодам на мовах Fortran і C.
  • Дададзена падтрымка пашырэння __builtin_shufflevector(vec1, vec2, index1, index2, …), раней дададзенага ў Clang і які прапануе адзіны выклік для выканання агульных вектарных аперацый перастаноўкі і ператасоўкі.
  • Пры выкарыстанні ўзроўня аптымізацыі "-O2" па змаўчанні ўключана ўжыванне вектарызацыі (уключаны рэжымы -ftree-vectorize і -fvect-cost-model=very-cheap). Мадэль «very-cheap» дапушчае вектарызацыю толькі калі вектарны код можа цалкам замяніць вектарызаваны скалярны код.
  • Дададзены рэжым «-ftrivial-auto-var-init» улучальны відавочную ініцыялізацыю зменных у стэку для адсочвання праблем і блакаванні ўразлівасцяў, злучаных з выкарыстаннем неініцыялізаваных зменных.
  • Для моў C і C++ дададзена ўбудаваная функцыя __builtin_dynamic_object_size для вызначэння памеру аб'екта, сумяшчальная з аналагічнай функцыяй з Clang.
  • Для моў C і C++ дададзена падтрымка атрыбуту "unavailable" (напрыклад, можна адзначаць функцыі, пры спробе выкарыстання якіх будзе выводзіцца памылка).
  • Для моў C і C++ дададзена падтрымка дырэктыў прэпрацэсінгу "#elifdef" і "#elifndef".
  • Дададзены сцяг "-Wbidi-chars" для вываду папярэджання ў выпадку некарэктнага выкарыстання сімвалаў UTF-8, якія змяняюць парадак адлюстравання двунакіраванага тэксту.
  • Дададзены сцяг "-Warray-compare" для вываду папярэджання пры спробе параўнання двух аперанд, якія спасылаюцца на масівы.
  • Прадоўжана рэалізацыя стандартаў OpenMP 5.0 і 5.1 (Open Multi-Processing), якія вызначаюць API і спосабы прымянення метадаў паралельнага праграмавання на шмат'ядравых і гібрыдных (CPU+GPU/DSP) сістэмах з агульнай памяццю і блокамі вектарызацыі (SIMD).
  • Палепшана рэалізацыя спецыфікацыі паралельнага праграмавання OpenACC 2.6, якая вызначае сродкі для вынасу аперацый (offloading) на GPU і спецыялізаваныя працэсары, такія як NVIDIA PTX.
  • У бэкенд генерацыі кода для архітэктуры x86 дададзеная падтрымка пашыраных інструкцый Intel AVX512-FP16 і тыпу _Float16.
  • Для архітэктуры x86 дададзена абарона ад уразлівасцяў у працэсарах, выкліканых спекулятыўным выкананнем інструкцый пасля аперацый безумоўнага прамога пераходу. Праблема ўзнікае з-за папераджальнай апрацоўкі інструкцый, наступных у памяці адразу за камандай пераходу (SLS, Straight Line Speculation). Для ўключэння абароны прапанавана опцыя "-mharden-sls".
  • У эксперыментальны статычны аналізатар дададзена вызначэнне выкарыстання неініцыялізаваных зменных. Дададзена пачатковая падтрымка аналізу асэмблернага кода ў inline-устаўках. Палепшана адсочванне стану памяці. Перапісаны код для апрацоўкі выразаў switch.
  • Дададзена 30 новых выклікаў у libgccjit, падзяляную бібліятэку для ўбудавання генератара кода ў іншыя працэсы і выкарыстанні для арганізацыі JIT-кампіляцыі байткода ў машынны код.
  • У бэкенд для генерацыі байткода BPF дададзеная падтрымка механізму CO-RE (Compile Once – Run Everywhere), які дазваляе збіраць код eBPF-праграм для ядра Linux толькі адзін раз і выкарыстоўваць адмысловы ўніверсальны загрузнік, які адаптуе загружаную праграму да бягучага ядра і тыпам B Format). CO-RE вырашае праблему з пераноснасцю скампіляваных eBPF-праграм, якія раней маглі выкарыстоўвацца толькі ў той версіі ядра, для якой былі сабраныя, бо пазіцыя элементаў у структурах дадзеных змяняецца ад версіі да версіі.
  • У бэкендзе для архітэктуры RISC-V дададзеная падтрымка новых пашырэнняў архітэктуры набору каманд zba, zbb, zbc і zbs, а таксама ISA-пашырэнняў для вектарных і скалярных крыптаграфічных аперацый. Па змаўчанні забяспечана падтрымка спецыфікацыі RISC-V ISA 20191213. Дададзены сцяг -mtune=thead-c906, які ўключае аптымізацыі для ядраў T-HEAD c906.
  • У бэкенд генерацыі кода для GPU AMD на базе мікраархітэктуры GCN дададзеная падтрымка тыпу __int128_t/integer(kind=16). Забяспечана магчымасць выкарыстання да 40 працоўных груп на вылічальны блок (CU) і да 16 франтоў інструкцый (wavefront, набор нітак, раўналежна выкананых SIMD Engine) на групу. Раней было дазволена выкарыстанне толькі аднаго фронта інструкцый на CU.
  • У бэкэнд NVPTX, прызначаны для генерацыі кода з выкарыстаннем архітэктуры набору каманд NVIDIA PTX (Parallel Thread Execution), дададзена магчымасць выкарыстання сцягоў "-march", "-mptx" і "-march-map". Рэалізавана падтрымка PTX ISA sm_53, sm_70, sm_75 і sm_80. Па змаўчанні выкарыстоўваецца архітэктура sm_30.
  • У бэкендзе для працэсараў PowerPC / PowerPC64 / RS6000 перапісаны рэалізацыі ўбудаваных функцый. Дакументаваны ўбудаваныя функцыі __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar і __builtin_.
  • У бэкенд для архітэктуры ARM/AArch64 дададзеная падтрымка CPU Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) і Arm Cortex-X2 (cortex- x2). Дададзена падтрымка новых варыянтаў архітэктуры ARMv8 для выкарыстання ў опцыі "-march": armv8.7-a, armv8.8-a, armv9-a. Дададзена рэалізацыя убудаваных у кампілятар Сі-функцый (Intrinsics) для атамарнай загрузкі і захаванні дадзеных у памяць, заснаваная на выкарыстанні пашыраных інструкцый ARM (ls64). Дададзена падтрымка паскарэння функцый memcpy, memmove і memset пры дапамозе ARM-пашырэння mopsoption.
  • Дададзены новы рэжым праверкі "-fsanitize=shadow-call-stack" (ShadowCallStack), які пакуль даступны толькі для архітэктуры AArch64 і працуе пры зборцы кода з опцыяй "-ffixed-r18". Рэжым забяспечвае абарону ад перазапісу адрасу звароту з функцыі ў выпадку перапаўнення буфера ў стэку. Сутнасць абароны ў захаванні пасля перадачы кіравання функцыі адрасу звароту ў асобным "ценявым" стэку і выманні дадзенага адрасу перад вынахадам з функцыі.

Крыніца: opennet.ru

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