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?
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?
>
#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?
>>
>