clang 和 llvm 编译命令

这时以一些简单的示例程序说明 clang 和 llvm 的一些编译命令的用法。 test.c 的内 容为:

1
2
3
4
5
6
7
int main(int argc, char *argv[])
{

int a = 1;
int b = 2;
a += b;
return 0;
}

以下 IR 表示 llvm IR ,bitcode 表示 llvm bitcode

由 test.c 生成 IR

使用命令

1
clang -emit-llvm -S test.c -o test.ll

1
clang -cc1 -emit-llvm test.c -o test-cc1.ll

虽然产生的文件细节有一些差别,但是整体是一样的。

由 IR 生成 bitcode

命令为:

1
llvm-as-3.8 test.ll -o test.bc

生成的 test.bc 是二进制文件。

由 IR 或 bitcode 生成 汇编文件

此过程生成目标平台的汇编代码,输入文件可以是 .bc 类型的,也可以是 .ll 类型的。

1
llc-3.8 test.bc -o test.bc.s
llc-3.8 test.ll -o test.ll.s

由 bitcode 反编译为 IR

由命令 llvm-dis 完成:

1
llvm-dis-3.8 test.bc -o test.bc.ll

比较生成的 test.bc.ll 文件和由 test.c 直接生成的 test.ll 文件可以发现其内容 完全一样。也可能是因为源文件太简单,如果更复杂的话不知道是不是还能这样。

运行 bitcode

bitcode 可以直接由命令运行,和 Java 字节码类似,命令为:

1
lli-3.8 test.bc

多文件链接

两个源文件:

1
2
3
4
5
6
/* test1.c */
int func(int a)
{

a = a * 2;
return a;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
/* test2.c */
#include <stdio.h>

int func(int a);

int main(void)
{

int num = 5;
num = func(num);
printf("number is %d\n", num);

return 0;
}

使用如下命令编译链接,整个过程全部由 clang 和 llvm 完成,最后生成 bitcode。

1
clang -emit-llvm -S test1.c -o test1.ll
clang -emit-llvm -S test2.c -o test2.ll
llvm-as test1.ll -o test1.bc
llvm-as test2.ll -o test2.bc
llvm-link test1.bc test2.bc -o test.bc

clang 的一些参数

-E 预处理
-cc1 只运行编译器前端
-ast-dump 输出 AST

查看 AST 可以运行以下命令:

1
clang -cc1 -ast-dump test.c

References

  • LLVM Cookbook
Last Updated 2018-05-26 Sat 14:12.
Render by hexo-renderer-org with Emacs 25.2.2 (Org mode 9.1.13)
0%