<div dir="ltr">Sounds like maybe you're trying to do something at a level where it's not going to be practical - what's your overall goal?<br><br>But no, at the LLVM IR level you can't get the name of a virtual function being called - as you've seen, it's a dynamic call through a table of function pointers & at LLVM's level, those functions could have any names (or none at all - or at least none that makes sense in this translation unit/module because it's a local symbol in some other module).</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jun 7, 2018 at 9:40 AM via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div class="m_1601882183692235111WordSection1"><p class="MsoNormal">Hi,<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I have been implementing a CallGraphSCCPass that analyzes each function invocation. Direct calls are not a problem, but currently I also need to retrieve the name of the function in the case of virtual method calls. For example:<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">struct A {<u></u><u></u></p><p class="MsoNormal">    A() {}<u></u><u></u></p><p class="MsoNormal">    virtual foo() {}<u></u><u></u></p><p class="MsoNormal">    virtual ~A() {}<u></u><u></u></p><p class="MsoNormal">};<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">int main() {<u></u><u></u></p><p class="MsoNormal">    A* a = new A;<u></u><u></u></p><p class="MsoNormal">    a->foo();<u></u><u></u></p><p class="MsoNormal">}<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">In the pass, I can determine the name of the indirect call by using CallInst::getCalledValue(), but that doesn’t give any information on the actual method that is being called, which should be foo(). The only “name” I can get is the type of the class, in which this case is class.A.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Is there any way I can get the name of the virtual method (foo) that is being invoked? It isn’t in the bitcode except for when it is defined. I tried taking a look at the whole-program-devirt source but can’t find where they are actually finding the names of the functions when building the virtual tables for each class.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I would greatly appreciate any help on this and if it is possible at all.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Thanks,<b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:#0b5394"><u></u><u></u></span></b></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Ben Fu <u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p></div></div>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>