Andrii Vasyliev
2008-Oct-08 16:56 UTC
[LLVMdev] How can I create CallInst with a pointer to function
Hi
I mean when I have in my program pointer to a function how should I
build IR to call the function by the pointer?
Or how can I create llvm::Function with a pointer to a function?
I want to have something like this:
int factorial (int n) { return n==0 ? 1 : n*factorial(n-1); }
typedef int (*intFunc) (int);
intFunc fptr = factorial;
Value * N = ConstantInt::get(Type::Int32Ty,10);
irb.CreateCall(fptr,N);
OR
Function *F =
Function::Create(intFuncTy,Function::ExternalLinkage,fptr,myModule);
irb.CreateCall(F,N);
Thanks
Gordon Henriksen
2008-Oct-09 03:55 UTC
[LLVMdev] How can I create CallInst with a pointer to function
On 2008-10-08, at 12:56, Andrii Vasyliev wrote:> I mean when I have in my program pointer to a function how should I > build IR to call the function by the pointer? > Or how can I create llvm::Function with a pointer to a function?If you're just asking how to construct an indirect call, then calling a LoadInst* or Argument* or any other Value* is no different than calling a Function*. If your goal is to take an arbitrary function pointer (possibly precompiled) from the compiler's context and statically embed a call to it in the program you're building, then you can do this in a couple of ways. Both only work in a JIT context, for reasons that should be obvious. The first is to use something like this: Value *value = ConstantExpr::getIntToPtr( ConstantInt::get(reinterpret_cast<intptr_t>(fptr)), FunctionType::get(.......)); Secondly, you can create a Function* with no body (a declaration) and then use ExecutionEngine::addGlobalMapping. — Gordon