adu*_*adu 8 c++ llvm graph-traversal
BasicBlock
在LLVM框架中获取a的前身的最简单方法是什么?
我已经采取了看DepthFirstIterator
和idf_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)
通过在程序员手册中使用for-each循环,可以更简单地迭代前辈或后继者:
通过定义的例程,迭代块的前辈和后继块非常容易
llvm/IR/CFG.h
.只需使用这样的代码迭代BB的所有前辈:Run Code Online (Sandbox Code Playgroud)#include "llvm/IR/CFG.h" BasicBlock *BB = ...; for (BasicBlock *Pred : predecessors(BB)) { // ... }
同样,迭代后继者使用
successors
.
这比使用pred_begin
和使用显式迭代更清晰pred_end
.