Alexey Bakhirkin
2011-Jun-15 23:46 UTC
[LLVMdev] Cannot use function pass in a module pass
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: [***@*** ***]$ 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");
Hi Alexey,> 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:RegisterPass takes an "is_analysis" argument that you should probably set to true when registering your analysis pass. Ciao, Duncan.
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
Alexey Bakhirkin
2011-Jun-16 17:22 UTC
[LLVMdev] Cannot use function pass in a module pass
Thanks, John. There were a couple of function declarations in the module, and 'getAnalysis' failed for those. By the way, what do you mean by "in older versions of LLVM"? I'm quite sure I was using the latest llvm trunk. 2011/6/16 John Criswell <criswell at cs.uiuc.edu>:> 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 > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >