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

Пасля шасці месяцаў распрацоўкі прадстаўлены рэліз праекта LLVM 15.0 – GCC-сумяшчальнага інструментара (кампілятары, аптымізатары і генератары кода), які кампілюе праграмы ў прамежкавы біткод RISC-падобных віртуальных інструкцый (нізкаўзроўневая віртуальная машына з шматузроўневай сістэмай оптимитый. Згенераваны псеўдакод можа быць пераўтвораны пры дапамозе JIT-кампілятара ў машынныя інструкцыі непасрэдна ў момант выканання праграмы.

Асноўныя паляпшэнні ў Clang 15.0:

  • Для сістэм на базе архітэктуры x86 дададзены сцяг "-fzero-call-used-regs", які забяспечвае абнуленне ўсіх выкарыстаных у функцыі рэгістраў CPU перад вяртаннем кіравання з функцыі. Указаная опцыя дазваляе абараніцца ад уцечкі інфармацыі з функцый і прыкладна на 20% скараціць колькасць блокаў, прыдатных для пабудовы ROP-гаджэтаў (Return-Oriented Programming) у эксплоітах.
  • Рэалізавана рандомизация размяшчэння ў памяці структур для кода на мове Сі, якая ўскладняе выманне дадзеных са структур у выпадку эксплуатацыі ўразлівасцяў. Рандамізацыя ўключаецца і выключаецца пры дапамозе атрыбутаў randomize_layout і no_randomize_layout, і патрабуе ўсталёўкі затраўкі пры дапамозе сцяга "-frandomize-layout-seed" або "-frandomize-layout-seed-file".
  • Дададзены сцяг «-fstrict-flex-arrays= », з дапамогай якога можна кіраваць межамі для гнуткага элемента-масіва ў структурах (Flexible Array Members, масіў нявызначанага памеру ў канцы структуры). Пры выстаўленні значэння ў 0 (па змаўчанні) апошні элемент структуры з масівам заўсёды апрацоўваецца як гнуткі масіў, 1 - толькі памеры [], [0] і [1] апрацоўваюцца як гнуткі масіў, 2 - толькі памеры [] і [0] апрацоўваюцца як гнуткі масіў.
  • Дададзена эксперыментальная падтрымка Сі-падобнай мовы HLSL (High-Level Shader Language), які ўжываецца ў DirectX для напісання шэйдараў.
  • Дададзены параметр "-Warray-parameter", які папярэджвае аб перавызначэнні функцый з не якая спалучаецца аб'явай аргументаў, злучаных з масівамі фіксаванай і зменнай даўжыні.
  • Палепшана сумяшчальнасць з MSVC. Дададзена падтрымка "#pragma function" (паказвае кампілятару генераваць выклік функцыі, замест яе inline-разгортвання) і "#pragma alloc_text" (вызначае імя секцыі з кодам функцыі), якія прадстаўляюцца ў MSVC. Дададзена падтрымка сумяшчальных з MSVC сцягоў /JMC і /JMC.
  • Прадоўжана работа па забеспячэнні падтрымкі будучых стандартаў C2X і C++23. Для мовы Сі рэалізаваны: атрыбут noreturn, ключавыя словы false і true, тып _BitInt(N) для цэлых лікаў зададзенай разраднасці, макрасы *_WIDTH, прэфікс u8 для знакаў у кадоўцы UTF-8.

    Для З++ рэалізаваны: зліццё модуляў, ізаляцыя ABI чальцоў функцый, спарадкаваная дынамічная ініцыялізацыя нелакальных зменных у модулях, шматмерныя індэксныя аператары, auto(x), нелітэральныя зменныя, goto і пазнакі ў функцыях, абвешчаных як constexpr, escape-паслядоўнік, найменныя escape-знакі.

  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL і OpenMP. Дададзена падтрымка OpenCL-пашырэння cl_khr_subgroup_rotate.
  • Для архітэктуры x86 дададзена абарона ад уразлівасцяў у працэсарах, выкліканых спекулятыўным выкананнем інструкцый пасля аперацый безумоўнага прамога пераходу. Праблема ўзнікае з-за папераджальнай апрацоўкі інструкцый, наступных у памяці адразу за камандай пераходу (SLS, Straight Line Speculation). Для ўключэння абароны прапанавана опцыя "-mharden-sls=[none|all|return|indirect-jmp]".
  • Для платформаў з падтрымкай пашырэння SSE2 дададзены тып _Float16, які эмулюецца з выкарыстаннем тыпу float у выпадку адсутнасці падтрымкі інструкцый AVX512-FP16.
  • Дададзены сцяг "-m[no-]rdpru" для кіравання выкарыстаннем інструкцыі RDPRU, якая падтрымліваецца пачынальна з працэсараў AMD Zen2.
  • Дададзены сцяг "-mfunction-return=thunk-extern" для абароны ад уразлівасці RETBLEED, якая працуе праз даданне паслядоўнасці інструкцый, выняткоўвалай уцягванне механізму спекулятыўнага выканання для ўскосных пераходаў.

Асноўныя навіны LLVM 15.0:

  • Дададзена падтрымка CPU Cortex-M85, архітэктур Armv9-A, Armv9.1-A і Armv9.2-A, пашырэнняў Armv8.1-M PACBTI-M.
  • Дададзены эксперыментальны бэкэнд для DirectX, які падтрымлівае фармат DXIL (DirectX Intermediate Language), які ўжываецца для шэйдараў DirectX. Бэкенд уключаецца праз указанне пры зборцы параметру "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".
  • У Libc++ прадоўжана рэалізацыя новых магчымасцей стандартаў C++20 і C++2b, у тым ліку завершана рэалізацыя бібліятэкі "format" і прапанаваны эксперыментальны варыянт бібліятэкі "ranges".
  • Палепшаны бэкенд для архітэктур x86, PowerPC і RISC-V.
  • Пашыраны магчымасці кампаноўніка LLD і адладчыка LLDB.

Крыніца: opennet.ru

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