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