【发布时间】:2015-07-23 14:58:51
【问题描述】:
我正在编写一个需要有关循环信息的通行证。因此,我将覆盖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);
当我运行这个 pass 时,两个调试语句以正确的顺序打印(然后是什么)但是当 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 中给出的方法相同,所以我不太确定这里出了什么问题。谁能指出我正确的方向?
【问题讨论】: