OSDN Git Service

* cpppch.c (reset_ht): Remove.
authoraustern <austern@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Apr 2003 21:00:56 +0000 (21:00 +0000)
committeraustern <austern@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Apr 2003 21:00:56 +0000 (21:00 +0000)
(cpp_read_state): Remove loop to reset hashtable identifiers.
* ggc-common.c (gt_pch_save): Add call to gt_pch_fixup_stringpool
after pch file is written.
* ggc.h (gt_pch_fixup_stringpool): Declare.
* stringpool.c (ht_copy_and_clear): Define.  Callback.  Copy
hashnode's value to another hashtable, then clear the original.
(saved_ident_hash): Define.
(gt_pch_save_stringpool): Create saved_ident_hash, use it to
store definitions in ident_hash, and clear ident_hash.
(gt_pch_fixup_stringpool): Define.  Restore definitions from
saved_ident_hash to ident_hash, then destroy saved_ident_hash.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65215 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cpppch.c
gcc/ggc-common.c
gcc/ggc.h
gcc/stringpool.c

index a02b55c..0760413 100644 (file)
@@ -1,3 +1,18 @@
+2003-04-03  Matt Austern  <austern@apple.com>
+
+       * cpppch.c (reset_ht): Remove.
+       (cpp_read_state): Remove loop to reset hashtable identifiers.
+       * ggc-common.c (gt_pch_save): Add call to gt_pch_fixup_stringpool
+       after pch file is written.
+       * ggc.h (gt_pch_fixup_stringpool): Declare.
+       * stringpool.c (ht_copy_and_clear): Define.  Callback.  Copy
+       hashnode's value to another hashtable, then clear the original.
+       (saved_ident_hash): Define.
+       (gt_pch_save_stringpool): Create saved_ident_hash, use it to
+       store definitions in ident_hash, and clear ident_hash.
+       (gt_pch_fixup_stringpool): Define.  Restore definitions from
+       saved_ident_hash to ident_hash, then destroy saved_ident_hash.
+
 Thu Apr  3 22:27:40 CEST 2003  Jan Hubicka  <jh@suse.cz>
 
        * cfgrtl.c (update_bb_for_insn): Do not set block for barriers.
index 0ee04ea..637160c 100644 (file)
@@ -34,7 +34,6 @@ static int comp_hashnodes PARAMS ((const void *, const void *));
 static int collect_ht_nodes PARAMS ((cpp_reader *, cpp_hashnode *, void *));
 static int write_defs PARAMS ((cpp_reader *, cpp_hashnode *, void *));
 static int save_macros PARAMS ((cpp_reader *, cpp_hashnode *, void *));
-static int reset_ht PARAMS ((cpp_reader *, cpp_hashnode *, void *));
 
 /* This structure represents a macro definition on disk.  */
 struct macrodef_struct 
@@ -628,23 +627,6 @@ cpp_prepare_state (r, data)
   *data = d;
 }
 
-/* Erase all the existing macros and assertions.  */
-
-static int 
-reset_ht (r, h, unused)
-     cpp_reader *r ATTRIBUTE_UNUSED;
-     cpp_hashnode *h;
-     void *unused ATTRIBUTE_UNUSED;
-{
-  if (h->type != NT_VOID
-      && (h->flags & NODE_BUILTIN) == 0)
-    {
-      h->type = NT_VOID;
-      memset (&h->value, 0, sizeof (h->value));
-    }
-  return 1;
-}
-
 /* Given a precompiled header that was previously determined to be valid,
    apply all its definitions (and undefinitions) to the current state. 
    DEPNAME is passed to deps_restore.  */
@@ -664,11 +646,6 @@ cpp_read_state (r, name, f, data)
   size_t i, mac_count;
   int saved_line = r->line;
 
-  /* Erase all the existing hashtable entries for macros.  At this
-     point, they're all from the PCH file, and their pointers won't be
-     valid.  */
-  cpp_forall_identifiers (r, reset_ht, NULL);
-
   /* Restore spec_nodes, which will be full of references to the old 
      hashtable entries and so will now be invalid.  */
   {
index b1c3c61..db8cbd0 100644 (file)
@@ -543,6 +543,7 @@ gt_pch_save (f)
        memcpy (state.ptrs[i]->obj, this_object, state.ptrs[i]->size);
     }
   ggc_pch_finish (state.d, state.f);
+  gt_pch_fixup_stringpool ();
 
   free (state.ptrs);
   htab_delete (saving_htab);
index 17b8e72..e1364a3 100644 (file)
--- a/gcc/ggc.h
+++ b/gcc/ggc.h
@@ -124,6 +124,7 @@ extern void ggc_mark_roots          PARAMS ((void));
 /* Save and restore the string pool entries for PCH.  */
 
 extern void gt_pch_save_stringpool     PARAMS ((void));
+extern void gt_pch_fixup_stringpool     PARAMS ((void));
 extern void gt_pch_restore_stringpool  PARAMS ((void));
 
 /* PCH and GGC handling for strings, mostly trivial.  */
index 1edb46f..afb9bdb 100644 (file)
@@ -34,6 +34,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "ggc.h"
 #include "tree.h"
 #include "hashtable.h"
+#include "cpplib.h"
 
 /* The "" allocated string.  */
 const char empty_string[] = "";
@@ -50,6 +51,7 @@ static struct obstack string_stack;
 
 static hashnode alloc_node PARAMS ((hash_table *));
 static int mark_ident PARAMS ((struct cpp_reader *, hashnode, const PTR));
+static int ht_copy_and_clear PARAMS ((struct cpp_reader *, hashnode, const void *));
 
 /* Initialize the string pool.  */
 void
@@ -214,6 +216,33 @@ struct string_pool_data GTY(())
 
 static GTY(()) struct string_pool_data * spd;
 
+static int 
+ht_copy_and_clear (r, hp, ht2_p)
+     cpp_reader *r ATTRIBUTE_UNUSED;
+     hashnode hp;
+     const void *ht2_p;
+{
+  cpp_hashnode *h = CPP_HASHNODE (hp);
+  struct ht *ht2 = (struct ht *) ht2_p;
+
+  if (h->type != NT_VOID
+      && (h->flags & NODE_BUILTIN) == 0)
+    {
+      cpp_hashnode *h2 = CPP_HASHNODE (ht_lookup (ht2,
+                                                 NODE_NAME (h),
+                                                 NODE_LEN (h),
+                                                 HT_ALLOC));
+      h2->type = h->type;
+      memcpy (&h2->value, &h->value, sizeof (h->value));
+
+      h->type = NT_VOID;
+      memset (&h->value, 0, sizeof (h->value));
+    }
+  return 1;
+}
+
+static struct ht *saved_ident_hash;
+
 void
 gt_pch_save_stringpool ()
 {
@@ -228,6 +257,18 @@ gt_pch_save_stringpool ()
       spd->entries[i] = HT_IDENT_TO_GCC_IDENT (ident_hash->entries[i]);
     else
       spd->entries[i] = NULL;
+
+  saved_ident_hash = ht_create (14);
+  saved_ident_hash->alloc_node = alloc_node;
+  ht_forall (ident_hash, ht_copy_and_clear, saved_ident_hash);
+}
+
+void
+gt_pch_fixup_stringpool ()
+{
+  ht_forall (saved_ident_hash, ht_copy_and_clear, ident_hash);
+  ht_destroy (saved_ident_hash);
+  saved_ident_hash = 0;
 }
 
 void