【问题标题】:Finding the list of successors of a basic block in LLVM在 LLVM 中查找基本块的后继者列表
【发布时间】:2016-04-18 19:56:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果您愿意,可以稍微少一些代码:

    #include "llvm/IR/CFG.h"
    BasicBlock *BB = ...;
    
    for (BasicBlock *Pred : predecessors(BB)) {
      // ...
    }
    

    sn-p 取自LLVM's Programmers Handbook

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多