This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] [c++/debug info]


This patch corrects a couple of gdb test failures:

gdb.cp/inherit.exp: ptype tagless struct
gdb.cp/inherit.exp: ptype variable of type tagless struct

that occur due to incomplete debug information. The debug information is incomplete because the die for the structure is created before the typedef processing is complete. This patch creates a new debug hook that allows us to go back and patch the die after completing the typedef processing.

I testing this for i686-linux and mips-sde-elf.

Does this loook okay to install and for which branches (if any)?

Thanks,
Catherine

2009-02-13 Catherine Moore <clm@codesourcery.com>

        * debug.h (set_name):  Declare.
        * dwarf2out.c (dwarf2out_set_name): Declare.
        (dwarf2_debug_hooks): Add set_name.
        (find_AT_string): New.
        (add_AT_string): Call find_AT_string.
        (dwarf2out_set_name): New.
        * cp/decl.c (grokdeclarator): Call set_name.
        * vmsdbgout.c (vmsdbg_debug_hooks): Add set_name_debug_nothing.
        * debug.c (do_nothing_debug_hooks):  Likewise.
        * dbxout.c (dbx_debug_hooks): Likewise.
        * sdbout.c (sdb_debug_hooks): Likewise.
Index: vmsdbgout.c
===================================================================
--- vmsdbgout.c	(revision 144105)
+++ vmsdbgout.c	(working copy)
@@ -211,6 +211,7 @@ const struct gcc_debug_hooks vmsdbg_debu
    debug_nothing_int,		  /* handle_pch */
    debug_nothing_rtx,		  /* var_location */
    debug_nothing_void,            /* switch_text_section */
+   debug_nothing_tree_tree,	  /* set_name */
    0                              /* start_end_main_source_file */
 };
 
Index: debug.c
===================================================================
--- debug.c	(revision 144105)
+++ debug.c	(working copy)
@@ -49,6 +49,7 @@ const struct gcc_debug_hooks do_nothing_
   debug_nothing_int,		         /* handle_pch */
   debug_nothing_rtx,		         /* var_location */
   debug_nothing_void,                    /* switch_text_section */
+  debug_nothing_tree_tree,		 /* set_name */
   0                                      /* start_end_main_source_file */
 };
 
@@ -66,6 +67,12 @@ debug_nothing_tree (tree decl ATTRIBUTE_
 }
 
 void
+debug_nothing_tree_tree (tree t1 ATTRIBUTE_UNUSED,
+			 tree t2 ATTRIBUTE_UNUSED)
+{
+}
+
+void
 debug_nothing_tree_tree_tree_bool (tree t1 ATTRIBUTE_UNUSED,
 				   tree t2 ATTRIBUTE_UNUSED,
 				   tree t3 ATTRIBUTE_UNUSED,
Index: debug.h
===================================================================
--- debug.h	(revision 144105)
+++ debug.h	(working copy)
@@ -125,6 +125,8 @@ struct gcc_debug_hooks
      text sections.  */
   void (* switch_text_section) (void);
 
+  void (* set_name) (tree, tree);
+
   /* This is 1 if the debug writer wants to see start and end commands for the
      main source files, and 0 otherwise.  */
   int start_end_main_source_file;
@@ -139,6 +141,7 @@ extern void debug_nothing_int_charstar (
 extern void debug_nothing_int (unsigned int);
 extern void debug_nothing_int_int (unsigned int, unsigned int);
 extern void debug_nothing_tree (tree);
+extern void debug_nothing_tree_tree (tree, tree);
 extern void debug_nothing_tree_int (tree, int);
 extern void debug_nothing_tree_tree_tree_bool (tree, tree, tree, bool);
 extern bool debug_true_const_tree (const_tree);
Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 144105)
+++ cp/decl.c	(working copy)
@@ -8768,8 +8768,14 @@ grokdeclarator (const cp_declarator *dec
 
 	  /* Replace the anonymous name with the real name everywhere.  */
 	  for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
-	    if (TYPE_NAME (t) == oldname)
-	      TYPE_NAME (t) = decl;
+	    {
+	      if (TYPE_NAME (t) == oldname)
+		{
+		  debug_hooks->set_name (t, decl);
+	          TYPE_NAME (t) = decl;
+		}
+	    }
+		  
 
 	  if (TYPE_LANG_SPECIFIC (type))
 	    TYPE_WAS_ANONYMOUS (type) = 1;
Index: dbxout.c
===================================================================
--- dbxout.c	(revision 144105)
+++ dbxout.c	(working copy)
@@ -376,6 +376,7 @@ const struct gcc_debug_hooks dbx_debug_h
   dbxout_handle_pch,		         /* handle_pch */
   debug_nothing_rtx,		         /* var_location */
   debug_nothing_void,                    /* switch_text_section */
+  debug_nothing_tree_tree,		 /* set_name */
   0                                      /* start_end_main_source_file */
 };
 #endif /* DBX_DEBUGGING_INFO  */
Index: dwarf2out.c
===================================================================
--- dwarf2out.c	(revision 144105)
+++ dwarf2out.c	(working copy)
@@ -4538,6 +4538,7 @@ static void dwarf2out_imported_module_or
 static void dwarf2out_abstract_function (tree);
 static void dwarf2out_var_location (rtx);
 static void dwarf2out_begin_function (tree);
+static void dwarf2out_set_name (tree, tree);
 
 /* The debug hooks structure.  */
 
@@ -4571,6 +4572,7 @@ const struct gcc_debug_hooks dwarf2_debu
   debug_nothing_int,		/* handle_pch */
   dwarf2out_var_location,
   dwarf2out_switch_text_section,
+  dwarf2out_set_name,
   1                             /* start_end_main_source_file */
 };
 #endif
