diff options
author | Matt Austern <austern@apple.com> | 2003-04-03 21:00:56 +0000 |
---|---|---|
committer | Matt Austern <austern@gcc.gnu.org> | 2003-04-03 21:00:56 +0000 |
commit | d24ecd21b30e9e914788443666912d4dee5be6bc (patch) | |
tree | dbb1adecad038d29321ac64a1fb29c837c4b0c87 | |
parent | bcc53e2a94852391230761e15c044cd48797d4d1 (diff) | |
download | gcc-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/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/cpppch.c | 23 | ||||
-rw-r--r-- | gcc/ggc-common.c | 1 | ||||
-rw-r--r-- | gcc/ggc.h | 1 | ||||
-rw-r--r-- | gcc/stringpool.c | 41 |
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); @@ -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 |