10. 아이디어의 시작은…
•
JVMs do all optimizations online at JIT time:
- Hugely redundant across runs
- Applications launch slowly
- What if we could do heavy lifting at install time?
!
•
Problem: Java bytecode is too limiting!
- Memory safety prevents some optzns (eg. bounds checks)
- JVM type system doesn’t lend itself to machine optzns
11. “
With some sort of low level virtual machine,
we could optimize better and a JIT compiler
would have to do less work online!
”
12. Introduction
•
LLVM
- Low-Level Virtual Machine
•
An Infrastructure for Multi-stage Optimization
- by Chris Arthur Lattner @2002
•
Design and Implementation of a compiler infrastructure
- support a unique multi-stage optimization system
- support inter-procedural and profile-driven optimizations
•
LLVM virtual instruction (IR)
- with high-level type information
•
Sponsored by APPLE
13. LLVM Vision and Approach
•
Primary mission: Build a set of modular compiler components:
- Reduces the time & cost to construct a particular compiler
- Components are shared across different compilers
- Allows choice of the right component for the job
•
Secondary mission: Build compilers out of these components
X86 PPC CBE clang GCC LTO
DWARF
Code
Target
gen
JIT Optzn linker IPO
BC IO LL IO System Core
Support xforms analysis
GC
...
14. Authors
•
Vikram Adve
- At University of Illinois
•
Chris Lattner
- LLVM: A Compilation Framework for Lifelong
Program Analysis & Transformation @2004
- Macroscopic Data Structure Analysis and
Optimization @2005 Ph.D Thesis
- work for Apple from 2007
•
Related Publications
- 15 < @2007, 30 ~ @2008, 50 ~ @2009, 30 ~ @2010
17. The Architecture
Libraries
Compiler FE 1
.
.
Compiler FE N
LLVM
.o
files
LLVM
LLVM
Native
CodeGen
Offline Reoptimizer
exe &
LLVM
exe
Linker
IPO / IPA
LLVM
exe
LLVM
CPU
exe
Link
Time
Runtime
Optimizer
LLVM
JIT
Compile
Time
Profile
& Trace
Info
Profile
Info
LLVM
Run-Time
22. Summary of the optimization
•
Analysis Passes (~50)
- Basic Alias Analysis
- Basic CallGraph construction
- Count alias analysis query response
- Dominator Tree Construction
- Counts the various types of Instructions
- Loop Dependence Analysis
- Track pointer bounds
•
Transform Passes (~70)
- Remove redundant conditional branches
- Aggressive Dead Code Elimination
- Dead Code Elimination
- Deduce function attributes
- Unroll loops
- Optimize use of memcpy and friends
- Strip debug info for unused symbols
•
Utility Passes (~10)
- Dead Argument Hacking
- View CFG of function
http://llvm.org/docs/Passes.html
28. Clang Front-end
C, Objective-C and C++ front-end
• Aggressive project with many goals...
•
- Compatibility with GCC
- Fast compilation
- Expressive error messages (static analysis)
!
t.c:6:49: error: invalid operands to binary expression (‘int’ and ‘struct A’)!
!
return intArg + func(intArg ? ((someA.X+40) + someA) / 42 : someA.X));!
~~~~~~~~~~~~~ ^ ~~~~~
!
•
Host for a broad range of source-level tools
http://llvm.org/devmtg/2008-08/Kremenek_StaticAnalyzer.pdf
29. Clang Front-end
Analyzer Xcode Integration
C, Objective-C and C++ front-end
• Aggressive project with many goals...
•
- Compatibility with GCC
- Fast compilation
- Expressive error messages (static analysis)
!
t.c:6:49: error: invalid operands to binary expression (‘int’ and ‘struct A’)!
!
return intArg + func(intArg ? ((someA.X+40) + someA) / 42 : someA.X));!
~~~~~~~~~~~~~ ^ ~~~~~
!
•
Host for a broad range of source-level tools
Improving Your Application with the Xcode Static Analyzer
North Beach
Tuesday 5:00PM
http://llvm.org/devmtg/2008-08/Kremenek_StaticAnalyzer.pdf
30. Better Diagnosis of the Problem
Better Diagnosis of the Problem
GCC 4.2
Clang
test.m:4:1: error: unknown type name 'NSString'
NSString *P = @"good stuff";
^
31. libclang
•
Clang is not just a great compiler...
- also a library for processing source code
✴
✴
Resolves identifiers and symbols
✴
Expands macros
✴
•
Translates text into AST
Makes implicit information explicit
Features
- Parsing
- Indexing and cross-referencing
- Syntax highlighting
- Code completion
NEW
32. libclang
•
Clang is not just a great compiler...
- also a library for processing source code
✴
✴
Resolves identifiers and symbols
✴
Expands macros
✴
•
Translates text into AST
Makes implicit information explicit
Features
- Parsing
- Indexing and cross-referencing
- Syntax highlighting
- Code completion
NEW
33. ARC
•
NEW
Automatic Reference Coun
Automatic Reference Counting
- Automatic memory management of Objective-C objects
- Just Compile-time, Not Run-time
Not Garbage-Collector
• Migration Tool in Xcode 4.2
•
- with LLVM 3.0
- build-settings : -fobjc-arc (cf. -fno-objc-arc)
•
New Rules
- remove dealloc, retain/release/autorelease
✴
can still use CFRetain / CFRelease in CF
- Can’t use NSAllocateObject / NSDeallocateObject
- Can’t use object pointer in C Structures
- no casual casting id -> void*
- Can’t use NSAutoreleasePool -> @autoreleasepool
- Can’t use memory zone (NSZone)
- Can’t give a property name with new-
osxdev.org
34. libc++
•
Another C++ standard library?
- http://libcxx.llvm.org
•
The C++0x spec introduces several
fundamentally new ideas
- Move semantics
- Perfect forwarding
- Variadic templates
•
New language features
- C++03 implementation from the beginning
- driven several low-level design decisions.
NEW
35. DragonEgg
•
gcc plugin
- replaces gcc’s optimizers and code generators
- reimplementation of llvm-gcc. with gcc-4.5 or later
•
Current Status (v2.8)
- C works well, C++ works fairly well
- can compile a small amount of Obj-C/C++
- Limited debug info
- Requires patching gcc
- Only supports x86-32/64
- Only supports linux/darwin
ex) gcc hello.c -S -O1 -o -fplugin=./dragonegg.so
NEW
36.
37. LLDB
NEW
• Next-generation!
• & High-performance Debugger!
• a set of reusable components in LLVM!
• Clang expression parser!
• LLVM disassembler!
• C/C++, Objective-C!
• Efficient Multi-threading, symbol manager!
• Extension - Python script!
• Support Remote protocol/debug server
42. LLDB Command Syntax
Command Syntax
<noun> <verb> [-options [option-value]] [argument [argument...]]
Uses standard getopt_long() for predicate behavior
(lldb) process launch a.out --stop-at-entry
(lldb) process launch a.out -- --arg0 --arg1
(lldb) process launch a.out -st
Options know which other options they are compatible with
(lldb) process attach --pid 123 --name a.out
43. Common Commands
GDB
(gdb) ^C
(gdb) signal 2
(gdb) info break
(gdb) continue
(gdb) step
(gdb) stepi
(gdb) next
(gdb) nexti
(gdb) finish
(gdb) info threads
(gdb) backtrace
LLDB
(lldb) process interrupt
(lldb) process signal SIGINT
(lldb) breakpoint list
(lldb) process continue
(lldb) thread step-in
(lldb) thread step-inst
(lldb) thread step-over
(lldb) thread step-over-inst
(lldb) thread step-out
(lldb) thread list
(lldb) thread backtrace
44. Common Commands
GDB
LLDB
(gdb) ^C
(gdb) signal 2
(gdb) in br
(gdb) c
(gdb) s
(gdb) si
(gdb) n
(gdb) ni
(gdb) f
(gdb) info threads
(gdb) bt
(lldb) pro int
(lldb) pro s SIGINT
(lldb) br l
(lldb) c
(lldb) s
(lldb) si
(lldb) n
(lldb) ni
(lldb) f
(lldb) th l
(lldb) bt
46. Call for help!
Call for help
OSS community needs to unite work on various scripting languages
– Common module to represent/type infer an arbitrary dynamic language
– Who will provide this? pypy? parrot? llvm itself someday (“hlvm”)?
–
Ruby Python Perl Javascript ...
Common Dynamic Language
Representation + Type Inference
C, C++, Ada, ... GLSL, ARB VP, ...
llvm-gcc
OpenGL
What Next?
LLVM
LTO JIT Install Time Cross Lang Debugger
Codegen
Optzn
Support
IPO
http://llvm.org/
47. LLVM sub-projects
Clang & LLDB
• OpenMP
• Compiler-rt
•
- provides highly tuned implementations of the low-level
code generator.
•
cf. libgcc
VMKit
- is an implementation of the Java and .NET Virtual
Machines
•
KLEE
- implements a "symbolic virtual machine"
- which uses a theorem prover to try to evaluate all
dynamic paths through a program
48. LLVM sub-projects
•
Polly
- implements a suite of cache-locality optimizations as
well as auto-parallelism and vectorization using a
polyhedral model.
•
libclc
- implement the OpenCL standard library.
•
SAFECode
- is a memory safety compiler for C/C++ programs.
- It instruments code with run-time checks to detect
memory safety errors (ex. buffer overflows) at run-time.
LLD (Linker)
• ... to be continue ...
•
49. VMKit: a substrate for virtual machines
MMTk
Classpath
Mono
Pnetlib
LLVM JIT
POSIX
운영체제
하드웨어
http://vmkit.llvm.org/tuto/VMKit_pres_eng.pdf
52. LLVM use in Open Source OSes
Minix moved to Clang as default compiler
• FreeBSD is working on ClangBSD
• LLVM a hard dependency for Gallium3D
• Building Debian with Clang
• Unsupported GCC Flags / C Extensions
•
출처 : http://llvm.org/devmtg/2012-04-12/Slides/Mark_Charlebois.pdf
53. Use-case #1 - New Compiler
• Cling - CERN
• CtoVerilog - Haifa University
• OpenCL - AMD
• Click - Ericsson
• EDGtoLLVM - ARM
• Delphi XE- Embarcadero
• Jaguar - Cray
56. OpenGL
–
•
Very fragile, hard to understand and change (hex opcodes)
OpenGL Interpreter:
– JIT didn’t support all OpenGL features: fallback to interpreter
– Interpreter was very slow, 100x or worse than JIT
LLVM 이전까지는…
GFX Card
GLSL
Text
OpenGL
Parser
Custom JIT
OpenGL
AST
Interpreter
htt
57. 1.Translate OpenGL AST into LLVM call instructions: one per operation
– Very fragile, hard to understand and change (hex
2.Use the LLVM inliner to inline opcodes from precompiled bytecode opcodes)
3.Optimize/codegen as before
OpenGL
•
GLSL
OpenGL Interpreter:
– JIT didn’t support all OpenGL features: fallback to interpreter
– Interpreter was very slow, 100xLLVM
OpenGL to
or worse thanLLVM
JIT
OpenGL
LLVM 이전까지는…
Parser
LLVM
Optimizer
JIT
LLVM IR
OpenGL
AST
OpenGL
to LLVM
...
vec3 viewVec = normalize(-ecPosition);
GLSL
float diffuse = max(dot(lightVec, tnorm), 0.0);
Text
...
OpenGL
Parser
OpenGL
Optimize,
AST
Codegen
PPC
X86
LLVM IR
GFX Card
...
%tmp1 = call opengl_negate(ecPosition)
%viewVec = call opengl_normalize(%tmp1);
%tmp2 = call opengl_dot(%lightVec, %tnorm)
%diffuse = call opengl_max(%tmp2, 0.0);
...
Custom JIT
Interpreter
LLVM Inliner
...
%tmp1 = sub <4 x float> <0,0,0,0>, %ecPosition
%tmp3 = shuffle <4 x float> %tmp1, ...;
%tmp4 = mul <4 x float> %tmp3, %tmp3
...
http://llvm.org/
htt
62. Use-case #3 - Cross Language
Crack Scripting Language
➔ C/C++/Java-like Scripting Language
➔ Speed of a compiled language,
ease of use of a scripting language
➔ Unladen Sparrow(Python), Rubinius(Ruby), V8(JS)
cf. PNaCl (Portable Native Client)
63. Use-case #3 - Emscripten
compiles LLVM bytecode into JavaScript
➔ C/C++ to JavaScript
➔ can be run on the web
➔ Python, the Bullet physics engine, eSpeak (TTS)
https://github.com/kripken/emscripten/wiki
64. Everything compiles into LLVM bitcode
Use-case #3 - Emscripten
compiles LLVM bytecode into JavaScript
➔ C/C++ to JavaScript
➔ The web is everywhere, and runs JavaScript
can be run on the web
➔ Python, the Bullet physics engine, eSpeak (TTS)
Compiling LLVM bitcode to JavaScript lets us run
~ everything, everywhere
https://github.com/kripken/emscripten/wiki
70. 놀라운 사실들
•
•
•
•
•
•
•
First production JIT compiler for C-based
languages
Clang/LLVM have fully replaced GCC in XCode 5
Used on both major mobile platforms: iOS and
Android
Most GPU compute languages (OpenCL, CUDA,
Renderscript) use LLVM
First complete C++-11x: language + library
First ARM64 compiler in production (iPhone 5s)
2012 ACM Software System Award
72. Bug fixed…
From March, 2008 to present:
170 bugs fixed + 3 reported but not yet fixed
( 57 wrong code bugs, 116 crash bugs)
• 2.4 revision simplifies “( a>13 ) & ( a==15)” into “( a>13 )”
• 2.8 revision folds “((x==x) | (y&z))==1” into 0
• 2.8 revision reduces this loop into “i=1”
for (i=0; i<5; i++)
{
if (i) continue;
if (i) break;
}
73. More to come…
•
•
•
•
•
•
More complete Windows support
More effective profile-guided
optimization
Improved usability, parallelization for LTO
Improved auto-vectorization
Improved debugging support
State-of-the-art pointer analysis
74. Conclusion
•
LLVM is
- still continue evolution...
- not omnia(all mighty)
- maybe a shortcut to the new compiler
- new strategy for mobile
- alternative solution for HW emulation or VM
- can mix with the other languages
- synergy with OpenCL, OpenGL
- new chance with LLVM projects