+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>
#include "output.h"
#include "except.h"
#include "expr.h"
+#include "defaults.h"
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
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,
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
{
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))
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;
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);
*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)
{
/* 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);
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)