如何在LLVM IR中识别不同的循环类型,例如while,for和do-while?

时间:2017-11-06 16:11:06

标签: loops llvm llvm-ir

我想在LLVM IR中识别while循环,我使用LoopInfoWrapperPass来获取loopInfo。

  

LoopInfo& LoopInfo = getAnalysis(* F).getLoopInfo();

我找不到相关的API来区分不同的循环类型。

1 个答案:

答案 0 :(得分:0)

对于LLVM IR,如果您查看Loop API,则会收到getStartLoc之类的相关调用。所以你可以这样做(例如在runOn传递的llvm::Function方法内):

llvm::SmallVector<llvm::Loop *> workList;
auto &LI = getAnalysis<llvm::LoopInfoWrapperPass>(CurFunc).getLoopInfo();

std::for_each(LI.begin(), LI.end(), [&workList](llvm::Loop *e) { workList.push_back(e); });

for(auto *e : workList) {
      auto line = e->getStartLoc().getLine();
      auto *scope = llvm::dyn_cast<llvm::DIScope>(e->getStartLoc().getScope());
      auto filename = scope->getFilename();

      // do stuff here
    }

现在,从源代码行开始,您可以确定它是什么类型的循环。