re PR c++/15428 (vtables shouldn't always be weak on Darwin)

PR c++/15428
	* default.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): New name
	for TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY, with reversed sense.
	* config/darwin.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): Likewise.
	* doc/tm.texi (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): Rewrite
	documentation to reflect the new macro name and to clarify its
	meaning.
	* cp/decl2.c (maybe_emit_vtables): If TARGET_WEAK_NOT_IN_ARCHIVE_TOC
	is nonzero, and if we see a noninline definition of a key method,
	make the vtables nonweak.

From-SVN: r82610
This commit is contained in:
Matt Austern 2004-06-03 23:15:01 +00:00 committed by Matt Austern
parent c073ab616f
commit 0524c91d1e
6 changed files with 70 additions and 18 deletions

View File

@ -1,3 +1,13 @@
2004-06-03 Matt Austern <austern@apple.com>
PR c++/15428
* default.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): New name
for TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY, with reversed sense.
* config/darwin.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): Likewise.
* doc/tm.texi (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): Rewrite
documentation to reflect the new macro name and to clarify its
meaning.
2004-06-04 Steven Bosscher <stevenb@suse.de>
* rtl.def (VAR_LOCATION): Make RTX_EXTRA.

View File

@ -358,11 +358,10 @@ do { text_section (); \
#undef USE_COMMON_FOR_ONE_ONLY
#define USE_COMMON_FOR_ONE_ONLY 0
/* The Darwin linker doesn't like explicit template instantiations to be
coalesced, because it doesn't want coalesced symbols to appear in
/* The Darwin linker doesn't want coalesced symbols to appear in
a static archive's table of contents. */
#undef TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY
#define TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY 0
#undef TARGET_WEAK_NOT_IN_ARCHIVE_TOC
#define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 1
/* We make exception information linkonce. */
#undef TARGET_USES_WEAK_UNWIND_INFO

View File

@ -1,3 +1,10 @@
2004-06-03 Matt Austern <austern@apple.com>
PR c++/15428
* decl2.c (maybe_emit_vtables): If TARGET_WEAK_NOT_IN_ARCHIVE_TOC
is nonzero, and if we see a noninline definition of a key method,
make the vtables nonweak.
2004-06-02 Matt Austern <austern@apple.com>
* cp-tree.h (instantiate_decl): new boolean parameter,

View File

@ -1441,7 +1441,7 @@ maybe_make_one_only (tree decl)
to for variables so that cp_finish_decl will update their linkage,
because their DECL_INITIAL may not have been set properly yet. */
if (TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY
if (!TARGET_WEAK_NOT_IN_ARCHIVE_TOC
|| (! DECL_EXPLICIT_INSTANTIATION (decl)
&& ! DECL_TEMPLATE_SPECIALIZATION (decl)))
{
@ -1582,6 +1582,7 @@ maybe_emit_vtables (tree ctype)
tree vtbl;
tree primary_vtbl;
bool needed = false;
bool weaken_vtables;
/* If the vtables for this class have already been emitted there is
nothing more to do. */
@ -1612,6 +1613,29 @@ maybe_emit_vtables (tree ctype)
else if (TREE_PUBLIC (vtbl) && !DECL_COMDAT (vtbl))
needed = true;
/* Determine whether to make vtables weak. The ABI requires that we
do so. There are two cases in which we have to violate the ABI
specification: targets where we don't have weak symbols
(obviously), and targets where weak symbols don't appear in
static archives' tables of contents. On such targets, avoiding
undefined symbol link errors requires that we only make a symbol
weak if we know that it will be emitted everywhere it's needed.
So on such targets we don't make vtables weak in the common case
where we're emitting a vtable of a nontemplate class in the
translation unit containing the definition of a noninline key
method. */
if (flag_weak && !TARGET_WEAK_NOT_IN_ARCHIVE_TOC)
weaken_vtables = true;
else if (flag_weak)
{
if (CLASSTYPE_USE_TEMPLATE (ctype))
weaken_vtables = CLASSTYPE_IMPLICIT_INSTANTIATION (ctype);
else
weaken_vtables = !CLASSTYPE_KEY_METHOD (ctype)
|| DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (ctype));
}
else
weaken_vtables = false;
/* The ABI requires that we emit all of the vtables if we emit any
of them. */
@ -1658,8 +1682,8 @@ maybe_emit_vtables (tree ctype)
DECL_IGNORED_P (vtbl) = 1;
}
/* Always make vtables weak. */
if (flag_weak)
/* Always make vtables weak. Or at least almost always; see above. */
if (weaken_vtables)
comdat_linkage (vtbl);
rest_of_decl_compilation (vtbl, NULL, 1, 1);

View File

@ -238,11 +238,13 @@ do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
#endif
#endif
/* Determines whether explicit template instantiations should
be given link-once semantics. The C++ ABI requires this
macro to be nonzero; see the documentation. */
#ifndef TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY
# define TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY 1
/* This determines whether weak symbols must be left out of a static
archive's table of contents. Defining this macro to be nonzero has
the consequence that certain symbols will not be made weak that
otherwise would be. The C++ ABI requires this macro to be zero;
see the documentation. */
#ifndef TARGET_WEAK_NOT_IN_ARCHIVE_TOC
#define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 0
#endif
/* This determines whether or not we need linkonce unwind information */

View File

@ -6753,13 +6753,23 @@ commands that will make the symbol(s) associated with @var{decl} have
hidden, protected or internal visibility as specified by @var{visibility}.
@end deftypefn
@defmac TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY
@defmac TARGET_WEAK_NOT_IN_ARCHIVE_TOC
A C expression that evaluates to true if the target's linker expects
explicit template specializations, as well as implicit, to be given
linkonce semantics. The default is @code{1}. The C++ ABI requires
this macro to be nonzero. Define this macro for targets where full
C++ ABI compliance is impossible and where explicit and implicit
template specialization must be treated differently.
that weak symbols do not appear in a static archive's table of contents.
The default is @code{0}.
Leaving weak symbols out of an archive's table of contents means that,
if a symbol will only have a definition in one translation unit and
will have undefined references from other translation units, that
symbol should not be weak. Defining this macro to be nonzero will
thus have the effect that certain symbols that would normally be weak
(explicit template instantiations, and vtables for polymorphic classes
with noninline key methods) will instead be nonweak.
The C++ ABI requires this macro to be zero. Define this macro for
targets where full C++ ABI compliance is impossible and where linker
restrictions require weak symbols to be left out of a static archive's
table of contents.
@end defmac
@defmac TARGET_SUPPORTS_HIDDEN