一 、 llvm构建(Linux ubuntu64 3.2.0-29-generic)
http://llvm.org/releases/download.html#3.3
从llvm 下载3.3版本, 下载clang、llvm、compiler-rt三部分。
tar vxzf llvm-3.3.src.tar.gz
tar vxzf cfe-3.3.src.tar.gz
tar vxzf compiler-rt-3.3.src.tar.gz
mv cfe-3.3.src llvm-3.3.src/tools/clang
mv compiler-rt-3.3.src llvm-3.3.src/projects/compiler-rt
mkdir build
cd build
../llvm/configure 或者 cmake ../llvm
make -j8
生成clang等在build/bin中。
参考文档 http://llvm.org/docs/GettingStarted.html
二、基本工具使用 (参考 http://llvm.org/docs/CommandGuide/index.html)
hello.c
clang hello.c -o hello //生成可执行文件hello
clang -O3 -emit-llvm hello.c -c -o hello.bc //生成llvmir 的bc格式文件
clang -O3 -emit-llvm hello.c -S -o hello.ll //生成llvmir的ll格式
llvm-dis < hello.bc |less //bc格式转换成ll格式显示
lli hello.bc //JIT运行
llc hello.bc -o hello.s //生成.s文件
clang 前端命令。
clang -cc1 -help //获取cc1的命令选项列表
clang -cc1 -ast-dump hello.c //dump AST
#include <stdio.h>
int main()
{
printf("hello world.\n");
return 0;
}
TranslationUnitDecl 0x6f15720 <<invalid sloc>>
|-TypedefDecl 0x6f15c00 <<invalid sloc>> __int128_t '__int128'
|-TypedefDecl 0x6f15c60 <<invalid sloc>> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x6f15fb0 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
|-FunctionDecl 0x6f16050 <hello.c:3:1, line:7:1> main 'int ()'
| `-CompoundStmt 0x6f42b40 <line:4:1, line:7:1>
| |-CallExpr 0x6f16390 <line:5:2, col:25> 'int'
| | |-ImplicitCastExpr 0x6f16378 <col:2> 'int (*)(const char *, ...)' <FunctionToPointerDecay>
| | | `-DeclRefExpr 0x6f162b8 <col:2> 'int (const char *, ...)' Function 0x6f16160 'printf' 'int (const char *, ...)'
| | `-ImplicitCastExpr 0x6f16400 <col:9> 'const char *' <BitCast>
| | `-ImplicitCastExpr 0x6f163e8 <col:9> 'char *' <ArrayToPointerDecay>
| | `-StringLiteral 0x6f16318 <col:9> 'char [14]' lvalue "hello world.\n"
| `-ReturnStmt 0x6f42b20 <line:6:5, col:12>
| `-IntegerLiteral 0x6f16418 <col:12> 'int' 0
`-FunctionDecl 0x6f16160 <line:5:2> printf 'int (const char *, ...)' extern
|-ParmVarDecl 0x6f16200 <<invalid sloc>> 'const char *'
`-FormatAttr 0x6f16260 <col:2> "printf" 1 2