Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемГаля Упырина
1 LLVM Воронин Дмитрий
2 Agenda Что такое LLVM LLVM проекты Промежуточное представление LLVM Пример создания новой фазы компиляции в LLVM Пример внедрения новой фазы в компилятор clang Пример использования JIT компиляции в LLVM 2
3 LLVM LLVM – набор средств разработки (компиляторы, ассемблеры, дебаггеры, библиотеки и пр.), тесно связанных между собой. Идея разработки: -создать блоки (библиотеки), из которых можно «собирать» готовые решения (или внедрять блоки в свои проекты) -максимально переиспользовать разработанный код Примеры: -использование парсера фронтенда для нужд IDE (индексирование, подсветка ситаксиса, рефакторинг) -использование единого промежуточного представление (IR) для всех входных языков, как для статической так и для динамической компиляции. 3
4 LLVM проекты Clang – C/C++/Objective-C фронтент DragonEgg – плагин к GCC, заменяющий GCC оптимизатор LLVMовским LLDB – дебаггер (для Mac OS X) Libc++ - реализация C++ библиотеки для нового стандарта C++0X VMKit – реализация Java Virtual Machine 4
5 СПО проекты (на базе LLVM) Crack – скриптовый язык программирования, объединяющий парадигмы C++, Java, Python TCE – TTA-based Co-design Environment (TTA – Transport Triggered Architecture), тулчейн для преобразования C/C++ программы в VHDL PinaVM – SystemC фронтенд, SystemC – язык для системного моделирования, дизайна и верификации IcedTea – замена «несвободных» компонент в OpenJDK GHC – Glasgow Haskel Compiler Rubinius – реализация Ruby FAUST – Functional AUdio Stream (real time audio signal processing language) 5
6 Проприетарные проекты (на базе LLVM) Компилятор фирмы Apple Копилятор GPGPU фирмы Nvidia Компилятор GPGPU фирмы AMD Компилятор фирмы RapidMind (куплена фирмой Intel) Portable Native Client фирмы Google 6
7 LLVM IRs 7 C Fortran Ada Optimizer ARM Backend Power PC Backend X86 Backend LLVM IRCodeGen IR AST
8 Основные объекты LLVM IR LLVMContext -constants maps and predefined constants -types maps and predefined types -map of value handles Module -list of global variables and aliases -values and types sym-tabs -list of functions Function -list of arguments -list of basic blocks -values sym-tab BasicBlock -list of instructions Instruction -list of uses -result type Use - pointer to argument (Value) Constant Type 8
9 Типы 9 DerivedType Type* IntegerTypeFunctionTypeCompositeTypeOpaqueType StructTypeSequentialType ArrayTypeVectorTypePointerType *Type has a list of its uses
10 Значения 10 User* Value InstructionConstant ArgumentBasicBlock * User has a list of its uses
11 Константы 11 ConstantExpr Constant UnaryConstantExpr BinaryConstantExpr GetElementPtrConstantExpr SelectConstantExpr ExtractElementConstantExpr InsertElementConstantExpr ShuffleVectorConstantExpr ExtractValueConstantExpr InsertValueConstantExpr CompareConstantExpr ConstantInt ConstantFP ConstantArray ConstantStruct ConstantVector BlockAddress GlobalValue GlobalVariable GlobalAlias Function
12 Инструкции 12 UnaryInstruction Instruction AllocaInst LoadInst VAArgInst ExtractValueInst StoreInst GetElementPtrInst SelectInst BinaryOperator CastInst CmpInst ICmpInst FCmpInst TruncInst ZExtInst SExtInst FPTruncInst FPExtInst UIToFPInst SIToFPInst FPToUIInst FPToSIInst IntToPtrInst PtrToIntInst BitCastInst TerminatorInst ReturnInst BranchInst SwitchInst IndirectInst InvokeInst UnwindInst UnreachableInst CallInst _other_
13 Специальные инструкции (intrinsic) 13 IntrinsicInst CallInst EHExceptionIntrinsic EHSelectIntrinsic MemIntrinsic MemTransferInst MemCpyInst MemMoveInst MemSetInst DbgInfoIntrinsic DbgDeclareInst DbgValueInst
14 Пример IR 14 int foo( int *a, int size) { int i, sum = 0; for( i=0; i
15 Приведения объектов IR (isa, cast, dyn_cast) Каждый класс реализует метод static inline bool classof( Value* val); template inline bool isa( Y *val); template inline X cast( Y *val); template inline X dyn_cast( Y *val); for ( BasicBlock::iterator it = bb->begin(), …) { Instruction *inst = it; if ( isa ( inst) ) { // inst можно привести к BranchInst BranchInst *br = cast ( inst); } if ( InvokeInst *invoke = dyn_cast ( inst) ) { // invoke приведен к InvokeInst } 15
16 QA 16
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.