查找LLVM中基本块的后继列表

时间:2016-01-13 17:46:27

标签: compiler-construction llvm compiler-optimization llvm-clang

在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 
    }
}

2 个答案:

答案 0 :(得分:3)

如果愿意的话,代码少一些:

#include "llvm/IR/CFG.h"
BasicBlock *BB = ...;

for (BasicBlock *Pred : predecessors(BB)) {
  // ...
}

摘录摘自LLVM's Programmers Handbook

答案 1 :(得分:2)

我同意BasicBlock没有直接属性。相反,您可以get the terminator instruction基本块,然后遍历其successors

或者,基于读取BasicBlock类的source code,您可以从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)