Hi Joshua, I have a function foo and I want to insert exit(0) at the end of foo. The problem is M.getFunction returns null, which is understandable. I am not sure what to do. Below is the code snippet. void foo(int argc, char* argv[]) { printf("hello world\n"); exit(0); //***I want to insert this exit } My llvm code snippet is vector<const Type *> params = vector<const Type *>(); params.push_back(Type::getInt32Ty(M.getContext())); FunctionType *fType FunctionType::get(Type::getVoidTy(M.getContext()), params, false); Constant *temp = M.getFunction("exit", fType); if(!temp){ errs() << "exit function not in symbol table\n"; exit(1); } Function *f = cast<Function>(temp); CallInst *ci = CallInst::Create(...) On Thu, Mar 31, 2011 at 2:46 PM, Joshua Warner <joshuawarner32 at gmail.com>wrote:> Hi George, > > Could you be a more specific about what you are trying to do, how you are > trying to do it, and what is failing. A couple of relevant snippets of code > would do wonders in helping you. > > Thanks, > > Joshua > > On Wed, Mar 30, 2011 at 3:59 PM, George Baah <georgebaah at gmail.com> wrote: > >> Hi Everyone, >> I am trying to insert an exit function into my IR. >> However, I thought I can get access to exit by using >> Module.getOrInsertFunction or Module.getFunction. However, I am >> getting a null value returned. I have searched through the llvmdev >> archives >> but not found any thing that addresses this question. >> >> Any help will be greatly appreciated. Thanks. >> >> George >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110331/2c9f1f0f/attachment.html>
Hi George, Unless you already inserted the function into the module previously, it looks like your problem is here:> Constant *temp = M.getFunction("exit", fType); > >needs to be: Constant* temp = M.getOrInsertFunction("exit", fType); In LLVM, declarations are just functions without bodies. A declaration (without a body) or definition (with a body) needs to be added for every function referenced in the module, including "standard" functions like exit. Let me know if this helps. -Joshua -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110331/e69c7002/attachment.html>
On Thu, Mar 31, 2011 at 9:31 PM, George Baah <georgebaah at gmail.com> wrote:> Hi Joshua, > I have a function foo and I want to insert exit(0) at the end of foo. > The problem is M.getFunction returns null, which is understandable. I am not > sure what to do. Below is the code snippet. > void foo(int argc, char* argv[]) { > printf("hello world\n"); > exit(0); //***I want to insert this exit > } > My llvm code snippet is > > vector<const Type *> params = vector<const Type *>();The initialization is unnecessary (but harmless).> params.push_back(Type::getInt32Ty(M.getContext())); > > FunctionType *fType = FunctionType::get(Type::getVoidTy(M.getContext()), > params, false); > > Constant *temp = M.getFunction("exit", fType);M.getOrInsertFunction("exit", fType);> if(!temp){ > > errs() << "exit function not in symbol table\n"; > > exit(1); > > } > > Function *f = cast<Function>(temp); > > CallInst *ci = CallInst::Create(...)
I did M.getOrInsertFunction and called the exit function with . IRBuilder<> builder = IRBuilder<>(...); Value *one = ConstantInt::get(Type::getInt32Ty(M.getContext()),1); builder.CreateCall(exitF,one,"tmp4"); "Instruction has a name, but provides a void value! %tmp4 = call void @exit(i32 1) Broken module found, compilation aborted! " On Thu, Mar 31, 2011 at 3:51 PM, Frits van Bommel <fvbommel at gmail.com>wrote:> On Thu, Mar 31, 2011 at 9:31 PM, George Baah <georgebaah at gmail.com> wrote: > > Hi Joshua, > > I have a function foo and I want to insert exit(0) at the end of > foo. > > The problem is M.getFunction returns null, which is understandable. I am > not > > sure what to do. Below is the code snippet. > > void foo(int argc, char* argv[]) { > > printf("hello world\n"); > > exit(0); //***I want to insert this exit > > } > > My llvm code snippet is > > > > vector<const Type *> params = vector<const Type *>(); > > The initialization is unnecessary (but harmless). > > > params.push_back(Type::getInt32Ty(M.getContext())); > > > > FunctionType *fType = FunctionType::get(Type::getVoidTy(M.getContext()), > > params, false); > > > > Constant *temp = M.getFunction("exit", fType); > > M.getOrInsertFunction("exit", fType); > > > if(!temp){ > > > > errs() << "exit function not in symbol table\n"; > > > > exit(1); > > > > } > > > > Function *f = cast<Function>(temp); > > > > CallInst *ci = CallInst::Create(...) >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110331/d8e33af8/attachment.html>