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>