BasicBlock
在 LLVM 框架中获取 a 的前辈最简单的方法是什么?
我看过DepthFirstIterator
and idf_iterator<BasicBlock*>
,但实际上我需要对控制流图进行广度优先搜索。
我觉得这应该很容易,但是从文档或我一直在网上探索的示例中并不明显。
BasicBlock
在 LLVM 框架中获取 a 的前辈最简单的方法是什么?
我看过DepthFirstIterator
and idf_iterator<BasicBlock*>
,但实际上我需要对控制流图进行广度优先搜索。
我觉得这应该很容易,但是从文档或我一直在网上探索的示例中并不明显。
从文档中不清楚,但基本块类支持 pred 迭代器,它将前辈提供给基本块。在 C++11 风格中,可以循环遍历块的前辈,如下所示:
BasicBlock* B = ...
for (auto it = pred_begin(B), et = pred_end(B); it != et; ++it)
{
BasicBlock* predecessor = *it;
...
}
使用程序员手册中的 for-each 循环显示了一种更简单的迭代前任或后继者的方法:
使用定义在
llvm/IR/CFG.h
. 只需使用这样的代码来迭代 BB 的所有前辈:#include "llvm/IR/CFG.h" BasicBlock *BB = ...; for (BasicBlock *Pred : predecessors(BB)) { // ... }
同样,要迭代后继者,请使用
successors
.
这比使用pred_begin
和使用显式迭代要干净得多pred_end
。