aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2001-02-26 06:11:38 -0500
committerJason Merrill <jason@gcc.gnu.org>2001-02-26 06:11:38 -0500
commit8cf8d8a27b3eb2b183511a3e2f449985a7aa320b (patch)
treeea9f084f1be947aa45bc7aed9c4985df654130c7 /gcc
parente5dd4aad7f83c3257f4302e100b31690000e1a26 (diff)
downloadgcc-8cf8d8a27b3eb2b183511a3e2f449985a7aa320b.zip
gcc-8cf8d8a27b3eb2b183511a3e2f449985a7aa320b.tar.gz
gcc-8cf8d8a27b3eb2b183511a3e2f449985a7aa320b.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/c-decl.c14
-rw-r--r--gcc/toplev.c23
3 files changed, 28 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3648e8a..22467dc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2001-02-26 Jason Merrill <jason@redhat.com>
+
+ * 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 <rth@redhat.com>
* ifcvt.c (struct noce_if_info): Add test_bb.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index cd6929f..c5420b0 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 cc50fce..924c50b 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,