2. Сегодняшний доклад
● Что есть LLVM;
● LLVM IR;
● Оптимизация;
● Кодогенерация;
● Сопутствующие проекты;
● Clang.
3. Определения
● универсальная система анализа,
трансформации и оптимизации программ;
● 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.)
4. Основные идеи
● Чёткие интерфейсы;
● Реализация в виде переиспользуемых
библиотек;
● Универсальное промежуточное
представление (IR).
6. Примеры проблем GCC
● Back end обходит AST для создания
генерации отладочной информации;
● Формирование front end'ом структур
данных back end'а;
● Использование глобальных переменных;
● Магические макросы;
● Трудности с выводом промежуточных
результатов.
7. История
● 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.
8. Intermediate Representation: идея
● Предназначен для промежуточного
анализа и оптимизирующих
преобразований;
● Тщательно специфицирован;
● Полное и единственное представление
кода для оптимизатора и кодогенератора.
9. Intermediate Representation: детали
● RISC-подобный набор инструкций;
● Строгая типизация;
● Бесконечный набор временных
переменных;
● Абстрагирование архитектурных
особенностей (например, соглашения о
вызовах).
11. Тот же код на Си
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);
}
12. Intermediate Representation:
формы
● Текст (program.ll);
● Рабочее представление (в оперативной
памяти, обрабатывается оптимизатором);
● Компактное представление для
сохранения на диск (биткод, program.bc).
.ll <-> .bc: llvm-as, llvm-dis.
13. Оптимизирующий проход
● Сопоставление с образцом;
● Проверка корректности;
● Замена кода на преобразованный.
// X - 0 -> X
if (match(Op1, m_Zero()))
return Op0;
// X - X -> 0
if (Op0 == Op1)
return Constant::getNullValue(Op0->getType());
// (X*2) - X -> X
if (match(Op0, m_Mul(m_Specific(Op1), m_ConstantInt<2>())))
return Op1;
…
return 0; // Nothing matched, return null to indicate no transformation.
18. Ъ Unix Way
● Не монолитный, переиспользуемый код:
программы и библиотеки выполняют свою
задачу и взаимодействуют друг с другом;
● Инструмент, а не политика.
21. Clang: цели
● Лёгкость разработки и поддержки;
● Либеральная лицензия;
● Интеграция с IDE;
● Подробные сообщения об ошибках;
● Быстрая, требующая мало памяти
компиляция;
● Поддержка стандартов C, ObjC, C++ и
языковых расширений GCC;
● ...
22. Заявленные преимущества перед
GCC
● Современная, понятная архитектура и
реализация;
● Предоставление API, простота
переиспользования;
● Сериализация AST;
● Скорость, малое потребление памяти;
● Лучшая поддержка C++;
● ...