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:
parent
d5d0ed2d89
commit
a41844e513
8 changed files with 18 additions and 67 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
// PR c++/60347
|
||||
// { dg-options "-fno-use-all-virtuals" }
|
||||
|
||||
struct A;
|
||||
|
||||
|
|
|
@ -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> { };
|
Loading…
Add table
Reference in a new issue