LLVM
llvm 是一个模块化的开源编译器框架,最早的时候是Illinois 大学的一个研究项目,早先的主要负责人是Chris Lattner。
llvm 有一个表达形式很好的IR语言(intermediate representation),高度模块化的结构,因此它可以作为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的目标代码生成功能。
其借鉴了 GCC 等传统编译器的分段设计方式,引入了高度模块化的设计。
正是由于贯穿编译过程的统一的IR表示,llvm 支持快速开发编程语言,添加各种前后端来完成编译器的构建。
Low Level Virtual Machine
A set of reusable libraries that collect of compiler technology components
Program analyzer and optimizator
Machine code generator
Clang: C based language front-end such as C, C++
Just-In-Time compiler
Implemented in C++ with well-defined interfaces: Easy to add, remove, and change funcitionality
Open source, and BSD licensed
Website: http://llvm.org/
Clang
- clang
- clang-format
- clang-check
- clang-rename
- clang-refactor
进阶工具
- opt
- llc
- lli
- llvm-config
- llvm-diff
- llvm-mc
- llvm-bcanalyzer
- llvm-opt-report
- bugpoint
- llvm-stress
- llvm-tblgen
- llvm-mcmarkup
- clang-offload-bundler
- obj2yaml / yaml2obj
- llvm-rtdyld
- llvm-cfi-verify
- verify-uselistorder
opt foo.ll -O1 -view-cfg
优化 | opt 选项 |
---|---|
Constant Propagation | -constprop |
Function Inlining | -inline |
Dead Code Elimination | -dce |
Common Sub-expression Elimination | -early-cse |
Loop Unrolling | -loop-unroll |
IR 操作
- llvm-link
- llvm-as
- llvm-dis
- llvm-extract
- llvm-split
- llvm-cat
- llvm-modextract
- llvm-lto
- llvm-lto2
Debug Info 相关
- llvm-dwp
- llvm-dwarfdump
- llvm-dsymutil
LLVM IR
- Low level assembly like language
- RISC-like three address code
- Target independence
- Infinite virtual register set
- Static Single Assignment form
- LLVM IR is strongly typed
- https://llvm.org/docs/LangRef.html
IR Format
- in-memory: binary in-memory format, used during compilation process
- bitcode: binary on-disk format, suitable for fast loading
- assembly: human-readable format
三种类型是等价的。bitcode file 的后缀名是 .bc
;assembly file 的后缀名是 .ll
。
IR Generation
- Assembly
llvm-dis
: LLVM IR assembly code, llvm .bc => .ll
llc
: native assembly code, llvm .bc => .s
clang -emit-llvm -S filename.c -o out.ll
opt -S xx.bc -o out.ll
llvm-dis xxx.bc -o -out.ll
- Bitcode
clang -emit-llvm -c filename.c -o out.bc
opt xx.ll -o out.bc
llvm-as xx.ll -o out.bc