Skip to content

Instantly share code, notes, and snippets.

@RKX1209
Created November 5, 2017 06:23
Show Gist options
  • Save RKX1209/00175920f35e78b44b69860967075763 to your computer and use it in GitHub Desktop.
Save RKX1209/00175920f35e78b44b69860967075763 to your computer and use it in GitHub Desktop.
LLVM source code internal

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment