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

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

Ключовою зміною у новому випуску стало включення до складу Flang, фронтенду для мови Fortran. Flang підтримує Fortran 2018, OpenMP 4.5 та OpenACC 3.0, але розробка проекту поки не завершена і фронтенд обмежується розбором коду та його перевіркою на коректність. Генерація проміжного коду LLVM поки не підтримується і для формування файлів, що виконуються, генерується канонічний код, який передається у зовнішній компілятор Fortran.

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

  • Додано можливість відновлення абстрактного синтаксичного дерева (АСТ) для некоректного коду на C++, яке може використовуватися для спрощення діагностики помилок та надає додаткову інформацію для зовнішніх утиліт, таких як clang-tidy та clangd. Можливість за замовчуванням включена для коду C++ і керується через опції «-Xclang -f[no-]recovery-ast».
  • Додані нові режими діагностики:
    • "-Wpointer-to-int-cast" — група попереджень про приведення покажчиків до цілого типу int, що не містить усіх можливих значень.
    • "-Wuninitialized-const-reference" - попередження про передачу неініціалізованих змінних у параметрах функції, що приймають аргументи посилання з ознакою "const".
    • "-Wimplicit-const-int-float-conversion" - включене за умовчанням попередження про неявне перетворення речовинної константи в цілий тип.
  • Для платформи ARM надано вбудовані в компілятор Сі-функції (Intrinsics), що замінюються на ефективні векторні інструкції Arm v8.1-M MVE та CDE. Доступні функції визначені в заголовках arm_mve.h і arm_cde.h.
  • доданий набір розширених цілих типів _ExtInt(N), що дозволяють створювати типи не кратні ступеня двійки, які можуть ефективно оброблятися на FPGA/HLS. Наприклад_ExtInt(7) визначає цілий тип, що складається з 7 біт.
  • Додані макроси, що визначають підтримку вбудованих Си-функцій на базі інструкцій ARM SVE (Scalable Vector Extension):
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Наприклад, макрос __ARM_FEATURE_SVE визначається при генерації коду AArch64 з установкою опції командного рядка "-march=armv8-a+sve".

  • Прапор "-O" тепер ототожнюється з режимом оптимізації "-O1" замість "-O2".
  • Додані нові прапори компілятора:
    • "-fstack-clash-protection" - включає захист від перетину стека та купи.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - дозволяє вибрати режим обробника винятків для чисел з плаваючою комою.
    • "-ffp-model={precise,strict,fast}" - спрощує доступ до серії спеціалізованих опцій для чисел з плаваючою комою.
    • "-fpch-codegen" та "-fpch-debuginfo" для генерації передкомпільованого заголовка (PCH) з окремими об'єктними файлами для коду та debuginfo.
    • "-fsanitize-coverage-allowlist" та "-fsanitize-coverage-blocklist" для перевірки білого та чорного списків coverage-тестування.
    • "-mtls-size={12,24,32,48}" для вибору розміру TLS (thread-local storage).
    • "-menable-experimental-extension" для включення експериментальних розширень RISC-V.
  • За умовчанням для Сі застосовано режим "-fno-common", що дозволяє підвищити ефективність доступу до глобальних змінних на деяких платформах.
  • Кеш модулів за умовчанням перенесено з /tmp до каталогу ~/.cache. Для перевизначення можна використовувати прапор "-fmodules-cache-path=".
  • Стандартний мову Сі, що застосовується за замовчуванням, оновлено з gnu11 до gnu17.
  • Додано попередню підтримку розширення GNU C «asm inline» для додавання асемблерних вставок. Розширення поки що лише розбирається, але ніяк не обробляється.
  • Розширено можливості, пов'язані з підтримкою OpenCL та CUDA. Додано підтримку діагностики блоків OpenCL 2.0 та реалізовано нові можливості OpenMP 5.0.
  • В утиліту clang-format додано опцію IndentExternBlock для вирівнювання всередині блоків extern C і extern C++.
  • У статичному аналізаторі поліпшена обробка успадкованих конструкторів C++. Додані нові перевірки alpha.core.C11Lock і alpha.fuchsia.Lock для перевірки блокувань, alpha.security.cert.pos.34c для виявлення небезпечного використання putenv, webkit.NoUncountedMemberChecker та webkit.RefCntblBaseVirtualDtor для виявлення . SmartPtr для перевірки розіменування нульового розумного покажчика.
  • У linter clang-tidy додано велика частина нових перевірок.
  • У кешуючому сервері clangd (Clang Server) підвищено продуктивність та додано нові можливості діагностики.

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

  • Система складання переведена на використання Python 3. Якщо Python 3 недоступний, то реалізована можливість відкату на використання Python 2.
  • З випуску виключено фронтенд з компілятором для мови Go (llgo), який, можливо, буде реструктизований у майбутньому.
  • У проміжне подання (IR) доданий атрибут vector-function-abi-variant для опису мапінгу між скалярними та векторними функціями для векторизації викликів. З llvm::VectorType виділено два окремі векторні типи llvm::FixedVectorType і llvm::ScalableVectorType.
  • Визнано невизначеною поведінкою розгалуження на основі udef-значень та передача undef-значень у функції стандартної бібліотеки. У
    memset/memcpy/memmove дозволена передача undef-покажчиків, але якщо параметр з розміром дорівнює нулю.

  • У LLJIT додано підтримку виконання статичних ініціалізацій через методи LLJIT::initialize і LLJIT::deinitialize. Реалізовано можливість додавання статичних бібліотек до JITDylib за допомогою класу StaticLibraryDefinitionGenerator. Доданий Сі API для ORCv2 (API для збирання JIT-компіляторів).
  • У бекенд для архітектури AArch64 додано підтримку процесорів Cortex-A34, Cortex-A77, Cortex-A78 та Cortex-X1. Реалізовані розширення ARMv8.2-BF16 (BFloat16) та ARMv8.6-A, включаючи RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Activity Monitors virtualization) та ARMv8.0-DGH (Data gathering hint). Забезпечено можливість генерації коду для вбудованих функцій-обв'язок до векторних інструкцій SVE.
  • У бекенд для архітектури ARM додано підтримку процесорів Cortex-M55, Cortex-A77, Cortex-A78 та Cortex-X1. Реалізовано розширення
    Armv8.6-A Matrix Multiply та RMv8.2-AA32BF16 BFloat16.

  • У бекенд для архітектури PowerPC додано підтримку генерації коду для процесорів POWER10. Розширено оптимізацію циклів та покращено підтримку операцій з плаваючою комою.
  • У бекенді для архітектури RISC-V дозволено прийом патчів з підтримкою експериментальних розширених наборів інструкцій, які ще офіційно не схвалені.
  • Бекенд для архітектури AVR переведений з категорії експериментальних у стабільні, включені до базової поставки.
  • У бекенді для архітектури x86 реалізовано підтримку інструкцій Intel AMX і TSXLDTRK. Доданий захист від атак LVI (Load Value Injection), а також реалізований загальний механізм Speculative Execution Side Effect Suppression для блокування атак, спричинених спекулятивним виконанням операцій у CPU.
  • У бекенді для архітектури SystemZ додано підтримку MemorySanitizer і LeakSanitizer.
  • У Libc++ додано підтримку заголовного файлу з математичними константами .
  • Розширено можливості компонувальника LLD. Поліпшена підтримка формату ELF, у тому числі додані опції "-lto-emit-asm", "-lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", "-thinlto- single-module», «unique», «rosegment», «threads = N». Додано опцію «—time-trace» для збереження трасування у файл, який можна проаналізувати через інтерфейс chrome://tracing в Chrome.

Джерело: opennet.ru

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