[llvm-dev] LLVM plugin: access function signature of a function pointer parameter

Johannes Doerfert via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 8 09:30:51 PST 2021


This is untested.

Going through the callee value, as you did.:

Value *Callee = CI->getCalledValue();
PointerType *CalleePtrTy = dyn_cast<PointerType>(Callee->getType());
if (!CalleePtrTy) ...
FunctionType *CalleeFnTy = 
dyn_cast<FunctionType>(CalleePtrTy->getPointerElementType());
if (!CalleeFnTy) ...
if (CalleeFnTy->getNumParams() > idx)
   return CalleFnTy->getParamTy(idx);


Alternatively, go through the call:

if (CI->getNumArgOperands() > idx)
   return CI->getArgOperand(idx)->getType();


~ Johannes


On 2/8/21 10:20 AM, Marc via llvm-dev wrote:
> Hi,
>
> I am unable to find any information on how to extract the function
> signature from calls that receive a function pointer. e.g.:
>
> C code:
>    signal(SIG_TERM, a_function_ptr);
>
> IR:
>    %call = call void (i32)* @signal(i32 4, void (i32)* %1) #3, !dbg !26
>
> And Value* of callInst->GetOperand(1) resulting in: void (i32)*
>
> How can I extract that (i32) information, so basically the function
> parameter signature?
>
> I want to add a feature into an llvm plugin that parses all calls,
> identifies function pointers and then dumps the function signature.
> (Yes if a function point is hidden to be a size_t* bitcast and
> transfered I will not be able to see this, but in cases where this is
> visible I would like to get that information.
>
> Thank you!
>
> Regards,
> Marc
>


More information about the llvm-dev mailing list