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

llvm将控制流图转储到过程中的文件,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 更新: 多亏了米什,我才能够用这个画出图表

我想在我的一个过程中在llvm中构建一个控制流图。我目前使用以下内容来显示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?最好将此作为注释添加到相关答案中,而不是将其本身作为答案。是的,不幸的是,我没有足够的排名:\