Новая версия набора компиляторов LLVM 3.2

21 декабря 2012 года

После 6 месяцев разработки доступен релиз проекта LLVM 3.2 (Low Level Virtual Machine) - GCC совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.

Основные новшества субпроектов LLVM 3.2:

  • В LLVM-фронтэнде Clang обеспечена полноценная поддержка стандарта C++'11. Добавлены средства для документирования кода внутри комментариев с использованием синтаксиса, напоминающего Doxygen. Улучшены средства диагностики для выявления возможных проблем в коде. Добавлена поддержка атрибута tls_model для явного определения модели Thread-Local Storage. Добавлена поддержка атрибутов для контроля сохранности типов на этапе компиляции для функций с переменными аргументами и аргументами функции 'void *';
  • В DragonEgg, плагине к набору компиляторов GCC, заменяющем оригинальные оптимизаторы и генераторы кода GCC на аналоги, созданные в рамках проекта LLVM, добавлена поддержка загрузки плагинов LLVM, таких как Polly. Налажена передача информации о жизненном цикле переменных в оптимизаторы LLVM. Для сборки с поддержкой LTO более не требуется GCC;
  • В инструментарии для анализа кода Clang Static Analyzer существенно расширена поддержка языка Objective-C, в том числе обеспечена поддержка новых литералов для работы с массивами и словарными типами данных. В статический анализатор кода Clang добавлена поддержка внутрипроцедурного анализа для функций и методов Objective-C и C++. Улучшен код для моделирования вызова функций;
  • Улучшена работа библиотек libc++ и compiler_rt, которые распространяются под двойной лицензией MIT и UIUC. Библиотека libc++ представляет собой реализацию стандартной библиотеки классов C++, распространяемую под BSD-подобной лицензией и нацеленную на высокоэффективную генерацию кода и на максимальное обеспечение совместимости с существующими и будущими стандартами. Библиотека обеспечивает минимальное потребление памяти, высокую скорость выполнения функций, быструю компиляцию и совместимость на уровне ABI с libstdc++ из состава GCC для некоторых низкоуровневых возможностей, таких как объекты-исключения (exception objects), rtti и распределение памяти. В новой версии значительно улучшена поддержка стандарта C++11 и проведена оптимизация производительности;
  • Проведена работа над ошибками в VMKit, виртуальной машине Java VM, использующей LLVM для статической и JIT-компиляции;
  • Расширены возможности экспериментального оптимизатора Polly. Улучшены алгоритмы оптимизации циклов и механизмы автоматического распараллеливания кода с задействованием OpenMP. Добавлена распространяемая под лицензией MIT замена для CLooG (LGPLv2).

Проведено перелицензирование библиотеки isl (integer set library), которая теперь доступна под лицензией MIT;

Основные новшества LLVM 3.2:

  • В оптимизаторе представлена начальная реализация кода автоматической векторизации циклов (Loop Vectorizer), пока пригодная лишь для распараллеливания выполнения небольших циклов. По умолчанию векторизация циклов отключена, для включения необходимо указать "-mllvm -vectorize-loops". Вторым важным улучшением оптимизатора, является переработанная реализация фазы оптимизации SROA (Scalar Replacement of Aggregates), в результате которой теперь генерируется код, более пригодный для последующих фаз оптимизаций;
  • Добавлены оптимизации для некоторых новых моделей процессоров на базе архитектуры ARM. Добавлена поддержка CPU A6 'Swift'. Для целевой платформы ARM добавлен полноценный макроассемблер, в том числе поддерживающий модуль direct-to-object для clang. Полная поддержка ассемблера включена для режимов Thumb1, Thumb2 и ARM modes, а также для специфичных расширений VFP2, VFP3 и NEON;
  • Добавлен новый бэкенд NVPTX, созданный при участии компании NVIDIA, для генерации кода с использованием виртуальной системы команд (Instruction Set Architecture) псевдоязыка NVIDIA PTX (Parallel Thread Execution), используемого в окружении CUDA;
  • В LLVM IR (Intermediate Representation) добавлена поддержка явного выбора TLS (Thread-Local Storage) модели для хранения локальных переменных;
  • Улучшена работа платформонезависимого генератора кода. Добавлена новая фаза оптимизации, названная "раскраска стека" (Stack Coloring), осуществляющая слияние объектов в стеке, используемых в разрозненных частях кода, что позволяет существенно сократить размер стека. Задействованы новые, более агрессивные алгоритмы генерации кода. Добавлена новая инфраструктура TableGen, учитывающая зависимости между инструкциями, и новый упаковщик для группировки машинных команд в "связки инструкций" для целевых архитектур VLIW, в которых одна инструкция содержит несколько параллельно выполняющихся операций;
  • Расширена поддержка инструкций AVX2 (Advanced Vector Extensions) для процессоров x86;
  • Значительно улучшена работа бэкенда MIPS, включая обеспечение поддержки интегрированного ассемблера и дизассемблера для MIPS32 и MIPS64. Добавлена экспериментальная поддержка MIPS16;
  • Для целевой платформы PowerPC добавлены многочисленные улучшения и исправления, направленные на поддержку 64-разрядных процессоров PowerPC, улучшене совместимости с GCC и расширение поддержки ABI-интерфейса ELF для архитектуры PowerPC 64. Добавлена поддержка MCJIT.

Из параллельно развивающихся проектов, основанных на 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.
  • Portable OpenCL - открытая и независимая реализация стандарта OpenCL;
  • CUDA Compiler - позволяет сгенерировать GPU-инструкции из кода, написанного на языках Си, Си++ и Fortran;
  • Julia - открытый динамический язык программирования, использующий наработки проекта LLVM.

Источники

править


 
 
Creative Commons
Эта статья содержит материалы из статьи «Новая версия набора компиляторов LLVM 3.2», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots в архив и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.