re PR ipa/61659 (Extra undefined symbol because of devirtualization)

PR c++/61659
	PR c++/61687
Revert:
gcc/c-family/
	* c.opt (-fuse-all-virtuals): New.
gcc/cp/
	* decl2.c (mark_all_virtuals): New variable.
	(maybe_emit_vtables): Check it instead of flag_devirtualize.
	(cp_write_global_declarations): Set it and give helpful diagnostic
	if it introduces errors.
	* class.c (finish_struct_1): Check it.

From-SVN: r213308
This commit is contained in:
Jason Merrill 2014-07-30 13:27:20 -04:00 committed by Jason Merrill
parent d5d0ed2d89
commit a41844e513
8 changed files with 18 additions and 67 deletions

View File

@ -1,3 +1,10 @@
2014-07-30 Jason Merrill <jason@redhat.com>
PR c++/61659
PR c++/61687
Revert:
* c.opt (-fuse-all-virtuals): New.
2014-07-30 Tom Tromey <tromey@redhat.com>
PR c/59855

View File

@ -1276,10 +1276,6 @@ funsigned-char
C ObjC C++ ObjC++ LTO Var(flag_signed_char, 0)
Make \"char\" unsigned by default
fuse-all-virtuals
C++ ObjC++ Var(flag_use_all_virtuals) Init(1)
Treat all virtual functions as odr-used
fuse-cxa-atexit
C++ ObjC++ Var(flag_use_cxa_atexit) Init(DEFAULT_USE_CXA_ATEXIT)
Use __cxa_atexit to register destructors

View File

@ -1,5 +1,14 @@
2014-07-30 Jason Merrill <jason@redhat.com>
PR c++/61659
PR c++/61687
Revert:
* decl2.c (mark_all_virtuals): New variable.
(maybe_emit_vtables): Check it instead of flag_devirtualize.
(cp_write_global_declarations): Set it and give helpful diagnostic
if it introduces errors.
* class.c (finish_struct_1): Check it.
PR lto/53808
PR c++/61659
* pt.c (push_template_decl_real): Set DECL_COMDAT on templates.

View File

@ -6408,7 +6408,7 @@ finish_struct_1 (tree t)
in every translation unit where the class definition appears. If
we're devirtualizing, we can look into the vtable even if we
aren't emitting it. */
if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE || flag_use_all_virtuals)
if (CLASSTYPE_KEY_METHOD (t) == NULL_TREE)
keyed_classes = tree_cons (NULL_TREE, t, keyed_classes);
}

View File

@ -106,11 +106,6 @@ static GTY(()) vec<tree, va_gc> *no_linkage_decls;
/* Nonzero if we're done parsing and into end-of-file activities. */
int at_eof;
/* Nonzero if we've instantiated everything used directly, and now want to
mark all virtual functions as used so that they are available for
devirtualization. */
static int mark_all_virtuals;
/* Return a member function type (a METHOD_TYPE), given FNTYPE (a
@ -2020,15 +2015,6 @@ maybe_emit_vtables (tree ctype)
if (DECL_COMDAT (primary_vtbl)
&& CLASSTYPE_DEBUG_REQUESTED (ctype))
note_debug_info_needed (ctype);
if (mark_all_virtuals && !DECL_ODR_USED (primary_vtbl))
{
/* Make sure virtual functions get instantiated/synthesized so that
they can be inlined after devirtualization even if the vtable is
never emitted. */
mark_used (primary_vtbl);
mark_vtable_entries (primary_vtbl);
return true;
}
return false;
}
@ -4345,8 +4331,6 @@ cp_write_global_declarations (void)
instantiated, etc., etc. */
emit_support_tinfos ();
int errs = errorcount + sorrycount;
bool explained_devirt = false;
do
{
@ -4579,27 +4563,6 @@ cp_write_global_declarations (void)
pending_statics->length ()))
reconsider = true;
if (flag_use_all_virtuals)
{
if (!reconsider && !mark_all_virtuals)
{
mark_all_virtuals = true;
reconsider = true;
errs = errorcount + sorrycount;
}
else if (mark_all_virtuals
&& !explained_devirt
&& (errorcount + sorrycount > errs))
{
inform (global_dc->last_location, "this error is seen due to "
"instantiation of all virtual functions, which the C++ "
"standard says are always considered used; this is done "
"to support devirtualization optimizations, but can be "
"disabled with -fno-use-all-virtuals");
explained_devirt = true;
}
}
retries++;
}
while (reconsider);

View File

@ -189,7 +189,7 @@ in the following sections.
-fno-pretty-templates @gol
-frepo -fno-rtti -fstats -ftemplate-backtrace-limit=@var{n} @gol
-ftemplate-depth=@var{n} @gol
-fno-threadsafe-statics -fno-use-all-virtuals -fuse-cxa-atexit @gol
-fno-threadsafe-statics -fuse-cxa-atexit @gol
-fno-weak -nostdinc++ @gol
-fvisibility-inlines-hidden @gol
-fvtable-verify=@var{std|preinit|none} @gol
@ -2319,16 +2319,6 @@ ABI for thread-safe initialization of local statics. You can use this
option to reduce code size slightly in code that doesn't need to be
thread-safe.
@item -fno-use-all-virtuals
@opindex fno-use-all-virtuals
By default, G++ now treats all virtual functions declared in a
translation unit as odr-used, so they will be instantiated or
synthesized if possible even if they are not needed for the final
output. This is done so that such functions can be inlined after
devirtualization changes an indirect call into a direct call. If this
instantiation and synthesis prevents your code from compiling
successfully, you can disable it with this option.
@item -fuse-cxa-atexit
@opindex fuse-cxa-atexit
Register destructors for objects with static storage duration with the

View File

@ -1,5 +1,4 @@
// PR c++/60347
// { dg-options "-fno-use-all-virtuals" }
struct A;

View File

@ -1,13 +0,0 @@
// PR c++/60347
// { dg-options "-fuse-all-virtuals" }
struct A;
template <class T>
struct B
{
T* p;
virtual ~B() { p->~T(); } // { dg-error "incomplete" }
};
struct C: B<A> { };