Patchwork DWARF2 patch for debug/49090

login
register
mail settings
Submitter Jason Merrill
Date March 16, 2013, 6:36 p.m.
Message ID <5144BBBD.9090109@redhat.com>
Download mbox | patch
Permalink /patch/228236/
State New
Headers show

Comments

Jason Merrill - March 16, 2013, 6:36 p.m.
The GDB team asked for some indication that a 
DW_TAG_template_*_parameter node represents a default template argument 
rather than one supplied by the user; I think that using 
DW_AT_default_value as a flag makes sense here.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit 2500158c694114e1f5a627c26e55d936de21905e
Author: Jason Merrill <jason@redhat.com>
Date:   Fri Feb 1 14:47:14 2013 -0500

    	PR debug/49090
    	* dwarf2out.c (gen_generic_params_dies): Indicate default arguments
    	with DW_AT_default_value.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index d7faaac..51e5737 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -10238,6 +10238,7 @@  gen_generic_params_dies (tree t)
   tree parms, args;
   int parms_num, i;
   dw_die_ref die = NULL;
+  int non_default;
 
   if (!t || (TYPE_P (t) && !COMPLETE_TYPE_P (t)))
     return;
@@ -10257,9 +10258,14 @@  gen_generic_params_dies (tree t)
 
   parms_num = TREE_VEC_LENGTH (parms);
   args = lang_hooks.get_innermost_generic_args (t);
+  if (TREE_CHAIN (args) && TREE_CODE (TREE_CHAIN (args)) == INTEGER_CST)
+    non_default = int_cst_value (TREE_CHAIN (args));
+  else
+    non_default = TREE_VEC_LENGTH (args);
   for (i = 0; i < parms_num; i++)
     {
       tree parm, arg, arg_pack_elems;
+      dw_die_ref parm_die;
 
       parm = TREE_VEC_ELT (parms, i);
       arg = TREE_VEC_ELT (args, i);
@@ -10274,12 +10280,14 @@  gen_generic_params_dies (tree t)
 	     pack elements of ARG. Note that ARG would then be
 	     an argument pack.  */
 	  if (arg_pack_elems)
-	    template_parameter_pack_die (TREE_VALUE (parm),
-					 arg_pack_elems,
-					 die);
+	    parm_die = template_parameter_pack_die (TREE_VALUE (parm),
+						    arg_pack_elems,
+						    die);
 	  else
-	    generic_parameter_die (TREE_VALUE (parm), arg,
-				   true /* Emit DW_AT_name */, die);
+	    parm_die = generic_parameter_die (TREE_VALUE (parm), arg,
+					      true /* emit name */, die);
+	  if (i >= non_default)
+	    add_AT_flag (parm_die, DW_AT_default_value, 1);
 	}
     }
 }
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 4bc1bd5..80d4ef3 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -407,8 +407,10 @@  struct lang_hooks
 
   struct lang_hooks_for_lto lto;
 
-  /* Returns the generic parameters of an instantiation of
-     a generic type or decl, e.g. C++ template instantiation.  */
+  /* Returns a TREE_VEC of the generic parameters of an instantiation of
+     a generic type or decl, e.g. C++ template instantiation.  If
+     TREE_CHAIN of the return value is set, it is an INTEGER_CST
+     indicating how many of the elements are non-default.  */
   tree (*get_innermost_generic_parms) (const_tree);
 
   /* Returns the TREE_VEC of arguments of an instantiation