Релиз набора компиляторов 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

© OpenNet