diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d45451b494aaa3d97236dd4b9ea080f1f2c130b..0e8dd8a87d72836c14fe052c5dd7495090ef2799 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 d523e1323f6e1aea83e44d88b62a86336eb6fada..72f3325092625b536d2ed303198d91fc59fdc9c7 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 b5dcccdd596b762317dc4d04d9dc5808631fba13..0f5673e9cdc1d8848a7e3269982a3b3866326af2 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 2054a37e545208b5264f54d7336994ca50fdc40f..ee10fff29e3fa871ac6515ecbd7999855adf8147 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 16df801b0d0390727c1fa6fb57d8f6abef4d2213..8e4e7a196dccd85f76cb3cf784e9f3ab83586cbf 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; }