После чуть более шести месяцев разработки, запуск новая версия проекта LLVM 16.0, версия, в которой реализовано большое количество изменений и улучшений.
Тем, кто не знаком с LLVM, следует знать, что это компилятор, совместимый с GCC (компиляторы, оптимизаторы и генераторы кода), который компилирует программы в RISC-подобный промежуточный битовый код виртуальной инструкции (низкоуровневая виртуальная машина с многоуровневой системой оптимизации).
Сгенерированный псевдокод может быть преобразован JIT-компилятором в машинные инструкции прямо во время выполнения программы.
Основные новые возможности LLVM 16.0
В представленной новой версии мы можем найти несколько важных улучшений. в кланг 16.0, из которых выделяется стандарт C++/ObjC++ по умолчанию, который установлен на gnu++17 (ранее gnu++14), который подразумевает поддержку функций C++17 с расширениями GNU по умолчанию. Использование элементов, определенных в стандарте C++17, разрешено в коде LLVM.
Еще одно заметное изменение заключается в том, что он был добавлен поддержка процессоров Cortex-A715, Cortex-X3 и Neoverse Расширения V2, Armv8.3 и многоверсионные функции для серверной части AArch64.
La совместимость с платформой Armv2, Armv2A, Armv3 и Armv3M сняты с производства. в бэкэнде архитектуры ARM, для которого не гарантировалась правильная генерация кода. Добавлена возможность генерировать код инструкций по работе с комплексными числами и добавлено поддержка архитектур наборов инструкций (ISA) AMX-FP16, CMPCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT в серверную часть X86.
Кроме того, повышены требования для сборки LLVM, Также сборка теперь должна быть совместима со стандартом C++17, т. е. для сборки требуется как минимум GCC 7.1, Clang 5.0, Apple Clang 10.0 или Visual Studio 2019 16.7.
С другой стороны, это также подчеркивает улучшенные серверные части для архитектур MIPS, PowerPC и RISC-V, а также поддержка отладки 64-битных исполняемых файлов для архитектуры LoongArch в отладчике LLDB и улучшенная обработка отладочных символов COFF.
Из других изменений которые выделяются:
- В библиотеке Libc++ основная работа была сосредоточена на реализации поддержки новых возможностей стандартов C++20 и C++23.
- Время компоновки было значительно сокращено в компоновщике LDD за счет распараллеливания операций сканирования переадресации и инициализации секции. Добавлена поддержка сжатия разделов по алгоритму ZSTD.
- Также выделены расширенные функции, реализованные в стандарте C++20.
- захват структурированных ссылок в лямбда-функциях.
- Оператор равенства в выражениях.
- Возможность не указывать ключевое слово typename в некоторых контекстах,
- В скобках добавлена возможность инициализации ("Aggr(val1, val2)").
- Реализованы функции, определенные в будущем стандарте C++2b.
- Поддержка обеспечивается типом char8_t,
- Расширен диапазон символов, разрешенных для использования в "\N{…}",
- Добавлена возможность использовать переменные, объявленные как "static constexpr", в функциях, объявленных как constexpr.
- Реализованы функции, определенные в будущем стандарте C2x C:
- Добавлена поддержка загрузки нескольких файлов конфигурации (сначала загружаются файлы конфигурации по умолчанию, затем те, которые указаны с помощью флага «–config=», который теперь можно указывать несколько раз).
- Изменен порядок загрузки конфигурационных файлов по умолчанию: clang пытается сначала загрузить файл - .cfg и если не находит, то пытается загрузить два файла .cfg и .cfg.
- Добавлен новый флаг сборки «-fcoro-aligned-allocation» для обычного распределения с выравниванием по кадрам.
- Добавлен флаг «-fmodule-output», чтобы включить модель однофазной сборки стандартных модулей C++.
- Добавлен режим "-Rpass-analysis=stack-frame-layout" для диагностики проблем с расположением фрейма стека.
- Добавлен новый атрибут __attribute__((target_version("cpu_features"))) и расширена функциональность атрибута __attribute__((target_clones("cpu_features1″,"cpu_features2",…))) для выбора конкретных версий функций, предоставляемых CPU AArch64 .
- Расширенные средства диагностики:
- Добавлено предупреждение "-Wsingle-bit-bitfield-constant-conversion" для обнаружения неявного усечения при присвоении единицы однобитовому битовому полю со знаком.
- Расширенная диагностика для неинициализированных переменных constexpr.
- Добавлены предупреждения «-Wcast-function-type-strict» и «-Wincompile-function-pointer-types-strict», чтобы выявить потенциальные проблемы при приведении типов функций.
В конце концов Если вам интересно узнать об этом больше, вы можете проверить детали в по следующей ссылке.