LLVM错误在函数传递中访问loopinfo

时间:2014-09-23 22:45:50

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

我试图通过编写函数传递从IR获取循环信息。所以我按照一些例子写了如下。我对编写传球和传球经理不是很熟悉。

#include <iostream>
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/BasicBlock.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"

using namespace llvm;

namespace {
    class DetectLoop: public FunctionPass {
    public:
        DetectLoop() : FunctionPass(ID) {}

        static char ID;

        virtual void getAnalysisUsage(AnalysisUsage &AU) const {
            AU.addRequired<LoopInfo>();//I'm not sure if it's correct here *****1*****
        }

        virtual bool runOnFunction(Function &F) {
            if (!F.isDeclaration())
                LoopInfo &li = getAnalysis<LoopInfo>(F);//*****2*****
            for (Function::iterator I = F.begin(); I != F.end(); I++) {
                BasicBlock *BB = I;
                for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
                    Instruction &I = *BI++;
                    //did noting inside
                }
            }
            return false;
        }
    };
}

char DetectLoop::ID = 0;

int main(int argc, char** argv)
{
    if (argc < 2) {
        errs() << "Expected an argument - IR file name\n";
        exit(1);
    }

    SMDiagnostic Err;
    std::cout<<argv[1]<<std::endl;
    Module *Mod = ParseIRFile(argv[1], Err, getGlobalContext());
    Err.Print(argv[0], errs());


    if (Mod) {
        PassManager PM;
        PM.add(new DetectLoop());
        PM.add(new LoopInfo());//*****3*****
        PM.run(*Mod);
    }
    else {
        std::cout << "Mod is null" << std::endl;
    }

    return 0;
}

在我运行此程序时,它只显示了segmentation error(core dumped)

但当我注释掉 addRequired 时,我得到的错误信息是

IRparser: PassManager.cpp:1200: virtual llvm::Pass* llvm::PMDataManager::getOnTheFlyPass
(llvm::Pass*, llvm::AnalysisID, llvm::Function&): Assertion `0 && "Unable to find on the fly pass"' failed.
Stack dump:
0.  Running pass 'Function Pass Manager' on module '../../testcase/forloop1.ll'.
1.  Running pass 'Unnamed pass: implement Pass::getPassName()' on function '@main'
Aborted (core dumped)

我标记了3个地方我不确定哪个是正确的。任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:3)

如果您在模块中使用它:

LoopInfo &li = getAnalysis<LoopInfo>(F)

如果您在函数中使用它:

LoopInfo &li = getAnalysis<LoopInfo>()

答案 1 :(得分:-1)

我之前有过这个问题。在搜索了几个答案后,我找到了解决方案。 您应该更改以下两个语句的位置:

    PM.add(new DetectLoop());
    PM.add(new LoopInfo());//*****3*****

因为必须在自己通过之前注册LoopInfo Pass。