llvm将控制流图转储到过程中的文件
我想在我的一个过程中在llvm中构建一个控制流图。我目前使用以下内容来显示CFGllvm将控制流图转储到过程中的文件,llvm,control-flow-graph,llvm-3.1,Llvm,Control Flow Graph,Llvm 3.1,我想在我的一个过程中在llvm中构建一个控制流图。我目前使用以下内容来显示CFG block->getParent()->viewCFG(); //block is a basic block 问题是它会弹出一个窗口。我只想在特定的程序点转储cfg,作为一个点文件(或者jpg,如果可能的话),而不是显示在窗口中。我该怎么做呢?我正在使用LLVM3.1 注意:在该程序点之前,我正在修改过程中的cfg。因此,我不能使用opt-view cfg 更新: 多亏了米什,我才能够用这个画出图表
block->getParent()->viewCFG(); //block is a basic block
问题是它会弹出一个窗口。我只想在特定的程序点转储cfg,作为一个点文件(或者jpg,如果可能的话),而不是显示在窗口中。我该怎么做呢?我正在使用LLVM3.1
注意:在该程序点之前,我正在修改过程中的cfg。因此,我不能使用opt-view cfg
更新:
多亏了米什,我才能够用这个画出图表
WriteGraph(文件,(const llvm::Function*)&fun,true,“test”)//我也厌倦了false
如图所示。但是节点是空的。如何显示节点的内容查看一下,阅读
viewCFG()
函数前面的注释
viewCFG()
函数用于在新窗口中打印CFG。要将CFG转储到文件中,您必须使用CFGPrinter
pass,该过程可由句柄dot CFG
调用,您需要添加以下内容:
#包括
它内部有getEdgeSourceLabel实现,可提供正确的节点标签。
同时,请确保没有包含
文件,因为默认情况下该文件提供空标签。让我在Shubbotin的答案中添加一些内容。
问题是关于
DOTGraphTraits<const Function*>
dotgraphtrits
由CFGPrinter提供
在我的情况下,我不得不这样使用电话:
WriteGraph<const llvm::Function*>(...)
WriteGraph(…)
让它工作
函数模板定义如下所示:
template<typename GraphType>
raw_ostream &WriteGraph(raw_ostream &O, const GraphType &G,
bool ShortNames = false,
const Twine &Title = "")
模板
原始图形和书写图形(原始图形和O、常量图形类型和G、,
bool ShortNames=false,
const THINE&Title=“”)
因此GraphType通过隐式模板调用获得非常量。感谢您的回复。请提供如何使用它的参考资料。我无法在该类中找到一个函数来执行相同的操作
CFGPrinter
是一个过程,您可以通过opt
使用它。但是我如何指定它应该在哪个程序点绘制图形?如果您能指出一些示例用法,那就太好了。您可以在CFGPrinter.cpp中引入您自己的函数,它执行与dot cfg
过程相同的操作,然后在调用viewCFG
时调用它。顺便问一句,当过程仍在处理IR时,打印cfg有什么用途?如果是在考试结束时,为什么不发出IR,然后使用opt
获取CFG?最好将此作为注释添加到相关答案中,而不是将其本身作为答案。是的,不幸的是,我没有足够的排名:\