我想在我的一个传递中在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。但节点是空白的。如何显示节点的内容
答案 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>
文件,因为它默认提供空标签。