[LLVMdev] How to call a pointer that points to a C function
David Chisnall
David.Chisnall at cl.cam.ac.uk
Mon Oct 27 01:37:10 PDT 2014
There is at least one error here, possibly two.
On 27 Oct 2014, at 07:46, C K Tan <cktanx at gmail.com> wrote:
> I have a pointer to a function that I need to invoke without going
> through llvm::Module::getOrInsertFunction. This example does not work:
>
> static int add(int x, int y);
> llvm::Value *one, *two;
>
> llvm::Constant* addfn
> = llvm::ConstantInt::get(JB->getIntPtrTy(DataLayout), (intptr_t)add);
> llvm::Type* args[] = { Int32Ty, Int32Ty };
> llvm::FunctionType* ftype = llvm::FunctionType::get(Int32Ty, args);
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.
> addfn = llvm::ConstantExpr::getPointerCast(addfn, ftype);
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.
David
More information about the llvm-dev
mailing list