1

我试图通过编写函数传递从 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 个地方,我不确定哪个是正确的或不正确的。任何人都可以帮助我吗?

4

2 回答 2

5

如果在模块中使用它:

LoopInfo &li = getAnalysis<LoopInfo>(F)

如果在函数中使用它:

LoopInfo &li = getAnalysis<LoopInfo>()
于 2015-04-18T07:42:00.777 回答
-1

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

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

因为 LoopInfo Pass 必须在自己的 pass 之前注册。

于 2015-01-04T14:25:30.950 回答