[LLVMdev] pass utilizing MemoryDependenceAnalysis?
John Criswell
criswell at illinois.edu
Fri Oct 14 07:47:08 PDT 2011
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
More information about the llvm-dev
mailing list