LLVM 15.0 пристига с подобрения за различни бекендове, по-голяма поддръжка и други

LLVM 15 прилага подобрения в поддръжката

LLVM 15.0 също включва редица интересни актуализации на C/C++.

След шест месеца развитие, Обявено издание на проекта LLVM 15.0, в която направени са много големи промени, както и добавена поддръжка за нови процесори, архитектури и др.

За тези, които не са запознати с LLVM, трябва да знаете, че това е GCC съвместим компилатор (компилатори, оптимизатори и генератори на код), който компилира програми в RISC-подобен междинен биткод на виртуална инструкция (виртуална машина от ниско ниво с многостепенна система за оптимизация).

Генерираният псевдокод може да бъде преобразуван от JIT компилатора в машинни инструкции точно по време на изпълнение на програмата.

Основни нови функции на LLVM 15.0

В тази нова версия, която е представена, се подчертава, че поддръжка на процесори 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".

За частта от промените, свързани с Clang 15.0, се споменава, че добавена експериментална поддръжка за C-подобен език HLSL (High-Level Shading Language), който се използва за писане на шейдъри, започващи с DirectX 9, както и за превод на HLSL шейдъри в DXIL (DirectX Intermediate Language), съвместим с DirectX 12 двоичен формат, както и SPIR формат -V, използван от Vulkan. В бъдеще, планират да внедрят поддръжка за формата DXBC (DirectX Bytecode), използван в DirectX 9-11. Реализацията е предоставена от Microsoft и е базирана на DirectX Shader Compiler, издаден през 2017 г., изграден на базата на LLVM 3.7.

Споменава се също, че продължава с работят за поддръжка на бъдещи стандарти C2X и C++23. Реализирано за езика C: атрибутът noreturn, ключовите думи false и true, типът _BitInt(N) за цели числа с дадена битова дълбочина, макросите *_WIDTH, префиксът u8 за UTF-8 знаци.

Освен, че, е внедрено за C++: обединяване на модули, ABI изолиране на функционални членове, подредена динамична инициализация на нелокални променливи в модула, многомерни индексни оператори, auto(x), нелитерални променливи, goto и етикети във функции, декларирани като constexpr, ограничени екраниращи последователности, именувани екраниращи символи.

За системи, базирани на архитектурата x86, добавен флаг "-fzero-call-used-regs", което осигурява нулиране на всички CPU регистри, използвани във функцията, преди да върне управлението от функцията. тази опция предпазва от изтичане на данни функции и намаляване на броя на блоковете, подходящи за създаване на ROP (Return Oriented Programming) устройства в експлойти с около 20%.

Внедрено е рандомизиране на местоположението на паметта на структурите за C код, което усложнява извличането на данни от структурите в случай на експлоатация на уязвимости. Рандомизирането се включва и изключва с атрибутите randomize_layout и no_randomize_layout и изисква семената да бъдат зададени с флага "-frandomize-layout-seed" или "-frandomize-layout-seed-file", за да се осигурят повтарящи се компилации.

От останалите промени които се открояват:

  • Разширени възможности, свързани с поддръжката на OpenCL и OpenMP. Добавена е поддръжка за OpenCL разширението cl_khr_subgroup_rotate.
  • Подобрени бекендове за x86, PowerPC и RISC-V архитектури.
    Подобрени възможности на LLD линкер и LLDB дебъгер.
  • Добавен флаг "-fstrict-flex-arrays=" » с който можете да контролирате границите на мек елемент от масив в структури (Soft Array Members, масив с неопределен размер в края на структурата).
  • Добавена е опция "-warray-parameter", за да предупреждава за отменящи функции с несъответстващи декларации на аргументи, свързани с масиви с фиксирана и променлива дължина.
  • Подобрена съвместимост с MSVC.
  • Добавена е поддръжка за функцията #pragma и #pragma alloc_text, предоставена в MSVC.
  • Добавена е поддръжка за MSVC-съвместими /JMC и /JMC флагове.
  • Добавен флаг "-m[no-]rdpru" за контрол на използването на инструкцията RDPRU, поддържана от AMD Zen2 процесори.
  • Добавен е флагът „-mfunction-return=thunk-extern“ за защита срещу уязвимостта RETBLEED, която работи чрез добавяне на последователност от инструкции, която изключва участието на спекулативния механизъм за изпълнение за непреки скокове.

Накрая Ако се интересувате да научите повече за това, можете да проверите подробностите в следваща връзка.


Добавяне като предпочитан източник