llvm之旅第一站 - 编译及简单使用

转自:http://www.nagain.com/activity/article/4/html

llvm介绍前端


llvm(low level virtual machine)是一个开源编译器框架,最先的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他如今就任于Apple. Apple 目前也是llvm项目的主要赞助者之一。编程

llvm有一个表达形式很好的IR语言,高度模块化的结构,所以它能够做为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的代码生成功能。后端


传统编译器分三个阶段: bash

1.png



llvm也分三个阶段,可是设计上略微的有些区别:框架

2.png



不一样的前端后端使用统一的 LLVM IR ,若是须要支持新的编程语言或者新的设备平台,只须要开发对应的前端和后端便可。同时基于 LLVM  IR 咱们能够很快的开发本身的编程语言。less

目前llvm有不少的子项目,针对不一样的需求进行了深刻的扩展,具体参考llvm官方首页。编程语言

其中的Clang子项目实现了支持C/C++/Objective-C的优秀编译器前端,官方数据代表,在某些编译环境下,其编译速度要比gcc快三倍。ide


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


0.png


 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.png


 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.png



 4.编译源码 (Release)  

1
2
3
mkdir  build
cd  build
$ cmake -DCMAKE_BUILD_TYPE:String=Release .. /llvm/


5.png


6.png


也能够:

1
2
3
cd  llvm
$ . /configure
make


推荐使用cmake编译。



build目录下存放着编译后的文件: 


7.png



bin中存放着完整的工具链:


8.png




更详细的编译选项参考 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