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
This commit is contained in:
Matt Austern 2003-04-03 21:00:56 +00:00 committed by Matt Austern
parent bcc53e2a94
commit d24ecd21b3
5 changed files with 58 additions and 23 deletions

View 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.

View 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. */
{

View 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);

View File

@ -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. */

View 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