aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1997-11-27 19:26:15 +0000
committerJason Merrill <jason@gcc.gnu.org>1997-11-27 14:26:15 -0500
commit77be6f82096e0dea19e96225f5c24740ec6090fb (patch)
treefea0b573019967579efbc59afc9bfd8483d47b27 /gcc/cp
parent80c2681c0aa9298df4ad2f5ff580ec82f1b74534 (diff)
downloadgcc-77be6f82096e0dea19e96225f5c24740ec6090fb.zip
gcc-77be6f82096e0dea19e96225f5c24740ec6090fb.tar.gz
gcc-77be6f82096e0dea19e96225f5c24740ec6090fb.tar.bz2
cp-tree.h (struct lang_decl_flags): Add comdat.
* cp-tree.h (struct lang_decl_flags): Add comdat. (DECL_COMDAT): New macro. * decl.c (duplicate_decls): Propagate it. (cp_finish_decl): Handle it. * decl2.c (import_export_decl): Just set DECL_COMDAT on VAR_DECLs. From-SVN: r16804
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h17
-rw-r--r--gcc/cp/decl.c27
-rw-r--r--gcc/cp/decl2.c20
-rw-r--r--gcc/cp/pt.c1
5 files changed, 40 insertions, 31 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a62a398..53d2fdf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
Thu Nov 27 00:59:46 1997 Jason Merrill <jason@yorick.cygnus.com>
+ * cp-tree.h (struct lang_decl_flags): Add comdat.
+ (DECL_COMDAT): New macro.
+ * decl.c (duplicate_decls): Propagate it.
+ (cp_finish_decl): Handle it.
+ * decl2.c (import_export_decl): Just set DECL_COMDAT on VAR_DECLs.
+
* class.c: Remove static pending_hard_virtuals.
(add_virtual_function): Take pointers to pending_virtuals
and pending_hard_virtuals.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 47b9fe6..9b69b7b 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -943,7 +943,8 @@ struct lang_decl_flags
unsigned nonconverting : 1;
unsigned declared_inline : 1;
unsigned not_really_extern : 1;
- unsigned dummy : 5;
+ unsigned comdat : 1;
+ unsigned dummy : 4;
tree access;
tree context;
@@ -1148,16 +1149,6 @@ struct lang_decl
one that does). */
#define TYPE_VIRTUAL_P(NODE) (TREE_LANG_FLAG_2 (NODE))
-#if 0
-/* Same, but tells if this field is private in current context. */
-#define DECL_PRIVATE(NODE) (FOO)
-
-/* Same, but tells if this field is private in current context. */
-#define DECL_PROTECTED(NODE) (DECL_LANG_FLAG_6 (NODE))
-
-#define DECL_PUBLIC(NODE) (DECL_LANG_FLAG_7 (NODE))
-#endif
-
extern int flag_new_for_scope;
/* This flag is true of a local VAR_DECL if it was declared in a for
@@ -1420,6 +1411,10 @@ extern int flag_new_for_scope;
#define DECL_REALLY_EXTERN(NODE) \
(DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE))
+/* Used to tell cp_finish_decl that it should approximate comdat linkage
+ as best it can for this decl. */
+#define DECL_COMDAT(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.comdat)
+
#define THUNK_DELTA(DECL) ((DECL)->decl.frame_size.i)
/* ...and for unexpanded-parameterized-type nodes. */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 7b2e1c2..2a57fa9 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2853,6 +2853,7 @@ duplicate_decls (newdecl, olddecl)
{
DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
+ DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl);
}
if (TREE_CODE (newdecl) == FUNCTION_DECL)
@@ -6720,6 +6721,32 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
cp_warning_at ("sorry: semantics of inline function static data `%#D' are wrong (you'll wind up with multiple copies)", decl);
}
+ else if (TREE_CODE (decl) == VAR_DECL
+ && DECL_LANG_SPECIFIC (decl)
+ && DECL_COMDAT (decl))
+ {
+ /* Dynamically initialized vars go into common. */
+ if (DECL_INITIAL (decl) == NULL_TREE
+ || DECL_INITIAL (decl) == error_mark_node)
+ DECL_COMMON (decl) = 1;
+ else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
+ {
+ DECL_COMMON (decl) = 1;
+ DECL_INITIAL (decl) = error_mark_node;
+ }
+ else
+ {
+ /* Statically initialized vars are weak or comdat, if
+ supported. */
+ if (flag_weak)
+ make_decl_one_only (decl);
+ else
+ /* we can't do anything useful; leave vars for explicit
+ instantiation. */
+ DECL_EXTERNAL (decl) = 1;
+ }
+ }
+
if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
make_decl_rtl (decl, NULL_PTR, toplev);
else if (TREE_CODE (decl) == VAR_DECL
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index a2821ee..93452b2 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2776,26 +2776,8 @@ import_export_decl (decl)
{
if (TREE_CODE (decl) == FUNCTION_DECL)
comdat_linkage (decl);
- /* Dynamically initialized vars go into common. */
- else if (DECL_INITIAL (decl) == NULL_TREE
- || DECL_INITIAL (decl) == error_mark_node)
- DECL_COMMON (decl) = 1;
- else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
- {
- DECL_COMMON (decl) = 1;
- DECL_INITIAL (decl) = error_mark_node;
- }
else
- {
- /* Statically initialized vars are weak or comdat, if
- supported. */
- if (flag_weak)
- make_decl_one_only (decl);
- else
- /* we can't do anything useful; leave vars for explicit
- instantiation. */
- DECL_NOT_REALLY_EXTERN (decl) = 0;
- }
+ DECL_COMDAT (decl) = 1;
}
else
DECL_NOT_REALLY_EXTERN (decl) = 0;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 370c9e2..3b56dac 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4497,7 +4497,6 @@ instantiate_decl (d)
popclass (1);
}
- /* import_export_decl has to happen after DECL_INITIAL is set up. */
if (pattern_defined)
{
repo_template_used (d);