LLVM中,使用LLC生成可视化SelectionDAG

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!!!!第一个博客,没钱的点个赞!吐舌头

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页