Нашри маҷмӯи компилятори 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=<cpu>», активирующей выбранные микроархитектурные оптимизации, независимо от значения «-march=<cpu>».
  • В статическом анализаторе улучшена обработка некоторых POSIX-функций и значительно улучшено определение результата условных операций при наличии в сравнении нескольких символьных значений. Добавлены новые проверки: fuchia.HandleChecker (определяет дескрипторы в структурах), webkit.UncountedLambdaCapturesChecker webkit и alpha.webkit.UncountedLocalVarsChecker (учитывают особенности работы с указателями в коде движка WebKit).
  • В выражениях, используемых в контексте констант, разрешено использование встроенных функций __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __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

Илова Эзоҳ