[llvm-dev] CallInst::getCalledFunction returns null?
John Criswell via llvm-dev
llvm-dev at lists.llvm.org
Tue Sep 8 08:26:03 PDT 2015
On 9/8/15 11:16 AM, Christian Convey via llvm-dev wrote:
> I was wondering if someone could explain why
> CallInst::getCalledFunc behaves the way it does.
>
> For simple, direct call instructions in my IR, that method behaves
> just as one would expect.
>
> However, for instructions like this:
>
> %25 = call i32 (%struct._IO_FILE*, ...)* bitcast (i32 (...)*
> @close to i32 (%struct._IO_FILE*, ...)*)(%struct._IO_FILE* %24),
> !dbg !695
>
>
> getCalledFunc returns null.
>
> I know getCalledFunc is expected to return null
> <http://llvm.org/docs/doxygen/html/classllvm_1_1CallInst.html#a0bcd4131e1a1d92215f5385b4e16cd2e> on
> indirect calls, but I would have thought naming the callee via a
> constant expression like the one here would be considered a direct call.
The getCalledFunc() method is not very sophisticated. It turns NULL if
the called value is not trivially a function constant.
I'm not sure for the reasoning behind this. My best guess is that a
constant expression could do all sorts of interesting things. For
example, a constant expression can select one of several values or pull
a value out of an array using a constant expression GEP.
You'll need to do what SAFECode does; use
getCalledValue()->stripPointerCasts() to get the called value and remove
any casts that stand between you and the function value. It's
inconvenient, but it works.
Alternatively, you could see if the CallSite() class provides a smarter
method of getting the called function, but I'm not sure if it has such a
method.
Regards,
John Criswell
>
> Thanks,
> Christian
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
http://www.cs.rochester.edu/u/criswell
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150908/3edf1fda/attachment.html>
More information about the llvm-dev
mailing list