【问题标题】:llvm dumping control flow graph to file inside a passllvm 将控制流图转储到文件中
【发布时间】:2013-05-08 15:51:16
【问题描述】:

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

【问题讨论】:

    标签: llvm control-flow-graph llvm-3.1


    【解决方案1】:

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

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

    viewCFG() 函数用于在新窗口中打印 CFG。要将 CFG 转储到文件中,您必须使用 CFGPrinter 传递,该传递可以由句柄 dot-cfg 调用。

    【讨论】:

    • 感谢您的回复。能否请您提供如何使用它的参考。我在该类中找不到执行相同操作的函数
    • CFGPrinter 是通行证,您可以通过opt 使用。
    • 但是我如何指定它应该在哪个程序点绘制图形呢?如果您能指出一些示例用法,那就太好了
    • 您可以在 CFGPrinter.cpp 中引入您自己的函数,该函数执行与 dot-cfg 传递相同的操作,然后像调用 viewCFG 一样调用它。
    • 顺便说一句,在通行证仍在处理 IR 时打印 CFG 的目的是什么?如果是在 pass 的最后,那为什么不发射 IR,然后使用opt 来获取 CFG?
    【解决方案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 通过隐式模板调用获得非常量。

    【讨论】:

    • 最好将此作为评论添加到相关答案中,而不是将其单独作为答案。
    • 是的,不幸的是我没有足够的排名:\
    【解决方案3】:

    您需要添加包括: #include &lt;llvm\Analysis\CFGPrinter.h&gt;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多