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
ELVMでLLVM IR
Search
Akira Moroo
March 19, 2017
Programming
0
460
ELVMでLLVM IR
ELVMのLLVM IRバックエンドを作って遊んだときのスライドです.
Akira Moroo
March 19, 2017
Tweet
Share
More Decks by Akira Moroo
See All by Akira Moroo
Exploring x86 MSR Space
retrage
0
1.1k
LLMでバイナリ解析支援
retrage
0
140
GitHub ActionsでDevSecOpsごっこ
retrage
0
33
Practical Rust (Hypervisor) Firmware
retrage
3
1.5k
Bypassing UEFI Secure Boot with Thin-Hypervisor
retrage
0
1k
Porting Linux to Nabla Containers
retrage
0
1.1k
Network Boot from Bell Labs
retrage
2
1.5k
Unikernelで始める自作OS/OS Development with Unikernel
retrage
1
500
LLVM Backend Development for EFI Byte Code
retrage
2
850
Other Decks in Programming
See All in Programming
Rubyでつくるパケットキャプチャツール
ydah
0
170
functionalなアプローチで動的要素を排除する
ryopeko
1
190
KMP와 kotlinx.rpc로 서버와 클라이언트 동기화
kwakeuijin
0
300
ゼロからの、レトロゲームエンジンの作り方
tokujiros
3
1k
AWSのLambdaで PHPを動かす選択肢
rinchoku
2
390
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
870
2025.01.17_Sansan × DMM.swift
riofujimon
2
540
DMMオンラインサロンアプリのSwift化
hayatan
0
180
盆栽転じて家具となる / Bonsai and Furnitures
aereal
0
1.8k
Оптимизируем производительность блока Казначейство
lamodatech
0
950
GitHub CopilotでTypeScriptの コード生成するワザップ
starfish719
26
6k
Внедряем бюджетирование, или Как сделать хорошо?
lamodatech
0
940
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Automating Front-end Workflow
addyosmani
1366
200k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
How to train your dragon (web standard)
notwaldorf
89
5.8k
Faster Mobile Websites
deanohume
305
30k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Become a Pro
speakerdeck
PRO
26
5.1k
The Cult of Friendly URLs
andyhume
78
6.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Embracing the Ebb and Flow
colly
84
4.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Transcript
ELVMでLLVM IR 2017/03/19 @retrage
動機 • LLVMで遊んでみたい • フロントエンドを作ったりはしたくない • clang –emit-llvmで出⼒させたコードで遊ぶのも⾯⽩ くない •
LLVMを始めよう! 〜 LLVM IRの基礎はclangが 教えてくれた・Brainf**kコンパイラを作ってみ よう 〜 • http://itchyny.hatenablog.com/entry/2017/02/27/ 100000 • BrainF**kからLLVM IRを吐くようなものを作るとい う話
LLVM • コンパイラ基盤 • LLVM IRという中間表現を使う フロントエンド LLVM IR バックエンド
最適化 コード ターゲット clang opt llc • opt: LLVM IRに対し最適化 • lli:LLVM RIをVMで実⾏
ELVM • “LLVMのパロディ” フロントエンド ELVM IR バックエンド コード ターゲット 8cc
elc • ターゲット • BrainF**k, WhiteSpace, C++14(compile time)など • 環境依存でない中間表現ELVM IR
ELVMでLLVM IR • ELVMのLLVM IRバックエンドを作ろう • Q. 何かいいことor新しいことはある? • A.⼀切ない
• C ->ELVM IR -> C -> LLVM IRと同じ • LLVMの恩恵を感じてみたい • ELVMのバックエンドを作るのは⽐較的簡単
LLVM IRについて • 例: • unsigned int a = 5;
• a += 5; • %a = alloca i32 • store i32 5, i32* %a • %1 = load i32* %a • %2 = add i32 %1, 5 • store i32 %2, i32* @a
C->ELVM IR • ELVMでは8ccをフロントエンドにELVM IRを出⼒ $ cat hello.c #include <stdio.h>
int main() { const char* p = "Hello, world!\n"; for (; *p; p++) putchar(*p); return 0; } $ out/8cc -S -I. -Ilibc -Iout hello.c $ wc –l hello.s 12554 ../elvm/hello.s
ELVM IR -> LLVM IR $ ./elvm/out/elc –ll hello.c.eir >
hello.c.eir.ll $ wc –l hello.c.eir.ll 33882 hello.c.eir.ll $ clang –S –O0 –emit-llvm hello.c $wc –l hello.ll 45 hello.ll $ time lli hello.c.eir.ll Hello, world! real 0m0.339s user 0m0.300s sys 0m0.037s $ time lli hello.ll Hello, world! real 0m0.009s user 0m0.009s sys 0m0.000s
最適化させてみる $ wc –l hello.c.eir.ll 33882 hello.c.eir.ll $ time lli
hello.c.eir.ll Hello, world! real 0m0.339s user 0m0.300s sys 0m0.037s $ opt -O3 -S hello.c.eir.ll –o hello.c.eir.ll.opt 15865 hello.c.eir.ll.opt $ time lli hello.c.eir.ll.opt Hello, world! real 0m0.198s user 0m0.163s sys 0m0.032s
まとめ • LLVM IRのことが少しわかったような気がする • まだまだ使っていない仕様がたくさんある • ELVM IRへの変換によるオーバーヘッドはoptで ある程度削減できるっぽい
• LLVMのELVM IR向けバックエンドが実装されている ようなので,ELVM IR <-> LLVM IRできるかも • コンパイラでの最適化について良い本を知って いたら教えてください
参考⽂献 • http://shinh.skr.jp/slide/elvm/000.html • http://itchyny.hatenablog.com/entry/2017/02/27/ 100000 • http://llvm.org/docs/LangRef.html • http://llvm.org/docs/CommandGuide/opt.html
LLVM IRバックエンドつらい • 無名の識別⼦は%から始まる番号になっている • 少しでもずれたりすると怒られる • ELVM IRのsrcがREG/IMMで命令が結構変わる •
デバッグむずい • C->ELVM IRだとすぐにコード量が膨れあがる • lliを使ったいいデバッグ⽅法を知りたい