[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