From 8cf8d8a27b3eb2b183511a3e2f449985a7aa320b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 26 Feb 2001 06:11:38 -0500 Subject: [PATCH] c-decl.c (finish_decl): Set DECL_DEFER_OUTPUT on tentative file-scope definitions. * c-decl.c (finish_decl): Set DECL_DEFER_OUTPUT on tentative file-scope definitions. * toplev.c (rest_of_decl_compilation): Check DECL_DEFER_OUTPUT to recognize a tentative definition. Lose obsolete code. * toplev.c (wrapup_global_declarations): Don't emit DECL_COMDAT variables unless necessary, either. From-SVN: r40066 --- gcc/ChangeLog | 10 ++++++++++ gcc/c-decl.c | 14 +++++++++++--- gcc/toplev.c | 23 +++++++---------------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3648e8aa9da..22467dca8e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2001-02-26 Jason Merrill + + * c-decl.c (finish_decl): Set DECL_DEFER_OUTPUT on tentative file-scope + definitions. + * toplev.c (rest_of_decl_compilation): Check DECL_DEFER_OUTPUT to + recognize a tentative definition. Lose obsolete code. + + * toplev.c (wrapup_global_declarations): Don't emit DECL_COMDAT + variables unless necessary, either. + 2001-02-25 Richard Henderson * ifcvt.c (struct noce_if_info): Add test_bb. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index cd6929f8576..c5420b09131 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3612,9 +3612,17 @@ finish_decl (decl, init, asmspec_tree) maybe_objc_check_decl (decl); if (!DECL_CONTEXT (decl)) - rest_of_decl_compilation (decl, asmspec, - (DECL_CONTEXT (decl) == 0 - || TREE_ASM_WRITTEN (decl)), 0); + { + if (DECL_INITIAL (decl) == NULL_TREE + || DECL_INITIAL (decl) == error_mark_node) + /* Don't output anything + when a tentative file-scope definition is seen. + But at end of compilation, do output code for them. */ + DECL_DEFER_OUTPUT (decl) = 1; + rest_of_decl_compilation (decl, asmspec, + (DECL_CONTEXT (decl) == 0 + || TREE_ASM_WRITTEN (decl)), 0); + } else { if (asmspec) diff --git a/gcc/toplev.c b/gcc/toplev.c index cc50fce594f..924c50bc1fb 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1940,8 +1940,8 @@ wrapup_global_declarations (vec, len) defined in a main file, as opposed to an include file. */ if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl) - && (! TREE_READONLY (decl) - || TREE_PUBLIC (decl) + && (((! TREE_READONLY (decl) || TREE_PUBLIC (decl)) + && !DECL_COMDAT (decl)) || (!optimize && flag_keep_static_consts && !DECL_ARTIFICIAL (decl)) @@ -2562,20 +2562,11 @@ rest_of_decl_compilation (decl, asmspec, top_level, at_end) { timevar_push (TV_VARCONST); make_decl_rtl (decl, asmspec); - /* Initialized extern variable exists to be replaced - with its value, or represents something that will be - output in another file. */ - if (! (TREE_CODE (decl) == VAR_DECL - && DECL_EXTERNAL (decl) && TREE_READONLY (decl) - && DECL_INITIAL (decl) != 0 - && DECL_INITIAL (decl) != error_mark_node)) - /* Don't output anything - when a tentative file-scope definition is seen. - But at end of compilation, do output code for them. */ - if (! (! at_end && top_level - && (DECL_INITIAL (decl) == 0 - || DECL_INITIAL (decl) == error_mark_node))) - assemble_variable (decl, top_level, at_end, 0); + /* Don't output anything + when a tentative file-scope definition is seen. + But at end of compilation, do output code for them. */ + if (at_end || !DECL_DEFER_OUTPUT (decl)) + assemble_variable (decl, top_level, at_end, 0); if (decl == last_assemble_variable_decl) { ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,