【问题标题】:How to do DFS on call graph generated by llvm如何对 llvm 生成的调用图进行 DFS
【发布时间】:2017-07-01 13:50:25
【问题描述】:

我想对 llvm 生成的调用图进行 DFS(深度优先搜索)遍历,即我正在使用以下代码,但卡住了如何进一步进行?

bool runOnModule(Module &M) override
    {
        CallGraph cg = CallGraph(M);
         cg.dump();

         CallGraph::iterator beg =  cg.begin();

         CallGraph::iterator end = cg.end();

         return false;
    }

上面的代码只是转储callGraph。但我想从 main 方法开始对其进行 DFS 遍历。我使用 clang 作为前端。怎么做?

【问题讨论】:

    标签: llvm llvm-clang call-graph


    【解决方案1】:

    一旦你学会了使用 LLVM 图迭代器,深度优先遍历就非常简单了:

    #include <llvm/ADT/DepthFirstIterator.h>
    
    bool runOnModule(Module &M) override {
      CallGraph CG = CallGraph(M);
    
      for (auto IT = df_begin(&CG), EI = df_end(&CG); IT != EI; IT++) {
        if (Function *F = IT->getFunction()) {
          dbgs() << "Visiting function: " << F->getName() << "\n";
        }
      }
    
      return false;
    }
    

    df_iterator 中,您可以使用getPathLength()getPath(unsigned) 成员函数在访问期间检查您的位置,甚至可以使用skipChildren() 跳过特定的子树(但要小心与@987654329 混合使用@)。

    您也可以使用post-order traversalstrongly connected component iterator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2017-10-20
      • 2012-11-07
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多