如何在Module Pass中获取loopinfo

问题描述 投票:0回答:2

我想通过迭代 Module Pass 中的函数来获取每个函数中的循环信息。我的代码如下:

for (auto &F:M) {   
  if(!F.isDeclaration()){
  LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo();   
  } 
}

但是出现错误,我认为我的变量设置应该符合第一个函数定义,我该如何解决。

clang-12:/llvmtest/llvm/lib/IR/LegacyPassManager.cpp:1645:虚拟 std::元组 {匿名}::MPPassManager::getOnTheFlyPass(llvm::Pass*, llvm::AnalysisID、llvm::Function&):断言`FPP &&“无法找到 飞行通行证”失败了。请将错误报告提交至 https://bugs.llvm.org/ 并包含经过预处理的崩溃回溯 源代码和相关的运行脚本。

llvm llvm-ir
2个回答
2
投票

您无法使用旧版通行证管理器执行此操作。在旧版传递管理器中,每个传递只能从相同范围的传递中获取信息 - 模块来自模块、函数来自函数、循环来自循环,加上一个允许函数传递从模块传递获取数据的异常。

使用新的通道管理器,您可以创建一个 LoopAnalysisManager 并添加所需的分析通道并运行它。请参阅 https://llvm.org/docs/NewPassManager.html#using-analysiss .

请注意,目前大多数 LLVM 都是为了同时支持两个通道管理器而编写的。如果您这样做,您需要以与大多数 LLVM 的 pass 不同的方式编写 pass,您不能使用名称为“WrapperPass”的类型来支持旧版和新的 pass 管理器。


0
投票

在新的 pass 管理器中,在 Module pass 中,可以如下所示创建

FunctionAnalysisManager
实例,并且可以调用
getResult

// Inside the Module Pass
// m is of type llvm::Module
// mam is of type llvm::ModuleAnalysisManager

llvm::FunctionAnalysisManager &fam =  
   mam.getResult<FunctionAnalysisManagerModuleProxy>(m).getManager();

for (auto &f : m) {
  llvm::LoopInfo &li = fam.getResult<llvm::LoopAnalysis>(f);
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.