联系我们:010-58426662

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

2015-04-01 15:44:18

©娜迦 charme版权所有

版权声明:未经许可,请勿转载

llvm介绍


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

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


传统编译器分三个阶段: 

1.png



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

2.png



不同的前端后端使用统一的 LLVM IR ,如果需要支持新的编程语言或者新的设备平台,只需要开发对应的前端和后端即可。同时基于 LLVM  IR 我们可以很快的开发自己的编程语言。

目前llvm有很多的子项目,针对不同的需求进行了深入的扩展,具体参考llvm官方首页。

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


llvm下载及编译


后续的系列文章我们都将以Clang作为前端,Mac系统上进行开发。(Linux 及Window系统上的下载及编译过程与此相同)


1. 迁出LLVM 

$ cd where-you-want-llvm-to-live
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm


0.png


 2. 迁出Clang 

$ cd where-you-want-llvm-to-live
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang


3.png


 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)  

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


5.png


6.png


也可以:

$ 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

#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 Systemhttp://llvm.org/docs/GettingStarted.html

LLVM 官网http://llvm.org

Clang 官网http://clang.llvm.org


标签: llvm clang

热度  48836 回应  5 收藏  0

  • shiyi
    llvm 源码下载不成功,一直报错,svn: E120108: Error running context: The server unexpectedly closed the connection.
    回应 2018-03-07 14:40:22
  • 明儿
    @Rover12421 要是make的时候出问题了怎么解决呢? [ 78%] Building CXX object tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/Registry.cpp.o c++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions. tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/build.make:134: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/Registry.cpp.o' failed make[2]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/Registry.cpp.o] Error 4 CMakeFiles/Makefile2:25566: recipe for target 'tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/all' failed make[1]: *** [tools/clang/lib/ASTMatchers/Dynamic/CMakeFiles/clangDynamicASTMatchers.dir/all] Error 2 Makefile:149: recipe for target 'all' failed make: *** [all] Error 2 这样的错
    回应 2017-11-08 12:53:07
  • Rover12421
    4.编译源码 (Release) ``` $ mkdir build $ cd build $ cmake -DCMAKE_BUILD_TYPE:String=Release ../llvm/ ``` 后面少了一步`make`
    回应 2015-05-18 15:00:24
  • 玩命
    我还以为我要写第一篇,被你占先了。
    回应 2015-04-16 16:59:04
llvm之旅第一站 - 编译及简单使用

作者信息

  • charme
  • 2015-03-30日入驻

收藏 0

文章 7

进入个人主页

娜迦,守护10亿移动用户安全! 免费体验