From 2b59501bf6ed69ff30931024cf346ba6592ba9be Mon Sep 17 00:00:00 2001
From: Matt Austern <austern@apple.com>
Date: Tue, 18 Feb 2003 18:50:05 +0000
Subject: [PATCH] langhooks.h, [...]: introduce new langhook...

       * langhooks.h, langhooks-def.h: introduce new langhook,
       final_write_globals, with write_global_declarations as default.
       * toplev.c: Move invocation of wrapup_global_declarations from
       compile_file to new function, write_global_declarations.  Change
       compile_file to use final_write_globals hook.  Change
       wrapup_global_declarations so writing to DECL_DEFER_OUTPUT is
       conditional.

       * cp/cp-lang.c: Change lang hooks so that final_write_globals does
       nothing for C++.
       * cp/decl.c (wrapup_globals_for_namespace): Remove special
       handling of global namespace.

From-SVN: r63051
---
 gcc/ChangeLog       | 10 +++++++
 gcc/cp/ChangeLog    |  7 +++++
 gcc/cp/cp-lang.c    |  3 +++
 gcc/cp/decl.c       |  4 ---
 gcc/langhooks-def.h |  7 ++++-
 gcc/langhooks.h     |  4 +++
 gcc/toplev.c        | 64 +++++++++++++++++++++++++--------------------
 7 files changed, 65 insertions(+), 34 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39529c2f7191..051a5d0b62ce 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2003-02-18  Matt Austern <austern@apple.com>
+	
+	* langhooks.h, langhooks-def.h: introduce new langhook,
+	final_write_globals, with write_global_declarations as default.
+	* toplev.c: Move invocation of wrapup_global_declarations from
+	compile_file to new function, write_global_declarations.  Change
+	compile_file to use final_write_globals hook.  Change
+	wrapup_global_declarations so writing to DECL_DEFER_OUTPUT is
+	conditional. 
+	
 2003-02-18  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
 	* pa.md: Correct and enhance comment.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 61ed974aec3a..73676fc06681 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2003-02-18  Matt Austern <austern@apple.com>
+	
+	* cp/cp-lang.c: Change lang hooks so that final_write_globals does
+	nothing for C++.
+	* cp/decl.c (wrapup_globals_for_namespace): Remove special
+	handling of global namespace.
+	
 2003-02-18  Geoffrey Keating  <geoffk@apple.com>
 
 	* cp-tree.h (rid_to_yy): Delete.
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 6dc03082eaed..3671027ebe6b 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -92,6 +92,9 @@ static bool cp_var_mod_type_p (tree);
 #define LANG_HOOKS_PRINT_ERROR_FUNCTION	cxx_print_error_function
 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
+#undef LANG_HOOKS_WRITE_GLOBALS
+#define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing
+
 
 #undef LANG_HOOKS_FUNCTION_INIT
 #define LANG_HOOKS_FUNCTION_INIT cxx_push_function_context
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index adde6280a1de..94cd4c3e7d2b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1855,10 +1855,6 @@ wrapup_globals_for_namespace (tree namespace, void* data)
   tree decl;
   int last_time = (data != 0);
 
-  if (last_time && namespace == global_namespace)
-    /* Let compile_file handle the global namespace.  */
-    return 0;
-
   /* Process the decls in reverse order--earliest first.
      Put them into VEC from back to front, then take out from front.  */       
   for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index c38fdd8c1f64..6fc10603a7f8 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -82,6 +82,9 @@ int lhd_tree_inlining_start_inlining		PARAMS ((tree));
 void lhd_tree_inlining_end_inlining		PARAMS ((tree));
 tree lhd_tree_inlining_convert_parm_for_inlining PARAMS ((tree, tree, tree));
 
+/* In toplev.c */
+void write_global_declarations PARAMS ((void));
+
 #define LANG_HOOKS_NAME			"GNU unknown"
 #define LANG_HOOKS_IDENTIFIER_SIZE	sizeof (struct lang_identifier)
 #define LANG_HOOKS_INIT			lhd_do_nothing
