Дата публикации:Mon, 02 Mar 2026 12:15:55 +0300
После шести месяцев разработки представлен релиз проекта LLVM 22.1.0, развивающего инструментарий (компиляторы, оптимизаторы и генераторы кода), компилирующий программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован в машинный код для заданной целевой платформы или использован JIT-компилятором для формирования машинных инструкций непосредственно во время выполнения программы. На базе технологий LLVM проектом развивается компилятор Clang, поддерживающий языки программирования C, C++ и Objective-C. Начиная с ветки 18.x проект перешёл на новую схему формирования номеров версий, в соответствии с которой нулевой выпуск ("N.0") используется в процессе разработки, а первая стабильная версия снабжается номером "N.1".
Среди улучшений в Clang 22:
- Добавлена поддержка токенов выделения памяти (Allocation Token) для маркировки уникальным идентификатором операций выделения памяти, осуществляемых при помощи таких функций, как malloc. Идентификаторы дают возможность структурировать информацию в куче (heap), упростить выявление утечек в памяти и реализовать группировку объектов на основе назначения или характера изменений (например, разделять "горячие" или "холодные" данные). Для включения следует использовать флаг "-fsanitize=alloc-token". Возможности, связанные с языком С: Реализован черновик спецификации, определяющей механизм отложенного выполнения "defer", дающий возможность выполнить действия в момент выхода из текущей области видимости. Для включения поддержи "defer" добавлен флаг "-fdefer-ts". Добавлена встроенная функция __builtin_stack_address(), повторяющая аналогичную функцию в GCC. Функция возвращает адрес в стеке, разделяющий область стека текущей функции, вызвавшей __builtin_stack_address(), и в последующем вызываемыми функциями.
- Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам и оператору switch, которые можно указывать в операторах break и continue для явного определения цикла, из которого производится выход. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // переход к CONT1 continue outer; // переход к CONT2 // CONT1 } // CONT2 } Расширена и включена в стандарт реализация встроенного макроса "__COUNTER__", предназначенного для генерации уникальных имён идентификаторов. Выставлен лимит в 2147483647 вызовов данного макроса, после превышения которого будет выведена ошибка. Убран вывод предупреждения (-Wstatic-in-inline) при использовании статических функций или переменных внутри функций, объявленных как "extern inline".
- В заголовочный файл float.h добавлена поддержка макросов FLT_SNAN, DBL_SNAN и LDBL_SNAN, реализующих сигнальные (вызывающие исключение при использовании в арифметических операциях) значения NaN для типов float, double и long double. Исправлена ошибка, из-за которой разные неименованные типы обрабатывались как совместимые в пределах одной единицы трансляции, если у них совпадали поля. Флаг "-MG", используемый для игнорирования отсутствия заголовочных файлов при сканировании зависимостей, распространён на директивы "#embed" и теперь подавляет вывод ошибки "file not found" при отсутствии файла, указанного в директиве "#embed".
- Добавлена развиваемая в спецификации C++2с (C++26) возможность использования структурированных привязок (structured binding) в контексте "constexpr", т.е. ссылки на константные выражения теперь сами могут быть константными выражениями. Поддержка реализована для массивов и простых структур (кортежи пока не поддерживаются). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr; В соответствии с требованием стандарта C++20 обеспечено преобразование ограничений (constraints) в стандартную форму перед проверкой их выполнения, что позволяет выдавать более точные диагностические сообщения и правильно обрабатывать ошибки подстановки в аргументах шаблона, используемых только в concept-ids. Добавлено семейство встроенных функций "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship", позволяющих узнать, были ли операторы сравнения "<", ">", "<=" и ">=" синтезированы из оператора "<=>". Параметр "-Wincompatible-pointer-types" переведён на вывод ошибки вместо предупреждения. Для возвращения старого поведения следует использовать опцию "-Wno-error=incompatible-pointer-types".
- "-f[no-]sanitize-debug-trap-reasons" для управления встраиванием причин возникновения исключений (trap) в отладочную информацию при компиляции в режиме "-fsanitize-trap". "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" и "-fsanitize-alloc-token-extended" для управления токенами выделения памяти. "-fmatrix-memory-layout" для управления размещением в памяти матричных типов (например, column-major - по столбцам, row-major - по строкам).
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=64898