<div>Hi, all:</div>
<div> </div>
<div>I wanted to use a FunctionPass (e.g. <em>MemoryDependenceAnalysis</em>) in a ModulePass, and then I used the method "<font face="Courier New">getAnalysis<<em>MemoryDependenceAnalysis</em>>(llvm::Function *)"</font> described at <a href="http://llvm.org/docs/WritingAnLLVMPass.html#ModulePass">http://llvm.org/docs/WritingAnLLVMPass.html#ModulePass</a> to get the FunctionPass. But , it still crashed when I invoked this pass in tool 'opt'.</div>
<div> </div>
<div>However, if I change my pass to inherit from FunctionPass, then everything goes well. But I must use the ModulePass to solve my problem. What can I do now?</div>
<div> </div>
<div>Following is the project file and crash infomation.</div>
<div> </div>
<div>--------------------------------------part of my project file--------------------------------------------------------</div>
<div><br> <em>struct pFuncName : public ModulePass {<br> ......</em></div>
<div><em> virtual bool runOnModule(Module &M)</em></div>
<div><em> {<br> for(Module::iterator mib=M.begin(), mie=M.end(); mib!=mie; ++mib)<br> {<br> MemoryDependenceAnalysis &mda = getAnalysis<MemoryDependenceAnalysis>(*f); // I have noticed </em></div>
<div><em> ......<br> }<br> return false;<br> }</em></div>
<div><em></em> </div>
<div><em> void getAnalysisUsage(AnalysisUsage &AU) const</em></div>
<div><em> {<br> AU.addRequired<MemoryDependenceAnalysis>();<br> }<br> };</em></div>
<div> </div>
<div> </div>
<div>-----------------------------------------------crash infomation----------------------------------------------------</div>
<div> </div>
<div><em>$ opt -load /home/****/llvm-2.5/Debug/lib/g_pFuncName.so -g_pFuncName < test.bc > /dev/null<br>opt: /home/****/llvm-2.5/include/llvm/Target/TargetData.h:114: llvm::TargetData::TargetData(): Assertion `0 && "ERROR: Bad TargetData ctor used. " "Tool did not specify a TargetData to use?"' failed.<br>
0 opt 0x08604986<br>1 opt 0x08604cc8<br>2 0x003ba400 __kernel_sigreturn + 0<br>3 libc.so.6 0x009cce28 abort + 392<br>4 libc.so.6 0x009c440e __assert_fail + 238<br>5 opt 0x08507bc5 llvm::Pass* llvm::callDefaultCtor<llvm::TargetData>() + 0<br>
6 opt 0x08507be2 llvm::Pass* llvm::callDefaultCtor<llvm::TargetData>() + 29<br>7 opt 0x08596996 llvm::PassInfo::createPass() const + 126<br>8 opt 0x0859156a llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 284<br>
9 opt 0x085915f1 llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 419<br>10 opt 0x0859b9ec llvm::FunctionPassManagerImpl::add(llvm::Pass*) + 30<br>11 opt 0x085917ab llvm::MPPassManager::addLowerLevelRequiredPass(llvm::Pass*, llvm::Pass*) + 315<br>
12 opt 0x08592636 llvm::PMDataManager::add(llvm::Pass*, bool) + 816<br>13 opt 0x08592a81 llvm::ModulePass::assignPassManager(llvm::PMStack&, llvm::PassManagerType) + 137<br>14 opt 0x0859b8a9 llvm::PassManagerImpl::addTopLevelPass(llvm::Pass*) + 237<br>
15 opt 0x08591642 llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 500<br>16 opt 0x0859b9cc llvm::PassManagerImpl::add(llvm::Pass*) + 30<br>17 opt 0x08591667 llvm::PassManager::add(llvm::Pass*) + 27<br>
18 opt 0x082d10c2<br>19 opt 0x082d2f03 main + 3181<br>20 libc.so.6 0x009b66e5 __libc_start_main + 229<br>21 opt 0x082c4641<br>Aborted (core dumped)<br>---------------------------------------------------------------------------------------------------------------</em></div>
<div><em></em> </div>
<div>Thanks a lot.</div>
<div> </div>
<div>gauss</div>