Fix PR debug/PR46973

gcc/

	* dwarf2out.c (prune_unused_types_mark_generic_parms_dies): New
	static function.
	(prune_unused_types_mark): Use it.

gcc/testsuite/

	* g++.dg/debug/dwarf2/template-params-9.C: New test.

From-SVN: r168743
This commit is contained in:
Dodji Seketeli 2011-01-13 09:48:04 +00:00 committed by Dodji Seketeli
parent 9b0f04e708
commit 71d1227667
4 changed files with 71 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2011-01-13 Dodji Seketeli <dodji@redhat.com>
PR debug/PR46973
* dwarf2out.c (prune_unused_types_mark_generic_parms_dies): New
static function.
(prune_unused_types_mark): Use it.
2011-01-13 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/45352

View File

@ -6477,6 +6477,7 @@ static void output_loc_list (dw_loc_list_ref);
static char *gen_internal_sym (const char *);
static void prune_unmark_dies (dw_die_ref);
static void prune_unused_types_mark_generic_parms_dies (dw_die_ref);
static void prune_unused_types_mark (dw_die_ref, int);
static void prune_unused_types_walk (dw_die_ref);
static void prune_unused_types_walk_attribs (dw_die_ref);
@ -22245,6 +22246,32 @@ prune_unused_types_walk_attribs (dw_die_ref die)
}
}
/* Mark the generic parameters and arguments children DIEs of DIE. */
static void
prune_unused_types_mark_generic_parms_dies (dw_die_ref die)
{
dw_die_ref c;
if (die == NULL || die->die_child == NULL)
return;
c = die->die_child;
do
{
switch (c->die_tag)
{
case DW_TAG_template_type_param:
case DW_TAG_template_value_param:
case DW_TAG_GNU_template_template_param:
case DW_TAG_GNU_template_parameter_pack:
prune_unused_types_mark (c, 1);
break;
default:
break;
}
c = c->die_sib;
} while (c && c != die->die_child);
}
/* Mark DIE as being used. If DOKIDS is true, then walk down
to DIE's children. */
@ -22258,6 +22285,10 @@ prune_unused_types_mark (dw_die_ref die, int dokids)
{
/* We haven't done this node yet. Mark it as used. */
die->die_mark = 1;
/* If this is the DIE of a generic type instantiation,
mark the children DIEs that describe its generic parms and
args. */
prune_unused_types_mark_generic_parms_dies (die);
/* We also have to mark its parents as used.
(But we don't want to mark our parents' kids due to this.) */

View File

@ -1,3 +1,8 @@
2011-01-13 Dodji Seketeli <dodji@redhat.com>
PR debug/PR46973
* g++.dg/debug/dwarf2/template-params-9.C: New test.
2011-01-13 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/45352

View File

@ -0,0 +1,28 @@
// Origin PR debug/PR46973
// { dg-options "-g -dA" }
// { dg-do compile }
struct S
{
int f;
};
template<typename T, int I, int *P, int S::*MP>
struct Base
{
template<typename Z>
struct Inner
{
};
};
int a_global;
int main ()
{
Base<long, 47, &a_global, &S::f>::Inner<float> inner;
return 0;
}
// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_type_param" 2 } }
// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 3 } }