使用“LoopInfo :: getLoopF​​or”时如何修复未定义的符号?

时间:2013-07-20 14:47:40

标签: llvm llvm-c++-api

我正在尝试编写一个遍历每个基本块的传递,我想确定每个基本块是否在循环中。

我添加了LoopInfo作为必要的分析:

virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AU.setPreservesCFG();
    AU.addRequired<LoopInfo>();
    AU.addPreserved<LoopInfo>();
}

然后调用getLoopFor

virtual bool runOnFunction(Function &Func) {
    OptimizeBB(bb);
    return false;
}

virtual void OptimizeBB(BasicBlock &bb){
    LoopInfo &LI = getAnalysis<LoopInfo>();
    errs()<<" \nDebug Here\n ";
    Loop* innerloop=LI.getLoopFor(&bb);
    if(innerloop==NULL){ errs()<<" \n(not loop)\n ";}
    else { errs()<<" \n(loop)\n ";}
}

但我收到以下错误:

  

/ home / mypass / llvm / Debug + Asserts / bin / opt:symbol lookup error:/home/mypass/llvm/Debug+Asserts/lib/ReadIR.so: undefined symbol:_ZNK4llvm12LoopInfoBaseINS_10BasicBlockENS_4LoopEE10getLoopF​​orEPKS1 _

我该如何解决?或者是否有任何其他方法可以识别基本块的循环?

2 个答案:

答案 0 :(得分:0)

我假设你有正确的标题。在以下代码中,您传递的是bb

virtual bool runOnFunction(Function &Func) {
OptimizeBB(bb);
return false;
}

您需要迭代Func以获取Func内的BB,然后将其传递给OptimizeBB()

答案 1 :(得分:0)

试试这个

virtual bool runOnFunction(Function &Func) {
     for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
          OptimizeBB(bb);
     return false;
}