This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Redirect calls to non-functions to builtin_unreachable
- From: Martin Jambor <mjambor at suse dot cz>
- To: Marcus Shawcroft <marcus dot shawcroft at gmail dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 24 Jun 2013 23:51:47 +0200
- Subject: Re: [PATCH] Redirect calls to non-functions to builtin_unreachable
- References: <20130510172709 dot GH3568 at virgil dot suse> <CAFqB+PxwVmz403oEap8PS=vszvwy7k=6kDD5qDd3LmGpxebhbQ at mail dot gmail dot com> <20130620154628 dot GC31242 at virgil dot suse>
Hi,
On Thu, Jun 20, 2013 at 05:46:28PM +0200, Martin Jambor wrote:
> On Thu, Jun 20, 2013 at 03:47:11PM +0100, Marcus Shawcroft wrote:
> > Hi, I've been looking at an issue in mysql compilation which appears
> > to be due to this patch.
> >
> > On 10 May 2013 18:27, Martin Jambor <mjambor@suse.cz> wrote:
> > > Hi,
> > >
> > > as we discover targets of previously indirect calls in ipa-inline and
> > > ipa-cp, we sometimes figure out that the targets are not a function.
> > > One typical example is when NULL is passed as a function pointer
> >
> > OK, this part makes sense to me.
> >
> > > parameter, another is when C++ member-pointer points to a virtual
> > > function and the overloaded field of the structure which can also hold
> > > pointers to non-virtual methods contains odd integer constants.
> >
> > I'm struggling to understand why such a member-pointer call would be
> > illegal in a well formed program.
> >
> > Attached is a fragment of code that demonstrates the issue I've been
> > looking at. When compiled at -O3 the 047i.inline dump tells me that:
> >
> > ipa-prop: Discovered direct call to non-function in unsigned int
> > A::foo(unsigned int (H::*)() const) const/11, making it unreachable.
> > not inlinable: unsigned int A::foo(unsigned int (H::*)() const)
> > const/11 -> void __builtin_unreachable()/12, function body not
> > available
> >
> > This behavior appears to be the explicit intent of the original patch,
> > the call to the member function pointer has been replaced with
> > __builtin_unreachable, but that looks like a legitimate call to me.
> > What am I missing?
>
> Hm, the reason why I did this was that I misremembered that each
> branch, the one for virtual calls and the one for direct calls. But
> when I checked dumps, I realized it was not so, there is only one call
> when the branches join. I'll fix this promptly.
>
> Thanks for the report,
For the record, this is PR 57670.
Martin