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
Compilation Process
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
AlexDenisov
January 21, 2015
Programming
800
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Compilation Process
Compilation process overview
AlexDenisov
January 21, 2015
More Decks by AlexDenisov
See All by AlexDenisov
Getting started with LLVM using Swift
alexdenisov
0
180
Magic Behind Xcode
alexdenisov
2
510
BloodMagic
alexdenisov
1
1k
Other Decks in Programming
See All in Programming
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
770
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
550
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
210
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
120
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
490
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
460
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
250
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
480
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
Odyssey Design
rkendrick25
PRO
2
750
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
GitHub's CSS Performance
jonrohan
1033
470k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
410
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
Compilation process How a program is born CocoaHeads Berlin, 2015
> whoami Twitter: @1101_debian Freenode: AlexDenisov Github: @AlexDenisov
Outline • Compilation process • LLVM/Clang • Q & A
Compilation Process
int main(){ return 0; } 0000000 cf fa ed fe
07 00 00 01 03 00 00 80 02 00 00 00 0000010 0f 00 00 00 38 03 00 00 85 00 20 00 00 00 00 00 0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 0000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000060 00 00 00 00 00 00 00 00 19 00 00 00 38 01 00 00 0000070 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000080 00 00 00 00 01 00 00 00 00 10 00 00 00 00 00 00 0000090 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00000a0 07 00 00 00 05 00 00 00 03 00 00 00 00 00 00 00 00000b0 5f 5f 74 65 78 74 00 00 00 00 00 00 00 00 00 00 00000c0 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 00000d0 98 0f 00 00 01 00 00 00 08 00 00 00 00 00 00 00 00000e0 98 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000f0 00 04 00 80 00 00 00 00 00 00 00 00 00 00 00 00 0000100 5f 5f 75 6e 77 69 6e 64 5f 69 6e 66 6f 00 00 00 0000110 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000120 a0 0f 00 00 01 00 00 00 48 00 00 00 00 00 00 00 0000130 a0 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 00 0000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000150 5f 5f 65 68 5f 66 72 61 6d 65 00 00 00 00 00 00 0000160 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000170 e8 0f 00 00 01 00 00 00 18 00 00 00 00 00 00 00 0000180 e8 0f 00 00 03 00 00 00 00 00 00 00 00 00 00 00 0000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001a0 19 00 00 00 48 00 00 00 5f 5f 4c 49 4e 4b 45 44 00001b0 49 54 00 00 00 00 00 00 00 10 00 00 01 00 00 00 00001c0 00 10 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00001d0 d8 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00001e0 00 00 00 00 00 00 00 00 22 00 00 80 30 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
int main(){ return 0; } 0000000 cf fa ed fe
07 00 00 01 03 00 00 80 02 00 00 00 0000010 0f 00 00 00 38 03 00 00 85 00 20 00 00 00 00 00 0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 0000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000060 00 00 00 00 00 00 00 00 19 00 00 00 38 01 00 00 0000070 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000080 00 00 00 00 01 00 00 00 00 10 00 00 00 00 00 00 0000090 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00000a0 07 00 00 00 05 00 00 00 03 00 00 00 00 00 00 00 00000b0 5f 5f 74 65 78 74 00 00 00 00 00 00 00 00 00 00 00000c0 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 00000d0 98 0f 00 00 01 00 00 00 08 00 00 00 00 00 00 00 00000e0 98 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000f0 00 04 00 80 00 00 00 00 00 00 00 00 00 00 00 00 0000100 5f 5f 75 6e 77 69 6e 64 5f 69 6e 66 6f 00 00 00 0000110 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000120 a0 0f 00 00 01 00 00 00 48 00 00 00 00 00 00 00 0000130 a0 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 00 0000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000150 5f 5f 65 68 5f 66 72 61 6d 65 00 00 00 00 00 00 0000160 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 0000170 e8 0f 00 00 01 00 00 00 18 00 00 00 00 00 00 00 0000180 e8 0f 00 00 03 00 00 00 00 00 00 00 00 00 00 00 0000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001a0 19 00 00 00 48 00 00 00 5f 5f 4c 49 4e 4b 45 44 00001b0 49 54 00 00 00 00 00 00 00 10 00 00 01 00 00 00 00001c0 00 10 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00001d0 d8 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00001e0 00 00 00 00 00 00 00 00 22 00 00 80 30 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Lexer Parser Semantic Analysis Code Generation Optimization Assembler Linker
const float factor = 42.f; int calc(float x) { return
factor * x; }
Lexer
const float factor = 42.f; int calc(float x) { return
factor * x; }
const float factor = 42.f; int calc(float x) { return
factor * x; } (KW ‘const’)
const float factor = 42.f; int calc(float x) { return
factor * x; } (KW ‘const’), (TYPE ‘float’)
const float factor = 42.f; int calc(float x) { return
factor * x; } (KW ‘const’), (TYPE ‘float’), (ID ‘factor'), (EQ ‘=‘), (NUM ’42.f’), (SEMI ‘;’)
const float factor = 42.f; int calc(float x) { return
factor * x; } (KW ‘const’), (TYPE ‘float’), (ID ‘factor'), (EQ ‘=‘), (NUM ’42.f’), (SEMI ‘;’), (TYPE ‘int’), (ID ‘calc’), (L_PAREN ‘(‘), (TYPE ‘float’), (ID 'x') (R_PAREN ‘)’), (L_BRACE ‘{‘), (KW ‘return’), (ID ‘factor’), (STAR ‘*’), (ID ‘x’), (SEMI ‘;’), (R_BRACE ‘}’), (EOF '')
Parser
(KW ‘return’) (ID ‘factor’) (STAR ‘*’) (ID ‘x’)
ReturnStmt return BinaryOperator * ReferenceDecl x ReferenceDecl factor (KW ‘return’)
(ID ‘factor’) (STAR ‘*’) (ID ‘x’)
AST VariableDecl factor : float FloatLiteral 42.f FunctionDecl calc :
int ParameterDecl x : float ReturnStmt return BinaryOperator * ReferenceDecl x ReferenceDecl factor
Semantic Analysis
AST VariableDecl factor : float FloatLiteral 42.f FunctionDecl calc :
int ParameterDecl x : float ReturnStmt return BinaryOperator * ReferenceDecl x ReferenceDecl factor
AST VariableDecl factor : float FloatLiteral 42.f : ??? FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : ??? BinaryOperator * : ??? ReferenceDecl x : ??? ReferenceDecl factor : ???
AST VariableDecl factor : float FloatLiteral 42.f : float FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : ??? BinaryOperator * : ??? ReferenceDecl x : float ReferenceDecl factor : float
AST VariableDecl factor : float FloatLiteral 42.f : float FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : int BinaryOperator * : ??? ReferenceDecl x : float ReferenceDecl factor : float
AST VariableDecl factor : float FloatLiteral 42.f : float FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : int BinaryOperator * : float ReferenceDecl x : float ReferenceDecl factor : float
AST VariableDecl factor : float FloatLiteral 42.f : float FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : int BinaryOperator * : float ReferenceDecl x : float ReferenceDecl factor : float ???
AST VariableDecl factor : float FloatLiteral 42.f : float FunctionDecl
calc : int ParameterDecl x : float ReturnStmt return : int BinaryOperator * : float ReferenceDecl x : float ReferenceDecl factor : float ImplicitCast ftoi : int
Code Generation
@factor = constant float 42.0 define calc(float %x) { entry:
movf %x, %r1 movf @factor, %r2 %r3 = fmul %r1, %r2 movf %r3, %r0 ret }
Optimization
@factor = constant float 42.0 define calc(float %x) { entry:
movf %x, %r1 movf @factor, %r2 %r3 = fmul %r1, %r2 movf %r3, %r0 ret }
@factor = constant float 42.0 define calc(float %x) { entry:
%r0 = fmul @factor, %x ret }
Assembler
_calc: push {r7, lr} mov r7, sp mov r1, #36175872
orr r1, r1, #1073741824 bl ___mulsf3 bl ___fixsfsi pop {r7, lr} mov pc, lr .section __TEXT,__const .globl _factor @ @factor .align 2 _factor: .long 1109917696 @ float 42
Linker
> clang -c calc.c -o calc.o const float factor =
42.f; int calc(float x) { return factor * x; }
extern int calc(float); int main() { printf(“%d\n”, calc(2.f)); return 0;
} > clang -c main.c -o main.o
> nm main.o U _calc 0000000000000000 T _main U _printf
> nm main.o U _calc 0000000000000000 T _main U _printf
> ld -lc calc.o main.o -o main > nm main 0000000000001f30 T _calc 0000000000001fc8 S _factor 0000000000001f60 T _main U _printf
LLVM & Clang
Lexer Parser Semantic Analysis Code Generation Optimization Assembler Linker
Optimization Assembler Linker Optimization Assembler Linker Code Generation Semantic
Analysis Parser Lexer Code Generation Semantic Analysis Parser Lexer
Optimization Assembler Linker Code Generation Semantic Analysis Parser Lexer
Code Generation Semantic Analysis Parser Lexer
Lexer Parser Semantic Analysis Code Generation Clang Optimization Assembler
LLVM Linker OS
libclangLex
const float factor = 42.f; int calc(float x) { return
factor * x; } > clang -cc1 -dump-tokens calc.c
const 'const' [StartOfLine] Loc=<calc.c:1:1> float 'float' [LeadingSpace] Loc=<calc.c:1:7> identifier 'factor'
[LeadingSpace] Loc=<calc.c:1:13> equal '=' [LeadingSpace] Loc=<calc.c:1:20> numeric_constant '42.f' [LeadingSpace] Loc=<calc.c:1:22> semi ';' Loc=<calc.c:1:26> int 'int' [StartOfLine] Loc=<calc.c:3:1> identifier 'calc' [LeadingSpace] Loc=<calc.c:3:5> l_paren '(' Loc=<calc.c:3:9> float 'float' Loc=<calc.c:3:10> identifier 'x' [LeadingSpace] Loc=<calc.c:3:16> r_paren ')' Loc=<calc.c:3:17> l_brace '{' [LeadingSpace] Loc=<calc.c:3:19> return 'return' [StartOfLine] [LeadingSpace] Loc=<calc.c:4:3> identifier 'factor' [LeadingSpace] Loc=<calc.c:4:10> star '*' [LeadingSpace] Loc=<calc.c:4:17> identifier 'x' [LeadingSpace] Loc=<calc.c:4:19> semi ';' Loc=<calc.c:4:20> r_brace '}' [StartOfLine] Loc=<calc.c:5:1> eof '' Loc=<calc.c:6:1>
libclangParse/ libclangSema
const float factor = 42.f; int calc(float x) { return
factor * x; } > clang -cc1 -ast-dump calc.c
TranslationUnitDecl <<invalid sloc>> <invalid sloc> |-VarDecl <calc.c:1:1, col:22> col:13 used
factor 'const float' cinit | `-FloatingLiteral <col:22> 'float' 4.200000e+01 `-FunctionDecl <line:3:1, line:5:1> line:3:5 calc 'int (float)' |-ParmVarDecl <col:10, col:16> col:16 used x 'float' `-CompoundStmt <col:19, line:5:1> `-ReturnStmt <line:4:3, col:19> `-ImplicitCastExpr <col:10, col:19> 'int' <FloatingToIntegral> `-BinaryOperator <col:10, col:19> 'float' '*' |-ImplicitCastExpr <col:10> 'float' <LValueToRValue> | `-DeclRefExpr <col:10> 'const float' lvalue Var 'factor' 'const float' `-ImplicitCastExpr <col:19> 'float' <LValueToRValue> `-DeclRefExpr <col:19> 'float' lvalue ParmVar 'x' 'float'
libclangCodeGen
const float factor = 42.f; int calc(float x) { return
factor * x; } > clang -S -emit-llvm calc.c
@factor = constant float 4.200000e+01, align 4 define i32 @calc(float
%x) #0 { entry: %x.addr = alloca float, align 4 store float %x, float* %x.addr, align 4 %0 = load float* %x.addr, align 4 %mul = fmul float 4.200000e+01, %0 %conv = fptosi float %mul to i32 ret i32 %conv }
libclangCodeGen + opt
const float factor = 42.f; int calc(float x) { return
factor * x; } > clang -S -emit-llvm -O1 calc.c
@factor = constant float 4.200000e+01, align 4 define i32 @calc(float
%x) #0 { entry: %mul = fmul float %x, 4.200000e+01 %conv = fptosi float %mul to i32 ret i32 %conv }
libLLVMAsmPrinter
const float factor = 42.f; int calc(float x) { return
factor * x; } > clang -S -arch arm -O0 calc.c
_calc: push {r7, lr} mov r7, sp mov r1, #36175872
orr r1, r1, #1073741824 bl ___mulsf3 bl ___fixsfsi pop {r7, lr} mov pc, lr .section __TEXT,__const .globl _factor @ @factor .align 2 _factor: .long 1109917696 @ float 42
Summary
Summary • Learn your tools
Summary • Learn your tools • Provide feedback, don’t make
complaints
Summary • Learn your tools • Provide feedback, don’t make
complaints • Give back to community
https://speakerdeck.com/alexdenisov/compilation-process Slides: Twitter: @1101_debian Questions?