aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-05-16 00:48:52 -0400
committerJason Merrill <jason@gcc.gnu.org>2002-05-16 00:48:52 -0400
commitff48be5c7926b0a806d99a63500e5937601f6865 (patch)
treed488aa103427f298f243322a5f33bd64a0eed7b9 /gcc
parent57cb4fe5b89460fd505d84bb85303e8c40d20fa7 (diff)
downloadgcc-ff48be5c7926b0a806d99a63500e5937601f6865.zip
gcc-ff48be5c7926b0a806d99a63500e5937601f6865.tar.gz
gcc-ff48be5c7926b0a806d99a63500e5937601f6865.tar.bz2
rtti.c (get_tinfo_decl): Don't call comdat_linkage.
* cp/rtti.c (get_tinfo_decl): Don't call comdat_linkage. Do set DECL_COMDAT. (synthesize_tinfo_var): Take the public decl. (create_real_tinfo_var): Likewise. Check DECL_COMDAT. (emit_tinfo_decl): Adjust. Call import_export_decl. * cp/decl2.c (import_export_decl): Simplify tinfo decl handling. * config/mips/mips.c (mips_output_external): Don't do sdata optimization for a variable with DECL_COMDAT set. From-SVN: r53506
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/mips/mips.c1
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl2.c23
-rw-r--r--gcc/cp/rtti.c42
5 files changed, 48 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8d45451b..0e8dd8a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-05-16 Jason Merrill <jason@redhat.com>
+
+ * config/mips/mips.c (mips_output_external): Don't do sdata
+ optimization for a variable with DECL_COMDAT set.
+
2002-05-15 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/altivec.h: Cleanups for tighter typechecking.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index d523e13..72f3325 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -6035,6 +6035,7 @@ mips_output_external (file, decl, name)
if (TARGET_GP_OPT
&& TREE_CODE (decl) != FUNCTION_DECL
+ && !DECL_COMDAT (decl)
&& (len = int_size_in_bytes (TREE_TYPE (decl))) > 0
&& ((section_name = DECL_SECTION_NAME (decl)) == NULL
|| strcmp (TREE_STRING_POINTER (section_name), ".sbss") == 0
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b5dcccd..0f5673e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2002-05-14 Jason Merrill <jason@redhat.com>
+
+ * rtti.c (get_tinfo_decl): Don't call comdat_linkage.
+ Do set DECL_COMDAT.
+ (synthesize_tinfo_var): Take the public decl.
+ (create_real_tinfo_var): Likewise. Check DECL_COMDAT.
+ (emit_tinfo_decl): Adjust. Call import_export_decl.
+ * decl2.c (import_export_decl): Simplify tinfo decl handling.
+
2002-05-14 Alexandre Oliva <aoliva@redhat.com>
* cp-tree.h (struct lang_type): Added non_zero_init.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 2054a37..ee10fff 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -2509,6 +2509,11 @@ import_export_decl (decl)
}
else if (tinfo_decl_p (decl, 0))
{
+ /* Here, we only decide whether or not the tinfo node should be
+ emitted with the vtable. The decl we're considering isn't
+ actually the one which gets emitted; that one is generated in
+ create_real_tinfo_var. */
+
tree ctype = TREE_TYPE (DECL_NAME (decl));
if (IS_AGGR_TYPE (ctype))
@@ -2528,20 +2533,14 @@ import_export_decl (decl)
&& same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
{
DECL_NOT_REALLY_EXTERN (decl)
- = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
- || (DECL_DECLARED_INLINE_P (decl)
- && ! flag_implement_inlines
- && !DECL_VINDEX (decl)));
-
- /* Always make artificials weak. */
- if (flag_weak)
- comdat_linkage (decl);
+ = ! CLASSTYPE_INTERFACE_ONLY (ctype);
+ DECL_COMDAT (decl) = 0;
}
- else if (TYPE_BUILT_IN (ctype)
- && same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
- DECL_NOT_REALLY_EXTERN (decl) = 0;
else
- comdat_linkage (decl);
+ {
+ DECL_NOT_REALLY_EXTERN (decl) = 1;
+ DECL_COMDAT (decl) = 1;
+ }
}
else
comdat_linkage (decl);
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 16df801..8e4e7a1 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -59,7 +59,7 @@ static tree dfs_class_hint_mark PARAMS ((tree, void *));
static tree dfs_class_hint_unmark PARAMS ((tree, void *));
static int class_hint_flags PARAMS((tree));
static tree class_initializer PARAMS((tree, tree, tree));
-static tree synthesize_tinfo_var PARAMS((tree, tree));
+static tree synthesize_tinfo_var PARAMS((tree));
static tree create_real_tinfo_var PARAMS((tree, tree, tree, tree, int));
static tree create_pseudo_type_info PARAMS((const char *, int, ...));
static tree get_vmi_pseudo_type_info PARAMS((int));
@@ -309,9 +309,8 @@ get_tinfo_decl (type)
TREE_STATIC (d) = 1;
DECL_EXTERNAL (d) = 1;
TREE_PUBLIC (d) = 1;
- if (flag_weak || !typeinfo_in_lib_p (type))
- comdat_linkage (d);
SET_DECL_ASSEMBLER_NAME (d, name);
+ DECL_COMDAT (d) = 1;
cp_finish_decl (d, NULL_TREE, NULL_TREE, 0);
pushdecl_top_level (d);
@@ -929,19 +928,23 @@ typeinfo_in_lib_p (type)
}
/* Generate a pseudo_type_info VAR_DECL suitable for the supplied
- TARGET_TYPE and given the REAL_NAME. This is the structure expected by
+ TARGET_TYPE and corresponding to PUBLIC_DECL. This is the structure expected by
the runtime, and therefore has additional fields. If we need not emit a
definition (because the runtime must contain it), return NULL_TREE,
otherwise return the VAR_DECL. */
static tree
-synthesize_tinfo_var (target_type, real_name)
- tree target_type;
- tree real_name;
+synthesize_tinfo_var (public_decl)
+ tree public_decl;
{
tree var_init = NULL_TREE;
tree var_type = NULL_TREE;
int non_public = 0;
+ tree target_type = TREE_TYPE (DECL_NAME (public_decl));
+ my_friendly_assert (target_type != NULL_TREE, 20000120);
+
+ /* Say we've dealt with it. */
+ TREE_TYPE (DECL_NAME (public_decl)) = NULL_TREE;
switch (TREE_CODE (target_type))
{
@@ -1079,7 +1082,7 @@ synthesize_tinfo_var (target_type, real_name)
}
return create_real_tinfo_var (target_type,
- real_name, TINFO_PSEUDO_TYPE (var_type),
+ public_decl, TINFO_PSEUDO_TYPE (var_type),
var_init, non_public);
}
@@ -1087,9 +1090,9 @@ synthesize_tinfo_var (target_type, real_name)
make this variable public (comdat). */
static tree
-create_real_tinfo_var (target_type, name, type, init, non_public)
+create_real_tinfo_var (target_type, public_decl, type, init, non_public)
tree target_type;
- tree name;
+ tree public_decl;
tree type;
tree init;
int non_public;
@@ -1098,6 +1101,7 @@ create_real_tinfo_var (target_type, name, type, init, non_public)
tree decl;
tree hidden_name;
char hidden[30];
+ tree name = DECL_ASSEMBLER_NAME (public_decl);
/* We cannot give this the name NAME, as that already is globally
bound to the tinfo_decl we originally created for this type in
@@ -1115,7 +1119,8 @@ create_real_tinfo_var (target_type, name, type, init, non_public)
if (!non_public)
{
TREE_PUBLIC (decl) = 1;
- if (flag_weak || !typeinfo_in_lib_p (target_type))
+ if (flag_weak
+ || (DECL_COMDAT (public_decl) && !typeinfo_in_lib_p (target_type)))
comdat_linkage (decl);
}
SET_DECL_ASSEMBLER_NAME (decl, name);
@@ -1457,19 +1462,16 @@ emit_tinfo_decl (decl_ptr, data)
void *data ATTRIBUTE_UNUSED;
{
tree tinfo_decl = *decl_ptr;
- tree tinfo_type, decl;
+ tree decl;
my_friendly_assert (TREE_TYPE (tinfo_decl) == tinfo_decl_type, 20000121);
- tinfo_type = TREE_TYPE (DECL_NAME (tinfo_decl));
- my_friendly_assert (tinfo_type != NULL_TREE, 20000120);
-
- if (!DECL_NEEDED_P (tinfo_decl))
+
+ import_export_decl (tinfo_decl);
+ if (DECL_REALLY_EXTERN (tinfo_decl) || !DECL_NEEDED_P (tinfo_decl))
return 0;
- /* Say we've dealt with it. */
- TREE_TYPE (DECL_NAME (tinfo_decl)) = NULL_TREE;
-
+
create_tinfo_types ();
- decl = synthesize_tinfo_var (tinfo_type, DECL_ASSEMBLER_NAME (tinfo_decl));
+ decl = synthesize_tinfo_var (tinfo_decl);
return decl != 0;
}