我想在LLVM IR中识别while循环,我使用LoopInfoWrapperPass来获取loopInfo。
LoopInfo& LoopInfo = getAnalysis(* F).getLoopInfo();
我找不到相关的API来区分不同的循环类型。
答案 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
}
现在,从源代码行开始,您可以确定它是什么类型的循环。