Commit 331c7fcd by Eric Botcazou Committed by Eric Botcazou

lto-streamer.c [...] (tree_htab, [...]): New tree hash table.

	* lto-streamer.c [LTO_STREAMER_DEBUG] (tree_htab, tree_hash_entry,
	hash_tree, eq_tree): New tree hash table.
	(lto_streamer_init) [LTO_STREAMER_DEBUG]: Initialize it.
	[LTO_STREAMER_DEBUG] (lto_orig_address_map, lto_orig_address_get,
	lto_orig_address_remove): Reimplement.

From-SVN: r158836
parent 34f97b94
2010-04-28 Eric Botcazou <ebotcazou@adacore.com>
* lto-streamer.c [LTO_STREAMER_DEBUG] (tree_htab, tree_hash_entry,
hash_tree, eq_tree): New tree hash table.
(lto_streamer_init) [LTO_STREAMER_DEBUG]: Initialize it.
[LTO_STREAMER_DEBUG] (lto_orig_address_map, lto_orig_address_get,
lto_orig_address_remove): Reimplement.
2010-04-28 Xinliang David Li <davidxl@google.com> 2010-04-28 Xinliang David Li <davidxl@google.com>
PR c/42643 PR c/42643
......
...@@ -785,6 +785,31 @@ lto_streamer_cache_delete (struct lto_streamer_cache_d *c) ...@@ -785,6 +785,31 @@ lto_streamer_cache_delete (struct lto_streamer_cache_d *c)
} }
#ifdef LTO_STREAMER_DEBUG
static htab_t tree_htab;
struct tree_hash_entry
{
tree key;
intptr_t value;
};
static hashval_t
hash_tree (const void *p)
{
const struct tree_hash_entry *e = (const struct tree_hash_entry *) p;
return htab_hash_pointer (e->key);
}
static int
eq_tree (const void *p1, const void *p2)
{
const struct tree_hash_entry *e1 = (const struct tree_hash_entry *) p1;
const struct tree_hash_entry *e2 = (const struct tree_hash_entry *) p2;
return (e1->key == e2->key);
}
#endif
/* Initialization common to the LTO reader and writer. */ /* Initialization common to the LTO reader and writer. */
void void
...@@ -795,6 +820,10 @@ lto_streamer_init (void) ...@@ -795,6 +820,10 @@ lto_streamer_init (void)
new TS_* astructure is added, the streamer should be updated to new TS_* astructure is added, the streamer should be updated to
handle it. */ handle it. */
check_handled_ts_structures (); check_handled_ts_structures ();
#ifdef LTO_STREAMER_DEBUG
tree_htab = htab_create (31, hash_tree, eq_tree, NULL);
#endif
} }
...@@ -823,10 +852,16 @@ gate_lto_out (void) ...@@ -823,10 +852,16 @@ gate_lto_out (void)
void void
lto_orig_address_map (tree t, intptr_t orig_t) lto_orig_address_map (tree t, intptr_t orig_t)
{ {
/* FIXME lto. Using the annotation field is quite hacky as it relies struct tree_hash_entry ent;
on the GC not running while T is being rematerialized. It would struct tree_hash_entry **slot;
be cleaner to use a hash table here. */
t->base.ann = (union tree_ann_d *) orig_t; ent.key = t;
ent.value = orig_t;
slot
= (struct tree_hash_entry **) htab_find_slot (tree_htab, &ent, INSERT);
gcc_assert (!*slot);
*slot = XNEW (struct tree_hash_entry);
**slot = ent;
} }
...@@ -836,7 +871,13 @@ lto_orig_address_map (tree t, intptr_t orig_t) ...@@ -836,7 +871,13 @@ lto_orig_address_map (tree t, intptr_t orig_t)
intptr_t intptr_t
lto_orig_address_get (tree t) lto_orig_address_get (tree t)
{ {
return (intptr_t) t->base.ann; struct tree_hash_entry ent;
struct tree_hash_entry **slot;
ent.key = t;
slot
= (struct tree_hash_entry **) htab_find_slot (tree_htab, &ent, NO_INSERT);
return (slot ? (*slot)->value : 0);
} }
...@@ -845,7 +886,15 @@ lto_orig_address_get (tree t) ...@@ -845,7 +886,15 @@ lto_orig_address_get (tree t)
void void
lto_orig_address_remove (tree t) lto_orig_address_remove (tree t)
{ {
t->base.ann = NULL; struct tree_hash_entry ent;
struct tree_hash_entry **slot;
ent.key = t;
slot
= (struct tree_hash_entry **) htab_find_slot (tree_htab, &ent, NO_INSERT);
gcc_assert (slot);
free (*slot);
htab_clear_slot (tree_htab, (PTR *)slot);
} }
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment