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

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

З новых магчымасцяў LLVM 9.0 адзначаецца забеспячэнне зняцця пазнакі эксперыментальнай распрацоўкі з мэтавай платформы RISC-V, падтрымка C++ для OpenCL, магчымасць падзелу праграмы на дынамічна падгружаныя часткі ў LLD і рэалізацыя канструкцыі.asm goto«, выкарыстоўванай у кодзе ядра Linux. У libc++ дададзеная падтрымка WASI (WebAssembly System Interface), а ў LLD з'явілася пачатковая падтрымка дынамічнага злучэння WebAssembly.

паляпшэння у Clang 9.0:

  • Дададзена рэалізацыя спецыфічнага для GCC выразы «asm goto«, якое дазваляе выканаць пераход з асэмблернага inline-блока да пазнакі ў кодзе на мове Сі. Паказаная магчымасць неабходна для зборкі ядра Linux у рэжыме "CONFIG_JUMP_LABEL=y" з выкарыстаннем Clang на сістэмах з архітэктурай x86_64. З улікам дададзеных у мінулых выпусках змен, ядро ​​Linux зараз можа збірацца ў Clang і для архітэктуры x86_64 (раней падтрымлівалася толькі зборка для архітэктур arm, aarch64, ppc32, ppc64le і mips). Больш за тое, праекты Android і ChromeOS ужо перакладзены на выкарыстанне Clang для зборкі ядра і Google тэстуе Clang у якасці асноўнай платформы для зборкі ядраў для сваіх працоўных Linux-сістэм. У далейшым у працэсе зборкі ядра можна будзе выкарыстоўваць і іншыя кампаненты LLVM, уключаючы LLD, llvm-objcopy, llvm-ar, llvm-nm і llvm-objdump;
  • Дададзена эксперыментальная падтрымка выкарыстання C++17 у OpenCL. З спецыфічных магчымасцяў адзначаецца падтрымка атрыбутаў адраснай прасторы, блакіроўка пераўтварэння адраснай прасторы аператарамі прывядзення тыпаў, прадастаўленне вектарных тыпаў як у OpenCL для C, наяўнасць спецыфічных OpenCL-тыпаў для малюнкаў, падзей, каналаў і да т.п.
  • Дададзены новыя сцягі кампілятара "-ftime-trace" і "-ftime-trace-granularity=N" для генерацыі справаздачы аб часе выканання розных стадый працы фронтэнда (парсінг, ініцыялізацыя) і бэкенда (стадыі аптымізацыі). Справаздача захоўваецца ў фармаце json, сумяшчальным з chrome://tracing і speedscope.app;
  • Дададзена апрацоўка спецыфікатара "__declspec(allocator)" і генерацыя спадарожнай адладкавай інфармацыі, якая дазваляе адсочваць спажыванне памяці ў асяроддзі Visual Studio;
  • Для мовы Сі дададзеная падтрымка макраса «__FILE_NAME__», які нагадвае макрас «__FILE__», але ўлучальны толькі імя файла без поўнага шляху;
  • Для мовы C++ пашырана падтрымка атрыбутаў адраснай прасторы, якія ахопліваюць розныя магчымасці C++, уключаючы шаблоны параметраў і аргументаў, спасылкавыя тыпы, выснова тыпу якое вяртаецца значэння, аб'екты, аўтаматычна генераваныя функцыі, убудаваныя аператары і да т.п.
  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL, OpenMP і CUDA. У тым ліку забяспечана пачатковая падтрымка няяўнага ўключэння ўбудаваных функцый OpenCL (дададзены сцяг "-fdeclare-opencl-builtins"), рэалізавана пашырэнне cl_arm_integer_dot_product і пашыраны сродкі дыягностыкі;
  • Палепшана работа статычнага аналізатара і дададзена дакументацыя па выкананні статычнага аналізу. Дададзеныя сцягі для адлюстравання даступных модуляў праверкі і падтрымліваемых опцый ("-analyzer-checker[-option]-help", "-analyzer-checker[-option]-help-alpha" і "-analyzer-checker[-option]-help -developer»). Дададзены сцяг "-analyzer-werror" для рэагавання на папярэджанні як на памылкі.
    Дададзены новыя рэжымы праверкі:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling для выяўлення небяспечных прыёмаў працы з буферамі;
    • osx.MIGChecker для пошуку парушэнняў правіл афармленні выклікаў MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast для пошуку некарэктных пераўтварэнняў аб'ектаў XNU libkern;
    • apiModeling.llvm з наборам мадэлюючых функцый праверкі для выяўлення памылак у кодавай базе LLVM;
    • Стабілізаваны код для праверкі неініцыялізаваных аб'ектаў З++ (UninitializedObject у пакеце optin.cplusplus);
  • Ва ўтыліту clang-format дададзеная падтрымка фарматавання кода на мове C# і забяспечана падтрымка ужывальнага ў Microsoft стылю афармлення кода;
  • У clang-cl, альтэрнатыўным інтэрфейсе каманднага радка, які забяспечвае сумяшчальнасць на ўзроўні опцый з кампілятарам cl.exe са складу Visual Studio, дададзена эўрыстыка для ўспрымання неіснуючых файлаў як опцый каманднага радка з высновай якое адпавядае папярэджання (напрыклад, пры запуску «clang-cl /diagnostic :caret /c test.cc»);
  • У linter clang-tidy дададзена вялікая порцыя новых праверак, у тым ліку дададзены праверкі, спецыфічныя для API OpenMP;
  • Пашыраны магчымасці сервера clangd (Clang Server), у якім па змаўчанні ўключаны рэжым пабудовы азначніка ў фонавым рэжыме, дададзеная падтрымка кантэкстных дзеянняў з кодам (выманне зменнай, расчыненне азначэнняў auto і макрасаў, пераўтварэнне экранаваных радкоў у неэкранаваныя), з'явілася магчымасць высновы папярэджанняў ад Clang-tidy, пашырана дыягностыка памылак у загалоўкавых файлах і дададзена магчымасць вываду інфармацыі аб іерархіі тыпаў;

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

  • У кампаноўнік LLD дададзена эксперыментальная магчымасць партыцыравання, якая дазваляе падзяліць адну праграму на некалькі частак, кожная з якіх размяшчаецца ў асобным ELF-файле. Указаная магчымасць дазваляе запускаць асноўную частку праграмы, якая па меры неабходнасці падчас прац будзе падгружаць астатнія кампаненты (напрыклад, можна вылучыць убудаваны PDF-прагляднік у асобны файл, які будзе загружацца толькі калі карыстач адкрыў PDF-файл).

    Кампаноўшчык LLD даведзены да стану, прыдатнага для кампаноўкі ядра Linux для архітэктур arm32_7, arm64, ppc64le і x86_64.
    Прапанаваны новыя опцыі "-" (вывад у stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " -z ifunc-noplt» і «-z common-page-size». Для архітэктуры AArch64 дададзена падтрымка інструкцый BTI (Branch Target Indicator) і PAC (Pointer Authentication Code). Істотна палепшана падтрымка платформаў MIPS, RISC-V і PowerPC. Дададзена пачатковая падтрымка дынамічнага звязвання для WebAssembly;

  • У libc++ рэалізаваны функцыі ssize, std::is_constant_evaluated, std::midpoint і std::lerp, у std::span дабаўлены метады "front" і "back", дабаўлены прыкметы тыпаў std::is_unbounded_array і std::is_bounded_array, пашыраны магчымасці std :atomic. Спынена падтрымка GCC 4.9 (магчыма выкарыстанне з GCC 5.1 і навейшых выпускаў). Дададзена падтрымка ВАСІ (WebAssembly System Interface, інтэрфейс для выкарыстання WebAssembly па-за браўзэрам);
  • Дададзены новыя аптымізацыі. Забяспечана пераўтварэнне выклікаў memcmp у bcmp у некаторых сітуацыях. Рэалізаваны пропуск праверкі дыяпазонаў для табліц пераходаў, у якіх ніжнія блокі switch недасягальныя ці калі інструкцыі не выкарыстоўваюцца, напрыклад, пры выкліку функцый з тыпам void;
  • Стабілізаваны бэкэнд для архітэктуры архітэктуры RISC-V, які больш не пазіцыянуецца як эксперыментальны і збіраецца па змаўчанні. Забяспечана поўная падтрымка генерацыі кода для варыянтаў набораў інструкцый RV32I і RV64I з пашырэннямі MAFDC;
  • Унесены шматлікія паляпшэнні ў бэкэнды для архітэктур X86, AArch64, ARM, SystemZ, MIPS, AMDGPU і PowerPC. Напрыклад, для архітэктуры
    AArch64 дададзеная падтрымка інструкцый SVE2 (Scalable Vector Extension 2) і MTE (Memory Tagging Extensions), у бэкендзе ARM дададзеная падтрымка архітэктуры Armv8.1-M і пашырэнні MVE (M-Profile Vector Extension). У бэкенд AMDGPU дададзеная падтрымка архітэктуры GFX10 (Navi), па змаўчанні ўключаная магчымасці выкліку функцый і актываваны камбінаваны праход DPP (Data-Parallel Primitives).

  • У адладчыку LLDB з'явілася каляровае падсвятленне зваротных трасіровак, дададзеная падтрымка блокаў DWARF4 debug_types і DWARF5 debug_info;
  • Ва ўтыліты llvm-objcopy і llvm-strip дададзена падтрымка аб'ектных і выкананых файлаў у фармаце COFF.

Крыніца: opennet.ru

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