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>() 应该可以正常工作。