Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
hito-ga-oshieru-llvm
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kmotiko
March 22, 2014
Programming
5.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
hito-ga-oshieru-llvm
Kmotiko
March 22, 2014
Other Decks in Programming
See All in Programming
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
310
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
790
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
220
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
970
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
130
dRuby over BLE
makicamel
2
390
act1-costs.pdf
sumedhbala
0
120
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1k
Inside Stream API
skrb
1
800
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.5k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
860
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
Featured
See All Featured
Music & Morning Musume
bryan
47
7.2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
620
Marketing to machines
jonoalderson
1
5.5k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
The SEO Collaboration Effect
kristinabergwall1
1
490
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Designing Powerful Visuals for Engaging Learning
tmiket
1
430
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
400
Documentation Writing (for coders)
carmenintech
77
5.4k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
How STYLIGHT went responsive
nonsquared
100
6.2k
Transcript
ヒトがおしえる!LLVM 2014/3/21 柏木餅子
自己紹介 柏木餅子(♂) サークルMotiPizzaで活動中 「きつねさんでもわかる!LLVM」 達人出版会様&インプレスジャパン様から
LLVM本ではフロントエンド側担当 LLVM本の弱い方 金髪幼女の方 お仕事はソフトウェア開発色々 LLVMを使う機会は無いです 外で発表するのは初めてなので。。。 2
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 3
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 4
LLVMとは? コンパイラ基盤だよ? 5
LLVMとは? コンパイラ基盤って何!? 6
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 7
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
8
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) 9
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) バックエンド (コード生成) 10
コンパイラの処理 C/C++ X86 Java ARM Haskell PowerPC 中間表現 フロントエンド (解析・変換)
ミドルエンド (解析・最適化) バックエンド (コード生成) ・中間表現の規定 ・中間表現の生成・解析/最適化 ・中間表現から各種ターゲットのコード生成 ⇒各種モジュールが整理されて再利用できると嬉しいよね 11
LLVMのイメージ C/C++ X86 Java ARM Haskell PowerPC 中間表現 (LLVM-IR) 変換前
LLVM-IR Pass A Pass B Backend Pass LLVM バックエンド 処理 変換後 LLVM-IR 解析・最適化 Pass=中間表現(LLVM-IR)の解析や 最適化を行うモジュール 12
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 13
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による 14
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による
最近人気なようですね? 15
LLVMとは? コンパイラ基盤だよ? 中間表現(LLVM-IR)と最適化・コード生成等のモジュール 正しくは、LLVM=Clangとかを含むプロジェクトの総称 どちらを指しているかは文脈による
最近人気なようですね? BSDライクの比較的緩いライセンス モジュール化されていて再利用しやすい 読みやすい(読める) 16
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 17
LLVM IRの特徴 18
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 19
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 20
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 静的単一代入形式(SSA) 変数への代入は一度だけ def-useが追いやすい 21
LLVM IRの特徴 LLVM IR=LLVMの中間表現 言語非依存 レジスタマシンがターゲット
i32,floatなどの型があります 静的単一代入形式(SSA) 変数への代入は一度だけ def-useが追いやすい 3種類あるけど全て等価 メモリ上のIR シリアライズされたビットコード 人間が読めるアセンブリ形式 詳細はLLVMのドキュメントに・・・ LLVM Language Reference Manual 22
LLVM IRの例 例えば↑のソースコードをclang v3.4でコンパイルすると・・・ clang –emit-llvm –S HelloWorld.c
#include<stdio.h> int main() { printf("Hello World!\n"); return 0; } 23
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} 24
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module 25
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 26
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 27 Function
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 28 Function BasicBlock
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 29 Function BasicBlock Instruction
LLVM IRの例 ; ModuleID = 'HelloWorld.cpp' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:
0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @.str = private unnamed_addr constant [14 x i8] c"Hello World!\0A\00", align 1 ; Function Attrs: uwtable define i32 @main() #0 { entry: %retval = alloca i32, align 4 store i32 0, i32* %retval %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str, i32 0, i32 0)) ret i32 0 } declare i32 @printf(i8*, ...) #1 attributes #0 = { 省略 } attributes #1 = { 省略 } !llvm.ident = !{!0} !0 = metadata !{metadata !"clang version 3.4 (tags/RELEASE_34/final 204003)"} Module Grobal Variable 30 Function BasicBlock Instruction Metadata
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 31
Passの概念 LLVMの解析や最適化を担う重要な要素 LLVMの各種解析/最適化は全てPass optコマンドで任意のPassを適用することも可能 • opt -pass-name
XX.ll 32
Passの種類 以下の基底クラスを目的に応じて継承 ImmutablePass ModulePass FunctionPass
LoopPass RegionPass BasicBlockPass MachineFunctionPass どのようなPassがあるかは公式ドキュメントを・・・ LLVM’s Analysis and Transform Passes 33
Passの種類 以下の基底クラスを目的に応じて継承 ImmutablePass ModulePass FunctionPass
LoopPass RegionPass BasicBlockPass MachineFunctionPass どのようなPassがあるかは公式ドキュメントを・・・ LLVM’s Analysis and Transform Passes 34 ART内のGPCExpander はFunctionPassを継承
アジェンダ LLVMとは? コンパイラの処理 LLVMのイメージ LLVM-IR
LLVM-IRの特徴 LLVM-IRの例 Pass Passの概念 Passの種類 おまけ 35
おまけ 36 折角なのでARTの話を少し
おまけ:ARTにおけるLLVM Android4.4に含まれる新しいruntime 開発者向け ARTのソースコードを少し眺めてみた とりあえずart/compiler配下だけ
ぐーぐる先生に「LLVM ART」と聞くと良いエントリがありますよ! 37
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 38
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 39 LLVMが関係してくるのはここ
おまけ:ARTにおけるLLVM ARTの処理系も幾つか種類があるらしい Quick Portable SeaIR
インタプリタ? 今回はPortableまわりで読んだところを少しだけ Dexを入力としてコード生成する 40 LLVMが関係してくるのはここ
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる 41
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? 42
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize 43
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize CompileOneMethod frontend.ccのCompileMethodへ MIRの最適化とLLVMIRへの変換(PortableじゃなければArm/MIPS/X86CodeGenerator) 44
おまけ:ARTにおけるLLVM Portableの場合 Dex2Oat::CreateOatFile art/dex2oat/dex2oat.cc 一番下にmainがあるのでそこから読んでみる
CompilerDriver::CompileAll art/compiler/llvm/compiler_driver.cc CompilerLLVM::CompileDexFile等を経由しCompilerLLVM::CompileDexMethodへ? CompilerLLVM::CompileDexMethod art/compiler/llvm/compiler_llvm.cc CompileOneMethod,LLVMCompilationUnit::Materialize CompileOneMethod frontend.ccのCompileMethodへ MIRの最適化とLLVMIRへの変換(PortableじゃなければArm/MIPS/X86CodeGenerator) LLVMCompilationUnit::Materialize GBCExpanderの適用とPassManagerBuilderを利用してO3最適化 PassManagerはnothingcosmosさんのwikiとエントリがわかりやすいよ! 45
おまけ:ARTにおけるLLVM 今回読んだところ PortableはDex⇒MIR⇒MIR最適化⇒LLVMIR⇒GBCExpander⇒O3最適化⇒コード生成 SeaIRはDex⇒SeaGraph⇒LLVMIR⇒O3最適化⇒コード生成という感じ? 残念ながらPortableは動いていない?らしい 46
まとめ LLVMはコンパイラ基盤 コンパイラ基盤=中間表現とその操作セット Passを用いて解析や最適化 optコマンドで任意のPassを適用可能
自分で実装する場合は目的に応じて基底クラスを継承 Android4.4のARTでもLLVMが! PortableではDex⇒MIR⇒MIR最適化⇒LLVMIR⇒GBCExpander⇒O3最適化⇒コード生成 47
ありがとうございました 48