This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch] [c++/debug info]
- From: Catherine Moore <clm at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Catherine Moore <clm at codesourcery dot com>
- Date: Mon, 16 Feb 2009 16:41:35 -0500
- Subject: [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 */
};