<div dir="ltr">Hi John, <div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 8, 2015 at 11:26 AM, John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><span class="">
    <div>The getCalledFunc() method is not very sophisticated.  It turns NULL
    if the called value is not trivially a function constant.<br></div></span>
    <br>
    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.<br>
    <br>
    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.<br></div></blockquote><div><br></div><div>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.)</div><div><br></div><div>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.</div><div><br></div><div>Do you know if it tends to be the case that:</div><div><ul><li>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.<br><br></li><li>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 <i>not</i> an llvm::Constant.</li></ul><div><br></div></div><div>Thanks again,</div><div>Christian</div></div></div></div>