Llvm 检测BasicBlock是否在循环中
我是LLVM的初学者,我正在尝试编写LLVM通行证。我的过程非常简单:它检测循环和函数调用。我想知道函数调用是否在循环中并检测子循环 我遇到的问题是,当调用在循环中时,我的pass会打印函数调用两次。这是我的代码:Llvm 检测BasicBlock是否在循环中,llvm,static-analysis,Llvm,Static Analysis,我是LLVM的初学者,我正在尝试编写LLVM通行证。我的过程非常简单:它检测循环和函数调用。我想知道函数调用是否在循环中并检测子循环 我遇到的问题是,当调用在循环中时,我的pass会打印函数调用两次。这是我的代码: void BlocksInLoop(Loop *L,unsigned nlvl){ errs() <<"Loop level"<< nlvl << " {\n"; BasicBlock* h = L->getHeader(); S
void BlocksInLoop(Loop *L,unsigned nlvl){
errs() <<"Loop level"<< nlvl << " {\n";
BasicBlock* h = L->getHeader();
ScalarEvolution *SE = &getAnalysis<ScalarEvolutionWrapperPass().getSE();
errs() <<"Loop trip count :"<< SE->getSmallConstantTripCount(L) << "\n";
std::vector<Loop*> subLoops = L-> getSubLoops();
Loop::iterator j,f;
for (j = subLoops.begin(), f = subLoops.end();j!=f ; ++j)
BlocksInLoop(*j ,nlvl+1);
unsigned numBlocks = 0;
Loop::block_iterator bb;
for(bb = L-> block_begin(); bb != L-> block_end();++bb){
BasicBlock* BB = *bb;
for(BasicBlock::iterator i = BB->begin() , e = BB->end(); i!=e; ++i){
if(isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
errs()<<"Call "<< cast<CallInst((*i))->getCalledFunction()->getName() << "\n";
}
}
}
errs()<< "}\n";
}
virtual bool runOnFunction(Function &F){
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
errs() << "Function " << F.getName () + "{\n";
for( Function::iterator b = F.begin() , be = F.end() ;b != be; ++b){
for(BasicBlock::iterator i = b->begin() , ie = b->end();i != ie; i ++){
if(isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
errs()<<"Call "<< cast<CallInst>(&(*i))->getCalledFunction()->getName() << "\n";
}
}
}
for(LoopInfo::iterator i = LI.begin(), e = LI.end(); i!=e; ++i)
BlocksInLoop (*i,0);
errs()<< "}\n\n";
return(false);
}
因此,我正在寻找一种能够检测调用是否在循环中的方法,如果是,则忽略第一个打印。可能吗?如果可能,如何实现?(行程计数也是错误的,始终为0,但我稍后会尝试修复。)这是实现目标的一种方法,跳过属于环路的基本块
virtual bool runOnFunction(Function &F){
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
for(LoopInfo::iterator i = LI.begin(), e = LI.end(); i!=e; ++i)
BlocksInLoop (*i,0);
errs() << "Function " << F.getName () + "{\n";
for( Function::iterator b = F.begin() , be = F.end() ;b != be; ++b){
for(LoopInfo::iterator L = LI.begin(), e = LI.end(); L!=e; ++L) {
if(L->contains(&*b)){
break; // Skip those BB that belong to a loop.
}
}
for(BasicBlock::iterator i = b->begin() , ie = b->end();i != ie; i ++){
if(isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
errs()<<"Call "<< cast<CallInst>(&(*i))->getCalledFunction()->getName() << "\n";
}
}
}
return(false);
virtualbool runOnFunction(函数&F){
LoopInfo&LI=getAnalysis().getLoopInfo();
对于(LoopInfo::迭代器i=LI.begin(),e=LI.end();i!=e;++i)
BlocksInLoop(*i,0);
errs()begin(),ie=b->end();i!=ie;i++){
如果(isa(&(*i))| isa(&(*i))){
谢谢你的回答,但我找到了另一个解决方案。我不会测试它,但我会验证它,因为我想这是另一种聪明的方法,我觉得很惭愧我没有考虑它。
Function foo{
Call foo
Loop level0 {
Loop trip count :0
Call foo
}
}
virtual bool runOnFunction(Function &F){
LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
for(LoopInfo::iterator i = LI.begin(), e = LI.end(); i!=e; ++i)
BlocksInLoop (*i,0);
errs() << "Function " << F.getName () + "{\n";
for( Function::iterator b = F.begin() , be = F.end() ;b != be; ++b){
for(LoopInfo::iterator L = LI.begin(), e = LI.end(); L!=e; ++L) {
if(L->contains(&*b)){
break; // Skip those BB that belong to a loop.
}
}
for(BasicBlock::iterator i = b->begin() , ie = b->end();i != ie; i ++){
if(isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
errs()<<"Call "<< cast<CallInst>(&(*i))->getCalledFunction()->getName() << "\n";
}
}
}
return(false);