在LLVM中获取BasicBlock的前驱项

adu*_*adu 8 c++ llvm graph-traversal

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

我已经采取了看DepthFirstIteratoridf_iterator<BasicBlock*>,但实际上我需要做的控制流图的广度优先搜索.

我觉得这应该很容易,但是从我在网上探索的文档或示例中并不明显.

Bri*_*ian 18

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

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

  • BasicBlock文档在这里没有帮助.逻辑在于llvm/Support/CFG.h`.我在这里找到答案:http://llvm.org/docs/ProgrammersManual.html#iterating-over-predecessors-successors-of-blocks (8认同)

Riv*_*ver 6

通过在程序员手册中使用for-each循环,可以更简单地迭代前辈或后继者:

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

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

同样,迭代后继者使用successors.

这比使用pred_begin和使用显式迭代更清晰pred_end.