После шести месяцев разработки представлен запуск новой редакции проекта LLVM 11.0 в котором представлены несколько улучшений, таких как обновление до Python 3, патчи для поддержки экспериментальных инструкций в RISC-V и многие другие изменения.
Тем, кто не знаком с LLVM, следует знать, что это такое. набор инструментов, совместимый с GCC (компиляторы, оптимизаторы и генераторы кода), которые компилируют программы в RISC-подобные промежуточные виртуальные инструкции с битовым кодом (низкоуровневая виртуальная машина с многоуровневой системой оптимизации).
Он предназначен для оптимизации времени компиляции, время привязки, время выполнения на любом языке программирования, который пользователь хочет определить.. Первоначально реализовано для компиляции C и C ++, Независимый от языка дизайн LLVM и успех проекта они породили множество языков.
Сгенерированный псевдокод можно преобразовать с помощью JIT-компилятора в машинные инструкции непосредственно во время выполнения программы.
Основные новые возможности LLVM 11.0
В этой новой версии LLVM 11.0 система сборки переведена на использование Python 3Таким образом, использование Python 3 не является принудительным, поскольку в случае его отсутствия реализована возможность отката для использования Python 2.
Атрибут добавлен вариант-вектор-функция-abi к промежуточному представлению (IR) для описания отображения между скалярными и векторными функциями для вызовов векторизации. Два отдельных векторных типа, llvm :: FixedVectorType и llvm :: ScalableVectorType, извлекаются из llvm :: VectorType.
Неопределенное поведение - это ветвление на основе undef и переход от неопределенных значений к стандартным библиотечным функциям.
В memset / memcpy / memmove разрешено передавать неопределенные указатели, но если параметр с размером равен нулю.
LLJIT добавляет поддержку статической инициализации с помощью методов LLJIT :: initialize и LLJIT :: deinitialize.
Добавил возможность добавлять статические библиотеки в JITDylib используя класс StaticLibraryDefinitionGenerator. Добавлен C API для ORCv2 (API для создания JIT-компиляторов).
По части улучшения поддержки различных архитектур процессоров:
- Добавлено поддержка процессоров Cortex-A34, Cortex-A77, Cortex-A78 и Cortex-X1 на бэкэнде архитектуры AArch64. Были реализованы расширения ARMv8.2-BF16 (BFloat16) и ARMv8.6-A, включая RMv8.6-ECV (расширенная виртуализация счетчиков), ARMv8.6-FGT (мелкозернистые ловушки), ARMv8.6-AMU (Activity Мониторинг виртуализации) и ARMv8.0-DGH (подсказка по сбору данных).
- Добавлена поддержка процессоров Cortex-M55, Cortex-A77, Cortex-A78 и Cortex-X1 на бэкэнде ARM. Реализованы расширения Armv8.6-A Matrix Multiply и RMv8.2-AA32BF16 BFloat16.
- Добавлена поддержка генерации кода для процессоров POWER10 в серверной части PowerPC. Улучшенная оптимизация цикла и улучшенная поддержка операций с плавающей запятой.
- Бэкэнд архитектуры RISC-V может получать патчи с поддержкой для экспериментальных расширенных наборов инструкций, которые еще не были официально утверждены.
В дополнение к этому, предусмотрена возможность генерации кода для привязки функций интегрированы в векторные инструкции SVE.
Бэкэнд для архитектуры AVR переведен из категории экспериментальных в категорию стабильных, включенных в базовый дистрибутив.
Бэкэнд x86 поддерживает инструкции Intel AMX и TSXLDTRK. Добавлена защита от LVI атак. (Внедрение значения нагрузки) и общий механизм подавления побочных эффектов спекулятивного выполнения также были реализованы для блокировки атак, вызванных спекулятивным выполнением операций на ЦП.
Из других изменений, которые выделяются:
- Бэкэнд для архитектуры SystemZ добавляет поддержку MemorySanitizer и LeakSanitizer.
- Libc ++ добавляет поддержку файла заголовка математической константы .
- Расширенные возможности компоновщика LLD.
- Улучшенная поддержка ELF, включая добавленные параметры «–lto-emit-asm», «–lto-all-program-visible», «–print-archive-stats», «–shuffle-section», «–thinlto-single -module. "," –Unique "," –rosegment "," –threads = N ".
- Добавлена опция «–time-trace» для сохранения трассировки в файл, который затем можно проанализировать через интерфейс chrome: // trace в Chrome.
- Интерфейс с компилятором Go (llgo) был удален из выпуска и может быть реструктурирован в будущем.
В конце концов если вы хотите узнать об этом больше об этой новой версии вы можете проверить подробности по следующей ссылке.