我想在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作为前端。怎么做?
答案 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 traversal或strongly connected component iterator。