Релиз набора компиляторов LLVM 3.0
В версии 3.0 осуществлён отказ от поддержки фронтэнда llvm-gcc в пользу Си/C++/Objective-C компилятора Clang и GCC-плагина DragonEgg. В настоящее время Clang является более оптимальным решением для сборки проектов на языке Си, а DragonEgg является хорошим решением для разработчиков, заинтересованных в интеграции LLVM с GCC. Кроме того, прекращена поддержка загрузки ".bc" и ".ll" файлов из LLVM 2.8 и более ранних версий. С выпуском LLVM 3.0 отмечена стабилизация формата, а целью проекта стало обеспечение совместимости всех будущих релизов LLVM с текущим форматом файлов ".bc" и ".ll".
Основные новшества LLVM 3.0:
- В LLVM-фронтэнде Clang, поддерживающем языки C, C++ и Objective-C, расширена поддержка стандарта C++0x (C++ 2011), добавлены некоторые возможности, ожидаемые в будущем стандарте C1x. Значительно улучшена поддержка сборки приложений на языке C++, увеличена стабильность и расширены средства диагностики. Расширена поддержка Objective-C, реализованы возможности, необходимые для работы Objective-C runtime для Mac OS X 10.7 / iOS 5. Добавлены дополнительные оптимизации в библиотеку libclang,
- В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, реализована полная поддержка работы в виде плагина к GCC 4.5 и 4.6 без применения дополнительных патчей (прошлая версия DragonEgg поддерживала только GCC 4.5 и требовала наложения патчей). Добавлена опция, позволяющая одновременно использовать оптимизаторы LLVM и GCC (ранее DragonEgg заменял кодом из LLVM оптимизатор GCC). Связка из GCC-фронтэнда и LLVM-бэкенда официально поддерживает языки C, C++, Фортран и Ада, частично реализована поддержка Java, Objective-C, Objective-C++ и Google Go;
- Библиотеки libc++ и compiler_rt теперь распространяются под двойной лицензией MIT и UIUC. Библиотека представляет собой реализацию стандартной библиотеки классов C++, распространяемую под BSD-подобной лицензией и нацеленную на высокоэффективную генерацию кода и на максимальное обеспечение совместимости с существующими и будущими стандартами (C++0X). Библиотека обеспечивает минимальное потребление памяти, высокую скорость выполнения функций, быструю компиляцию и совместимость на уровне ABI с libstdc++ из состава GCC для некоторых низкоуровневых возможностей, таких как объекты-исключения (exception objects), rtti и распределение памяти. LLVM C++ планируется использовать по умолчанию в качестве стандартной С++ библиотеки во FreeBSD 10;
- В VMKit, виртуальной машине Java VM, использующей LLVM для статической и JIT-компиляции, добавлена поддержка упреждающей компиляции небольшой части базовой библиотеки Java. Обеспечена поддержка создания собственных виртуальных методов для индивидуальных классов. Добавлена новая модель обработки исключительных ситуация и улучшена реализация поддержки inline-развёртывания для инструкций Java-байткода. Увеличена скорость запуска и производительность runtime-компонентов;
- В LLVM IR (Intermediate Representation) добавлена полная поддержка атомарных операций с памятью, включая поддержку модели, определённой в спецификациях C++11 (C++0x) и C'1x (атомарная загрузка и сохранение, сравнение, обмен значений, инструкции чтения/изменения/записи и т.п.). В LLVM IR значительна переработана система типов и модель обработки исключительных ситуаций, что позволило избавиться от некоторых давно мешающих проблем;
- Основанная на линейном сканировании система распределения регистров (register allocator) заменена на новый "жадный" аллокатор регистров ("greedy" register allocator), способным на лету дробить диапазоны и реализующим много интересных оптимизаций, что в конечном итоге приводит к увеличению качества кода;
- Большой рывок в развитии отмечается для бэкенда MIPS, который из экспериментальных переведен в разряд готовых для промышленной эксплуатации. В новой версии реализована поддержка MIPS32r1/r2 и MIPS64, протестирован O32 ABI, доведёна до конца реализация JIT, прекращена поддержка старых архитектур MIPS1 и MIPS2;
- Оптимизатор и генератор кода теперь поддерживает информацию в форматах gprof и gcov, полученную из систем профилирования и анализа покрытия кода. Для работы с cov/gcov подготовлена утилита llvm-cov. Clang может использовать данные профилирования через совместимые с GCC опции;
- В бэкенде, ассемблере и дизассемблере архитектуры x86 обеспечена полная поддержка набора инструкций AVX 1 (Advanced Vector Extensions), поддерживаемых процессорами серии AMD Bulldozer и Intel Sandy Bridge. Включение производится через опцию "-mavx". В ассемблере и дизассемблере добавлена поддержка дополнительных инструкций, используемых в Atom, Ivy Bridge, SSE4a/BMI и RdRand;
- В ARM-бэкенде значительно увеличена производительность кода, сгенерированного для чипов на базе CPU ARM Cortex-A9, улучшена поддержка процессоров серии Cortex-M. Задействованы дополнительные оптимизации при генерации кода с инструкциями NEON, полученного при помощи Clang.
Из параллельно развивающихся проектов, основанных на LLVM, можно отметить:
- KLEE - символьный анализатор и генератор тестовых наборов;
- Runtime-библиотека compiler-rt;
- llvm-mc - автогенератор ассемблера, дизассемблера и других, связанных с машинным кодом компонентов, на основе описаний параметров LLVM-совместимых платформ.
- VMKit - виртуальная машина для Java и .NET;
- Реализация функционального языка программирования Pure;
- LDC - компилятор для языка D;
- Roadsend PHP - оптимизатор, статический и JIT компилятор для языка PHP;
- Виртуальные машины для Ruby: Rubinius и MacRuby;
- Unladen Swallow - реализация языка Python;
- 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=32433
|
0 | Tweet | Нравится |
|