LLVM静态编译器(LLVM Static Compiler,llc)是一个将DAG内容可视化的优秀工具。使用llc的命令行选项,在特定的执行阶段之前或之后显示SelectionDAG。但是关于如何生成可视化的SelectionDAG的教程却非常少,官网上也只是给出了几个命令参数,并没有给出详细的教程。我通过自己摸索,最后成功做出了DAG的可视化,想着记录在自己的博客里,供自己参考,也供别人参考。
操作系统:Ubuntu
llvm:debug版本(我看网上有人说只有debug版本才能够使用可视化的命令,其他release版本没有尝试过)默认前提已经装好了llvm,就不再讲述llvm编译过程。
步骤:
1.安装graphviz,这个软件用来可视化,生成png图片
(1)只需要在Ubuntu系统命令行中直接使用命令安装即可:sudo apt-get install graphviz
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
您可能需要运行“apt-get -f install”来纠正下列错误:
下列软件包有未满足的依赖关系:
graphviz : 依赖: libcdt5 但是它将不会被安装
依赖: libcgraph6 但是它将不会被安装
依赖: libgvc6 但是它将不会被安装
依赖: libgvpr2 但是它将不会被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
(2)可能会安装时报错需要安装一些依赖关系(视每个人情况而定,可能你之前的某些操作已经安装好了这些依赖),只需要按照提示进行安装即可: sudo apt-get -f install
然后就可以安装成功。
(3)可以写一个小例子测试是否安装成功
创建文件dag.dot,内容如下:
digraph G {
rankdir=LR;
a -> b;
b -> c;
subgraph x{
rank=same;
b->d;
}
subgraph y{
//rank = same;
d->e;
}
subgraph z{
rank=same;
c->e;
}
}
(4)画图命令
执行命令:dot test.dot -Tpng -o test.png
如果找不到dot命令,仍需要下载一些开发包
sudo apt-get install graphviz-dev graphviz-doc libgraphviz-dev
(5)查看绘图结果
2.DAG可视化
(1)C++代码
首先将cpp代码用clang编译,产生.ll文件即LLVM IR
示例代码mul.cpp:
long imul(long a, long b) {
return a * b;
}
主要实现了一个乘法功能
使用命令:clang -S -emit-llvm mul.cpp
会产生mul.ll文件,其内容如下所示:
; ModuleID = 'mul.cpp'
source_filename = "mul.cpp"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define i64 @_Z4imulll(i64, i64) #0 {
%3 = alloca i64, align 8
%4 = alloca i64, align 8
store i64 %0, i64* %3, align 8
store i64 %1, i64* %4, align 8
%5 = load i64, i64* %3, align 8
%6 = load i64, i64* %4, align 8
%7 = mul nsw i64 %5, %6
ret i64 %7
}
attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.9.0 (tags/RELEASE_390/final)"}
(2)生成dot
使用命令: llc -view-dag-combine1-dags mul.ll
Writing '/tmp/dag._Z4imulll-c00dbe.dot'... done.
Trying 'xdg-open' program... Remember to erase graph file: /tmp/dag._Z4imulll-c00dbe.dot
然后根据提示找到 /tmp/dag._Z4imulll-c00dbe.dot
(3)可视化
转到/tmp目录下,使用命令将.dot文件转成png图片
dot dag._Z4imulll-d35333.dot -Tpng -o dag.png
最后得到可视化的DAG:
That's All!!!!第一个博客,没钱的点个赞!