<div dir="ltr"><div><br></div>So, I won't know the called function statically, Right?</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><br>--------------------------------------------<br>Qiuping Yi<br>Institute Of Software<br>Chinese Academy of Sciences</div></div>
<br><div class="gmail_quote">On Wed, Jan 20, 2016 at 2:24 PM, Nema, Ashutosh <span dir="ltr"><<a href="mailto:Ashutosh.Nema@amd.com" target="_blank">Ashutosh.Nema@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Typically for C++ virtual function you will see an indirect callSite (unless not de-virtualized).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Regards,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Ashutosh<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Qiuping Yi [mailto:<a href="mailto:yiqiuping@gmail.com" target="_blank">yiqiuping@gmail.com</a>]
<br>
<b>Sent:</b> Wednesday, January 20, 2016 9:10 AM<br>
<b>To:</b> Nema, Ashutosh<br>
<b>Cc:</b> llvm-dev<br>
<b>Subject:</b> Re: [llvm-dev] Why getFunction() of CallGraphNode return NULL function?<u></u><u></u></span></p><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">Dear Ashutosh,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thank you, I can handle some indirect callSites by getFunction() of InvokInst and CallInst.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">However, when I am handling C++ programs, I found the calls of member functions are converted<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">to some strange  indirect calls. For example:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">table->truncate(sysTransaction);   // from mysql<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">are translated to the next complex llvm IR:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">_ZN8Database20getSystemTransactionEv.exit:        ; preds = %bb33<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  call void @llvm.dbg.value(metadata %class.Transaction.553* %tmp36, i64 0, metadata !7310, metadata !53545), !dbg !69981<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  %tmp37 = bitcast %class.Table.543* %table to void (%class.Table.543*, %class.Transaction.553*)***, !dbg !69982<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  %tmp38 = load void (%class.Table.543*, %class.Transaction.553*)*** %tmp37, align 8, !dbg !69982, !tbaa !53550<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  %tmp39 = getelementptr inbounds void (%class.Table.543*, %class.Transaction.553*)** %tmp38, i64 5, !dbg !69982<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  %tmp40 = load void (%class.Table.543*, %class.Transaction.553*)** %tmp39, align 8, !dbg !69982<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  invoke void %tmp40(%class.Table.543* %table, %class.Transaction.553* %tmp36)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">          to label %bb41 unwind label %bb72, !dbg !69982<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">and thus I cannot find the called function "truncate" from "invoke void %tmp40(...)", what should I do?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I didn't analysis C++ code with llvm, does all the function calls through objects are translated to such complex indirect calls?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">If so, how can I dereference such functions? Thanks!<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><br clear="all">
<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><br>
--------------------------------------------<br>
Qiuping Yi<br>
Institute Of Software<br>
Chinese Academy of Sciences<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Tue, Jan 19, 2016 at 8:23 PM, Nema, Ashutosh <<a href="mailto:Ashutosh.Nema@amd.com" target="_blank">Ashutosh.Nema@amd.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">You will see NULL for indirect callSite.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">May need to add additional checks for this possibility.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Regards,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Ashutosh</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> llvm-dev [mailto:<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>]
<b>On Behalf Of </b>Qiuping Yi via llvm-dev<br>
<b>Sent:</b> Tuesday, January 19, 2016 5:35 PM<br>
<b>To:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> [llvm-dev] Why getFunction() of CallGraphNode return NULL function?</span><u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">Hi all,</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt"> </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">I want to find all the called functions in each function, thus I iterate the calledFunctions of each CallGraphNode in CallGraph as follow:</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt"> </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">for (CallGraph::iterator it = CG->begin(); it != CG->end(); ++it) {</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">   CallGraphNode* node = it->second;</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">   for (CallGraphNode::iterator it2 = node->begin(); it2 != node->end(); ++it2) {</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">      Function* calledFunc = it2->second=>getFunction();</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">      cerr <<</span><span style="font-size:9.5pt;font-family:"Calibri",sans-serif"> </span><span style="font-size:9.5pt">”function: “ << calledFunc->getName().str()
 <<"\n";  <b>// crash some times</b></span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">      ... ...</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">      ... ...</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">    }</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">}</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt"> </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">I found that some time "calledFunc" is NULL function and thus the output crash. I don't known why? If the before code is wrong, so what is the correct
 method for get all the called functions?</span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt"> </span><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.5pt">I use LLVM 3.6. Thank you all in advance.</span><u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal"><br>
--------------------------------------------<br>
Qiuping Yi<br>
Institute Of Software<br>
Chinese Academy of Sciences<u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div></div></div>
</div>

</blockquote></div><br></div>