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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 1098
Зарегистрирован: 20.08.2022

#

Релиз набора компиляторов LLVM 22
Дата публикации: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(), и в последующем вызываемыми функциями.
Возможности, развиваемые для будущего стандарта C2y:
  • Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам и оператору 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".
Возможности, определённые в Си-стандарте C23:
  • В заголовочный файл 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".
Добавлены встроенные функции __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter и __builtin_dedup_pack. Например, builtin_dedup_pack позволяет удалить дубликаты из списка типов: using MyTypeList = TypeList<__builtin_dedup_pack<int, double, int, char, double>...>; // результирующий тип будет TypeList<int, double, char> При отладке неопределённого поведения через UBSan (-fsanitize=undefined -fsanitize-trap=undefined) обеспечено добавление в генерируемую отладочную информацию сведений о причинах ошибок. Для задания уровня детализации информации об ошибках добавлен флаг "-fsanitize-debug-trap-reasons", который может принимать значение "basic" для общих описаний (например, "Integer addition overflowed") и "detailed" для включения развёрнутой информации (например, "signed integer addition overflow in 'a + b'"). Добавлены новые флаги компилятора:
  • "-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 - по строкам).
Для функций реализован атрибут "malloc_span", похожий на атрибут malloc, но применяемый к функциям, возвращающим span-подобные структуры, содержащие указатель и поле с размером или указателем на конец блока. Добавлен атрибут "modular_format" для динамического выбора необходимой статически связываемой реализации функции printf во время компоновки. Расширены средства диагностики и статического анализа, добавлены новые проверки (несколько десятков улучшений, связанных с диагностикой). В бэкенд для архитектуры X86 добавлены дополнительные встроенные функции (Intrinsics) для расширений SSE, AVX и AVX512. Добавлены режимы сборки для CPU Intel на базе микроархитектур Wildcat Lake (-march=wildcatlake) и Nova Lake (-march=novalake). В бэкенд для архитектуры AArch64 добавлена поддержка процессоров Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) и Arm C1-Ultra (c1-ultra). Добавлены дополнительные встроенные функции для инструкций FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US], FCVTA[US]. Стабилизирована поддержка FMV (Function Multi-Versioning). Пользователям предоставлена возможность переопределения приоритета различных версий функций. Добавлена поддержка архитектуры LoongArch32 (LA32R, LA32S). Улучшены бэкенды для архитектур ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly и PowerPC.

Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=64898

Жизнь за Нер'зула!

Ответить