LLVMのなかみ (LLVM internals)
基本的にLLVMContextがthread context情報を持っていてModuleが各モジュールを表す。 IR生成時は例えばグローバル変数の生成のような各モジュールに関連付ける必要のある操作ではModuleを渡して操作。またIR生成は最初にllvm::BasicBlockを作ってbuilder.SetInsertPointでBasicBlockを設定する事で、指定されたBasicBlockから命令挿入が始まる。 このようなBasicBlockはコンテキストLLVMContextを指定して生成、関連付け。
#0 ディレクトリ構成 lib/
- CodeGen: IR->マシン非依存データ郡(MachineInstr...)への変換
- Target/X86: ネイティブへの変換(アーキテクチャ依存部)
- Transforms: 主にコード最適化のためにコードを変換する
- Transforms/Instrumentation: instrumentクラス sanitizerがメイン
- MC: [ref https://speakerdeck.com/kazegusuri/ren-jian-demowakarullvmbatukuendoru-men]
#1. IRBuilder LLVM IRを生成するクラス。Builder自身はLLVMContextを受け取る。 基本的には
|cpp| CallInst *CI = CallInst::Create(Callee, Ops, Name); Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI); ||< のようにBuilderの持ってるInstListに挿入していく。命令列は また
#2. Support
-
AlignOf: アライメントのラッパー(?)
-
Allocator:
-
Compiler: コンパイラ拡張。gcc,clang,mingwごとにマクロで定義されてる。
-
DataTypes: cmakeから生成。 stdintとかcinttypesがあれば使う。uint64とかの定義
-
PointerLikeTypeTraits: ポインタの変換、キャストのラッパー
(OS specific)
- Allocator
- FileSystem
- Memory
- MemoryBuffer
- MemoryObject
- Path
- Process
- Program
- TargetRegistry
- TargetSelect
- ThreadLocal
- ThreadPool
- Threading
- raw_ostream