From: Jason Merrill Date: Fri, 19 Dec 1997 08:38:33 +0000 (+0000) Subject: cp-tree.h (struct lang_decl_flags): Add comdat. X-Git-Tag: prereleases/egcs-1.0.1-prerelease~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fb7f625d374775e8dca50d5e39536ed2b9edc2d8;p=thirdparty%2Fgcc.git 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: r17149 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a6c118c93cc3..14cd582b524c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ Fri Dec 19 09:37:26 1997 Jason Merrill + * 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. + * except.c (expand_start_catch_block): suspend_momentary for the terminate handler. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 47b9fe6062ef..67cc22face89 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; @@ -1420,6 +1421,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 b60f842fa43b..193a6fd74863 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) @@ -6716,6 +6717,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 4513f75df56e..8beec1359dc8 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2769,26 +2769,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;