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

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

Поліпшення у Clang 13.0:

  • Реалізовано підтримку гарантованих хвостових викликів (виклик підпрограми в самому кінці функції, що утворює хвостову рекурсію у випадку, якщо підпрограма викликається сама себе). Підтримка гарантованих хвостових викликів забезпечена за допомогою атрибуту "[[clang::musttail]]" в C++ і "__attribute__((musttail))" в C, що застосовуються у виразі "return". Можливість дозволяє реалізувати оптимізації через розгортання коду в плоску ітерацію задля економії витрати стека.
  • У деклараціях «using» та розширеннях clang реалізовано підтримку визначення атрибутів у стилі C++11, використовуючи формат «[[]]».
  • Доданий прапор «-Wreserved-identifier» для виведення попередження при вказівці в коді користувача зарезервованих ідентифікаторів.
  • Додані прапори "-Wunused-but-set-parameter" та "-Wunused-but-set-variable" для виведення попередження, якщо параметр або змінна виставлені, але не використовуються.
  • Доданий прапор "-Wnull-pointer-subtraction" для виведення попередження, якщо код може призвести до невизначеної поведінки через використання нульового покажчика в операціях віднімання.
  • Доданий прапор "-fstack-usage" для генерації для кожного файлу з кодом додаткового файлу ".su", що містить відомості про розмір кадрів стека для кожної функції, визначеної в файлі, що обробляється.
  • У статичному аналізаторі додано новий тип виводу - "sarif-html", що призводить до формування звітів одночасно у форматах HTML і Sarif. Додано нову перевірку allocClassWithName. При наведенні опції «-analyzer-display-progress» забезпечено виведення часу аналізу кожної функції. Майже доведено до готовності аналізатор розумних покажчиків (alpha.cplusplus.SmartPtr).
  • Розширено можливості, пов'язані із підтримкою OpenCL. Додано підтримку нових розширень cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields та __cl_clang_non_portable_kernel_param_types. Продовжено реалізацію специфікації OpenCL 3.0. Для Сі за замовчуванням задіяна специфікація OpenCL 1.2, якщо явно не вибрано іншу версію. Для C++ додано підтримку файлів з розширенням ".clcpp".
  • Реалізована підтримка директив трансформації циклів (#pragma omp unrol і #pragma omp tile), визначених у специфікації OpenMP 5.1.
  • В утиліту clang-format додані опції: SpacesInLineCommentPrefix для визначення кількості пробілів перед коментарями, IndentAccessModifiers, LambdaBodyIndentation і PPIndentWidthдля управління вирівнюванням записів, лямбда-виразів та директив препроцесора. Розширено можливості сортування переліку заголовних файлів (SortIncludes). Додано підтримку форматування файлів JSON.
  • У linter clang-tidy додано велику порцію нових перевірок.

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

  • Додано опцію "-ehcontguard" для використання технології CET (Windows Control-flow Enforcement Technology) для захисту на етапі обробки винятків від виконання експлоїтів, побудованих з використанням прийомів зворотно-орієнтованого програмування (ROP, Return-Oriented Programming).
  • Проект debuginfo-test перейменований на cross-project-tests і розрахований на тестування компонентів з різних проектів, не обмежуючись налагоджувальною інформацією.
  • У складальній системі забезпечена підтримка складання кількох дистрибутивів, наприклад, один з утилітами, а другий з бібліотеками для розробників.
  • У бекенді для архітектури AArch64 в асемблері реалізована підтримка розширень Armv9-A RME (Realm Management Extension) та SME (Scalable Matrix Extension).
  • У бекенд для архітектури Hexagon додано підтримку ISA V68/HVX.
  • У бекенді для архітектури x86 покращена підтримка процесорів AMD Zen 3.
  • У бекенд AMDGPU додано підтримку APU GFX1013 RDNA2.
  • У Libc++ продовжено реалізацію нових можливостей стандартів C++20 і C++2b, зокрема завершено реалізацію бібліотеки «concepts». Для платформи Windows на базі MinGW додано підтримку std::filesystem. Розділено заголовні файли , та . Додано збірну опцію LIBCXX_ENABLE_INCOMPLETE_FEATURES для відключення заголовних файлів з не повністю реалізованою функціональністю.
  • Розширено можливості компонувальника LLD, в якому реалізовано підтримку Big-endian процесорів Aarch64, а бекенд Mach-O доведений до стану, що дозволяє компонувати звичайні програми. Увімкнено покращення, необхідні для компонування Glibc з використанням LLD.
  • Утиліту llvm-mca (Machine Code Analyzer) додано підтримку процесорів, що виконують інструкції по порядку (in-order superscalar pipeline), таких як ARM Cortex-A55.
  • У відладчику LLDB для платформи AArch64 реалізовано повну підтримку автентифікації покажчиків (Pointer Authentication), механізму MTE (MemTag, Memory Tagging Extension) та регістрів SVE. Додані команди, що дозволяють прив'язати теги до кожної операції виділення пам'яті та організувати при доступі до пам'яті перевірку покажчика, який має бути пов'язаний із коректним тегом.
  • До складу бінарних збірок, що формуються проектом, додані відладник LLDB і фронтенд для мови Fortran — Flang.

Джерело: opennet.ru

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