在 LLVM 中查找基本块的后继列表
Finding the list of successors of a basic block in LLVM
在 LLVM 中,BasicBlock 具有属性 getSinglePredecessor() 和 getSingleSuccessor(),但我需要获取基本块的后继者和前任者的完整列表。我怎样才能在 llvm 中实现这一点?
我的密码是
virtual bool runOnFunction(Function &F) {
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
//Here I need to get the predecessor and successsor of the basic block b
}
}
我同意没有直接 属性 到 BasicBlock。相反,您可以 get the terminator instruction of the basic block and then iterate through its successors.
或者,根据将 source code 读取到 BasicBlock class,您可以从 BasicBlock 实例创建一个 pred_iterator 和 succ_iterator。例如:
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b)
{
BasicBlock* bb = dyn_cast<BasicBlock>(&*b);
for (pred_iterator pit = pred_begin(bb), pet = pred_end(bb); pit != pet; ++pit)
如果您愿意,可以稍微减少代码:
#include "llvm/IR/CFG.h"
BasicBlock *BB = ...;
for (BasicBlock *Pred : predecessors(BB)) {
// ...
}
该片段摘自 LLVM's Programmers Handbook。
在 LLVM 中,BasicBlock 具有属性 getSinglePredecessor() 和 getSingleSuccessor(),但我需要获取基本块的后继者和前任者的完整列表。我怎样才能在 llvm 中实现这一点?
我的密码是
virtual bool runOnFunction(Function &F) {
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
//Here I need to get the predecessor and successsor of the basic block b
}
}
我同意没有直接 属性 到 BasicBlock。相反,您可以 get the terminator instruction of the basic block and then iterate through its successors.
或者,根据将 source code 读取到 BasicBlock class,您可以从 BasicBlock 实例创建一个 pred_iterator 和 succ_iterator。例如:
for (Function::iterator b = F.begin(), be = F.end(); b != be; ++b)
{
BasicBlock* bb = dyn_cast<BasicBlock>(&*b);
for (pred_iterator pit = pred_begin(bb), pet = pred_end(bb); pit != pet; ++pit)
如果您愿意,可以稍微减少代码:
#include "llvm/IR/CFG.h"
BasicBlock *BB = ...;
for (BasicBlock *Pred : predecessors(BB)) {
// ...
}
该片段摘自 LLVM's Programmers Handbook。