[llvm-dev] How to know the CallInst is a virtual call ?

PenYiWang via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 18 10:52:22 PDT 2020


So if I want to know whether a CallInst is a C++ virtual call or not.

I have to get the information at frontend/Clang.

and then pass the information to middle-end/LLVM IR by myself.

Is it right?

Thank you



David Blaikie <dblaikie at gmail.com> 於 2020年6月19日 週五 上午1:26寫道:

> On Thu, Jun 18, 2020 at 9:53 AM PenYiWang via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
> >
> > Hi
> >
> > I know that a virtual call looks like this :
> >
> >   %4 = load %class.base*, %class.base** %1, align 8
> >   %5 = bitcast %class.base* %4 to void (%class.base*)***
> >   %6 = load void (%class.base*)**, void (%class.base*)*** %5, align 8
> >   %7 = getelementptr inbounds void (%class.base*)*, void
> (%class.base*)** %6, i64 0
> >   %8 = load void (%class.base*)*, void (%class.base*)** %7, align 8
> >   call void %8(%class.base* %4)
> >
> > There may be some action to get function pointer on vtable .
> >
> > But, when I scan a llvm ir file, if I just see a CallInst and it is an
> indirect call
> >
> > Is there any way to know whether the CallInst is a virtual call or not ?
>
> Not exactly, no - LLVM has no concept of virtual calls specifically -
> they are "just" indirect calls through a vtable. LLVM optimizations
> generally shouldn't be trying to reconstruct more high level semantics
> than exist in LLVM IR - an optimization to improve virtual function
> calls (using the existing IR - not accounting for some special cases
> that might involve adding extra metadata, etc) should be framed in
> terms of indirect calls in general (perhaps indirect calls from
> functions in constant arrays - maybe that's the specific subcase you
> want to target, etc).
>
> - Dave
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200619/94a4a6eb/attachment.html>


More information about the llvm-dev mailing list