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

Loops 如何在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

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


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
    }