i'm starting to learn llvm api and i wrote my first pass. My goal is to print how functions call each others.
Lately i wanted to add some loop information to the display to look if a function can be call several time or not. But when i try to use LoopInfo i got this compilation error :
llvm[0]: Compiling cfg.cpp for Debug+Asserts build (PIC)
In file included from cfg.cpp:19:
In file included from /home/llvm-lab/llvm/include/llvm/Pass.h:378:
/home/llvm-lab/llvm/include/llvm/PassAnalysisSupport.h:56:37: error:
no member named 'ID' in 'llvm::LoopInfo'
return addRequiredID(PassClass::ID);
^
cfg.cpp:33:10: note: in instantiation of function template
specialization 'llvm::AnalysisUsage::addRequired<llvm::LoopInfo>'
requested here
AU.addRequired<LoopInfo>();
^
1 error generated.
Here is my code :
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "iostream"
#include "llvm/Pass.h"
#include "llvm/IR/InstIterator.h"
#include <llvm/IR/Instructions.h>
#include <llvm/Analysis/LoopInfo.h>
using namespace llvm;
namespace {
struct CFG : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
CFG() : FunctionPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<LoopInfo>();
}
bool runOnFunction(Function &F) override {
errs().write_escaped(F.getName());
errs() << " : ";
for( Function::iterator b = F.begin() , be = F.end(); b != be; ++b){
errs() << "\n\t BB : ";
LoopInfo *loop = new LoopInfo();
bool isLoop = loop->getLoopFor(b);
if(isLoop){
errs() << "loop{";
}
for(BasicBlock::iterator i = b->begin() , ie = b->end(); i!=ie; ++i){
if( isa<CallInst>(&(*i)) || isa<InvokeInst>(&(*i))){
errs() << cast<CallInst>(&(*i))->getCalledFunction()->getName() << "\t";
}
}
if(isLoop){
errs() << "}";
}
}
errs() << '\n';
return false;
}
};
}
char CFG::ID = 0;
static RegisterPass<CFG> X("CFG", "Gen CFG",true ,true);
I can't find any reference to an "no member named 'ID' in 'llvm::LoopInfo'" error anywhere, does anyone have an idea about what's is wrong here ?