如何在 Module Pass 中获取 loopinfo

How to get loopinfo in Module Pass

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

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

但是有错误,我觉得我的变量设置应该符合第一个函数定义,我应该怎么解决。

clang-12: /llvmtest/llvm/lib/IR/LegacyPassManager.cpp:1645: virtual std::tuple<llvm::Pass*, bool> {anonymous}::MPPassManager::getOnTheFlyPass(llvm::Pass*, llvm::AnalysisID, llvm::Function&): Assertion `FPP && “Unable to find on the fly pass”’ failed. PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.

旧版通行证管理器无法执行此操作。在旧版传递管理器中,每个传递只能从 same-scoped 传递中获取信息——模块从模块、函数从函数、循环从循环,加上允许函数传递从模块传递获取数据的异常。

使用新的传递管理器,您将创建一个 LoopAnalysisManager 并添加您想要的分析传递和 运行 它。参见 https://llvm.org/docs/NewPassManager.html#using-analyses

请注意,目前编写的大部分 LLVM 都是为了同时支持这两种传递管理器。如果你这样做,你需要编写你的传递与大多数 LLVM 的传递不同,你不能使用名称如“WrapperPass”的类型来支持旧的和新的传递管理器。