После шести месяцев разработки представлен релиз проекта LLVM 23.1.0, развивающего инструментарий (компиляторы, оптимизаторы и генераторы кода), компилирующий программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован в машинный код для заданной целевой платформы или использован JIT-компилятором для формирования машинных инструкций непосредственно во время выполнения программы. На базе технологий LLVM проектом развивается компилятор Clang, поддерживающий языки программирования C, C++ и Objective-C.
Начиная с ветки 18.x проект перешёл на новую схему формирования номеров версий, в соответствии с которой нулевой выпуск ("N.0") используется в процессе разработки, а первая стабильная версия снабжается номером "N.1". Код проекта распространяется под лицензией Apache 2.0.
Среди улучшений в Clang 23:
Источник: https://www.opennet.ru/opennews/art.shtml?num=66153
Начиная с ветки 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), задействованы не ссылочные типы.
- 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}.
- -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__(...))) - назначение функции для раскрутки стека при возникновении исключений.
Источник: https://www.opennet.ru/opennews/art.shtml?num=66153