在LLVM中获取BasicBlock的前驱项

时间:2014-02-11 17:01:53

标签: c++ llvm graph-traversal

在LLVM框架中获取BasicBlock的前导的最简单方法是什么?

我查看了DepthFirstIteratoridf_iterator<BasicBlock*>,但实际上我需要在控制流图上进行广度优先搜索。

我觉得这应该很简单,但从我在网上探索的文档或示例中并不明显。

2 个答案:

答案 0 :(得分:18)

从文档中不清楚,但是basic block class支持预迭代器,它给前辈们提供了基本块。在C ++ 11风格中,可以循环遍历块的前驱,如下所示:

BasicBlock* B = ...
for (auto it = pred_begin(B), et = pred_end(B); it != et; ++it)
{
  BasicBlock* predecessor = *it;
  ...
}

答案 1 :(得分:6)

使用for-each循环in the Programmer's Manual显示了迭代前导或后继的更简单方法:

  

使用llvm/IR/CFG.h中定义的例程,对块的前驱和后继进行迭代非常容易。只需使用这样的代码迭代BB的所有前辈:

#include "llvm/IR/CFG.h"
BasicBlock *BB = ...; 
for (BasicBlock *Pred : predecessors(BB)) {
  // ...
}
     

同样,要迭代后继者,请使用successors

这比使用pred_beginpred_end的显式迭代要清晰得多。