2013-05-08 14 views
5

我想在我的一个合格文件中在llvm中创建控制流程图。我目前使用以下显示CFGllvm将控制流程图转储到合格文件中

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

看看这个,看看viewCFG()函数之前的注释。

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

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

+0

谢谢你的回复。请给出一个关于如何使用它的参考。我无法在该课程中找到同样的功能 – simpleuser 2013-05-08 16:20:57

+0

'CFGPrinter'是一个通行证,您可以通过'opt'使用它。 – shrm 2013-05-09 11:11:56

+0

但是,如何指定绘制图形的程序点?如果你可以指出一些示例用法,那将是非常好的 – simpleuser 2013-05-09 13:07:48

1

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

它getEdgeSourceLabel里面执行提供正确的节点标签。 同时,请确保你不要<llvm\Support\CFG.h>文件,因为它默认提供空标签。

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与隐含调用模板。

+1

最好将此添加为相关答案的评论,而不是单独作出回答。 – SuperBiasedMan 2015-05-15 10:12:33

+0

是的,不幸的是,我没有足够的排名:\ – wvoquine 2015-05-15 12:44:33