RFA: New ipa-devirt PATCH for c++/58678 (devirt vs. KDE)
Jan Hubicka
hubicka@ucw.cz
Wed Mar 12 23:44:00 GMT 2014
> > This patch fixes the latest 58678 testcase by avoiding speculative
> > devirtualization to the destructor of an abstract class, which can
> > never succeed: you can't create an object of an abstract class, so
> > the pointer must point to an object of a derived class, and the
> > derived class necessarily has its own destructor. Other virtual
> > member functions of an abstract class are OK for devirtualization:
> > the destructor is the only virtual function that is always
> > overridden in every class.
> >
> > We could also detect an abstract class by searching through the
> > vtable for __cxa_pure_virtual, but I figured it was easy enough for
> > the front end to set a flag on the BINFO.
> >
> > Tested x86_64-pc-linux-gnu. OK for trunk?
>
> > commit b64f52066f3f4cdc9d5a30e2d48aaf6dd5efd3d4
> > Author: Jason Merrill <jason@redhat.com>
> > Date: Wed Mar 5 11:35:07 2014 -0500
> >
> > PR c++/58678
> > gcc/
> > * tree.h (BINFO_ABSTRACT_P): New.
> > * ipa-devirt.c (abstract_class_dtor_p): New.
> > (likely_target_p): Check it.
> > gcc/cp/
> > * search.c (get_pure_virtuals): Set BINFO_ABSTRACT_P.
> > * tree.c (copy_binfo): Copy it.
Jason, also if abstract_class_dtor_p functions are never called via vtables, is there
reason for C++ FE to put them there? I understand that there is a slot in vtable initializer
for them, but things would go smoother if it was initialized to NULL or some other marker
different from cxa_pure_virtual. Then gimple-fold will already substitute it for
builtin_unreachable and they will get ignored during the ipa-devirt's walks.
Honza
More information about the Gcc-patches
mailing list