转自:http://www.nagain.com/activity/article/4/
llvm介绍
llvm(low level virtual machine)是一个开源编译器框架,最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。
llvm有一个表达形式很好的IR语言,高度模块化的结构,因此它可以作为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的代码生成功能。
传统编译器分三个阶段:
llvm也分三个阶段,但是设计上略微的有些区别:
不同的前端后端使用统一的 LLVM IR ,如果需要支持新的编程语言或者新的设备平台,只需要开发对应的前端和后端即可。同时基于 LLVM IR 我们可以很快的开发自己的编程语言。
目前llvm有很多的子项目,针对不同的需求进行了深入的扩展,具体参考llvm官方首页。
其中的Clang子项目实现了支持C/C++/Objective-C的优秀编译器前端,官方数据表明,在某些编译环境下,其编译速度要比gcc快三倍。
llvm下载及编译
后续的系列文章我们都将以Clang作为前端,Mac系统上进行开发。(Linux 及Window系统上的下载及编译过程与此相同)
1. 迁出LLVM
1
2
|
$
cd
where-you-want-llvm-to-live
$ svn co http:
//llvm
.org
/svn/llvm-project/llvm/trunk
llvm
|
2. 迁出Clang
1
2
3
|
$
cd
where-you-want-llvm-to-live
$
cd
llvm
/tools
$ svn co http:
//llvm
.org
/svn/llvm-project/cfe/trunk
clang
|
3. 迁出编译运行库
1
2
3
|
$
cd
where-you-want-llvm-to-live
$
cd
llvm
/projects
$ svn co http:
//llvm
.org
/svn/llvm-project/compiler-rt/trunk
compiler-rt
|
4.编译源码 (Release)
1
2
3
|
$
mkdir
build
$
cd
build
$ cmake -DCMAKE_BUILD_TYPE:String=Release ..
/llvm/
|
也可以:
1
2
3
|
$
cd
llvm
$ .
/configure
$
make
|
推荐使用cmake编译。
build目录下存放着编译后的文件:
bin中存放着完整的工具链:
更详细的编译选项参考 Getting Started with the LLVM System
编译链中工具的具体说明参考 LLVM Command Guide
工具链使用
编译完成后,build/bin目录下存放了完整的编译工具链,使用这些工具就可以完成源码的编译。
创建简单的c语言源码文件test.c
1
2
3
4
5
|
#include <stdio.h>
int
main() {
printf
(
"hello llvm\n"
);
return
0;
}
|
编译可执行文件
./clang test.c -o test
生成LLVM 字节码文件
./clang -O3 -emit-llvm test.c -c -o test.bc
生成LLVM 可视化字节码文件
./clang -O3 -emit-llvm test.c -S -o test.ll
运行可执行文件
./test
运行字节码文件
./lli test.bc
反汇编字节码文件
./llvm-dis < test.bc | less
编译字节码为汇编文件
./llc test.bc -o test.s
参考文献:
Getting Started with the LLVM System - http://llvm.org/docs/GettingStarted.html
LLVM 官网 - http://llvm.org
Clang 官网 - http://clang.llvm.org