+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.
#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
+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,
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)))
{
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. */
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. */
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);
#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 */
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