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

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

З нових можливостей LLVM 10.0 відзначається підтримка концепцій C++ (C++ Concepts), припинення запуску Clang у вигляді окремого процесу, підтримка перевірок CFG (control flow guard) Windows і підтримка нових можливостей CPU.

покращення у Clang 10.0:

  • Додано підтримку «концепції«, Розширення шаблонів C++, яке увійде до складу наступного стандарту, що розвивається під кодовим ім'ям C++2a (включається прапором -std=c++2a).
    Концепції дозволяють визначити набір вимог до параметрів шаблону, які під час компіляції обмежують набір аргументів, які можуть бути прийняті як параметри шаблону. Концепції можна застосовувати для того, щоб уникнути логічних невідповідностей між властивостями типів даних, що використовуються всередині шаблону, та властивостями типів даних вхідних параметрів.

    template
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    {a!=b} -> std::boolean;
    };

  • За замовчуванням припинено запуск окремого процесу (clang -cc1), в якому виконується компіляція. Компіляція тепер виконується в основному процесі, а для відновлення старої поведінки можна використовувати опцію "-fno-integrated-cc1".
  • Нові режими діагностики:
    • "-Wc99-designator" та "-Wreorder-init-list" - попереджають про використання ініціалізаторів C99 в режимі C++ у випадках, коли вони коректні в C99, але не підходять для C++20.
    • -Wsizeof-array-div - відловлює такі ситуації, як int arr [10]; …sizeof(arr) / sizeof(short)…» (має бути «sizeof(arr) / sizeof(int)»).
    • -Wxor-used-as-po - попереджає про використання таких конструкцій, як застосування оператора "^" (xor) в операціях, які можна сплутати зі зведенням в ступінь (2 ^ 16).
    • "-Wfinal-dtor-non-final-class" - попереджає про класи, не позначені специфікатором "final", але мають деструктор з ознакою "final".
    • -Wtautological-bitwise-compare - група попереджень для діагностики тавтологічного порівняння бітової операції і константи, а також для виявлення завжди справжніх порівнянь, в яких бітова операція OR застосовується до невід'ємного числа.
    • "-Wbitwise-conditional-parentheses" попереджає про проблеми при змішуванні логічних операторів AND ("&") та OR ("|") з умовним оператором ("?:").
    • "-Wmisleading-indentation" - аналог однойменної перевірки з GCC, що попереджає про вирази, виділені відступом, ніби вони входять до блоку if/else/for/while, але насправді в даний блок не входять.
    • При вказівці "-Wextra" забезпечено включення перевірки "-Wdeprecated-copy", що попереджає про використання конструкторів
      «move» та «copy» у класах із явним визначенням деструктора.

    • Розширені перевірки "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis".
    • За замовчуванням вимкнено перевірки "-Wbitwise-op-parentheses" та "-Wlogical-op-parentheses".
  • У коді С і З++ арифметичні операції з покажчиками дозволені лише у масивах. Детектор невизначеної поведінки (Undefined Behavior Sanitizer) в режимі -fsanitize=pointer-overflow тепер відловлює такі випадки, як додавання ненульового зміщення до вказівника зі значенням null або утворення нульового покажчика при відніманні цілого числа з ненульового покажчика.
  • Режим "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) адаптований для виявлення проблем з операціями інкременту та декременту для типів з бітовим розміром меншим, ніж у типу "int".
  • При виборі цільових x86-архітектур "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" та "-march=cooperlake" за замовчуванням у векторизованому коді припинено використання 512-розрядних регістрів zmm, за винятком їхньої прямої вказівки у вихідних текстах. Причиною є зниження частоти CPU при виконанні 512-розрядних операцій, що може негативно впливати на загальну продуктивність. Для зміни нової поведінки передбачено опцію "-mprefer-vector-width=512".
  • Поведінка прапора "-flax-vector-conversions" наближена до GCC: заборонені неявні векторні бітові перетворення між цілими векторами і векторами з плаваючою точкою. Для виключення цього обмеження пропонується використовувати прапор
    "-flax-vector-conversions=all", який використовується за замовчуванням.

  • Поліпшено підтримку CPU MIPS сімейства Octeon. До списку допустимих типів CPU додано "octeon+".
  • Під час складання в проміжний код WebAssembly забезпечено автоматичний виклик оптимізатора wasm-opt, за наявності в системі.
  • Для систем на базі архітектури RISC-V в умовних блоках асемблерних inline-вставок дозволено використання регістрів, що зберігають значення з плаваючою комою.
  • Додані нові прапори компілятора: -fgnuc-version для завдання значення версії для __GNUC__ і подібних макросів; "-fmacro-prefix-map=OLD=NEW" для заміни префікса каталогів OLD на NEW у таких макросах, як "__FILE__"; "-fpatchable-function-entry=N[,M]" для генерації певного числа інструкцій NOP перед та після точкою входу в функцію. Для RISC-V
    додано підтримку прапорів "-ffixed-xX", "-mcmodel=medany" та "-mcmodel=medlow".

  • Додано підтримку атрибуту '__attribute__((target(«branch-protection=…»)))»', дія якого аналогічна опції -mbranch-protection.
  • На платформі Windows при вказівці прапора -cfguard реалізована підстановка перевірок цілісності потоку виконання (Control Flow Guard) при непрямих викликах функцій. Для вимкнення підстановки перевірок можна використовувати прапор "-cfguard-nochecks" або модифікатор "__declspec(guard(nocf))".
  • Поводження атрибуту gnu_inline наближено до GCC у випадках, коли він використовується без ключового слова "extern".
  • Розширено можливості, пов'язані з підтримкою OpenCL та CUDA. Додано підтримку нових можливостей OpenMP 5.0.
  • В утиліту clang-format додано опцію Standard, що дозволяє визначити версію стандарту C++, що застосовується при розборі та форматуванні коду (Latest, Auto, c++03, c++11, c++14, c++17, c++20) ).
  • У статичний аналізатор додані нові перевірки: alpha.cplusplus.PlacementNew для визначення достатнього місця в сховищі, fuchsia.HandleChecker для виявлення витоків, пов'язаних з обробниками Fuchsia, security.insecureAPI.decodeValueOfObjCType для визначення потенційних переповнень Type:at:] .
  • У детекторі невизначеної поведінки (UBSan, Undefined Behavior Sanitizer) розширено перевірки переповнення покажчиків, які відловлюють застосування ненульових зсувів до покажчиків NULL або отримання в результаті додавання зміщення покажчика зі значенням NULL.
  • У linter clang-tidy додано велика частина нових перевірок.

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

  • У фреймворк Attributor додано нові міжпроцедурні оптимізації та аналізатори. Забезпечено прогнозування стану 19 різних атрибутів, включаючи 12 атрибутів 12 LLVM IR та 7 абстрактних атрибутів, таких як живучість (liveness).
  • Додано нові вбудовані в компілятор матричні математичні функції (Intrinsics), які під час компіляції замінюються на ефективні векторні інструкції.
  • Внесено численні покращення в бекенди для архітектур X86, AArch64, ARM, SystemZ, MIPS, AMDGPU та PowerPC. Додана підтримка CPU
    Cortex-A65, Cortex-A65AE, Neoverse E1 та Neoverse N1. Для ARMv8.1-M оптимізовано процес генерації коду (наприклад, з'явилася підтримка циклів з мінімальними накладними витратами) та додано підтримку автовекторизації з використанням розширення MVE. Поліпшено підтримку CPU MIPS Octeon. Для PowerPC включено векторизацію математичних підпрограм з використанням бібліотеки MASSV (Mathematical Acceleration SubSystem), покращено генерацію коду та оптимізовано доступ до пам'яті з циклів. Для x86 змінено обробку векторних типів v2i32, v4i16, v2i16, v8i8, v4i8 і v2i8.

  • Покращено генератор коду для WebAssembly. Додано підтримку TLS (Thread-Local Storage) та інструкції atomic.fence. Значно розширено підтримку SIMD. У об'єктних файлах WebAssembly додано можливість використання сигнатур функцій з кількома значеннями.
  • При обробці циклів задіяно аналізатор MemorySSA, що дозволяє визначати залежність між різними операціями з пам'яттю. MemorySSA дозволяє досягти скорочення часу компіляції та виконання коду або може використовуватися замість AliasSetTracker без втрати у продуктивності.
  • У відладчику LLDB значно покращено підтримку формату DWARF v5. Поліпшено підтримку складання з MinGW
    та додано початкову можливість налагодження виконуваних файлів Windows для архітектур ARM та ARM64. Додано опис опцій, пропонованих при автодоповненні введення натисканням табуляції.

  • Розширено можливості компонувальника LLD. Покращена підтримка формату ELF, у тому числі забезпечена повна сумісність glob-шаблонів з компонувальником GNU, додана підтримка стиснутих секцій налагодження «.zdebug», додана властивість PT_GNU_PROPERTY для визначення секції .note.gnu.property (може використовуватися в майбутніх ядрах
    реалізовані режими "-z noseparate-code", "-z separate-code" та "-z separate-loadable-segments". Поліпшено підтримку MinGW і WebAssembly.

Джерело: opennet.ru

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