diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47f1ce6cc9e..fa122a9da70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2009-04-15 Catherine Moore + + * 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. + 2009-04-15 Michael Eager * config/rs6000/rs6000.c: rs6000_function_value: set function return diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5ab9392849b..2c13e84b64c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8828,8 +8828,13 @@ grokdeclarator (const cp_declarator *declarator, /* Replace the anonymous name with the real name everywhere. */ for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) - if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) - TYPE_NAME (t) = decl; + { + if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) + { + debug_hooks->set_name (t, decl); + TYPE_NAME (t) = decl; + } + } if (TYPE_LANG_SPECIFIC (type)) TYPE_WAS_ANONYMOUS (type) = 1; diff --git a/gcc/dbxout.c b/gcc/dbxout.c index babba15f8a5..dc63c7c80c4 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -376,6 +376,7 @@ const struct gcc_debug_hooks dbx_debug_hooks = 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 */ diff --git a/gcc/debug.c b/gcc/debug.c index e0beaa94b08..3946debc519 100644 --- a/gcc/debug.c +++ b/gcc/debug.c @@ -50,6 +50,7 @@ const struct gcc_debug_hooks do_nothing_debug_hooks = 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_UNUSED) { } +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, diff --git a/gcc/debug.h b/gcc/debug.h index e1ee12e829d..1169c51a66b 100644 --- a/gcc/debug.h +++ b/gcc/debug.h @@ -126,6 +126,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; @@ -140,6 +142,7 @@ extern void debug_nothing_int_charstar (unsigned int, const char *); 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); diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 7d82c47679a..81a5062fc20 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4549,6 +4549,7 @@ static void dwarf2out_imported_module_or_decl_1 (tree, tree, tree, 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. */ @@ -4582,6 +4583,7 @@ const struct gcc_debug_hooks dwarf2_debug_hooks = debug_nothing_int, /* handle_pch */ dwarf2out_var_location, dwarf2out_switch_text_section, + dwarf2out_set_name, 1 /* start_end_main_source_file */ }; #endif @@ -5929,12 +5931,9 @@ debug_str_eq (const void *x1, const void *x2) (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; @@ -5955,6 +5954,18 @@ add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str) 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; @@ -15763,6 +15774,31 @@ maybe_emit_file (struct dwarf_file_data * fd) 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. */ diff --git a/gcc/sdbout.c b/gcc/sdbout.c index 1b64a50f7ca..9874db7d0c0 100644 --- a/gcc/sdbout.c +++ b/gcc/sdbout.c @@ -337,6 +337,7 @@ const struct gcc_debug_hooks sdb_debug_hooks = 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 */ }; diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c index c655caa53b9..134c7d99225 100644 --- a/gcc/vmsdbgout.c +++ b/gcc/vmsdbgout.c @@ -211,6 +211,7 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks 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 */ };