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

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

З нових можливостей LLVM 9.0 відзначається забезпечення зняття мітки експериментальної розробки з цільової платформи RISC-V, підтримка C++ для OpenCL, можливість поділу програми на частини, що динамічно підвантажуються в LLD і реалізація конструкції «asm goto«, що використовується в коді ядра Linux. У libc++ додано підтримку WASI (WebAssembly System Interface), а LLD з'явилася початкова підтримка динамічного зв'язування WebAssembly.

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

  • Додана реалізація специфічного для GCC виразу «asm goto«, яке дозволяє виконати перехід із асемблерного inline-блоку до мітки в коді мовою Сі. Вказана можливість необхідна для збирання ядра Linux в режимі CONFIG_JUMP_LABEL=y з використанням Clang на системах з архітектурою x86_64. З урахуванням доданих у попередніх випусках змін, ядро ​​Linux тепер може збиратися в Clang і для архітектури x86_64 (раніше підтримувалася тільки збірка для архітектур arm, aarch64, ppc32, ppc64le і mips). Більш того, проекти Android і ChromeOS вже переведені на використання Clang для збирання ядра і Google тестує Clang як основну платформу для збирання ядер для своїх робочих Linux-систем. Надалі в процесі складання ядра можна буде використовувати інші компоненти LLVM, включаючи LLD, llvm-objcopy, llvm-ar, llvm-nm і llvm-objdump;
  • Додана експериментальна підтримка використання C++17 OpenCL. Зі специфічних можливостей відзначається підтримка атрибутів адресного простору, блокування перетворення адресного простору операторами приведення типів, надання векторних типів як OpenCL для C, наявність специфічних OpenCL-типів для зображень, подій, каналів і т.п.
  • Додані нові прапори компілятора "-ftime-trace" та "-ftime-trace-granularity=N" для генерації звіту про час виконання різних стадій роботи фронтенду (парсинг, ініціалізація) та бекенда (стадії оптимізації). Звіт зберігається у форматі json, сумісному з chrome://tracing та speedscope.app;
  • Додано обробку специфікатора «__declspec(allocator)» та генерацію супутньої налагоджувальної інформації, що дозволяє відстежувати споживання пам'яті в середовищі Visual Studio;
  • Для мови Сі додана підтримка макросу "__FILE_NAME__", що нагадує макрос "__FILE__", але включає тільки ім'я файлу без повного шляху;
  • Для мови C++ розширена підтримка атрибутів адресного простору, що охоплюють різні можливості C++, включаючи шаблони параметрів і аргументів, типи посилань, виведення типу значення, що повертається, об'єкти, автоматично генеровані функції, вбудовані оператори і т.п.
  • Розширено можливості, пов'язані з підтримкою OpenCL, OpenMP та CUDA. У тому числі забезпечено початкову підтримку неявного включення вбудованих функцій OpenCL (додано прапор «-fdeclare-opencl-builtins»), реалізовано розширення cl_arm_integer_dot_product та розширено засоби діагностики;
  • Поліпшено роботу статичного аналізатора та додано документацію щодо виконання статичного аналізу. Додані прапори для відображення доступних модулів перевірки та підтримуваних опцій («-analyzer-checker[-option]-help», «-analyzer-checker[-option]-help-alpha" та "-analyzer-checker[-option]-help -Developer»). Доданий прапор "-analyzer-werror" для реагування на попередження як на помилки.
    Додано нові режими перевірки:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling для виявлення небезпечних прийомів роботи з буферами;
    • osx.MIGChecker для пошуку порушень правил оформлення викликів MIG (Mach Interface Generator);
    • optin.osx.OSObjectCStyleCast для пошуку некоректних перетворень об'єктів XNU libkern;
    • apiModeling.llvm з набором моделюючих функцій перевірки для виявлення помилок у кодовій базі LLVM;
    • Стабілізовано код для перевірки неініціалізованих об'єктів С++ (UninitializedObject в пакеті optin.cplusplus);
  • В утиліту clang-format додана підтримка форматування коду мовою C# і забезпечена підтримка стилю оформлення коду, що застосовується в Microsoft;
  • У clang-cl, альтернативному інтерфейсі командного рядка, що забезпечує сумісність на рівні опцій з компілятором cl.exe зі складу Visual Studio, додано евристику для сприйняття неіснуючих файлів як опцій командного рядка з виведенням відповідного попередження (наприклад, при запуску «clang-cl /diagnostic» :caret /c test.cc»);
  • У linter clang-tidy додано велику порцію нових перевірок, у тому числі додано перевірки, специфічні для API OpenMP;
  • Розширено можливості сервера clangd (Clang Server), в якому за умовчанням включений режим побудови індексу у фоновому режимі, додано підтримку контекстних дій з кодом (витяг змінної, розкриття визначень auto і макросів, перетворення екранованих рядків на неекрановані), з'явилася можливість виведення попереджень від Clang-tidy, розширена діагностика помилок у заголовних файлах та додана можливість виведення інформації про ієрархію типів;

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

  • У компонувальник LLD додано експериментальну можливість партикування, що дозволяє розділити одну програму на кілька частин, кожна з яких розміщується в окремому ELF-файлі. Вказана можливість дозволяє запускати основну частину програми, яка при необхідності в процесі роботи підвантажуватиме інші компоненти (наприклад, можна виділити вбудований PDF-переглядач в окремий файл, який завантажуватиметься тільки коли користувач відкрив PDF-файл).

    Компонувальник LLD доведено до стану, придатного для компонування ядра Linux для архітектур arm32_7, arm64, ppc64le та x86_64.
    Запропоновано нові опції "-" (висновок у stdout), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " -z ifunc-noplt» та «-z common-page-size». Для архітектури AArch64 додано підтримку інструкцій BTI (Branch Target Indicator) та PAC (Pointer Authentication Code). Істотно покращено підтримку платформ MIPS, RISC-V і PowerPC. Додано початкову підтримку динамічного зв'язування для WebAssembly;

  • У libc++ реалізовані функції ssize, std::is_constant_evaluated, std::midpoint і std::lerp, до std::span додані методи «front» і «back», додані ознаки типів std::is_unbounded_array та std::is_bounded_array, розширені можливості std :Atomic. Припинено підтримку GCC 4.9 (можливе використання з GCC 5.1 та новіших випусків). Додана підтримка ВАСИ (WebAssembly System Interface, інтерфейс для використання WebAssembly поза браузером);
  • Додано нові оптимізації. Забезпечено перетворення дзвінків memcmp на bcmp у деяких ситуаціях. Реалізовано перевірку діапазонів для таблиць переходів, в яких нижні блоки switch недосяжні або коли інструкції не використовуються, наприклад, при виклику функцій з типом void;
  • Стабілізований бекенд для архітектури RISC-V, який більше не позиціонується як експериментальний і збирається за замовчуванням. Забезпечено повну підтримку генерації коду для варіантів наборів інструкцій RV32I та RV64I з розширеннями MAFDC;
  • Внесено численні покращення в бекенди для архітектур X86, AArch64, ARM, SystemZ, MIPS, AMDGPU та PowerPC. Наприклад, для архітектури
    AArch64 додано підтримку інструкцій SVE2 (Scalable Vector Extension 2) та MTE (Memory Tagging Extensions), в бекенді ARM додано підтримку архітектури Armv8.1-M та розширення MVE (M-Profile Vector Extension). У бекенд AMDGPU додано підтримку архітектури GFX10 (Navi), за замовчуванням включено можливості виклику функцій та активовано комбінований прохід DPP (Data-Parallel Primitives).

  • У відладчику LLDB з'явилося кольорове підсвічування зворотних трасувань, додано підтримку блоків DWARF4 debug_types і DWARF5 debug_info;
  • В утиліти llvm-objcopy та llvm-strip додана підтримка об'єктних та виконуваних файлів у форматі COFF.

Джерело: opennet.ru

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