5

我想在我的一张通行证中在 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。但是节点是空白的。如何显示节点的内容

4

3 回答 3

3

看看这个,阅读viewCFG()函数前的评论。

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

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

于 2013-05-08T16:04:38.017 回答
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 通过隐式模板调用获得非常量。

于 2015-05-15T10:02:18.180 回答
1

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

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

于 2015-04-08T17:16:35.947 回答