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>
PR c/42643
......
......@@ -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. */
void
......@@ -795,6 +820,10 @@ lto_streamer_init (void)
new TS_* astructure is added, the streamer should be updated to
handle it. */
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)
void
lto_orig_address_map (tree t, intptr_t orig_t)
{
/* FIXME lto. Using the annotation field is quite hacky as it relies
on the GC not running while T is being rematerialized. It would
be cleaner to use a hash table here. */
t->base.ann = (union tree_ann_d *) orig_t;
struct tree_hash_entry ent;
struct tree_hash_entry **slot;
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)
intptr_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)
void
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
......
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