LLVM 无法获得所需的分析
LLVM unable to get a required analysis
我正在编写一个需要有关循环的信息的通行证。因此,我覆盖 getAnalysisUsage(AnalysisUsage&)
让通行证管理员知道我的通行证取决于 LoopInfoWrapperPass
。但是,当我尝试获取该分析的结果时,LLVM 断言我的通过不需要该分析。这是我遇到问题的简单传递:
#include <llvm/Pass.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/Analysis/LoopInfo.h>
struct Example : public ModulePass {
static char ID;
Example() : ModulePass(ID) {}
bool runOnModule(Module& M) override {
errs() << "what\n";
LoopInfo& loops = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
loops.print(errs());
return false;
}
virtual void getAnalysisUsage(AnalysisUsage& AU) const override {
errs() << "here\n";
AU.addRequired<LoopInfoWrapperPass>();
}
};
char Example::ID = 0;
static RegisterPass<Example> X("example", "an example", false, false);
当我 运行 通过时,两个调试语句以正确的顺序打印(然后是什么)但是当调用 getAnalysis<LoopInfoWrapperPass>()
时,我得到这个断言错误:
opt: /home/matt/llvm/llvm/include/llvm/PassAnalysisSupport.h:211: AnalysisType& llvm::Pass::getAnalysisID(llvm::AnalysisID) const [with AnalysisType = llvm::LoopInfoWrapperPass; llvm::AnalysisID = const void*]: Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
这与 LLVM documentation on writing passes 中给出的方法相同,所以我不太确定这里出了什么问题。谁能指出我正确的方向?
LoopInfoWrapperPass
派生自 FunctionPass
。但是,您的 Example
class 来自 ModulePass
。它在模块级别工作,因此您需要告诉 LoopInfoWrapperPass
您要分析哪个函数。基本上,您可能希望循环模块中的每个函数 f
,并使用 getAnalysis<LoopInfoWrapperPass>(f)
.
或者,修复上述代码的最简单方法是将 ModulePass
替换为 FunctionPass
,将 runOnModule(Module& M)
替换为 runOnFunction(Function& F)
。然后,getAnalysis<LoopInfoWrapperPass>()
应该可以正常工作。
我正在编写一个需要有关循环的信息的通行证。因此,我覆盖 getAnalysisUsage(AnalysisUsage&)
让通行证管理员知道我的通行证取决于 LoopInfoWrapperPass
。但是,当我尝试获取该分析的结果时,LLVM 断言我的通过不需要该分析。这是我遇到问题的简单传递:
#include <llvm/Pass.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/Analysis/LoopInfo.h>
struct Example : public ModulePass {
static char ID;
Example() : ModulePass(ID) {}
bool runOnModule(Module& M) override {
errs() << "what\n";
LoopInfo& loops = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
loops.print(errs());
return false;
}
virtual void getAnalysisUsage(AnalysisUsage& AU) const override {
errs() << "here\n";
AU.addRequired<LoopInfoWrapperPass>();
}
};
char Example::ID = 0;
static RegisterPass<Example> X("example", "an example", false, false);
当我 运行 通过时,两个调试语句以正确的顺序打印(然后是什么)但是当调用 getAnalysis<LoopInfoWrapperPass>()
时,我得到这个断言错误:
opt: /home/matt/llvm/llvm/include/llvm/PassAnalysisSupport.h:211: AnalysisType& llvm::Pass::getAnalysisID(llvm::AnalysisID) const [with AnalysisType = llvm::LoopInfoWrapperPass; llvm::AnalysisID = const void*]: Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
这与 LLVM documentation on writing passes 中给出的方法相同,所以我不太确定这里出了什么问题。谁能指出我正确的方向?
LoopInfoWrapperPass
派生自 FunctionPass
。但是,您的 Example
class 来自 ModulePass
。它在模块级别工作,因此您需要告诉 LoopInfoWrapperPass
您要分析哪个函数。基本上,您可能希望循环模块中的每个函数 f
,并使用 getAnalysis<LoopInfoWrapperPass>(f)
.
或者,修复上述代码的最简单方法是将 ModulePass
替换为 FunctionPass
,将 runOnModule(Module& M)
替换为 runOnFunction(Function& F)
。然后,getAnalysis<LoopInfoWrapperPass>()
应该可以正常工作。