【问题标题】:Iterating over the BasicBlocks of loops of function in LLVM IR in module pass在模块传递中迭代 LLVM IR 中函数循环的 BasicBlocks
【发布时间】:2017-10-24 04:47:00
【问题描述】:

有谁知道如何在模块传递中迭代基本的函数循环。我正在尝试:

bool runOnModule(Module &M) override
{
    for(Module::iterator f = M.begin(), fend = M.end(); f != fend; ++f)
    {
            LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
            for(Loop *L : LI)
            {
                for(BasicBlock *BB : L->getBlocks())
                {
                    dbgs() << "basicb name: "<< BB->getName() <<"\n";
                }
            }
     }
     return true;
}

总是报错

opt: /home/anurag/polly/llvm/include/llvm/PassAnalysisSupport.h:235:    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.

【问题讨论】:

  • 您是否已将 LoopInfoWrapperPass 添加到您的 getAnalysisUsage() 例程中?
  • 是的,我已经添加了。
  • @Brian 我试过这样:void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired(); }

标签: llvm llvm-ir llvm-c++-api


【解决方案1】:

此代码需要两个更新。第一个也在this question 中提到,当从模块传递请求循环信息时,您需要指定函数(添加迭代器访问):

LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>(*f).getLoopInfo();

第二个问题是模块中的一些函数是“空的”,没有定义的声明。添加大小检查应该会跳过这些并避免尝试在空函数中查找循环时出现任何问题。

if ((*f).size() == 0) continue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多