llvm将控制流图转储到pass中的文件

时间:2013-05-08 15:51:16

标签: llvm control-flow-graph llvm-3.1

我想在我的一个传递中在llvm中构建一个控制流图图。我目前使用以下内容来展示CFG

block->getParent()->viewCFG(); //block is a basic block

问题是它会弹出一个窗口。我只想将cfg转储到该特定程序点,作为点文件(如果可能的话,还是jpg),不要显示在窗口中。我怎么能这样做?我正在使用llvm 3.1。

注意:我正在修改我的传递中的cfg,在该程序点之前。因此我无法使用opt -view-cfg

更新

感谢Mishr,我能够用这个

绘制图表

WriteGraph(File, (const llvm::Function*) &fun, true, "test"); //I have also tired with false

显示了CFG。但节点是空白的。如何显示节点的内容

3 个答案:

答案 0 :(得分:3)

看看这个,请阅读viewCFG()功能之前的评论。

http://llvm.org/docs/doxygen/html/CFGPrinter_8cpp_source.html

viewCFG()功能用于在新窗口中打印CFG。要将CFG转储到文件中,您必须使用CFGPrinter传递,该传递可以由句柄dot-cfg调用。

答案 1 :(得分:2)

让我在ssubbotin的回答中添加一些内容。 问题是关于

DOTGraphTraits<const Function*>

由CFGPrinter提供。

在我的情况下,我不得不使用这样的电话:

WriteGraph<const llvm::Function*>(...)

让它发挥作用。

功能模板定义如下:

template<typename GraphType>
raw_ostream &WriteGraph(raw_ostream &O, const GraphType &G,
                        bool ShortNames = false,
                        const Twine &Title = "")

因此GraphType通过隐式模板调用获得非const。

答案 2 :(得分:1)

您需要添加include: #include <llvm\Analysis\CFGPrinter.h>

它内部有getEdgeSourceLabel实现,提供正确的节点标签。 同时,请确保包含<llvm\Support\CFG.h>文件,因为它默认提供空标签。