[llvm-dev] CallInst::getCalledFunction returns null?

Christian Convey via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 8 08:52:59 PDT 2015


Hi John,

On Tue, Sep 8, 2015 at 11:26 AM, John Criswell <jtcriswel at gmail.com> wrote:

> 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.
>

My apologies if this should be a clang question, but I'm trying to
reconcile what people mean by "direct" calls in the clang vs. LLVM
communities.  (The documentation for getCalledFunction makes me wonder if
I'm using term the same way as everyone else.)

I'm coming to this question with my AA-implementer's hat on.  I want to
handle C/C++ indirect calls well, and I'm trying to figure out if that
basically means handling non-`llvm::Constant` callee-specifications well.

Do you know if it tends to be the case that:

   - A direct function call at the C/C++ level becomes an llvm::CallInst or
   llvm::InvokeInst where the callee is name by an llvm::Constant.

   - An indirect function call at the C/C++ level ends up being translated
   to a llvm::CallInst or llvm::InvokeInst where the callee is named by an
   llvm::Value which is *not* an llvm::Constant.


Thanks again,
Christian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150908/b92b84c4/attachment.html>


More information about the llvm-dev mailing list