[LLVMdev] Cannot use function pass in a module pass
John Criswell
criswell at cs.uiuc.edu
Thu Jun 16 07:25:34 PDT 2011
On 6/15/11 6:46 PM, Alexey Bakhirkin wrote:
> Hi. I'm trying to implement a module pass which can be dynamically
> loaded by `opt` (against up-to-date llvm from svn).
> Despite what the tutorial
> (http://llvm.org/docs/WritingAnLLVMPass.html) states in my module pass
> I cannot perform getAnalysis and fetch the function pass result.
> When trying to do so `opt` fails with the following mesage:
This may not be your problem, but in older versions of LLVM, you cannot
call getAnalysis<FunctionPassName>(F) if F is a function with no body.
You need to do something like:
if (!(F->isDeclaration())) {
getAnalysis<FunctionPassName>(F);
...
}
-- John T.
> [***@*** ***]$ opt -load ~/llvm/Debug+Asserts/lib/MyPassLibrary.so
> -mymodulepass< input.bc>/dev/null
> MyModulePass::runOnModule
> MyFunctionPass::runOnFunction(process)
> opt: /***/llvm/include/llvm/MyFunctionPass.h:241: AnalysisType&
> llvm::Pass::getAnalysisID(llvm::AnalysisID, llvm::Function&) [with
> AnalysisType = {anonymous}::MyFunctionPass, llvm::AnalysisID = const
> void*]: Assertion `ResultPass&& "Unable to find requested analysis
> info"' failed.
> 0 opt 0x0000000000dbcd86
> 1 opt 0x0000000000dbcb82
> 2 libpthread.so.0 0x0000003b8f00eeb0
> 3 libc.so.6 0x0000003b8e835285 gsignal + 53
> 4 libc.so.6 0x0000003b8e836b9b abort + 379
> 5 libc.so.6 0x0000003b8e82dc0e
> 6 libc.so.6 0x0000003b8e82dcb2
> 7 MyPassLibrary.so 0x00007fb2989ce7e8
> 8 MyPassLibrary.so 0x00007fb2989ce59f
> 9 MyPassLibrary.so 0x00007fb2989ce401
> 10 opt 0x0000000000d39af7
> llvm::MPPassManager::runOnModule(llvm::Module&) + 453
> 11 opt 0x0000000000d39ff8
> llvm::PassManagerImpl::run(llvm::Module&) + 130
> 12 opt 0x0000000000d3a3ff llvm::PassManager::run(llvm::Module&) + 39
> 13 opt 0x00000000008c6803 main + 4561
> 14 libc.so.6 0x0000003b8e82139d __libc_start_main + 237
> 15 opt 0x00000000008b7b69
> Stack dump:
> 0. Program arguments: opt -load
> /***/llvm/Debug+Asserts/lib/MyPassLibrary.so -mymodulepass
> 1. Running pass 'My module pass' on module '<stdin>'.
> Aborted
>
> --------
>
> My code is similar to the following:
>
> #include "llvm/Pass.h"
> #include "llvm/Function.h"
> #include "llvm/Module.h"
> #include "llvm/Support/raw_ostream.h"
>
> using namespace llvm;
>
> namespace {
> struct MyFunctionPass : public FunctionPass {
> static char ID;
> MyFunctionPass() : FunctionPass(ID) {};
>
> virtual bool runOnFunction(Function&F) {
> errs()<< "MyFunctionPass::runOnFunction("<< F.getName()<< ")"<< '\n';
> return false;
> }
> };
> }
>
> char MyFunctionPass::ID = 0;
> static RegisterPass<MyFunctionPass> MyFunctionPassPass("myfunctionpass",
> "My function pass");
>
> namespace {
> struct MyModulePass : public ModulePass {
> static char ID;
> MyModulePass() : ModulePass(ID) {};
>
> virtual bool runOnModule(Module&M) {
> errs()<< "MyModulePass::runOnModule"<< '\n';
>
> for(Module::iterator FI=M.begin(), E=M.end(); FI!=E; ++FI) {
> getAnalysis<MyFunctionPass>(*FI);
> }
>
> return false;
> }
>
> virtual void getAnalysisUsage(AnalysisUsage&AU) const {
> AU.addRequired<MyFunctionPass>();
> }
> };
> }
>
> char MyModulePass::ID = 0;
> static RegisterPass<MyModulePass> MyModulePassPass("mymodulepass",
> "My module pass");
> _______________________________________________
> 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