[llvm-dev] How to efficiently extract the calledFunction from a complex CallInst?

Shen Liu via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 13 09:32:16 PST 2015


Appreciate your advice, John! It works well as you said, thanks very much!

On Fri, Nov 13, 2015 at 8:44 AM, John Criswell <jtcriswel at gmail.com> wrote:

> On 11/12/15 10:27 PM, Shen Liu via llvm-dev wrote:
>
> Hi all,
>
> Usually if we want to get the called Function we can directly use
> CallInst->getCalledFunction(), however, today i encounter an unusual
> CallInst as follows:
>
>  %call11 = call double (...)* bitcast (double ()* @quantum_frand to double
> (...)*)()
>
>
> As others have noted, Function::getCalledFunction() is returning null
> because the function that is being called is first casted.  For some
> reason, Function::getCalledFunction() does not strip off pointer casts on
> its first argument.
>
> However, you can do that easily.  Just use:
>
> Function * calledFunc =
> dyn_cast<Function>(CallInst->getCalledValue()->stripPointerCasts())
>
> If calledFunc is non-zero, it's a pointer to the called function.
> Otherwise, you have an indirect call.
>
> As an aside, note that indirect calls are sometimes the result of a select
> instruction that picks between one of two functions.  It's therefore worth
> checking to see if the called value is a SelectInst and, if it is, see if
> both operands to the SelectInst are Functions.
>
> Regards,
>
> John Criswell
>
>
> the original C source involve type cast:
>
> float u,v;
> extern double quantum_frand();
>    u = 2 * quantum_frand() - 1;
>    v = 2 * quantum_frand() - 1;
>
> In this case, CallInst->getCalledFunction() returns a nullptr unusually, I
> printed out the getOperand(0) and found the operand is the whole thing of
>  "double (...)* bitcast (double ()* @quantum_frand to double (...)*)()".
> Any member function calling on that fails so i don't know whether there is
> an efficient way to exactly get the called function @quantum_frand(...)
> here? Thanks!
>
>
> Best regards,
>
> Shen
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing listllvm-dev at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
> --
> John Criswell
> Assistant Professor
> Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151113/65fb46d0/attachment.html>


More information about the llvm-dev mailing list