доклад про llvm

25
Мир LLVM Вадим Евард, 445 группа 01.02.13

Upload: -

Post on 15-Jun-2015

166 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: доклад про Llvm

Мир LLVMВадим Евард, 445 группа

01.02.13

Page 2: доклад про Llvm

Сегодняшний доклад

● Что есть LLVM;● LLVM IR;● Оптимизация;● Кодогенерация;● Сопутствующие проекты;● Clang.

Page 3: доклад про Llvm

Определения

● универсальная система анализа, трансформации и оптимизации программ;

● 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.)

Page 4: доклад про Llvm

Основные идеи

● Чёткие интерфейсы;● Реализация в виде переиспользуемых

библиотек;● Универсальное промежуточное

представление (IR).

Page 5: доклад про Llvm

Архитектура компилятора

Page 6: доклад про Llvm

Примеры проблем GCC

● Back end обходит AST для создания генерации отладочной информации;

● Формирование front end'ом структур данных back end'а;

● Использование глобальных переменных;● Магические макросы;● Трудности с выводом промежуточных

результатов.

Page 7: доклад про Llvm

История

● 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.

Page 8: доклад про Llvm

Intermediate Representation: идея

● Предназначен для промежуточного анализа и оптимизирующих преобразований;

● Тщательно специфицирован;● Полное и единственное представление

кода для оптимизатора и кодогенератора.

Page 9: доклад про Llvm

Intermediate Representation: детали

● RISC-подобный набор инструкций;● Строгая типизация;● Бесконечный набор временных

переменных;● Абстрагирование архитектурных

особенностей (например, соглашения о вызовах).

Page 10: доклад про Llvm

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}

Page 11: доклад про Llvm

Тот же код на Си

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);}

Page 12: доклад про Llvm

Intermediate Representation: формы

● Текст (program.ll);● Рабочее представление (в оперативной

памяти, обрабатывается оптимизатором);● Компактное представление для

сохранения на диск (биткод, program.bc).

.ll <-> .bc: llvm-as, llvm-dis.

Page 13: доклад про Llvm

Оптимизирующий проход

● Сопоставление с образцом;● Проверка корректности;● Замена кода на преобразованный.// 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.

Page 14: доклад про Llvm

Снова архитектура

Page 15: доклад про Llvm

Оптимизатор составляется из отдельных проходов

Page 16: доклад про Llvm

Кодогенерация для разных платформ

Снова максимальное переиспользование кода:● Выбор инструкций;● Выделение регистров;● Упорядочение инструкций;● Генерация машинного кода.

Page 17: доклад про Llvm

Декларативное описание целевых платформ

Page 18: доклад про Llvm

Ъ Unix Way

● Не монолитный, переиспользуемый код: программы и библиотеки выполняют свою задачу и взаимодействуют друг с другом;

● Инструмент, а не политика.

Page 19: доклад про Llvm

Link (and Install) Time Optimization

Page 20: доклад про Llvm

Подпроекты LLVM

● LLVM Core;● Clang aka LLVM Native;● Dragonegg (замена LLVM-GCC);● LLDB (отладчик);● libc++;● vmkit (Java- и .NET-машины);● libclc -реализация OpenCL;● klee - символьная виртуальная машина;● SAFECode - безопасная работа с памятью

без сборщика мусора.

Page 21: доклад про Llvm

Clang: цели

● Лёгкость разработки и поддержки;● Либеральная лицензия;● Интеграция с IDE;● Подробные сообщения об ошибках;● Быстрая, требующая мало памяти

компиляция;● Поддержка стандартов C, ObjC, C++ и

языковых расширений GCC;● ...

Page 22: доклад про Llvm

Заявленные преимущества перед GCC

● Современная, понятная архитектура и реализация;

● Предоставление API, простота переиспользования;

● Сериализация AST;● Скорость, малое потребление памяти;● Лучшая поддержка C++;● ...

Page 23: доклад про Llvm

Производительность Clang

Page 24: доклад про Llvm

Родственные проекты

● Emscripten - компилятор IR в JavaScript;● qt.js aka Emscripten-qt;● S2E - selective symbolic execution;● MAO - дизассемблер из x86 в IR;● llvmpipe - реализация OpenGL;● cling - интерпретатор C++;● qling - cling с поддержкой Qt;● Компиляторы.

Page 25: доклад про Llvm

http://www.drdobbs.com/architecture-and-design/the-design-of-llvm/240001128

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