在模块传递中迭代LLVM IR中的函数循环的BasicBlocks

时间:2017-10-24 04:47:01

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

有没有人知道如何在模块pass中迭代函数循环的基础。我正在尝试:

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.

1 个答案:

答案 0 :(得分:0)

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

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

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

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