0

我正在尝试编写一个通过每个基本块的通道,并且我想确定每个基本块是否处于循环中。

我添加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:符号查找错误:/home/mypass/llvm/Debug+Asserts/lib/ReadIR.so:未定义符号:_ZNK4llvm12LoopInfoBaseINS_10BasicBlockENS_4LoopEE10getLoopF​​orEPKS1_

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

4

2 回答 2

0

尝试这个

virtual bool runOnFunction(Function &Func) {
     for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
          OptimizeBB(bb);
     return false;
}
于 2015-01-04T19:05:24.050 回答
0

我假设您包含正确的标题。在以下代码中,您传递的是bb什么?

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

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

于 2013-07-23T15:29:10.260 回答