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

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

Ключавой зменай у новым выпуску стала ўключэнне ў склад Фланец, фронтэнда для мовы Fortran. Flang падтрымлівае Fortran 2018, OpenMP 4.5 і OpenACC 3.0, але распрацоўка праекту пакуль не завершана і фронтэнд абмяжоўваецца разборам кода і яго праверкай на карэктнасць. Генерацыя прамежкавага кода LLVM пакуль не падтрымліваецца і для фармавання выкананых файлаў генеруецца кананічны код, які перадаецца ў вонкавы кампілятар Fortran.

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

  • Дададзена магчымасць аднаўлення абстрактнага сінтаксічнага дрэва (АСТ) для некарэктнага кода на C++, якое можа выкарыстоўвацца для спрашчэння дыягностыкі памылак і дае дадатковую інфармацыю для вонкавых утыліт, такіх як clang-tidy і clangd. Магчымасць па змаўчанні ўключана для кода на C++ і кіруецца праз опцыі "-Xclang -f[no-]recovery-ast".
  • Дададзены новыя рэжымы дыягностыкі:
    • "-Wpointer-to-int-cast" — група папярэджанняў аб прывядзенні паказальнікаў да цэлага тыпу int, які не змяшчае ўсе магчымыя значэння.
    • "-Wuninitialized-const-reference" - папярэджанне аб перадачы неініцыялізаваных зменных у параметрах функцыі, якія прымаюць спасылачныя аргументы з прыкметай "const".
    • "-Wimplicit-const-int-float-conversion" - уключанае па змаўчанні папярэджанне аб няяўным пераўтварэнні рэчыўнай канстанты ў цэлы тып.
  • Для платформы ARM прадстаўлены убудаваныя ў кампілятар Сі-функцыі (Intrinsics), якія замяняюцца на эфектыўныя вектарныя інструкцыі Arm v8.1-M MVE і CDE. Даступныя функцыі вызначаны ў загалоўкавых файлах arm_mve.h і arm_cde.h.
  • Дададзены набор пашыраных цэлалікавых тыпаў _ExtInt(N), якія дазваляюць ствараць тыпы не кратныя ступені двойкі, якія могуць эфектыўна апрацоўвацца на FPGA/HLS. Напрыклад, _ExtInt(7) вызначае цэлы тып, які складаецца з 7 біт.
  • Дададзеныя макрасы, якія вызначаюць падтрымку ўбудаваных Сі-функцый на базе інструкцый ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Напрыклад, макрас __ARM_FEATURE_SVE вызначаецца пры генерацыі кода AArch64 з усталёўкай опцыі каманднага радка «-march=armv8-a+sve».

  • Сцяг "-O" зараз атаясамліваецца з рэжымам аптымізацыі "-O1" замест "-O2".
  • Дададзены новыя сцягі кампілятара:
    • "-fstack-clash-protection" - уключае абарону ад скрыжавання стэка і кучы.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" — дазваляе абраць рэжым апрацоўшчыка выключэнняў для лікаў з якая плавае коскі.
    • "-ffp-model={precise,strict,fast}" — спрашчае доступ да серыі спецыялізаваных опцый для лікаў з якая плавае коскі.
    • "-fpch-codegen" і "-fpch-debuginfo" для генерацыі предкомпилированного загалоўка (PCH) з асобнымі аб'ектнымі файламі для кода і debuginfo.
    • "-fsanitize-coverage-allowlist" і "-fsanitize-coverage-blocklist" для праверкі белага і чорнага спісаў coverage-тэставанні.
    • "-mtls-size={12,24,32,48}" для выбару памеру TLS (thread-local storage).
    • "-menable-experimental-extension" для ўключэння эксперыментальных пашырэнняў RISC-V.
  • Па змаўчанні для Сі ўжыты рэжым "-fno-common", які дазваляе падвысіць эфектыўнасць доступу да глабальных зменных на некаторых платформах.
  • Кэш модуляў па змаўчанні перанесены з /tmp у каталог ~/.cache. Для пераазначэння можна выкарыстоўваць сцяг "-fmodules-cache-path=".
  • Які ўжываецца па змаўчанні стандарт мовы Сі абноўлены з gnu11 да gnu17.
  • Дададзена папярэдняя падтрымка пашырэння GNU Casm inline» для дадання асэмблерных уставак. Пашырэнне пакуль толькі разбіраецца, але ніяк не апрацоўваецца.
  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL і CUDA. Дададзена падтрымка дыягностыкі блокаў OpenCL 2.0 і рэалізаваны новыя магчымасці OpenMP 5.0.
  • Ва ўтыліту clang-format дададзеная опцыя IndentExternBlock для выраўноўвання ўсярэдзіне блокаў extern "C" і extern "C++".
  • У статычным аналізатары палепшана апрацоўка ўспадкаваных канструктараў у C++. Дададзеныя новыя праверкі alpha.core.C11Lock і alpha.fuchsia.Lock для праверкі блакіровак, alpha.security.cert.pos.34c для выяўлення небяспечнага выкарыстання putenv, webkit.NoUncountedMemberChecker і webkit.RefCntblBaseVirtualDtor для выяўлення . SmartPtr для праверкі разнаймення нулявога разумнага паказальніка.
  • У linter clang-tidy дададзена вялікая порцыя новых праверак.
  • У які кешыруе серверы clangd (Clang Server) падвышаная прадукцыйнасць і дададзены новыя магчымасці дыягностыкі.

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

  • Сістэма зборкі пераведзена на выкарыстанне Python 3. Калі Python 3 недаступны, то рэалізаваная магчымасць адкату на выкарыстанне Python 2.
  • З выпуску выключаны фронтэнд з кампілятарам для мовы Go (llgo), які, магчыма, будзе рэструктызаваны ў будучыні.
  • У прамежкавае ўяўленне (IR) дададзены атрыбут vector-function-abi-variant для апісання мапінга паміж скалярнымі і вектарнымі функцыямі для вектарызацыі выклікаў. З llvm::VectorType вылучаны два асобныя вектарныя тыпы llvm::FixedVectorType і llvm::ScalableVectorType.
  • Прызнана нявызначанымі паводзінамі галінаванне на аснове udef-значэнняў і перадача undef-значэнняў у функцыі стандартнай бібліятэкі. У
    memset/memcpy/memmove дазволена перадача undef-паказальнікаў, але калі параметр з памерам роўны нулю.

  • У LLJIT дададзена падтрымка выканання статычных ініцыялізацый праз метады LLJIT::initialize і LLJIT::deinitialize. Рэалізавана магчымасць дадання статычных бібліятэк да JITDylib пры дапамозе класа StaticLibraryDefinitionGenerator. Дададзены Сі API для ORCv2 (API для зборкі JIT-кампілятараў).
  • У бэкенд для архітэктуры AArch64 дададзеная падтрымка працэсараў Cortex-A34, Cortex-A77, Cortex-A78 і Cortex-X1. Рэалізаваны пашырэнні ARMv8.2-BF16 (BFloat16) і ARMv8.6-A, уключаючы RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) і ARMv8.0-DGH (Data gathering hint). Забяспечана магчымасць генерацыі кода для ўбудаваных функцый-абвязак да вектарных інструкцый SVE.
  • У бэкенд для архітэктуры ARM дададзена падтрымка працэсараў Cortex-M55, Cortex-A77, Cortex-A78 і Cortex-X1. Рэалізаваны пашырэнні
    Armv8.6-A Matrix Multiply і RMv8.2-AA32BF16 BFloat16.

  • У бэкэнд для архітэктуры PowerPC дададзена падтрымка генерацыі кода для працэсараў POWER10. Пашыраны аптымізацыі цыклаў і палепшана падтрымка аперацый з якая плавае коскі.
  • У бэкендзе для архітэктуры RISC-V дазволены прыём патчаў з падтрымкай эксперыментальных пашыраных набораў інструкцый, яшчэ афіцыйна не адобраных.
  • Бэкенд для архітэктуры AVR пераведзены з катэгорыі эксперыментальных у стабільныя, уключаныя ў базавую пастаўку.
  • У бэкендзе для архітэктуры x86 рэалізавана падтрымка інструкцый Intel AMX і TSXLDTRK. Дададзена абарона ад нападаў LVI (Load Value Injection), а таксама рэалізаваны агульны механізм Speculative Execution Side Effect Suppression для блакавання нападаў, выкліканых спекулятыўным выкананнем аперацый у CPU.
  • У бэкендзе для архітэктуры SystemZ дададзеная падтрымка MemorySanitizer і LeakSanitizer.
  • У Libc++ дададзена падтрымка загалоўкавых файлаў з матэматычнымі канстантамі .
  • Пашыраны магчымасці кампаноўніка LLD. Палепшана падтрымка фармату ELF, у тым ліку дададзеныя опцыі "-lto-emit-asm", "-lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", "-thinlto- single-module", "-unique", "-rosegment", "-threads = N". Дададзена опцыя "-time-trace" для захавання трасіроўкі ў файл, які затым можна прааналізаваць праз інтэрфейс chrome://tracing у Chrome.

Крыніца: opennet.ru

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