在 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