Релиз набора компиляторов LLVM 13.0

После шести месяцев разработки представлен релиз проекта 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.
  • В бэкенд AMDGPU добавлена поддержка 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.



Источник: http://www.opennet.ru/opennews/art.shtml? num=55898

© OpenNet