]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
decl2.c (comdat_linkage): Also set DECL_COMDAT.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 12 Feb 1998 19:57:24 +0000 (19:57 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 12 Feb 1998 19:57:24 +0000 (14:57 -0500)
* decl2.c (comdat_linkage): Also set DECL_COMDAT.
(finish_file): Check DECL_COMDAT instead of weak|one_only.
(import_export_vtable): Use make_decl_one_only instead of
  comdat_linkage for win32 tweak.
(import_export_decl): Likewise.
* pt.c (mark_decl_instantiated): Likewise.
* decl2.c (import_export_vtable): If we support one_only but not
weak symbols, mark instantiated template vtables one_only.
(import_export_decl): Likewise for tinfo functions.
(finish_vtable_vardecl): Also write out vtables from explicitly
instantiated template classes.
* pt.c (mark_class_instantiated): Revert last change.

From-SVN: r17883

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/pt.c

index 6d62f49ab376275218ab37c58a579a8204ce21dc..8ad0c805773f9ab84de0887c584da45c6929b212 100644 (file)
@@ -1,3 +1,21 @@
+Thu Dec 11 22:18:37 1997  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * decl2.c (comdat_linkage): Also set DECL_COMDAT.
+       (finish_file): Check DECL_COMDAT instead of weak|one_only.
+       (import_export_vtable): Use make_decl_one_only instead of
+       comdat_linkage for win32 tweak.
+       (import_export_decl): Likewise.
+       * pt.c (mark_decl_instantiated): Likewise.
+
+Wed Nov 26 20:28:49 1997  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * decl2.c (import_export_vtable): If we support one_only but not
+       weak symbols, mark instantiated template vtables one_only.
+       (import_export_decl): Likewise for tinfo functions.
+       (finish_vtable_vardecl): Also write out vtables from explicitly 
+       instantiated template classes.
+       * pt.c (mark_class_instantiated): Revert last change.
+
 Tue Feb 10 20:36:52 1998  Jason Merrill  <jason@yorick.cygnus.com>
                          Manfred Hollstein  <manfred@s-direktnet.de>
 
index 8beec1359dc8586c3bbb2b0d3b7236e0fdae58ba..b05a25c9cfd263209dcafa13eaaeec5833aecc80 100644 (file)
@@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA.  */
 #include "output.h"
 #include "except.h"
 #include "expr.h"
+#include "defaults.h"
 
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
@@ -2499,6 +2500,9 @@ comdat_linkage (decl)
     make_decl_one_only (decl);
   else
     TREE_PUBLIC (decl) = 0;
+
+  if (DECL_LANG_SPECIFIC (decl))
+    DECL_COMDAT (decl) = 1;
 }
 
 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
@@ -2528,6 +2532,12 @@ import_export_vtable (decl, type, final)
       TREE_PUBLIC (decl) = 1;
       DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
       DECL_INTERFACE_KNOWN (decl) = 1;
+
+      /* For WIN32 we also want to put explicit instantiations in
+        linkonce sections.  */
+      if (CLASSTYPE_EXPLICIT_INSTANTIATION (type)
+         && supports_one_only () && ! SUPPORTS_WEAK)
+       make_decl_one_only (decl);
     }
   else
     {
@@ -2619,6 +2629,7 @@ finish_vtable_vardecl (prev, vars)
   if (write_virtuals >= 0
       && ! DECL_EXTERNAL (vars)
       && ((TREE_PUBLIC (vars) && ! DECL_WEAK (vars) && ! DECL_ONE_ONLY (vars))
+         || CLASSTYPE_EXPLICIT_INSTANTIATION (DECL_CONTEXT (vars))
          || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))
          || (hack_decl_function_context (vars) && TREE_USED (vars)))
       && ! TREE_ASM_WRITTEN (vars))
@@ -2798,6 +2809,12 @@ import_export_decl (decl)
          DECL_NOT_REALLY_EXTERN (decl)
            = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
                 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
+
+         /* For WIN32 we also want to put explicit instantiations in
+            linkonce sections.  */
+         if (CLASSTYPE_EXPLICIT_INSTANTIATION (ctype)
+             && supports_one_only () && ! SUPPORTS_WEAK)
+           make_decl_one_only (decl);
        }
       else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype))
        DECL_NOT_REALLY_EXTERN (decl) = 0;
@@ -2950,18 +2967,6 @@ finish_file ()
   walk_vtables ((void (*) PROTO ((tree, tree))) 0,
                finish_prevtable_vardecl);
 
-  for (vars = pending_statics; vars; vars = TREE_CHAIN (vars))
-    {
-      tree decl = TREE_VALUE (vars);
-
-      if (DECL_TEMPLATE_INSTANTIATION (decl)
-         && ! DECL_IN_AGGR_P (decl))
-       {
-         import_export_decl (decl);
-         DECL_EXTERNAL (decl) = ! DECL_NOT_REALLY_EXTERN (decl);
-       }
-    }
-
   for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars))
     if (! TREE_ASM_WRITTEN (TREE_VALUE (vars)))
       rest_of_decl_compilation (TREE_VALUE (vars), 0, 1, 1);
@@ -3244,8 +3249,7 @@ finish_file ()
              *p = TREE_CHAIN (*p);
            else if (DECL_INITIAL (decl) == 0)
              p = &TREE_CHAIN (*p);
-           else if ((TREE_PUBLIC (decl) && ! DECL_WEAK (decl)
-                     && ! DECL_ONE_ONLY (decl))
+           else if ((TREE_PUBLIC (decl) && ! DECL_COMDAT (decl))
                     || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
                     || flag_keep_inline_functions)
              {
index 17427b833d159fcfff17b9505f88975434248fb1..946c1d6342000544773ddf8e40cbfcec8417703d 100644 (file)
@@ -3992,7 +3992,7 @@ mark_decl_instantiated (result, extern_p)
       /* For WIN32 we also want to put explicit instantiations in
         linkonce sections.  */
       if (supports_one_only () && ! SUPPORTS_WEAK)
-       comdat_linkage (result);
+       make_decl_one_only (result);
     }
   else if (TREE_CODE (result) == FUNCTION_DECL)
     mark_inline_for_output (result);
@@ -4326,16 +4326,8 @@ mark_class_instantiated (t, extern_p)
      int extern_p;
 {
   SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
-
-  if (supports_one_only () && ! SUPPORTS_WEAK)
-    /* For WIN32 we also want to put explicit instantiations in
-       linkonce sections.  */;
-  else
-    {
-      SET_CLASSTYPE_INTERFACE_KNOWN (t);
-      CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
-    }
-
+  SET_CLASSTYPE_INTERFACE_KNOWN (t);
+  CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
   CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p;
   TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p;
   if (! extern_p)