llvm 学习笔记一 编译llvm

一 、 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


int main()
{
printf("hello world.\n");
    return 0;
}


TranslationUnitDecl 0x6f15720 <>
|-TypedefDecl 0x6f15c00 <> __int128_t '__int128'
|-TypedefDecl 0x6f15c60 <> __uint128_t 'unsigned __int128'
|-TypedefDecl 0x6f15fb0 <> __builtin_va_list '__va_list_tag [1]'
|-FunctionDecl 0x6f16050 main 'int ()'
| `-CompoundStmt 0x6f42b40
|   |-CallExpr 0x6f16390 'int'
|   | |-ImplicitCastExpr 0x6f16378 'int (*)(const char *, ...)'
|   | | `-DeclRefExpr 0x6f162b8 'int (const char *, ...)' Function 0x6f16160 'printf' 'int (const char *, ...)'
|   | `-ImplicitCastExpr 0x6f16400 'const char *'
|   |   `-ImplicitCastExpr 0x6f163e8 'char *'
|   |     `-StringLiteral 0x6f16318 'char [14]' lvalue "hello world.\n"
|   `-ReturnStmt 0x6f42b20
|     `-IntegerLiteral 0x6f16418 'int' 0
`-FunctionDecl 0x6f16160 printf 'int (const char *, ...)' extern
  |-ParmVarDecl 0x6f16200 <> 'const char *'
  `-FormatAttr 0x6f16260 "printf" 1 2

你可能感兴趣的:(llvm)