aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Austern <austern@apple.com>2003-04-03 21:00:56 +0000
committerMatt Austern <austern@gcc.gnu.org>2003-04-03 21:00:56 +0000
commitd24ecd21b30e9e914788443666912d4dee5be6bc (patch)
treedbb1adecad038d29321ac64a1fb29c837c4b0c87
parentbcc53e2a94852391230761e15c044cd48797d4d1 (diff)
downloadgcc-d24ecd21b30e9e914788443666912d4dee5be6bc.zip
gcc-d24ecd21b30e9e914788443666912d4dee5be6bc.tar.gz
gcc-d24ecd21b30e9e914788443666912d4dee5be6bc.tar.bz2
cpppch.c (reset_ht): Remove.
* 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. From-SVN: r65215
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/cpppch.c23
-rw-r--r--gcc/ggc-common.c1
-rw-r--r--gcc/ggc.h1
-rw-r--r--gcc/stringpool.c41
5 files changed, 58 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a02b55c..0760413 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cpppch.c b/gcc/cpppch.c
index 0ee04ea..637160c 100644
--- a/gcc/cpppch.c
+++ b/gcc/cpppch.c
@@ -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. */
{
diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c
index b1c3c61..db8cbd0 100644
--- a/gcc/ggc-common.c
+++ b/gcc/ggc-common.c
@@ -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);
diff --git a/gcc/ggc.h b/gcc/ggc.h
index 17b8e72..e1364a3 100644
--- 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. */
diff --git a/gcc/stringpool.c b/gcc/stringpool.c
index 1edb46f..afb9bdb 100644
--- a/gcc/stringpool.c
+++ b/gcc/stringpool.c
@@ -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