[LLVMdev] pass utilizing MemoryDependenceAnalysis?

ret val retval386 at gmail.com
Thu Oct 13 18:09:57 PDT 2011


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




More information about the llvm-dev mailing list