10

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

我看过DepthFirstIteratorand idf_iterator<BasicBlock*>,但实际上我需要对控制流图进行广度优先搜索。

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

4

2 回答 2

20

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

BasicBlock* B = ...
for (auto it = pred_begin(B), et = pred_end(B); it != et; ++it)
{
  BasicBlock* predecessor = *it;
  ...
}
于 2014-02-11T17:28:02.157 回答
8

使用程序员手册中的 for-each 循环显示了一种更简单的迭代前任或后继者的方法:

使用定义在llvm/IR/CFG.h. 只需使用这样的代码来迭代 BB 的所有前辈:

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

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

这比使用pred_begin和使用显式迭代要干净得多pred_end

于 2018-03-20T20:16:50.260 回答