一、基本文件格式
参考博客:llvm 文件转换图
.c
文件,C语言源代码。.bc
文件,llvm字节码的二进制形式(binary code)。.ll
文件,llvm字节码的文本形式。.s
文件,机器汇编代码。.out
文件,可执行的二进制文件。
一般 C 语言编译器( gcc 或 clang )执行后直接将源码.c
变为可执行二进制文件.out
。
clang 是 llvm 的前端,若我们需要得到 llvm 字节码,之后再对字节码做一些操作,可以用 clang -emit-llvm -c
指令,得到 .bc
文件。
若需要将字节码转为文本,使用 llvm-dis
将 .bc
转为 .ll
;相反的操作是 llvm-as
。
llc
指令将字节码转为汇编代码,llc 是 llvm 的后端,所谓后端指的是与某种指令集相关的部分,如 ARM、x86 等。
二、生成 CFG
方法一
clang -c -emit-llvm xxx.c -o xxx.bc
opt --view-cfg xxx.bc
这种方式产生的 dot 文件在 /tmp/…dot 文件夹下。
方法二
llvm-dis xxx.bc
opt -dot-cfg xxx.ll
这种方式产生的 dot 文件在当前目录下,但为隐藏文件,需要 ls -a
展示,如 .main.dot
。
以上方式产生的都是内部 CFG(intra CFG)。
三、生成 png
dot cfg.dot -Tpng -o cfg.png