доклад про llvm

Post on 15-Jun-2015

166 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Мир 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

Спасибо за внимание!

top related