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

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

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

  • Реалізована та включена за умовчанням підтримка запропонованих у стандарті C++20 атрибутів «likely» та «unlikely», що дозволяють інформувати оптимізатор про ймовірність спрацьовування умовної конструкції (наприклад, «[[likely]] if (random > 0) {«)».
  • Додано підтримку процесорів AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) та Intel Sapphire Rapids (-march=sapphirerapids).
  • Додано підтримку прапорів «-march=x86-64-v[234]» для вибору рівнів архітектури x86-64 (v2 - охоплює розширення SSE4.2, SSSE3, POPCNT і CMPXCHG16B; v3 - AVX2 і MOVBE; v4 - AVX-512) .
  • Додана підтримка процесорів Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) та Fujitsu A64FX (a64fx). Наприклад, для включення оптимізації для CPU Neoverse-V1 можна вказати "-mcpu=neoverse-v1".
  • Для архітектури AArch64 додані нові прапори компілятора -moutline-atomics та -mno-outline-atomics, призначені для включення та відключення допоміжних функцій з реалізацією атомарних операцій, таких як __aarch64_cas8_relax. Подібні функції під час виконання визначають наявність підтримки розширень LSE (Large System Extensions) і використовують атомарні процесорні інструкції, що надаються, або відкочуються на використання інструкцій LL/SC (Load-link/store-conditional) для синхронізації.
  • Додано опцію "-fbinutils-version" для вибору цільової версії набору binutils для забезпечення сумісності зі старою поведінкою компонувальника та асемблера.
  • Для виконуваних файлів ELF при вказівці прапора "-gz" за замовчуванням увімкнено стиснення налагоджувальної інформації з використанням бібліотеки zlib (gz=zlib). Для компонування результуючих об'єктних файлів потрібно lld або GNU binutils 2.26+. Для відновлення сумісності зі старими версіями binutils можна вказати "-gz=zlib-gnu".
  • Покажчик 'this' тепер обробляється з перевірками nonnull і dereferenceable(N). Для видалення атрибуту nonnull, за необхідності використання значень NULL, можна використовувати опцію "-fdelete-null-pointer-checks".
  • На платформі Linux для архітектур AArch64 і PowerPC включений режим "-fasynchronous-unwind-tables" для генерації "розкручених" (unwind) таблиць викликів, як у GCC.
  • В "#pragma clang loop vectorize_width" додано можливість вказівки опцій "fixed" (за замовчуванням) та "scalable" для вибору методу векторизації. Режим "scalable", незалежний від довжини вектора, є експериментальним і може використовуватися на обладнанні з підтримкою масштабованої векторизації.
  • Покращена підтримка платформи Windows: Підготовлені офіційні бінарні збірки для Windows на системах Arm64, що включають компілятор Clang, компонувальник LLD та runtime-бібліотеки compiler-rt. Під час складання для цільових платформ MinGW реалізовано додавання суфікса .exe, навіть при виконанні крос-компіляції.
  • Розширено можливості, пов'язані з підтримкою OpenCL, OpenMP та CUDA. Додані опції "-cl-std=CL3.0" та "-cl-std=CL1.0" для вибору варіантів макросів для OpenCL 3.0 та OpenCL 1.0. Розширено засоби діагностики.
  • Додано підтримку інструкцій HRESET, UINTR та AVXVNNI, реалізованих у деяких процесорах на базі архітектури x86.
  • На системах x86 включено підтримку опції «-mtune= », що активує вибрані мікроархітектурні оптимізації, незалежно від значення «-march= ».
  • У статичному аналізаторі покращено обробку деяких POSIX-функцій та значно покращено визначення результату умовних операцій за наявності порівняно кількох символьних значень. Додані нові перевірки: fuchia.HandleChecker (визначає дескриптори в структурах), webkit.UncountedLambdaCapturesChecker webkit та alpha.webkit.UncountedLocalVarsChecker (враховують особливості роботи з покажчиками у коді движка WebKit).
  • У виразах, що використовуються в контексті констант, дозволено використання вбудованих функцій __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_s__ __bswapd, __bswap64, __bswapq, _castf*, __rol* та __ror*.
  • В утиліту clang-format додано опцію BitFieldColonSpacing для вибору розміщення пробілів навколо ідентифікаторів, стовпців та визначень полів.
  • У сервері clangd (Clang Server) на платформі Linux значно скорочено споживання пам'яті при тривалій роботі (забезпечений періодичний виклик malloc_trim для віддачі вільних сторінок пам'яті операційній системі).

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

  • Припинено підтримку написаного мовою Python складального інструментарію llvm-build, замість якого проект повністю перейшов на використання складальної системи CMake.
  • У бекенді для архітектури AArch64 покращена підтримка платформи Windows: забезпечено коректну генерацію асемблерного виведення для цільових систем Windows, оптимізовано генерацію даних про «розкрутку» (unwind) викликів (розмір подібних даних скоротився на 60%), додано можливість створення unwind-даних за допомогою директиви .seh_*.
  • У бекенді для архітектури PowerPC реалізовані нові оптимізації циклів та inline-розгортання, розширення підтримка процесорів Power10, додана підтримка інструкцій MMA для маніпуляцій з матрицями, покращена підтримка операційної системи AIX.
  • У бекенді для архітектури x86 додана підтримка процесорів AMD Zen 3, Intel Alder Lake та Intel Sapphire Rapids, а також процесорних інструкцій HRESET, UINTR та AVXVNNI. Припинено підтримку розширень MPX (Memory Protection Extensions) для перевірки покажчиків на дотримання меж областей пам'яті (зазначена технологія не набула поширення і вже видалена з GCC і clang). В асемблер додано підтримку префіксів {disp32} і {disp8} і суфіксів .d32 і .d8 для керування розміром зсуву операндів і переходів. Додано новий атрибут tune-cpu для управління включенням мікроархітектурних оптимізацій.
  • У детектор проблем під час роботи з цілими числами (integer sanitizer, "-fsanitize=integer") додано новий режим "-fsanitize=unsigned-shift-base" виявлення переповнень беззнакових цілих чисел після бітового зсуву вліво.
  • У різних детекторах (asan, cfi, lsan, msan, tsan, ubsan sanitizer) додано підтримку Linux-дистрибутивів зі стандартною бібліотекою Musl.
  • Розширено можливості компонувальника LLD. Поліпшена підтримка формату ELF, в тому числі додані опції «dependency-file», «error-handling-script», «lto-pseudo-probe-for-profiling», «no-lto-whole-program-visibility ». Поліпшено підтримку MinGW. Для формату Mach-O (macOS) реалізована підтримка архітектур arm64, arm та i386, оптимізації на етапі зв'язування (LTO) та розкручування стека при обробці винятків.
  • У Libc++ реалізовано нові можливості стандарту C++20 і розпочалася розробка можливостей специфікації C++2b. Додано підтримку збірки з відключенням підтримки локалізації («-DLIBCXX_ENABLE_LOCALIZATION=OFF») та пристроїв для генерації псевдо-випадкових чисел («-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF»).

Джерело: opennet.ru

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