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

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

Паляпшэнні ў Clang 13.0:

  • Рэалізавана падтрымка гарантаваных хваставых выклікаў (выклік падпраграмы ў самым канцы функцыі, які ўтварае хваставую рэкурсію ў выпадку, калі падпраграма выклікаецца саму сябе). Падтрымка гарантаваных хваставых выклікаў забяспечана пры дапамозе атрыбуту "[[clang::musttail]]" у C++ і "__attribute__((musttail))" у C, якія ўжываюцца ў выразе "return". Магчымасць дазваляе рэалізаваць аптымізацыі праз разгортванне кода ў плоскую ітэрацыю для эканоміі расходавання стэка.
  • У дэкларацыях "using" і пашырэннях clang рэалізавана падтрымка вызначэння атрыбутаў у стылі C++11, выкарыстоўваючы фармат "[[]]".
  • Дададзены сцяг «-Wreserved-identifier» для вываду папярэджання пры ўказанні ў карыстацкім кодзе зарэзерваваных ідэнтыфікатараў.
  • Дададзеныя сцягі "-Wunused-but-set-parameter" і "-Wunused-but-set-variable" для вываду папярэджання, калі параметр або зменная выстаўлены, але не выкарыстоўваюцца.
  • Дададзены сцяг "-Wnull-pointer-subtraction" для вываду папярэджання, калі ў код можа прывесці да нявызначаных паводзін з-за выкарыстання нулявога паказальніка ў аперацыях аднімання.
  • Дададзены сцяг "-fstack-usage" для генерацыі для кожнага файла з кодам дадатковага файла ".su", які змяшчае звесткі аб памеры кадраў стэка для кожнай функцыі, вызначанай у апрацоўваным файле.
  • У статычным аналізатары дададзены новы тып высновы – «sarif-html», які прыводзіць да фармавання справаздач адначасова ў фарматах HTML і Sarif. Дададзена новая праверка allocClassWithName. Пры ўказанні опцыі "-analyzer-display-progress" забяспечаны вывад часу аналізу кожнай функцыі. Амаль даведзены да гатоўнасці аналізатар разумных паказальнікаў (alpha.cplusplus.SmartPtr).
  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL. Дададзена падтрымка новых пашырэнняў cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields і __cl_clang_non_portable_kernel_param_types. Працягнута рэалізацыя спецыфікацыі OpenCL 3.0. Для Сі па змаўчанні задзейнічана спецыфікацыя OpenCL 1.2, калі відавочна не абрана іншая версія. Для C++ дададзена падтрымка файлаў з пашырэннем ".clcpp".
  • Рэалізаваная падтрымка дырэктыў трансфармацыі цыклаў (#pragma omp unrol і #pragma omp tile), вызначаных у спецыфікацыі OpenMP 5.1.
  • Ва ўтыліту clang-format дададзены опцыі: SpacesInLineCommentPrefix для вызначэння колькасці прабелаў перад каментарамі, IndentAccessModifiers, LambdaBodyIndentation і PPIndentWidthдля кіравання выраўноўваннем запісаў, лямбда-выразаў і дырэктыў прэпрацэсара. Пашыраны магчымасці сартавання пералічэння загалоўкавых файлаў (SortIncludes). Дададзена падтрымка фарматавання файлаў JSON.
  • У linter clang-tidy дададзеная вялікая порцыя новых праверак.

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

  • Дададзена опцыя "-ehcontguard" для выкарыстання тэхналогіі CET (Windows Control-flow Enforcement Technology) для абароны на этапе апрацоўкі выключэнняў ад выканання эксплоітаў, пабудаваных з выкарыстаннем прыёмаў зваротна-арыентаванага праграмавання (ROP, Return-Oriented Programming).
  • Праект debuginfo-test перайменаваны ў cross-project-tests і разлічаны на тэсціраванне кампанентаў з розных праектаў, не абмяжоўваючыся адладкавай інфармацыяй.
  • У зборачнай сістэме забяспечана падтрымка зборкі некалькіх дыстрыбутываў, напрыклад, адзін з утылітамі, а другі з бібліятэкамі для распрацоўшчыкаў.
  • У бэкендзе для архітэктуры AArch64 у асэмблеры рэалізавана падтрымка пашырэнняў Armv9-A RME (Realm Management Extension) і SME (Scalable Matrix Extension).
  • У бэкенд для архітэктуры Hexagon дададзеная падтрымка ISA V68/HVX.
  • У бэкендзе для архітэктуры x86 палепшана падтрымка працэсараў AMD Zen 3.
  • У бэкенд AMDGPU дададзеная падтрымка APU GFX1013 RDNA2.
  • У Libc++ прадоўжана рэалізацыя новых магчымасцей стандартаў C++20 і C++2b, у тым ліку завершана рэалізацыя бібліятэкі "concepts". Для платформы Windows на базе MinGW дададзеная падтрымка std::filesystem. Раздзелены загалоўкавыя файлы , і . Дададзена зборачная опцыя LIBCXX_ENABLE_INCOMPLETE_FEATURES для адключэння загалоўкавых файлаў з не цалкам рэалізаванай функцыянальнасцю.
  • Пашыраны магчымасці кампаноўніка LLD, у якім рэалізаваная падтрымка Big-endian працэсараў Aarch64, а бэкэнд Mach-O даведзены да стану, які дазваляе кампанаваць звычайныя праграмы. Уключаны паляпшэнні, неабходныя для кампаноўкі Glibc з выкарыстаннем LLD.
  • Ва ўтыліту llvm-mca (Machine Code Analyzer) дададзеная падтрымка працэсараў, якія выконваюць інструкцыі па парадку (in-order superscalar pipeline), такіх як ARM Cortex-A55.
  • У адладчыку LLDB для платформы AArch64 рэалізавана поўная падтрымка аўтэнтыфікацыі паказальнікаў (Pointer Authentication), механізму MTE (MemTag, Memory Tagging Extension) і рэгістраў SVE. Дададзены каманды, якія дазваляюць прывязаць тэгі да кожнай аперацыі вылучэння памяці і арганізаваць пры доступе да памяці праверку паказальніка, які павінен быць злучаны з карэктным тэгам.
  • У склад фармуемых праектам бінарных зборак дададзены адладчык LLDB і фронтэнд для мовы Fortran - Flang.

Крыніца: opennet.ru

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