如何对 llvm 生成的调用图进行 DFS

How to do DFS on call graph generated by llvm

我想在 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 图迭代器后,深度优先遍历将非常简单:

#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 traversal or a strongly connected component iterator