re PR c++/15428 (vtables shouldn't always be weak on Darwin)
authorMatt Austern <austern@apple.com>
Thu, 3 Jun 2004 23:15:01 +0000 (23:15 +0000)
committerMatt Austern <austern@gcc.gnu.org>
Thu, 3 Jun 2004 23:15:01 +0000 (23:15 +0000)
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

gcc/ChangeLog
gcc/config/darwin.h
gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/defaults.h
gcc/doc/tm.texi

index dea0b8f79d2fa1a1deac12d1566c4249bfdbda21..614337b6c942b17881d0e5b9949a91d11fab1ced 100644 (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.
index 67bb29434bb72810f3fbbda59296099b657cf6ba..37122e6253c27d8dc4edb20d5a58e8c5e86ba1af 100644 (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
index 4eb93dcbcc6843b0b4c8c4837cc128e0f98e790a..652dc09a09e4e3794d78389f6b8e72f596e7a2c1 100644 (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,
index c5c4a55a1c4546812f567973be31277415275874..038fea00879669923dce363f14753aecf07f7554 100644 (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);
index cf8ad0881793e1b4c763176dfb88906a5d5d116c..e479affa4eff425562d36dcf9eba4caf9be44f51 100644 (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 */
index aee7ba87b7da872a8a79f12727c44d5111bfaf90..082de59446cb831a127b811c2869a0a249d5c396 100644 (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