<div dir="ltr">So if I want to know whether a CallInst is a C++ virtual call or not.<div><br></div><div>I have to get the information at frontend/Clang.</div><div><br></div><div>and then pass the information to middle-end/LLVM IR by myself.</div><div><br></div><div>Is it right?</div><div><br></div><div>Thank you</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> 於 2020年6月19日 週五 上午1:26寫道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Thu, Jun 18, 2020 at 9:53 AM PenYiWang via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> Hi<br>
><br>
> I know that a virtual call looks like this :<br>
><br>
>   %4 = load %class.base*, %class.base** %1, align 8<br>
>   %5 = bitcast %class.base* %4 to void (%class.base*)***<br>
>   %6 = load void (%class.base*)**, void (%class.base*)*** %5, align 8<br>
>   %7 = getelementptr inbounds void (%class.base*)*, void (%class.base*)** %6, i64 0<br>
>   %8 = load void (%class.base*)*, void (%class.base*)** %7, align 8<br>
>   call void %8(%class.base* %4)<br>
><br>
> There may be some action to get function pointer on vtable .<br>
><br>
> But, when I scan a llvm ir file, if I just see a CallInst and it is an indirect call<br>
><br>
> Is there any way to know whether the CallInst is a virtual call or not ?<br>
<br>
Not exactly, no - LLVM has no concept of virtual calls specifically -<br>
they are "just" indirect calls through a vtable. LLVM optimizations<br>
generally shouldn't be trying to reconstruct more high level semantics<br>
than exist in LLVM IR - an optimization to improve virtual function<br>
calls (using the existing IR - not accounting for some special cases<br>
that might involve adding extra metadata, etc) should be framed in<br>
terms of indirect calls in general (perhaps indirect calls from<br>
functions in constant arrays - maybe that's the specific subcase you<br>
want to target, etc).<br>
<br>
- Dave<br>
</blockquote></div>