@@ -217,6 +220,7 @@ int lhd_tree_dump_type_quals			PARAMS ((tree));
 #define LANG_HOOKS_PUSHDECL	pushdecl
 #define LANG_HOOKS_GETDECLS	getdecls
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl
+#define LANG_HOOKS_WRITE_GLOBALS write_global_declarations
 
 #define LANG_HOOKS_DECLS { \
   LANG_HOOKS_PUSHLEVEL, \
@@ -226,7 +230,8 @@ int lhd_tree_dump_type_quals			PARAMS ((tree));
   LANG_HOOKS_SET_BLOCK, \
   LANG_HOOKS_PUSHDECL, \
   LANG_HOOKS_GETDECLS, \
-  LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL \
+  LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL, \
+  LANG_HOOKS_WRITE_GLOBALS \
 }
 
 /* The whole thing.  The structure is defined in langhooks.h.  */
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 3118d2cfc696..4e2685b81464 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -176,6 +176,10 @@ struct lang_hooks_for_decls
   /* Returns true when we should warn for an unused global DECL.
      We will already have checked that it has static binding.  */
   bool (*warn_unused_global) PARAMS ((tree));
+
+  /* Obtain a list of globals and do final output on them at end
+     of compilation */
+  void (*final_write_globals) PARAMS ((void));
 };
 
 /* Language-specific hooks.  See langhooks-def.h for defaults.  */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 0e05323503e8..09e67b35dcf8 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1933,8 +1933,10 @@ wrapup_global_declarations (vec, len)
     {
       decl = vec[i];
 
-      /* We're not deferring this any longer.  */
-      DECL_DEFER_OUTPUT (decl) = 0;
+      /* We're not deferring this any longer.  Assignment is
+	 conditional to avoid needlessly dirtying PCH pages. */
+      if (DECL_DEFER_OUTPUT (decl) != 0)
+	DECL_DEFER_OUTPUT (decl) = 0;
 
       if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0)
 	(*lang_hooks.finish_incomplete_decl) (decl);
@@ -2141,8 +2143,6 @@ pop_srcloc ()
 static void
 compile_file ()
 {
-  tree globals;
-
   /* Initialize yet another pass.  */
 
   init_final (main_input_filename);
@@ -2165,25 +2165,7 @@ compile_file ()
   if (flag_syntax_only)
     return;
 
-  globals = (*lang_hooks.decls.getdecls) ();
-
-  /* Really define vars that have had only a tentative definition.
-     Really output inline functions that must actually be callable
-     and have not been output so far.  */
-
-  {
-    int len = list_length (globals);
-    tree *vec = (tree *) xmalloc (sizeof (tree) * len);
-    int i;
-    tree decl;
-
-    /* Process the decls in reverse order--earliest first.
-       Put them into VEC from back to front, then take out from front.  */
-
-    for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
-      vec[len - i - 1] = decl;
-
-    wrapup_global_declarations (vec, len);
+  (*lang_hooks.decls.final_write_globals)();
 
     if (profile_arc_flag)
       /* This must occur after the loop to output deferred functions.
@@ -2191,12 +2173,6 @@ compile_file ()
          functions in this compilation unit were deferred.  */
       create_profiler ();
 
-    check_global_declarations (vec, len);
-
-    /* Clean up.  */
-    free (vec);
-  }
-
   /* Write out any pending weak symbol declarations.  */
 
   weak_finish ();
@@ -2248,6 +2224,36 @@ compile_file ()
       timevar_pop (TV_DUMP);
     }
 }
+
+/* Default for lang_hooks.decls.final_write_globals */
+void write_global_declarations ()
+{
+  tree globals = (*lang_hooks.decls.getdecls) ();
+
+  /* Really define vars that have had only a tentative definition.
+     Really output inline functions that must actually be callable
+     and have not been output so far.  */
+
+  {
+    int len = list_length (globals);
+    tree *vec = (tree *) xmalloc (sizeof (tree) * len);
+    int i;
+    tree decl;
+
+    /* Process the decls in reverse order--earliest first.
+       Put them into VEC from back to front, then take out from front.  */
+
+    for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
+      vec[len - i - 1] = decl;
+
+    wrapup_global_declarations (vec, len);
+
+    check_global_declarations (vec, len);
+
+    /* Clean up.  */
+    free (vec);
+  }
+}
 
 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
    and TYPE_DECL nodes.
-- 
GitLab