0.LLVM安装及工具链

安装

  • 官网下载页下载LLVM3.2版本的llvm3.2和clang3.2的source code压缩包
  • 解压后安装:./configure,make,sudo make install

    什么是LLVM

    llvm是low level virtual machine的简称,其实是一个编译器框架。llvm随着这个项目的不断的发展,已经无法完全的代表这个项目了,只是这种叫法一直延续下来。

llvm是一个开源的项目。它最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。

llvm的主要作用是它可以作为多种语言的后端,它可以提供可编程语言无关的优化和针对很多种CPU的代码生成功能。此外llvm目前已经不仅仅是个编程框架,它目前还包含了很多的子项目,比如最具盛名的clang.

llvm的优点是开源,有一个表达形式很好的IR语言,模块化作的特别好。

llvm这个框架目前已经有基于这个框架的大量的工具可以使用。

LLVM Command Guide

  • llvm-as 将人类可读的 .ll 文件汇编成字节代码

  • llvm-dis 将字节代码文件反编成人类可读的 .ll 文件

  • opt 在一个字节代码文件上运行一系列的 LLVM 到 LLVM 的优化

  • llc 为一个字节代码文件生成本机器代码

  • lli 直接运行使用 JIT 编译器或者解释器编译成字节代码的程序(运行.bc文件或.ll文件)

  • llvm-link 将几个字节代码文件连接成一个

  • llvm-ar 打包字节代码文件

  • llvm-lib LLVM lib.exe compatible library tool

  • llvm-nm 在 打印出LLVM中间格式或者object文件的符号表(2014年5月14日更新)

  • llvm-config 打印出配置时 LLVM 编译选项、库、等等

  • llvm-diff 比较两个模块的结构

llvm-ranlib 为 llvm-ar 打包的文件创建索引

llvm-prof 将 ‘llvmprof.out’ raw 数据格式化成人类可读的报告

llvm-ld 带有可装载的运行时优化支持的通用目标连接器

llvmc 一个通用的可定制的编译器驱动

bugpoint 自动案例测试减速器

llvm-extract 从 LLVM 字节代码文件中解压出一个函数

llvm-bcanalyzer 字节代码分析器 (分析二进制编码本身,而不是它代表的程序)

FileCheck 灵活的文件验证器,广泛的被测试工具利用

tblgen 目标描述阅读器和生成器

lit LLVM 集成测试器,用于运行测试

AddressSanitizer 一个快速内存错误探测器

LLVM工具链使用

Linuc GCC常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
gcc test.c -o test                        #直接从源代码生成可执行文件
实际流程:.c-->.i-->.s-->.o-->.elf

gcc -E test.c -o test.i 或 gcc -E test.c(不生成test.i,只在终端显示) #预处理Preprocessing(加入包含的库,生成中间文件.i)

gcc -S test.i -o test.s 或 gcc -S test.i(默认生成test.s) #编译为汇编Compilation(编译器生成汇编代码.s)

gcc -c test.s -o test.o 或 gcc -c test.s(默认生成test.o) #汇编Assembly(汇编器将汇编代码翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序格式,并保存在.o文件中)

gcc test.o -o test 或 gcc test.o(默认生成test.o) #链接Linking(将目标文件链接成可执行文件)

gcc test.i/test.s/test.o -o test #均生成可执行文件test.elf

gcc -O1 test.c -o test

#使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
vim hello.c

clang hello.c -o hello #生成可执行文件

./hello

#或者

clang -O3 -emit-llvm hello.c -c -o hello.bc #生成二进制中间表示语言.bc文件

lli hello.bc

#或者:
clang -03 -emit-llvm test.c -S -o test.ll
#生成人类可读的 .ll 文件

lli hello.ll

llvm-dis hello.bc -o hello.ll #.bc文件反汇编成.ll文件

或:llvm-dis < hello.bc (终端显示但不生成.ll文件)

llvm-dis < hello.bc | less (less打开但不生成.ll文件)

llvm-dis hello.bc (生成默认的hello.ll文件)

llvm-as hello.ll -o hello.bc #.ll文件汇编成.bc文件

llc hello.bc -o hello.s #.bc或.ll文件生成汇编代码.s文件

llc hello.ll -o hello.s

gcc -c hello.s -o hello.o

gcc hello.o -o hello

实际流程:.c-->.ll/.bc-->.s-->.o-->.elf

#.ll文件类似与汇编文件.s,而.bc文件类似于目标文件.o

参考资料

LLVM官网

LLVM零基础学习

LLVM每日谈