<p dir="ltr">Easy way to answer questions like this is to write the obvious c code and run it through ckang -emit-llvm to see what the IR looks like.</p>
<div class="gmail_quote">On Oct 27, 2014 10:05 AM, "CK Tan" <<a href="mailto:cktanx@gmail.com">cktanx@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Does anyone have a sample code on calling a c function thru pointer? Thanks.<br>
<br>
> On Oct 27, 2014, at 1:37 AM, David Chisnall <<a href="mailto:David.Chisnall@cl.cam.ac.uk">David.Chisnall@cl.cam.ac.uk</a>> wrote:<br>
><br>
> There is at least one error here, possibly two.<br>
><br>
>> On 27 Oct 2014, at 07:46, C K Tan <<a href="mailto:cktanx@gmail.com">cktanx@gmail.com</a>> wrote:<br>
>><br>
>> I have a pointer to a function that I need to invoke without going<br>
>> through llvm::Module::getOrInsertFunction. This example does not work:<br>
>><br>
>> static int add(int x, int y);<br>
>> llvm::Value *one, *two;<br>
>><br>
>> llvm::Constant* addfn<br>
>>  = llvm::ConstantInt::get(JB->getIntPtrTy(DataLayout), (intptr_t)add);<br>
>> llvm::Type* args[] = { Int32Ty, Int32Ty };<br>
>> llvm::FunctionType* ftype = llvm::FunctionType::get(Int32Ty, args);<br>
><br>
> The type that you want is not the function type, but the function *pointer* type.  ftype->getPointerTo() should give you the type that you need.<br>
><br>
>> addfn = llvm::ConstantExpr::getPointerCast(addfn, ftype);<br>
><br>
> I don't remember if this will just do casts between pointers or if it can also create inttoptrs, but you might need to be more explicit and ask for an inttoptr.<br>
><br>
> David<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div>