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

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

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

  • Ужывальны па змаўчанні стандарт C++/ObjC++ выстаўлены ў gnu++17 (раней ужываўся gnu++14), што мае на ўвазе падтрымку па змаўчанні магчымасцяў C++17 з пашырэннямі GNU. Для вяртання ранейшых паводзін можна выкарыстоўваць опцыю "-std=gnu++14".
  • Рэалізаваны пашыраныя магчымасці, звязаныя са стандартам C++20:
    • Умоўна-трывіяльныя спецыяльныя функцыі-члены,
    • захоп структураваных прывязак у лямбда-функцыях,
    • Аператар роўнасці ўнутры выразаў,
    • Магчымасць не паказваць ключавое слова typename у некаторых кантэкстах,
    • Дапушчальнасць агрэгаванай ініцыялізацыі ў дужках («Aggr(val1, val2)»).
  • Рэалізаваны магчымасці, вызначаныя ў будучым стандарце C++2b:
    • Дазволена размяшчэнне пазнак у канцы састаўных выразаў,
    • static operator(),
    • static operator[],
    • Забяспечана сумяшчальнасць з тыпам char8_t,
    • Пашыраны спектр сімвалаў, дапушчальных для выкарыстання ў "\N{…}",
    • Дададзена магчымасць выкарыстання зменных, абвешчаных як "static constexpr", у функцыях, абвешчаных як constexpr.
  • Рэалізаваны магчымасці, вызначаныя ў будучыні Сі-стандарце C2x:
    • Для адключэння папярэджання "-Wunused-label" дазволена прымяненне атрыбута "[[maybe_unused]]" да метак,
    • Дазволена размяшчэнне пазнак у любых месцах усярэдзіне складовых выразаў,
    • Дададзены аператары typeof і typeof_unqual,
    • Новы тып nullptr_t і канстанта nullptr для вызначэння нулявых паказальнікаў, якая можа канвертавацца ў любы тып паказальнікаў і ўяўляць варыянт NULL, не прывязаны да цэлалікавых тыпаў і тыпу void*.
    • У рэжыме C2x дазволены выклік макраса va_start з пераменным лікам аргументаў (variadic).
  • У рэжымах адпаведнасці стандартам C99, C11 і C17 опцыі "-Wimplicit-function-declaration" і "-Wimplicit-int" па змаўчанні зараз прыводзяць да высновы памылкі замест папярэджання.
  • Ускоснае выкарыстанне "void *" (напрыклад, "void func(void *p) {*p;}") у рэжыме C++ зараз прыводзіць да генерацыі памылкі, па аналогіі з ISO C++, GCC, ICC і MSVC.
  • Указанне бітавых палёў у якасці аперанд інструкцый (напрыклад, "__asm ​​{mov eax, s.bf}") у асэмблерных inline-блоках у стылі Microsoft зараз прыводзіць да генерацыі памылкі.
  • Дададзена дыягностыка наяўнасці адрозных структур і аб'яднанняў з аднолькавымі імёнамі ў розных модулях.
  • Пашыраны магчымасці, звязаныя з падтрымкай OpenCL і OpenMP. Палепшана дыягностыка шаблонаў C++, выкарыстоўваных у аргументах ядра OpenCL. Палепшана падтрымка блока падстаноўкі ў чаргу для AMDGPU. Да ўсіх функцый няяўна дададзены атрыбут nounwind. Палепшана падтрымка ўбудаваных функцый.
  • Дана магчымасць выкарыстання зменнай асяроддзя CLANG_CRASH_DIAGNOSTICS_DIR для вызначэння каталога, у які захоўваюцца дыягнастычныя дадзеныя аб аварыйных завяршэннях.
  • Падтрымка Unicode абноўлена да спецыфікацыі Unicode 15.0. Дазволена ўжыванне некаторых матэматычных сімвалаў у ідэнтыфікатарах, такіх як «₊» (, напрыклад «double xₖ₊₁»).
  • Дададзена падтрымка загрузкі некалькіх файлаў канфігурацыі (спачатку загружаюцца файлы канфігурацыі па змаўчанні, а затым зададзеныя праз сцяг «—config=», які зараз можна ўказваць некалькі разоў). Зменены парадак загрузкі файлаў канфігурацыі па змаўчанні: clang спачатку спрабуе загрузіць файл - .cfg, а калі ён не знойдзены спрабуе загрузіць два файлы .cfg і .cfg. Для адключэння загрузкі файлаў канфігурацыі па змаўчанні дададзены сцяг "-no-default-config".
  • Для забеспячэння паўтаральных зборак прадстаўлена магчымасць замены значэнняў бягучай даты і часу ў макрасах __DATE__, __TIME__ і __TIMESTAMP__ на час, зададзены ў зменнай асяроддзі SOURCE_DATE_EPOCH.
  • Для праверкі наяўнасці ўбудаваных функцый (builtin), якія могуць быць скарыстаны ў кантэксце канстант, дададзены макрас «__has_constexpr_builtin».
  • Дададзены новы сцяг кампіляцыі "-fcoro-aligned-allocation" для выраўнаванага размеркавання кадраў супраграм.
  • У сцягу -fstrict-flex-arrays= рэалізаваная падтрымка трэцяга ўзроўня праверкі гнуткага элемента-масіва ў структурах (Flexible Array Members, масіў нявызначанага памеру ў канцы структуры). На трэцім узроўні толькі памер "[]" (напрыклад, "int b[]") апрацоўваецца як гнуткі масіў, а памер "[0]" (напрыклад, "int b[0]") - не.
  • Дададзены сцяг "-fmodule-output" для ўключэння аднафазнай мадэлі кампіляцыі стандартных модуляў C++.
  • Дададзены рэжым "-Rpass-analysis=stack-frame-layout", які дазваляе дыягнаставаць праблемы з раскладной сткавых кадраў.
  • Дададзены новы атрыбут __attribute__((target_version("cpu_features"))) і пашырана функцыянальнасць атрыбута __attribute__((target_clones("cpu_features1","cpu_features2",…))) для выбару пэўных версій функцый, якія прадстаўляюцца CPU AArch
  • Пашыраны сродкі дыягностыкі:
    • Дададзена папярэджанне "-Wsingle-bit-bitfield-constant-conversion" для вызначэння няяўнага ўсячэння пры прысваенні адзінкі аднаразраднаму знакаваму бітаваму полю.
    • Пашыраная дыягностыка неініцыялізаваных constexpr-пераменных.
    • Дададзеныя папярэджанні "-Wcast-function-type-strict" і "-Wincompatible-function-pointer-types-strict" для выяўлення патэнцыйных праблем пры прывядзенні тыпаў функцый.
    • Дададзена дыягностыка выкарыстання некарэктных або зарэзерваваных імёнаў модуляў у блоках экспарту.
    • Палепшана выяўленне прапушчаных ключавых слоў "auto" у вызначэннях.
    • У рэалізацыі папярэджання "-Winteger-overflow" дабаўлены праверкі дадатковых сітуацый, якія прыводзяць да перапаўненняў.
  • Рэалізаваная падтрымка архітэктуры набору каманд LoongArch (-march=loongarch64 ці -march=la464), якая ўжываецца ў працэсарах Loongson 3 5000 і рэалізуе новы RISC ISA, падобны на MIPS і RISC-V.

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

  • У кодзе LLVM дазволенае выкарыстанне элементаў, вызначаных у стандарце C++17.
  • Павышаны патрабаванні да асяроддзя для зборкі LLVM. Зборачны інструментар зараз павінен падтрымліваць стандарт C++17, г.зн. для зборкі неабходны як мінімум GCC 7.1, Clang 5.0, Apple Clang 10.0 ці Visual Studio 2019 16.7/XNUMX.
  • У бэкенд для архітэктуры AArch64 дададзеная падтрымка CPU Cortex-A715, Cortex-X3 і Neoverse V2, асэмблера для RME MEC (Memory Encryption Contexts), пашырэнняў Armv8.3 (Complex Number) і мултыверсіянавання (Function Multi Versioning).
  • У бэкендзе для архітэктуры ARM спынена падтрымка мэтавых платформаў Armv2, Armv2A, Armv3 і Armv3M, генерацыя карэктнага кода для якіх не гарантавалася. Дададзена магчымасць генерацыі кода для інструкцый працы з комплекснымі лікамі.
  • У бэкенд для архітэктуры X86 дададзеная падтрымка архітэктур набору каманд (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Дададзена падтрымка інструкцый RDMSRLIST, RMSRLIST і WRMSRNS. Рэалізаваны опцыі "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" і "-mcpu=grandridge".
  • Дададзена афіцыйная падтрымка платформы LoongArch.
  • Палепшаны бэкэнды для архітэктур MIPS, PowerPC і RISC-V
  • У адладчык LLDB дададзена падтрымка адладкі 64-разрадных выкананых файлаў для архітэктуры LoongArch. Палепшана апрацоўка адладачных сімвалаў COFF. Забяспечана адсяванне дублікатаў DLL у спісе загружаных Windows-модуляў.
  • У бібліятэцы Libc++ асноўная праца была засяроджана на рэалізацыі падтрымкі новых магчымасцяў стандартаў C++20 і C++23.
  • У кампаноўніку LDD значна скарочаны час звязвання за кошт распаралельвання аперацый сканавання перасоўванняў адрасоў і ініцыялізацыі секцый. Дададзена падтрымка сціску секцый з выкарыстаннем алгарытму ZSTD.

Крыніца: opennet.ru

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