Релиз набора компиляторов LLVM 11.0
12 октября 2020 года
После шести месяцев разработки представлен релиз проекта LLVM 11.0 - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Ключевым изменением в новом выпуске стало включение в состав Flang, фронтэнда для языка Fortran. Flang поддерживает Fortran 2018, OpenMP 4.5 и OpenACC 3.0, но разработка проекта пока не завершена и фронтэнд ограничивается разбором кода и его проверкой на корректность. Генерация промежуточного кода LLVM пока не поддерживается и для формирования исполняемых файлов генерируется канонический код, который передаётся во внешний компилятор Fortran.
Улучшения в Clang 11.0:
- Добавлена возможность восстановления абстрактного синтаксического дерева (AST) для некорректного кода на 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" для генерации в отдельные объектные файлы разделяемого кода и 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.
- Добавлена предварительная поддержка "asm inline", расширения GNU C для добавления ассемблерных вставок. Расширение пока только разбирается, но никак не обрабатывается.
- Расширены возможности, связанные с поддержкой 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 для выявления проблем с несчётными типами, alpha.cplusplus.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.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), и ARMv8.2-BF16 (BFloat16). Обеспечена возможность генерации кода для встроенных функций-обвязок для векторных инструкций 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++ добавлена поддержка заголовочного файла с математическими константами <numbers>.
- Расширены возможности компоновщика 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.
Источники[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.