Релиз набора компиляторов LLVM 13.0
5 октября 2021 года
После шести месяцев разработки представлен релиз проекта LLVM 13.0 - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Улучшения в Clang 13.0:
- Реализована поддержка гарантированных хвостовых вызовов (вызов подпрограммы в самом конце функции, образующий хвостовую рекурсию в случае, если подпрограмма вызывается саму себя). Поддержка гарантированных хвостовых вызовов обеспечена при помощи атрибута "clang::musttail" в C++ и "__attribute__((musttail))" в C, применяемых в выражении "return". Возможность позволяет реализовать оптимизации через развёртывание кода в плоскую итерацию для экономии расходования стека.
- В декларациях "using" и расширениях clang реализована поддержка определения атрибутов в стиле C++11, используя формат "[[]]".
- Добавлен флаг "-Wreserved-identifier" для вывода предупреждения при указании в пользовательском коде зарезервированных идентификаторов.
- Добавлены флаги "-Wunused-but-set-parameter" и "-Wunused-but-set-variable" для вывода предупреждения, если параметр или переменная выставлены, но не используются.
- Добавлен флаг "-Wnull-pointer-subtraction" для вывода предупреждения, если в код может привести к неопределённому поведению из-за использования нулевого указателя в операциях вычитания.
- Добавлен флаг "-fstack-usage" для генерации для каждого файла с кодом дополнительного файла ".su", содержащего сведения о размере кадров стека для каждой функции, определённой в обрабатываемом файле.
- В статическом анализаторе добавлен новый тип вывода - "sarif-html", приводящий к формированию отчётов одновременно в форатмах HTML и Sarif. Добавлена новая проверка allocClassWithName. При указании опции "-analyzer-display-progress" обеспечен вывод времени анализа каждой функции. Почти доведён до готовности анализатор умных указателей (alpha.cplusplus.SmartPtr).
- Расширены возможности, связанные с поддержкой OpenCL. Добавлена поддержка новых расширений cl_khr_integer_dot_product,
cl_khr_extended_bit_ops, __cl_clang_bitfields и __cl_clang_non_portable_kernel_param_types. Продолжена реализация спецификации OpenCL 3.0 Для Си по умолчанию задействована спецификация OpenCL 1.2, если явно не выбрана другая версия. Для C++ добавлена поддержка расширения файлов ".clcpp".
- Реализована поддержка директив трансформации циклов ("#pragma omp unrol" и "#pragma omp tile"), определённых в спецификации OpenMP 5.1.
- В утилиту clang-format добавлена опции SpacesInLineCommentPrefix для определения числа пробелов перед комментариями, IndentAccessModifiers, LambdaBodyIndentation и PPIndentWidthдля управления выравниванием записей, лямбда-выражений и директив препроцессора. Расширены возможности сортировки перечисления заголовочных файлов (SortIncludes). Добавлена поддержка форматирования файлов JSON.
- В linter clang-tidy добавлена большая порция новых проверок.
Основные новшества LLVM 13.0:
- Добавлена опция "-ehcontguard" для использования технологии CET
(Windows Control-flow Enforcement Technology) для защиты на этапе обработки исключений от выполнения эксплоитов, построенных с использованием приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).
- Проект debuginfo-test переименован в cross-project-tests и рассчитан на тестирование компонентов из различных проектов, не ограничиваясь отладочной информацией.
- В сборочной системе обеспечена поддержка сборки нескольких дистрибутивов, например, один с утилитами, а второй с библиотеками для разработчиков.
- В бэкенде для архитектуры AArch64 в ассемблере реализована поддержка расширений Armv9-A RME (Realm Management Extension) и SME (Scalable Matrix Extension).
- В бэкенд для архитектуры Hexagon добавлена поддержка ISA V68/HVX.
- В бэкенде для архитектуры x86 улучшена поддержка процессоров AMD Zen 3.
- В бэкенд добавлена поддержка APU GFX1013 RDNA2.
- В Libc++ продолжена реализация новых возможностей стандартов C++20 и C++2b, в том числе завершена реализация библиотеки "concepts". Для платформы Windows на базе MinGW добавлена поддержка std::filesystem. Разделены заголовочные файлы <algorithm>, <iterator> и <utility>.
Добавлена сборочная опция LIBCXX_ENABLE_INCOMPLETE_FEATURES для отключения заголовочных файлов с не полностью реализованной функциональностью.
- Расширены возможности компоновщика LLD, в котором реализована поддержка Big-endian процессоров Aarch64, а бэкенд Mach-O доведён до состояния, позволяющего компоновать обычные программы. Включены улучшения, необходимые для компоновки Glibc с использованием LLD.
- В утилиту llvm-mca (Machine Code Analyzer) добавлена поддержка процессоров, выполняющих инструкции по порядку (in-order superscalar pipeline), таких как ARM Cortex-A55.
- В отладчике LLDB для платформы AArch64 реализована полная поддержка аутентификации указателей (Pointer Authentication), механизма MTE (MemTag, Memory Tagging Extension) и регистров SVE. Добавлены команды, позволяющие привязать теги к каждой операции выделения памяти и организовать при доступе к памяти проверку указателя, который должен быть связан с корректным тегом.
- В состав формируемых проектом бинарных сборок добавлены отладчик LLDB и фронтэнд для языка Fortran - Flang.
Источники править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.