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

После шести месяцев разработки представлен релиз проекта LLVM 23.1.0, развивающего инструментарий (компиляторы, оптимизаторы и генераторы кода), компилирующий программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован в машинный код для заданной целевой платформы или использован JIT-компилятором для формирования машинных инструкций непосредственно во время выполнения программы. На базе технологий LLVM проектом развивается компилятор Clang, поддерживающий языки программирования C, C++ и Objective-C.

Начиная с ветки 18.x проект перешёл на новую схему формирования номеров версий, в соответствии с которой нулевой выпуск («N.0») используется в процессе разработки, а первая стабильная версия снабжается номером «N.1». Код проекта распространяется под лицензией Apache 2.0.

Среди улучшений в Clang 23:

  • Добавлена поддержка OpenCL C 3.1 (-cl-std=CL3.1).
  • Возможности, связанные с языком С:
    • Реализованы функции циклического битового сдвига stdc_rotate_left_{uc,us,ui,ul,ull} и stdc_rotate_right_{uc,us,ui,ul,ull}, а также функции изменения порядка следования элементов массива в памяти __builtin_stdc_memreverse8, stdc_memreverse8 и stdc_memreverse8u{8,16,32,64}, определённые в заголовочном файле stdbit.h для будущего стандарта C2y.
    • Разрешено обращаться к элементам структур через оператор «.» внутри константных выражений (constexpr).
    • В функциях форматирования строк, таких как printf и scanf, реализована поддержка появившихся в стандарте C23 модификаторов размера: «%wN» для типа intN_t, «%wfN» для типа int_fastN_t, «%H» для типа _Decimal32, «%D» для типа _Decimal64 и «%DD» для типа _Decimal128.
  • Возможности, связанные с С++:
    • Во встроенной функции __is_trivially_equality_comparable реализована поддержка сравнения перечислений (enum).
    • Во всех режимах C++ разрешено использование ключевого слова «auto» для автоматического вывода типов параметров функций.
    • Добавлены флаги «-std=c++2d» и «-std=gnu++2d» для тестирования возможностей, развиваемых для стандарта, который выйдет после C++26.
    • Добавлена поддержка дополнительных именованных универсальных escape-символов.
    • Появившаяся в спецификации C++26 возможность использования структурированных привязок (structured binding) в контексте «constexpr» и «constinit» расширена поддержкой кортежеподобных структур (ранее поддерживались массивы и простые структуры).
    • Добавлена частичная поддержка утверждённого в стандарте C++26 оператора «template for» для перебора элементов на этапе компиляции в стиле обычного цикла. При выполнении «template for» тело цикла раскрывается для каждого элемента и каждая итерация обрабатывается в отдельной области видимости, в которой элемент последовательности, по которой итерируется цикл, является константой для каждой итерации и может участвовать в константных выражениях (constexpr). В контексте рефлексии «template for» может применяться для обхода свойств классов или перечислений.
    • Частично реализовано декорирование имён (Itanium mangling, создание уникальных имён символов для компоновщика), используемых для доступа к элементам пакета параметров по индексу.
    • Добавлена поддержка предложенного в стандарте C++20 синтаксиса для более эффективного определения зависимостей между модулями.
    • Арифметические операции с указателями после приведения производных и базовых типов теперь определяются как неопределённое поведение, что позволяет применять оптимизацию на основе девиртуализации вызовов.
    • Разрешено явно специализировать или создавать экземпляры operator() для generic-лямбд.
    • В операторах преобразования типов разрешено не указывать ключевое слово «typename» перед именем шаблона.
    • Разрешено объявлять специализации членов класса в области видимости класса.
    • В структурированных привязках (structured binding) для инициализаторов, возвращающих временные значения (prvalue), задействованы не ссылочные типы.
  • Добавлены встроенные функции __builtin_stdc_rotate_left, __builtin_stdc_rotate_right, __builtin_bitreverseg, __builtin_elementwise_clmul, __builtin_elementwise_pext, __builtin_elementwise_pdep, __builtin_stdc_leading_zeros, __builtin_stdc_leading_ones, __builtin_stdc_trailing_zeros, __builtin_stdc_trailing_ones, __builtin_stdc_first_leading_zero, __builtin_stdc_first_leading_one, __builtin_stdc_first_trailing_zero, __builtin_stdc_first_trailing_one, __builtin_stdc_count_zeros, __builtin_stdc_count_ones, __builtin_stdc_has_single_bit, __builtin_stdc_bit_width, __builtin_stdc_bit_floor, __builtin_stdc_bit_ceil.
  • Добавлены функции stdbit.h, применимые в константных выражениях (constexpr):
    • stdc_leading_zeros_{uc,us,ui,ul,ull}, stdc_leading_ones_{uc,us,ui,ul,ull},
    • stdc_trailing_zeros_{uc,us,ui,ul,ull}, stdc_trailing_ones_{uc,us,ui,ul,ull},
    • stdc_first_leading_zero_{uc,us,ui,ul,ull}, stdc_first_leading_one_{uc,us,ui,ul,ull}, stdc_first_trailing_zero_{uc,us,ui,ul,ull}, stdc_first_trailing_one_{uc,us,ui,ul,ull},
    • stdc_count_zeros_{uc,us,ui,ul,ull}, stdc_count_ones_{uc,us,ui,ul,ull},
    • stdc_has_single_bit_{uc,us,ui,ul,ull},
    • stdc_bit_width_{uc,us,ui,ul,ull}, stdc_bit_floor_{uc,us,ui,ul,ull}, stdc_bit_ceil_{uc,us,ui,ul,ull}.
  • В большинство встроенных функций «__atomic_» добавлена поддержка значений с плавающей запятой и указателей.
  • Добавлен заголовочный файл endian.h, включающий POSIX-функции для манипуляции порядком следования байт.
  • Поддерживаемая версия Unicode обновлена с 15.1 до 18.0.
  • В инструментарий для Linux и Windows добавлена поддержка механизма multilib, включаемого через флаг «-fmultilib-flag» и позволяющего использовать отдельные версии библиотек и заголовочных файлов для разных архитектур.
  • Добавлены новые флаги компилятора:
    • -fms-anonymous-structs / -fno-ms-anonymous-structs — включение/выключение поддержки расширений Microsoft для анонимных структур.
    • —precompile-reduced-bmi — генерация сокращённого BMI (Binary Module Interface) для импортируемого модуля.
    • -fdiagnostics-show-inlining-chain — показ информации об inline-развёртывании при диагностике при помощи атрибутов [[gnu::warning]] и [[gnu::error]].
    • -fcrash-diagnostics-tar — создание tar-архива с файлами для воспроизведения аварийного завершения для упрощения диагностики сбоев в компиляторе.
    • -fwin-cfg-mechanis — выбор режима защиты CFG (Control Flow Guard) для платформы Windows (automatic, dispatch и check).
    • -fstrict-bool — обработка загружаемых из памяти однобайтовых булевых значений только как 0 и 1.
  • Добавлены атрибуты:
    • stack_protector_ignore — выборочное отключение проверки безопасности локальных переменных внутри функции.
    • [[clang::no_outline]] — запрещает оптимизатору разделать код помеченной функции.
    • __attribute__((overflow_behavior)) — определяет поведение (wrap или trap) при переполнении чисел разных типов.
    • __attribute__((__personality__(…))) — назначение функции для раскрутки стека при возникновении исключений.
  • Расширены средства диагностики и статического анализа, добавлены новые проверки (несколько десятков улучшений, связанных с диагностикой).
  • В бэкенд для архитектуры X86 добавлена поддержка процессоров AMD на базе микроархитектуры Zen 6 (-march=znver6). Добавлена поддержка расширения набора команд AVX512BMM и реализованы встроенные функции на его основе.
  • В бэкенд для архитектуры AArch64 добавлена поддержка процессоров Arm AGI CPU (armagicpu), Hisilicon hip12 (hip12) и NVIDIA Rigel (rigel).
  • В бэкенде AMDGPU реализована начальная поддержка GPU GFX1310 на базе архитектуры RDNA 5. Добавлены встроенные функции __builtin_amdgcn_processor_is и __builtin_amdgcn_is_invocable.
  • Улучшены бэкенды для архитектур ARM, RISC-V, LoongArch64, MIPS, SystemZ, WebAssembly и PowerPC.
  • В компоновщике LLD реализовано распараллеливание загрузки входных файлов и маркировки секций для сокращения времени связывания крупных проектов.

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