Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
hito-ga-oshieru-llvm
Search
Kmotiko
March 22, 2014
Programming
5.5k
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
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
7
1.8k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
170
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
160
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
540
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
350
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
130
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
180
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.3k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
300
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
13
6.4k
パーソナライズPodcastを作った話
repunit11
0
120
setup-vp GitLab対応の裏側
naokihaba
0
150
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Optimizing for Happiness
mojombo
378
71k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
550
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
The Limits of Empathy - UXLibs8
cassininazir
1
700
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
550
Utilizing Notion as your number one productivity tool
mfonobong
4
610
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