aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/dwarf2out.c31
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C28
4 files changed, 71 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b22f65e..2ae8613 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 7e64b37..ca17967 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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.) */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0e0721c..f0b7c33 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
new file mode 100644
index 0000000..7af1d91
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
@@ -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 } }