LLVM无法获得所需的分析

时间:2015-07-23 14:58:51

标签: llvm llvm-ir

我正在写一个需要有关循环信息的传递。因此,我最重要的是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中给出的方法相同,所以我不太清楚这里出了什么问题。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

LoopInfoWrapperPass源自FunctionPass。但是,您的Example课程来自ModulePass。它适用于模块级别,因此您需要告诉LoopInfoWrapperPass您要分析哪个功能。基本上,您可能希望循环模块中的每个函数f,并使用getAnalysis<LoopInfoWrapperPass>(f)

或者,修复上述代码的最简单方法是将ModulePass替换为FunctionPass,将runOnModule(Module& M)替换为runOnFunction(Function& F)。然后,getAnalysis<LoopInfoWrapperPass>()应该可以正常工作。