|
После шести месяцев разработки представлен релиз проекта 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:
- Возможности, определённые в Си-стандарте C23:
- В заголовочный файл float.h добавлена поддержка макросов FLT_SNAN, DBL_SNAN и LDBL_SNAN, реализующих сигнальные (вызывающие исключение при использовании в арифметических операциях) значения NaN для типов float, double и long double.
- Исправлена ошибка, из-за которой разные неименованные типы обрабатывались как совместимые в пределах одной единицы трансляции, если у них совпадали поля.
- Флаг "-MG", используемый для игнорирования отсутствия заголовочных файлов при сканировании зависимостей, распространён на директивы "#embed" и теперь подавляет вывод ошибки "file not found" при отсутствии файла, указанного в директиве "#embed".
- Возможности, связанные с С++:
- Добавлены встроенные функции __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.
|