Ошибка LLVM при доступе к loopinfo в проходе функции

Я пытаюсь получить информацию о цикле от IR, написав функцию pass. Поэтому я последовал некоторым примерам и написал следующее. Я не очень хорошо разбираюсь в написании пассов и менеджеров пассов.

#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 места, я не уверен, что правильно или нет. Может ли кто-нибудь помочь мне с этим?


person Min Gao    schedule 23.09.2014    source источник


Ответы (2)


Если вы используете его в модуле:

LoopInfo &li = getAnalysis<LoopInfo>(F)

Если вы используете его в функции:

LoopInfo &li = getAnalysis<LoopInfo>()
person user3908054    schedule 18.04.2015

У меня был этот вопрос раньше. После поиска нескольких ответов я нашел решение. Вы должны изменить расположение двух утверждений ниже:

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

Потому что LoopInfo Pass должен быть зарегистрирован до вашего собственного прохода.

person djx    schedule 04.01.2015