LLVM
Low-Level Virtual Machine (LLVM)是一个编译器设施,包含一系列可重用的库和良定义的接口。 它的核心采用C++进行编写,支持多种前端编程语言及多种后端硬件,第一版由UIUC于2003年发布,开源,目前由苹果维护。
LLVM对应的C/C++编译器即为clang,通常编译时间要比gcc和icc少很多。
安装
注意现在版本的LLVM都采用cmake进行编译,而不是make+configure,下面以最新7.01版本为例
svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_701/final llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_701/final clang
cd ../projects/
svn co http://llvm.org/svn/llvm-project/compiler-rt/RELEASE_701/final compiler-rt
cd ../tools/clang/tools/
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/RELEASE_701/final extra
cd ../../..
mkdir build
cd build
cmake -G "Unix Makefiles" ../
make -j24
- 前端:如
clang和clang++ - 中端:
opt,分析与优化
注意Bytecodes(bc)都是可解释的(interpretable),可用lli的即时编译器(JIT)直接编译执行 - 后端:
llc,不同计算机架构
用下面的指令可以查看每一级优化的pass
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
LLVM IR
- RISC指令集,通常的指令码(opcodes)
- add, mul, or, shift, branch, load, store
- 类型表示
i32%0 = load i32* %X, align 4! %add = add nsw i32 %0, 1! ret i32 %add! - 静态单赋值(SSA)格式
- 控制流显性表示
switch i32 %0, label %sw.default [ i32 1, label %sw.bb i32 2, label %sw.bb1 i32 3, label %sw.bb2 i32 4, label %sw.bb3 i32 5, label %sw.bb4 ]
Pass
简介
- 每一个对源程序的分析/变换的流程称为一个pass
- 与机器无关的pass用
opt调出 - 与机器相关的pass用
llc调出
写Pass
假设在lib/Transforms内创建新的文件夹名为CountOp(新的Pass)
- 创建
lib/Transforms/CountOp/CMakeLists.txtadd_llvm_loadable_module(CountOp CountOp.cpp PLUGIN_TOOL opt ) - 在
lib/Transforms/CMakeLists.txt内添加add_subdirectory(CountOp) - 创建
CountOp.cpp源代码 - 回到先前编译的
build文件夹,更新cmake,然后编译cmake -G "Unix Makefiles" ../ make
测试
- 编译测试文件为llvm ByteCode,注意clang版本
export PATH=$PATH:~/llvm-project/llvm/build/bin/ clang-7 -c -emit-llvm file.c -o file.bc - 将CountOp作用到
file.bc上看结果./llvm/build/bin/opt -load llvm/build/lib/CountOp.so -CountOp -disable-output file.bc - 查看控制流图
opt –view-cfg const.cp.bc
参考资料
- A Complete Guide to LLVM for Programming Language Creators, https://mukulrathi.co.uk/create-your-own-programming-language/llvm-ir-cpp-api-tutorial/
- Getting Started Quickly, http://releases.llvm.org/7.0.1/docs/GettingStarted.html#getting-started-quickly-a-summary
- Programmer’s Manual, http://releases.llvm.org/7.0.1/docs/ProgrammersManual.html
- LLVM Pass, http://llvm.org/docs/WritingAnLLVMPass.html
- C Lattner, and V Adve, LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation, CGO, 2004