如何在llvm生成的调用图上执行DFS

时间:2017-07-01 13:50:25

标签: llvm llvm-clang call-graph

我想在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作为前端。怎么做?

1 个答案:

答案 0 :(得分:0)

一旦学习使用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()跳过特定的子树(但是小心将其与operator++混合)。

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