在LLVM框架中获取BasicBlock
的前导的最简单方法是什么?
我查看了DepthFirstIterator
和idf_iterator<BasicBlock*>
,但实际上我需要在控制流图上进行广度优先搜索。
我觉得这应该很简单,但从我在网上探索的文档或示例中并不明显。
答案 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_begin
和pred_end
的显式迭代要清晰得多。