@@ -5965,12 +5967,9 @@ debug_str_eq (const void *x1, const void
 		 (const char *)x2) == 0;
 }
 
-/* Add a string attribute value to a DIE.  */
-
-static inline void
-add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
+static struct indirect_string_node *
+find_AT_string (const char *str)
 {
-  dw_attr_node attr;
   struct indirect_string_node *node;
   void **slot;
 
@@ -5991,6 +5990,18 @@ add_AT_string (dw_die_ref die, enum dwar
     node = (struct indirect_string_node *) *slot;
 
   node->refcount++;
+  return node;
+}
+
+/* Add a string attribute value to a DIE.  */
+
+static inline void
+add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
+{
+  dw_attr_node attr;
+  struct indirect_string_node *node;
+
+  node = find_AT_string (str);
 
   attr.dw_attr = attr_kind;
   attr.dw_attr_val.val_class = dw_val_class_str;
@@ -15842,6 +15853,31 @@ maybe_emit_file (struct dwarf_file_data 
   return fd->emitted_number;
 }
 
+/* Replace DW_AT_name for the decl with name.  */
+ 
+static void
+dwarf2out_set_name (tree decl, tree name)
+{
+  dw_die_ref die;
+  dw_attr_ref attr;
+
+  die = TYPE_SYMTAB_DIE (decl);
+  if (!die)
+    return;
+
+  attr = get_AT (die, DW_AT_name);
+  if (attr)
+    {
+      struct indirect_string_node *node;
+
+      node = find_AT_string (dwarf2_name (name, 0));
+      /* replace the string.  */
+      attr->dw_attr_val.v.val_str = node;
+    }
+
+  else
+    add_name_attribute (die, dwarf2_name (name, 0));
+}
 /* Called by the final INSN scan whenever we see a var location.  We
    use it to drop labels in the right places, and throw the location in
    our lookup table.  */
Index: sdbout.c
===================================================================
--- sdbout.c	(revision 144105)
+++ sdbout.c	(working copy)
@@ -336,6 +336,7 @@ const struct gcc_debug_hooks sdb_debug_h
   debug_nothing_int,		         /* handle_pch */
   debug_nothing_rtx,		         /* var_location */
   debug_nothing_void,                    /* switch_text_section */
+  debug_nothing_tree_tree,		 /* set_name */
   0                                      /* start_end_main_source_file */
 };
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]