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
,分析与优化lli
的即时编译器(JIT)直接编译执行llc
,不同计算机架构用下面的指令可以查看每一级优化的pass
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
i32
%0 = load i32* %X, align 4!
%add = add nsw i32 %0, 1!
ret i32 %add!
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
]
opt
调出llc
调出假设在lib/Transforms
内创建新的文件夹名为CountOp
(新的Pass)
lib/Transforms/CountOp/CMakeLists.txt
add_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
export PATH=$PATH:~/llvm-project/llvm/build/bin/
clang-7 -c -emit-llvm file.c -o file.bc
file.bc
上看结果
./llvm/build/bin/opt -load llvm/build/lib/CountOp.so -CountOp -disable-output file.bc
opt –view-cfg const.cp.bc