[LLVMdev] Cast Pointer Address to Functions

1,312 views
Skip to first unread message

Xin Tong

unread,
Jun 18, 2012, 4:09:42 PM6/18/12
to LLVM Developers Mailing List
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
_______________________________________________
LLVM Developers mailing list
LLV...@cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

Bill Wendling

unread,
Jun 18, 2012, 10:21:38 PM6/18/12
to Xin Tong, LLVM Developers Mailing List
Using uintptr_t is the way to hold pointer values. However, I seem to recall there being an exception for function addresses.

-bw

Xin Tong

unread,
Jun 18, 2012, 10:33:29 PM6/18/12
to Bill Wendling, LLVM Developers Mailing List
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

Caldarale, Charles R

unread,
Jun 18, 2012, 10:38:01 PM6/18/12
to LLVM Developers Mailing List
> From: llvmdev...@cs.uiuc.edu [mailto:llvmdev...@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.

Xin Tong

unread,
Jun 18, 2012, 10:56:32 PM6/18/12
to Caldarale, Charles R, LLVM Developers Mailing List
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
Reply all
Reply to author
Forward
0 new messages