这时以一些简单的示例程序说明 clang 和 llvm 的一些编译命令的用法。 test.c
的内
容为:
1 | int main(int argc, char *argv[]) |
以下 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 | /* test1.c */ |
1 | /* test2.c */ |
使用如下命令编译链接,整个过程全部由 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