#include "llvm/Module.h" #include "llvm/Analysis/MemoryDependenceAnalysis.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; struct Hello: public ModulePass { public: static char ID; MemoryDependenceAnalysis *MD; Hello(): ModulePass(ID) { ;; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<MemoryDependenceAnalysis>(); errs() << "addRequired called\n"; } virtual bool runOnModule(Module &M) { for(Module::iterator f = M.begin(); f != M.end(); ++f) runOnFunction(*f, M); return false; } private: bool runOnFunction(Function &F, Module &M) { MD = &getAnalysis<MemoryDependenceAnalysis>(F); for(Function::iterator i = F.begin(); i != F.end(); ++i) { for(BasicBlock::iterator j = i->begin(); j != i->end(); ++j) { ;; } } return false; } }; char Hello::ID = 0; static RegisterPass<Hello> X("hello", "Hello World Pass"); On Thu, Oct 13, 2011 at 7:14 PM, ret val <retval386 at gmail.com> wrote:> My pass(that I want to use MemoryDependenceAnalysis) is a ModulePass. > When I changed my assignment to: > MD = &getAnalysis<MemoryDependenceAnalysis>(F); > > It fixed my initial problem but left me with: > Assertion failed: (ResultPass && "Unable to find requested > analysis info"), function getAnalysisID > > > On Thu, Oct 13, 2011 at 1:43 PM, ret val <retval386 at gmail.com> wrote: >> I wrote a pass(that is to be loaded by opt) that I would like to use >> in conjunction with MemoryDependenceAnalysis. I have tried using by >> including its header and adding this to my pass: >> virtual void getAnalysisUsage(AnalysisUsage &AU) const { >> errs() << "addRequired called\n"; >> AU.addRequired<MemoryDependenceAnalysis>(); >> } >> >> And in my runOnFunction() method I have: >> MD = &getAnalysis<MemoryDependenceAnalysis>(); >> >> The results in: >> addRequired called >> Assertion failed: (ResultPass && "getAnalysis*() called on an >> analysis that was not " "'required' by pass!"), function getAnalysisID >> >> I do not know why. I noticed the DeadStoreElimination pass also uses >> this, but it does not use RegisterPass (like mine and the docs show). >> Instead it has lines like: >> INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) >> >> This gives me: >> error: C++ requires a type specifier for all declarations >> >> What is the correct way todo this? >> >
In runOnFunction(), you should check to see if the function F is a declaration before calling getAnalysis(F). Calling getAnalysis<FunctionPass>() on a function that is a declaration will trigger an assertion if the function is just a declaration. To see if a function is a declaration, call its isDeclaration() method (i.e. if (F->isDeclaration()) ... ) -- John T. On 10/13/11 8:09 PM, ret val wrote:> #include "llvm/Module.h" > #include "llvm/Analysis/MemoryDependenceAnalysis.h" > #include "llvm/Support/raw_ostream.h" > using namespace llvm; > > struct Hello: public ModulePass { > public: > static char ID; > MemoryDependenceAnalysis *MD; > > Hello(): ModulePass(ID) { > ;; > } > > virtual void getAnalysisUsage(AnalysisUsage&AU) const { > AU.addRequired<MemoryDependenceAnalysis>(); > errs()<< "addRequired called\n"; > } > > virtual bool runOnModule(Module&M) { > for(Module::iterator f = M.begin(); f != M.end(); ++f) > runOnFunction(*f, M); > > return false; > } > > private: > bool runOnFunction(Function&F, Module&M) { > MD =&getAnalysis<MemoryDependenceAnalysis>(F); > for(Function::iterator i = F.begin(); i != F.end(); ++i) { > for(BasicBlock::iterator j = i->begin(); j != i->end(); ++j) { > ;; > } > } > > return false; > } > }; > > char Hello::ID = 0; > static RegisterPass<Hello> X("hello", "Hello World Pass"); > > > On Thu, Oct 13, 2011 at 7:14 PM, ret val<retval386 at gmail.com> wrote: >> My pass(that I want to use MemoryDependenceAnalysis) is a ModulePass. >> When I changed my assignment to: >> MD =&getAnalysis<MemoryDependenceAnalysis>(F); >> >> It fixed my initial problem but left me with: >> Assertion failed: (ResultPass&& "Unable to find requested >> analysis info"), function getAnalysisID >> >> >> On Thu, Oct 13, 2011 at 1:43 PM, ret val<retval386 at gmail.com> wrote: >>> I wrote a pass(that is to be loaded by opt) that I would like to use >>> in conjunction with MemoryDependenceAnalysis. I have tried using by >>> including its header and adding this to my pass: >>> virtual void getAnalysisUsage(AnalysisUsage&AU) const { >>> errs()<< "addRequired called\n"; >>> AU.addRequired<MemoryDependenceAnalysis>(); >>> } >>> >>> And in my runOnFunction() method I have: >>> MD =&getAnalysis<MemoryDependenceAnalysis>(); >>> >>> The results in: >>> addRequired called >>> Assertion failed: (ResultPass&& "getAnalysis*() called on an >>> analysis that was not " "'required' by pass!"), function getAnalysisID >>> >>> I do not know why. I noticed the DeadStoreElimination pass also uses >>> this, but it does not use RegisterPass (like mine and the docs show). >>> Instead it has lines like: >>> INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) >>> >>> This gives me: >>> error: C++ requires a type specifier for all declarations >>> >>> What is the correct way todo this? >>> > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
This gives me: Assertion failed: (0 && "Unable to find on the fly pass"), function getOnTheFlyPass, file PassManager.cpp #include "llvm/Module.h" #include "llvm/Analysis/MemoryDependenceAnalysis.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; struct Hello: public FunctionPass { public: static char ID; Hello(): FunctionPass(ID) { ;; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<MemoryDependenceAnalysis>(); errs() << "addRequired called\n"; } virtual bool runOnFunction(Function &F) { if(F.isDeclaration() == true) return false; MemoryDependenceAnalysis *MD = &getAnalysis<MemoryDependenceAnalysis>(F); for(Function::iterator i = F.begin(); i != F.end(); ++i) { for(BasicBlock::iterator j = i->begin(); j != i->end(); ++j) { i->dump(); } } return false; } }; char Hello::ID = 0; static RegisterPass<Hello> X("hello", "Hello World Pass"); On Fri, Oct 14, 2011 at 10:47 AM, John Criswell <criswell at illinois.edu> wrote:> In runOnFunction(), you should check to see if the function F is a > declaration before calling getAnalysis(F). Calling > getAnalysis<FunctionPass>() on a function that is a declaration will trigger > an assertion if the function is just a declaration. > > To see if a function is a declaration, call its isDeclaration() method (i.e. > if (F->isDeclaration()) ... ) > > -- John T. > > > On 10/13/11 8:09 PM, ret val wrote: >> >> #include "llvm/Module.h" >> #include "llvm/Analysis/MemoryDependenceAnalysis.h" >> #include "llvm/Support/raw_ostream.h" >> using namespace llvm; >> >> struct Hello: public ModulePass { >> public: >> static char ID; >> MemoryDependenceAnalysis *MD; >> >> Hello(): ModulePass(ID) { >> ;; >> } >> >> virtual void getAnalysisUsage(AnalysisUsage&AU) const { >> AU.addRequired<MemoryDependenceAnalysis>(); >> errs()<< "addRequired called\n"; >> } >> >> virtual bool runOnModule(Module&M) { >> for(Module::iterator f = M.begin(); f != M.end(); ++f) >> runOnFunction(*f, M); >> >> return false; >> } >> >> private: >> bool runOnFunction(Function&F, Module&M) { >> MD =&getAnalysis<MemoryDependenceAnalysis>(F); >> for(Function::iterator i = F.begin(); i != F.end(); ++i) { >> for(BasicBlock::iterator j = i->begin(); j !>> i->end(); ++j) { >> ;; >> } >> } >> >> return false; >> } >> }; >> >> char Hello::ID = 0; >> static RegisterPass<Hello> X("hello", "Hello World Pass"); >> >> >> On Thu, Oct 13, 2011 at 7:14 PM, ret val<retval386 at gmail.com> wrote: >>> >>> My pass(that I want to use MemoryDependenceAnalysis) is a ModulePass. >>> When I changed my assignment to: >>> MD =&getAnalysis<MemoryDependenceAnalysis>(F); >>> >>> It fixed my initial problem but left me with: >>> Assertion failed: (ResultPass&& "Unable to find requested >>> analysis info"), function getAnalysisID >>> >>> >>> On Thu, Oct 13, 2011 at 1:43 PM, ret val<retval386 at gmail.com> wrote: >>>> >>>> I wrote a pass(that is to be loaded by opt) that I would like to use >>>> in conjunction with MemoryDependenceAnalysis. I have tried using by >>>> including its header and adding this to my pass: >>>> virtual void getAnalysisUsage(AnalysisUsage&AU) const { >>>> errs()<< "addRequired called\n"; >>>> AU.addRequired<MemoryDependenceAnalysis>(); >>>> } >>>> >>>> And in my runOnFunction() method I have: >>>> MD =&getAnalysis<MemoryDependenceAnalysis>(); >>>> >>>> The results in: >>>> addRequired called >>>> Assertion failed: (ResultPass&& "getAnalysis*() called on an >>>> analysis that was not " "'required' by pass!"), function getAnalysisID >>>> >>>> I do not know why. I noticed the DeadStoreElimination pass also uses >>>> this, but it does not use RegisterPass (like mine and the docs show). >>>> Instead it has lines like: >>>> INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) >>>> >>>> This gives me: >>>> error: C++ requires a type specifier for all declarations >>>> >>>> What is the correct way todo this? >>>> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >