我正在写一个需要有关循环信息的传递。因此,我最重要的是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中给出的方法相同,所以我不太清楚这里出了什么问题。有人能指出我正确的方向吗?
答案 0 :(得分:3)
LoopInfoWrapperPass
源自FunctionPass
。但是,您的Example
课程来自ModulePass
。它适用于模块级别,因此您需要告诉LoopInfoWrapperPass
您要分析哪个功能。基本上,您可能希望循环模块中的每个函数f
,并使用getAnalysis<LoopInfoWrapperPass>(f)
。
或者,修复上述代码的最简单方法是将ModulePass
替换为FunctionPass
,将runOnModule(Module& M)
替换为runOnFunction(Function& F)
。然后,getAnalysis<LoopInfoWrapperPass>()
应该可以正常工作。