Релиз набора компиляторов LLVM 12.0
16 апреля 2021 года
После шести месяцев разработки представлен релиз проекта 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").
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.