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); --- Is there a way? Or must I call getOrInsertFunction? Before anyone asks why I am doing this, it is because I have maybe 200 functions with the same signature that I would like JIT a call to. I would like to avoid calling getOrInsertFunction 200 times. I know exactly the address of the functions. Thanks.
David Chisnall
2014-Oct-27 08:37 UTC
[LLVMdev] How to call a pointer that points to a C function
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
Does anyone have a sample code on calling a c function thru pointer? Thanks.> On Oct 27, 2014, at 1:37 AM, David Chisnall <David.Chisnall at cl.cam.ac.uk> wrote: > > 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
Reasonably Related Threads
- [LLVMdev] LLVM Type Int32Ty Problems & LLVMContextImpl.h Problems
- [LLVMdev] need to store the address of a variable
- [LLVMdev] LLVM Type Int32Ty Problems & LLVMContextImpl.h Problems
- [LLVMdev] A beginner question
- [LLVMdev] Please help with LLVM C++ integration