Реліз комплекту компіляторів LLVM 15.0

Після шести місяців розробки представлений реліз проекту LLVM 15.0 - GCC-сумісного інструментарію (компілятори, оптимізатори та генератори коду), що компілює програми в проміжний біткод RISC-подібних віртуальних інструкцій (низькорівнева віртуальна машина з багаторівневою системою). Сгенерований псевдокод може бути перетворений за допомогою JIT-компілятора машинні інструкції безпосередньо в момент виконання програми.

Основні покращення в Clang 15.0:

  • Для систем на базі архітектури x86 доданий прапор "-fzero-call-used-regs", що забезпечує обнулення всіх використаних у функції регістрів CPU перед поверненням управління з функції. Зазначена опція дозволяє захиститися від витоку інформації з функцій і приблизно на 20% скоротити кількість блоків, придатних для побудови ROP-гаджетів (Return-Oriented Programming) в експлоїтах.
  • Реалізовано рандомізацію розміщення у пам'яті структур для коду мовою Сі, яка ускладнює вилучення даних із структур у разі експлуатації вразливостей. Рандомізація включається та вимикається за допомогою атрибутів randomize_layout та no_randomize_layout, і вимагає встановлення затравки за допомогою прапора "-frandomize-layout-seed" або "-frandomize-layout-seed-file".
  • Доданий прапор «-fstrict-flex-arrays= », за допомогою якого можна керувати кордонами для гнучкого елемента-масиву в структурах (Flexible Array Members, масив невизначеного розміру наприкінці структури). При виставленні значення 0 (за замовчуванням) останній елемент структури з масивом завжди обробляється як гнучкий масив, 1 - тільки розміри [], [0] і [1] обробляються як гнучкий масив, 2 - тільки розміри [] і [0] обробляються як гнучкий масив.
  • Додано експериментальну підтримку Сі-подібної мови HLSL (High-Level Shader Language), що використовується в DirectX для написання шейдерів.
  • Додано параметр «-Warray-parameter», який попереджає про перевизначення функцій з оголошенням аргументів, що не поєднується, пов'язаних з масивами фіксованої та змінної довжини.
  • Поліпшено сумісність із MSVC. Додана підтримка «#pragma function» (вказує компілятору генерувати виклик функції замість її inline-розгортання) і «#pragma alloc_text» (визначає ім'я секції з кодом функції), що надаються в MSVC. Додана підтримка сумісних із MSVC прапорів /JMC та /JMC.
  • Продовжено роботу щодо забезпечення підтримки майбутніх стандартів C2X та C++23. Для мови Сі реалізовані: атрибут noreturn, ключові слова false і true, тип _BitInt(N) для цілих чисел заданої розрядності, макроси *_WIDTH, префікс u8 для символів кодування UTF-8.

    Для З++ реалізовані: злиття модулів, ізоляція ABI членів функцій, упорядкована динамічна ініціалізація нелокальних змінних у модулях, багатовимірні індексні оператори, auto(x), нелітеральні змінні, goto та мітки у функціях, оголошених як constexpr, escape іменовані escape-символи.

  • Розширено можливості, пов'язані з підтримкою OpenCL та OpenMP. Додано підтримку OpenCL-розширення cl_khr_subgroup_rotate.
  • Для архітектури x86 додано захист від уразливостей у процесорах, спричинених спекулятивним виконанням інструкцій після операцій безумовного прямого переходу. Проблема виникає через попереджувальну обробку інструкцій, що йдуть у пам'яті відразу за командою переходу (SLS, Straight Line Speculation). Для включення захисту запропоновано опцію «-mharden-sls=[none|all|return|indirect-jmp]».
  • Для платформ з підтримкою розширення SSE2 доданий тип _Float16, який емулюється з використанням типу float у разі відсутності підтримки інструкцій AVX512-FP16.
  • Доданий прапор "-m[no-]rdpru" для керування використанням інструкції RDPRU, що підтримується починаючи з процесорів AMD Zen2.
  • Доданий прапор "-mfunction-return=thunk-extern" для захисту від уразливості RETBLEED, що працює через додавання послідовності інструкцій, що виключає залучення спекулятивного механізму виконання для непрямих переходів.

Основні нововведення LLVM 15.0:

  • Додана підтримка CPU 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».
  • Покращені бекенди для архітектур x86, PowerPC та RISC-V.
  • Розширено можливості компонувальника LLD та відладчика LLDB.

Джерело: opennet.ru

Додати коментар або відгук