Loops 如何在LLVM IR中识别不同的循环类型,例如while、for和do while?
我想在LLVM IR中识别while循环,我使用LoopInfoWrapperPass来获取loopInfoLoops 如何在LLVM IR中识别不同的循环类型,例如while、for和do while?,loops,llvm,llvm-ir,Loops,Llvm,Llvm Ir,我想在LLVM IR中识别while循环,我使用LoopInfoWrapperPass来获取loopInfo LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo() 我找不到相关的API来区分不同的循环类型。对于LLVM IR,如果您查看一下API,就会发现如下相关调用。因此,您可以这样做(例如,在llvm::Functionpass的runOn方法中): llvm::SmallVector工作列表; auto&LI=getAnalysis(CurFunc
LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo()
我找不到相关的API来区分不同的循环类型。对于LLVM IR,如果您查看一下API,就会发现如下相关调用。因此,您可以这样做(例如,在
llvm::Function
pass的runOn
方法中):
llvm::SmallVector工作列表;
auto&LI=getAnalysis(CurFunc).getLoopInfo();
std::for_each(LI.begin()、LI.end()、[&workList](llvm::Loop*e){workList.push_back(e);});
用于(自动*e:工作列表){
auto line=e->GetStartOC().getLine();
auto*scope=llvm::dyn_cast(e->getstartoc().getScope());
自动文件名=范围->获取文件名();
//在这里做事
}
现在,从源代码行中,您可以确定它是什么类型的循环。对于LLVM IR,如果您查看一下API,就会发现如下相关调用。因此,您可以这样做(例如,在
llvm::Function
pass的runOn
方法中):
llvm::SmallVector工作列表;
auto&LI=getAnalysis(CurFunc).getLoopInfo();
std::for_each(LI.begin()、LI.end()、[&workList](llvm::Loop*e){workList.push_back(e);});
用于(自动*e:工作列表){
auto line=e->GetStartOC().getLine();
auto*scope=llvm::dyn_cast(e->getstartoc().getScope());
自动文件名=范围->获取文件名();
//在这里做事
}
现在,从源代码行您可以确定它是什么类型的循环。LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo();在LLVM级别无法区分while循环和等效for循环,因为它们将生成完全相同的LLVM代码。@sepp2k非常感谢much@LingyunSITU:但是从基本块名可以确定什么是右循环,您知道如何做了吗<代码>LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo()不提供API来区分不同类型的循环。此外,LLVM IR代码不包含用于区分的指示符。LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo();在LLVM级别无法区分while循环和等效for循环,因为它们将生成完全相同的LLVM代码。@sepp2k非常感谢much@LingyunSITU:但是从基本块名可以确定什么是右循环,您知道如何做了吗<代码>LoopInfo&LoopInfo=getAnalysis(*F).getLoopInfo()不提供API来区分不同类型的循环。此外,LLVM IR代码不包含要区分的指示符。
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
}