Релиз набора компиляторов LLVM 22
После шести месяцев разработки представлен релиз проекта 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».
- Добавлена поддержка именованных циклов, позволяющих присваивать имена циклам и оператору switch, которые можно указывать в операторах break и continue для явного определения цикла, из которого производится выход.
- Возможности, определённые в Си-стандарте 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».
- Добавлена развиваемая в спецификации C++2с (C++26) возможность использования структурированных привязок (structured binding) в контексте «constexpr», т.е. ссылки на константные выражения теперь сами могут быть константными выражениями. Поддержка реализована для массивов и простых структур (кортежи пока не поддерживаются).
- Добавлены встроенные функции __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.
Источник: http://www.opennet.ru/opennews/art.shtml? num=64898
OpenNet прочитано 559 раз
