Новая версия набора компиляторов LLVM 3.3
Новая версия примечательна интеграцией поддержки целевых платформ AArch64 и AMD R600 GPU, поддержкой систем IBM S390 на базе архитектуры z, значительным улучшением поддержки платформ PowerPC и MIPS. За счёт увеличение качества реализации автоматической векторизации циклов и реализации серии общих оптимизаций заметно увеличена производительность кода, генерируемого LLVM 3.3. В Clang доведена до готовности поддержка стандарта C++11, расширены возможности статического анализатора кода, добавлен инструментарий для автоматического преобразования кода C++ в вид, соответствующий спецификации C++11, подготовлено приложение для автоформатирования кода в vim и emacs.
Основные новшества LLVM 3.3:
- Поддержка 64-разрядной архитектуры AArch64 (ARM64) в качестве целевой платформы. Архитектура AArch64 включает в себя новый набор команд A64, примечательный расширением числа регистров, новыми командами для вычислений с плавающей запятой (FP) и новыми векторными SIMD-инструкциями NEON. В настоящее время работа по реализации порта AArch64 ещё полностью не завершена, но уже поддерживается сборка приложений, написанных в соответствии со стандартами C99 и C++03, для платформы Linux.
- Интеграция бэкэнда для использования в качестве целевой платформы GPU семейства R600 (HD2XXX - HD7XXX). Изначально бэкенд развивался в репозитории проекта Mesa, но был перенесён в кодовую базу LLVM. Бэкэнд необходим для компилятора шейдеров LLVM, который в свою очередь требуется для открытой реализации стандарта OpenCL;
- Улучшено качество кода, генерируемого при использовании автоматической векторизации циклов (Loop Vectorizer), которая теперь включена по умолчанию при выборе режима оптимизации "-O3". В новой версии добавлена поддержка векторизации вызова функций, векторизации смешанных типов, частичного развёртывания кода в процессе векторизации, проверки указателей во время выполнения и т.д. Распараллеливание циклов позволяет заметно поднять производительность кода, генерируемого LLVM 3.3. В итоге независимые тесты производительности фиксируют более высокую производительность кода, собранного c использованием LLVM 3.3, по сравнению с LLVM 3.2;
- Представлен новый SLP векторизатор, который пока не используется по умолчанию и требует для своего включения указания опции "-fslp-vectorize". Поддержка ранее доступного векторизатора BB сохранена и может быть активирована при указании опции "-fslp-vectorize-aggressive";
- Значительно улучшена реализация бэкенда для процессоров PowerPC, в том числе поддержка наборов инструкций PowerPC 2.04/2.05/2.06 и обеспечение поддержки интегрированного ассемблера;
- Улучшен бэкенд для архитектуры MIPS, добавлена поддержка инструментария Sourcery CodeBench, добавлены новые опции командной строки (-mxgot/-mno-xgot, -EL/-EB, -mmicromips/-mno-micromips, -msingle-float/-mdouble-float, -mabi=32 (o32 abi) и -mabi=64 (n64 abi)), улучшено качество генерации кода DSP-ASE;
- Добавлен бэкенд SystemZ/s390x с поддержкой IBM z/Architecture;
- Из состава удалён порт CellSPU и прекращена поддержка API для расширенной линковки на уровне промежуточного представления кода. В бэкенде для целевой платформы Hexagonv прекращена поддержка устаревших архитектур hexagonv2 и hexagonv3 (поддержка hexagonv4 и hexagonv5 сохранена).
Основные новшества субпроектов LLVM 3.3:
- В компиляторе Clang полностью завершена реализация поддержки всех компонентов стандарта C++11, в том числе новых библиотек, таких как std::regex. В анонсе отмечается, что Clang является первым компилятором, поддерживающим в полной мере стандарт C++'11 (разработчики GCC выступали с похожим заявлением). Для упрощения миграции на C++11 в состав включен новый инструмент "C++'11 Migrator", позволяющий автоматически конвертировать код C++ в представление, использующее элементы C++11. Кроме того, в Clang 3.3 добавлена возможность использования символов Unicode в идентификаторах.
В Clang Static Analyzer добавлены дополнительные проверки, позволяющие выполнять межпроцедурный статический анализ кода, выходящий за границы отдельных C++ конструкторов/деструкторов. Для разработчиков, использующих vim и emacs, представлено приложение clang-format, выполняющее функции интеллектуальной системы автоматического форматирования кода.
В состав Clang включены патчи, необходимые для обеспечения сборки ядра Linux, что позволило приблизиться к состоянию, когда немодифицированное ядро Linux можно будет пересобрать штатным компилятором Clang. До сих пор для подобной сборки требовалось применение серии патчей, как к ядру, так и к Clang;
- В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, добавлена поддержка GCC 4.8 (требуется gcc-4.8.1) и возможность записи объектных файлов с использованием встроенного ассемблера LLVM;
- В отладчике LLDB добавлена поддержка точек наблюдения (watchpoints), представлен плагин для интеграции с Vim, улучшена поддержка регистров (в том числе векторных), реализована возможность отладки многопоточных программ, обеспечена сборка с использованием cmake/ninja/auto-tools/clang 3.3/gcc 4.6, добавлены новые команды для вывода процессов, присоединения к процессу и форка, реализована поддержка вычисления выражений;
- Отмечен прогресс в реализации проекта Portable Computing Language OpenCL (PoCL), в рамках которого ведётся разработка полностью открытой реализации стандарта OpenCL, независимой от производителей графических ускорителей. PoCL позволит разработчикам не задумываться об особенностях той или иной реализации стандарта и использовать предоставляемые компилятором оптимизации вместо применения специфических для каждой платформы техник ручной оптимизации. PoCL реализован по модульному принципу, позволяющему использовать различные бэкенды для выполнения OpenCL-ядер на разных типах графических и центральных процессоров;
- Представлен проект Jade (Just-in-time Adaptive Decoder Engine), в рамках которого развивается универсальный движок для декодирования видео, использующих LLVM для JIT-компиляции адаптивных конфигураций декодера видео, определённых комитетом MPEG Reconfigurable Video Coding (RVC);
- Обновлена реализация LDC - компилятора для языка программирования D, комбинирующего фронтэнд из состава эталонного компилятора D с бэкендом на базе LLVM, позволяющим генерировать эффективный нативный код. LDC поддерживает генерацию кода для систем x86/x86_64 Linux, Mac OS X и Windows, и PPC64 для Linux. В разработке находится создание генератора кода для архитектуры ARM.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java и .NET;
- Реализация функционального языка программирования Pure;
- LDC - компилятор для языка D;
- Roadsend PHP - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- LLVM-Lua
- FlashCCompiler - средство для компиляции кода на языке Си в вид пригодный для выполнения в виртуальной машине Adobe Flash;
- LLDB - новая модульная инфраструктура отладки, использующая такие подсистемы LLVM как API для дизассемблирования, Clang AST (Abstract Syntax Tree), парсер выражений, генератор кода и JIT-компилятор. LLDB поддерживает отладку многопоточных программ на языках C, Objective-C и C++; отличается возможностью подключения плагинов и скриптов на языке Python; демонстрирует экстремально высокое быстродействие при отладке программ большого размера;
- emscripten - компилятор биткода LLVM в JavaScript, позволяющий преобразовать для запуска в браузере приложения, изначально написанные на языке Си. Например, удалось запустить Python, Lua, Quake, Freetype;
- sparse-llvm - бэкенд, нацеленный на создание Си-компилятора, способного собирать ядро Linux.
- Portable OpenCL - открытая и независимая реализация стандарта OpenCL;
- CUDA Compiler - позволяет сгенерировать GPU-инструкции из кода, написанного на языках Си, Си++ и Fortran;
- Julia - открытый динамический язык программирования, использующий наработки проекта LLVM.
Источник: http://www.opennet.ru/opennews/art.shtml?num=37200
|
0 | Tweet | Нравится |
|