Download - доклад про Llvm
Мир LLVMВадим Евард, 445 группа
01.02.13
Сегодняшний доклад
● Что есть LLVM;● LLVM IR;● Оптимизация;● Кодогенерация;● Сопутствующие проекты;● Clang.
Определения
● универсальная система анализа, трансформации и оптимизации программ;
● compiler infrastructure designed for compile-time, link-time, run-time, and "idle-time" optimization of programs written in arbitrary programming languages;
● an umbrella project that hosts and develops a set of close-knit, low-level toolchain components (assemblers, compilers, debuggers, etc.)
Основные идеи
● Чёткие интерфейсы;● Реализация в виде переиспользуемых
библиотек;● Универсальное промежуточное
представление (IR).
Архитектура компилятора
Примеры проблем GCC
● Back end обходит AST для создания генерации отладочной информации;
● Формирование front end'ом структур данных back end'а;
● Использование глобальных переменных;● Магические макросы;● Трудности с выводом промежуточных
результатов.
История
● 2000 - запуск исследовательского проекта в University of Illinois;
● 2003 - Открыт LLVM 1.0;● 2007 - Открыт Clang frontend;● 2008 - LLVM GCC 4.2 в составе Apple
Xcode;● 2009 - Clang 1.0, LLVM 2.6, сборка ядер
BSD-систем, полноценная поддержка C++, ObjC;
● 2010-2012 - сборка Linux, 91% пакетов Debian, основной компилятор FreeBSD.
Intermediate Representation: идея
● Предназначен для промежуточного анализа и оптимизирующих преобразований;
● Тщательно специфицирован;● Полное и единственное представление
кода для оптимизатора и кодогенератора.
Intermediate Representation: детали
● RISC-подобный набор инструкций;● Строгая типизация;● Бесконечный набор временных
переменных;● Абстрагирование архитектурных
особенностей (например, соглашения о вызовах).
Intermediate Representation: примерdefine i32 @add1(i32 %a, i32 %b) {entry: %tmp1 = add i32 %a, %b ret i32 %tmp1}
define i32 @add2<i32 %a, i32 %b) {entry: %tmp1 = icmp eq i32 %a, 0 br i1 %tmp1, label %done, label %recurse
recurse: %tmp2 = sub i32 %a, 1 %tmp3 = add i32 %b, 1 %tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3) ret i32 %tmp4
done: ret i32 %b}
Тот же код на Си
unsigned add1(unsigned a, unsigned b) { return a+b;}
unsigned add2(unsigned a, unsigned b) { if (a == 0) return b; return add2(a-1, b+1);}
Intermediate Representation: формы
● Текст (program.ll);● Рабочее представление (в оперативной
памяти, обрабатывается оптимизатором);● Компактное представление для
сохранения на диск (биткод, program.bc).
.ll <-> .bc: llvm-as, llvm-dis.
Оптимизирующий проход
● Сопоставление с образцом;● Проверка корректности;● Замена кода на преобразованный.// X - 0 -> Xif (match(Op1, m_Zero())) return Op0;
// X - X -> 0if (Op0 == Op1) return Constant::getNullValue(Op0->getType());
// (X*2) - X -> Xif (match(Op0, m_Mul(m_Specific(Op1), m_ConstantInt<2>()))) return Op1;
…
return 0; // Nothing matched, return null to indicate no transformation.
Снова архитектура
Оптимизатор составляется из отдельных проходов
Кодогенерация для разных платформ
Снова максимальное переиспользование кода:● Выбор инструкций;● Выделение регистров;● Упорядочение инструкций;● Генерация машинного кода.
Декларативное описание целевых платформ
Ъ Unix Way
● Не монолитный, переиспользуемый код: программы и библиотеки выполняют свою задачу и взаимодействуют друг с другом;
● Инструмент, а не политика.
Link (and Install) Time Optimization
Подпроекты LLVM
● LLVM Core;● Clang aka LLVM Native;● Dragonegg (замена LLVM-GCC);● LLDB (отладчик);● libc++;● vmkit (Java- и .NET-машины);● libclc -реализация OpenCL;● klee - символьная виртуальная машина;● SAFECode - безопасная работа с памятью
без сборщика мусора.
Clang: цели
● Лёгкость разработки и поддержки;● Либеральная лицензия;● Интеграция с IDE;● Подробные сообщения об ошибках;● Быстрая, требующая мало памяти
компиляция;● Поддержка стандартов C, ObjC, C++ и
языковых расширений GCC;● ...
Заявленные преимущества перед GCC
● Современная, понятная архитектура и реализация;
● Предоставление API, простота переиспользования;
● Сериализация AST;● Скорость, малое потребление памяти;● Лучшая поддержка C++;● ...
Производительность Clang
Родственные проекты
● Emscripten - компилятор IR в JavaScript;● qt.js aka Emscripten-qt;● S2E - selective symbolic execution;● MAO - дизассемблер из x86 в IR;● llvmpipe - реализация OpenGL;● cling - интерпретатор C++;● qling - cling с поддержкой Qt;● Компиляторы.
http://www.drdobbs.com/architecture-and-design/the-design-of-llvm/240001128
Спасибо за внимание!