Commit a85ce59d by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/51950 (fdebug-types-section regression for member pointers)

	PR debug/51950
	* dwarf2out.c (clone_tree_hash): New function.
	(copy_decls_walk): Use it instead of clone_tree.

From-SVN: r184224
parent 317ea7c0
2012-02-14 Jakub Jelinek <jakub@redhat.com>
PR debug/51950
* dwarf2out.c (clone_tree_hash): New function.
(copy_decls_walk): Use it instead of clone_tree.
2012-02-14 Richard Guenther <rguenther@suse.de> 2012-02-14 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52244 PR tree-optimization/52244
......
...@@ -7407,6 +7407,32 @@ copy_ancestor_tree (dw_die_ref unit, dw_die_ref die, htab_t decl_table) ...@@ -7407,6 +7407,32 @@ copy_ancestor_tree (dw_die_ref unit, dw_die_ref die, htab_t decl_table)
return copy; return copy;
} }
/* Like clone_tree, but additionally enter all the children into
the hash table decl_table. */
static dw_die_ref
clone_tree_hash (dw_die_ref die, htab_t decl_table)
{
dw_die_ref c;
dw_die_ref clone = clone_die (die);
struct decl_table_entry *entry;
void **slot = htab_find_slot_with_hash (decl_table, die,
htab_hash_pointer (die), INSERT);
/* Assert that DIE isn't in the hash table yet. If it would be there
before, the ancestors would be necessarily there as well, therefore
clone_tree_hash wouldn't be called. */
gcc_assert (*slot == HTAB_EMPTY_ENTRY);
entry = XCNEW (struct decl_table_entry);
entry->orig = die;
entry->copy = clone;
*slot = entry;
FOR_EACH_CHILD (die, c,
add_child_die (clone, clone_tree_hash (c, decl_table)));
return clone;
}
/* Walk the DIE and its children, looking for references to incomplete /* Walk the DIE and its children, looking for references to incomplete
or trivial types that are unmarked (i.e., that are not in the current or trivial types that are unmarked (i.e., that are not in the current
type_unit). */ type_unit). */
...@@ -7443,7 +7469,11 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, htab_t decl_table) ...@@ -7443,7 +7469,11 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, htab_t decl_table)
else else
{ {
dw_die_ref parent = unit; dw_die_ref parent = unit;
dw_die_ref copy = clone_tree (targ); dw_die_ref copy = clone_die (targ);
FOR_EACH_CHILD (targ, c,
add_child_die (copy,
clone_tree_hash (c, decl_table)));
/* Make sure the cloned tree is marked as part of the /* Make sure the cloned tree is marked as part of the
type unit. */ type unit. */
......
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