Cast Pointer Address to Functions

I have a function address held in an uint64_t. I would like to cast
the function address to a function prototype and create a call to the
function in LLVM. How could I do this ?

Thanks

Xin

Using uintptr_t is the way to hold pointer values. However, I seem to recall there being an exception for function addresses.

-bw

In fact i want to cast a uint64_t to a function address and make LLVM
generate IR to call it.

i.e. in LLVM IR, i want to generate something like this.

      the uint64_t function prototype function args
call 0xAABBCC (void () (int int)) (1 , 2)

Thanks

Xin

From: llvmdev-bounces@cs.uiuc.edu [mailto:llvmdev-bounces@cs.uiuc.edu] On Behalf Of Xin Tong
Subject: [LLVMdev] Cast Pointer Address to Functions

I have a function address held in an uint64_t. I would like to cast
the function address to a function prototype and create a call to the
function in LLVM. How could I do this ?

This is what works for us:

    std::vector<Type*> margs;
    FunctionType* fType;
    PointerType* pm3_routine;
    Value* m3func;
    Value* result;

    margs.resize(1);
    margs[0] = I64;
    fType = FunctionType::get(I32, margs, false);
    pm3_routine = PointerType::get(fType, 0);

    m3func = Builder.CreateIntToPtr(I64_Const((uint64_t)pFunc), pm3_routine, "pm3func");
    result = Builder.CreateCall(m3func, parameter, "m3func");

- Chuck

THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL and is thus for use only by the intended recipient. If you received this in error, please contact the sender and delete the e-mail and its attachments from all computers.

Interestingly I have something similar. but does not seem to work.

This one works.
   Value *FuncCast = EIR->CreateIntToPtr(FuncAddr, FuncTyPntr, "FuncName");

This one does not work. it gives me an instruction with badref.
  CastInst *FuncCast = CastInst::Create(Instruction::IntToPtr,
FuncAddr, FuncTyPntr);

Anyone knows why ?

Thanks

Xin