【问题标题】:LLVM unable to get a required analysisLLVM 无法获得所需的分析
【发布时间】: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&lt;LoopInfoWrapperPass&gt;() 被调用时,我得到这个断言错误:

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 中给出的方法相同,所以我不太确定这里出了什么问题。谁能指出我正确的方向?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    LoopInfoWrapperPass 派生自 FunctionPass。但是,您的 Example 类派生自 ModulePass。它适用于模块级别,因此您需要告诉LoopInfoWrapperPass 您要分析哪个函数。基本上,您可能希望循环模块中的每个函数f,并使用getAnalysis&lt;LoopInfoWrapperPass&gt;(f)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多