我正在尝试编写一个遍历每个基本块的传递,我想确定每个基本块是否在循环中。
我添加了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_4LoopEE10getLoopForEPKS1 _
我该如何解决?或者是否有任何其他方法可以识别基本块的循环?
答案 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;
}