How to call a pointer that points to a C function

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);
addfn = llvm::ConstantExpr::getPointerCast(addfn, ftype);
CreateCall(addfn, one, two);

There is at least one error here, possibly two.

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

Does anyone have a sample code on calling a c function thru pointer? Thanks.

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.