diff options
author | Tom de Vries <tdevries@suse.de> | 2018-09-12 07:27:26 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2018-09-12 07:27:26 +0000 |
commit | 03e992aceab3207fa92d26c44dd5b4845f1c23ed (patch) | |
tree | 4d2f898a8a72ae8a0cc662e8064a1f6e04d02d8b /gcc | |
parent | 28aa63232068fa0adb8911b1987ff9efa0101750 (diff) | |
download | gcc-03e992aceab3207fa92d26c44dd5b4845f1c23ed.zip gcc-03e992aceab3207fa92d26c44dd5b4845f1c23ed.tar.gz gcc-03e992aceab3207fa92d26c44dd5b4845f1c23ed.tar.bz2 |
[debug] Add -gdescribe-dies
This patch adds option -gdescribe-dies. It sets the DW_AT_description
attribute of dies that do not get a DW_AT_name attribute, to make it easier
to figure out what the die is describing.
The option exports the names of artificial variables:
...
DIE 0: DW_TAG_variable (0x7fa934dd54b0)
+ DW_AT_description: "D.1922"
DW_AT_type: die -> 0 (0x7fa934dd0d70)
DW_AT_artificial: 1
...
which can be traced back to gimple dumps:
...
char a[0:D.1922] [value-expr: *a.0];
...
Furthermore, it adds names to external references:
...
DIE 0: DW_TAG_subprogram (0x7fa88b9650f0)
+DW_AT_description: "main"
DW_AT_abstract_origin: die -> label: vla_1.c.6719312a + 29 (0x7fa88b965140)
...
and likewise to DW_TAG_call_site_parameter DIEs.
Bootstrapped and reg-tested on x86_64.
2018-09-12 Tom de Vries <tdevries@suse.de>
* common.opt (gdescribe-dies): Add option.
* dwarf2out.c (add_name_and_src_coords_attributes): Add description
attribute for artifical and nameless decls.
(dwarf2out_register_external_die): Add description attribute to
external reference die.
(add_desc_attribute): New functions.
(gen_subprogram_die): Add description attribute to
DW_TAG_call_site_parameter.
* tree-pretty-print.c (print_generic_expr_to_str): New function.
* tree-pretty-print.h (print_generic_expr_to_str): Declare.
* doc/invoke.texi (@item Debugging Options): Add -gdescribe-dies and
-gno-describe-dies.
(@item -gdescribe-dies): Add.
From-SVN: r264229
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 8 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 57 | ||||
-rw-r--r-- | gcc/tree-pretty-print.c | 10 | ||||
-rw-r--r-- | gcc/tree-pretty-print.h | 1 |
6 files changed, 95 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3ed707..de60879 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2018-09-12 Tom de Vries <tdevries@suse.de> + + * common.opt (gdescribe-dies): Add option. + * dwarf2out.c (add_name_and_src_coords_attributes): Add description + attribute for artifical and nameless decls. + (dwarf2out_register_external_die): Add description attribute to + external reference die. + (add_desc_attribute): New functions. + (gen_subprogram_die): Add description attribute to + DW_TAG_call_site_parameter. + * tree-pretty-print.c (print_generic_expr_to_str): New function. + * tree-pretty-print.h (print_generic_expr_to_str): Declare. + * doc/invoke.texi (@item Debugging Options): Add -gdescribe-dies and + -gno-describe-dies. + (@item -gdescribe-dies): Add. + 2018-09-12 Aldy Hernandez <aldyh@redhat.com> * tree-vrp.c (vrp_shift_undefined_p): Remove. diff --git a/gcc/common.opt b/gcc/common.opt index ebc3ef4..ef6a630 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2976,6 +2976,10 @@ gstrict-dwarf Common Driver Report Var(dwarf_strict) Init(0) Don't emit DWARF additions beyond selected version. +gdescribe-dies +Common Driver Report Var(flag_describe_dies) Init(0) +Add description attributes to some DWARF DIEs that have no name attribute. + gtoggle Common Driver Report Var(flag_gtoggle) Toggle debug information generation. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8ac29fd..ec12711 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -373,7 +373,7 @@ Objective-C and Objective-C++ Dialects}. -ginternal-reset-location-views -gno-internal-reset-location-views @gol -ginline-points -gno-inline-points @gol -gvms -gxcoff -gxcoff+ -gz@r{[}=@var{type}@r{]} @gol --gsplit-dwarf @gol +-gsplit-dwarf -gdescribe-dies -gno-describe-dies @gol -fdebug-prefix-map=@var{old}=@var{new} -fdebug-types-section @gol -fno-eliminate-unused-debug-types @gol -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol @@ -7466,6 +7466,12 @@ the build system to avoid linking files with debug information. To be useful, this option requires a debugger capable of reading @file{.dwo} files. +@item -gdescribe-dies +@opindex gdescribe-dies +Add description attributes to some DWARF DIEs that have no name attribute, +such as artificial variables, external references and call site +parameter DIEs. + @item -gpubnames @opindex gpubnames Generate DWARF @code{.debug_pubnames} and @code{.debug_pubtypes} sections. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 40cfdf5..9e9da30 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -3816,6 +3816,7 @@ static bool add_location_or_const_value_attribute (dw_die_ref, tree, bool); static bool tree_add_const_value_attribute (dw_die_ref, tree); static bool tree_add_const_value_attribute_for_decl (dw_die_ref, tree); static void add_name_attribute (dw_die_ref, const char *); +static void add_desc_attribute (dw_die_ref, tree); static void add_gnat_descriptive_type_attribute (dw_die_ref, tree, dw_die_ref); static void add_comp_dir_attribute (dw_die_ref); static void add_scalar_info (dw_die_ref, enum dwarf_attribute, tree, int, @@ -6030,6 +6031,8 @@ dwarf2out_register_external_die (tree decl, const char *sym, else equate_decl_number_to_die (decl, die); + add_desc_attribute (die, decl); + /* Add a reference to the DIE providing early debug at $sym + off. */ add_AT_external_die_ref (die, DW_AT_abstract_origin, sym, off); } @@ -20536,6 +20539,52 @@ add_name_attribute (dw_die_ref die, const char *name_string) } } +/* Generate a DW_AT_description attribute given some string value to be included + as the value of the attribute. */ + +static void +add_desc_attribute (dw_die_ref die, const char *name_string) +{ + if (!flag_describe_dies || (dwarf_version < 3 && dwarf_strict)) + return; + + if (name_string == NULL || *name_string == 0) + return; + + if (demangle_name_func) + name_string = (*demangle_name_func) (name_string); + + add_AT_string (die, DW_AT_description, name_string); +} + +/* Generate a DW_AT_description attribute given some decl to be included + as the value of the attribute. */ + +static void +add_desc_attribute (dw_die_ref die, tree decl) +{ + tree decl_name; + + if (!flag_describe_dies || (dwarf_version < 3 && dwarf_strict)) + return; + + if (decl == NULL_TREE || !DECL_P (decl)) + return; + decl_name = DECL_NAME (decl); + + if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL) + { + const char *name = dwarf2_name (decl, 0); + add_desc_attribute (die, name ? name : IDENTIFIER_POINTER (decl_name)); + } + else + { + char *desc = print_generic_expr_to_str (decl); + add_desc_attribute (die, desc); + free (desc); + } +} + /* Retrieve the descriptive type of TYPE, if any, make sure it has a DIE and attach a DW_AT_GNAT_descriptive_type attribute to the DIE of TYPE accordingly. @@ -21294,12 +21343,17 @@ add_name_and_src_coords_attributes (dw_die_ref die, tree decl, const char *name = dwarf2_name (decl, 0); if (name) add_name_attribute (die, name); + else + add_desc_attribute (die, decl); + if (! DECL_ARTIFICIAL (decl)) add_src_coords_attributes (die, decl); if (!no_linkage_name) add_linkage_name (die, decl); } + else + add_desc_attribute (die, decl); #ifdef VMS_DEBUGGING_INFO /* Get the function's name, as described by its RTL. This may be different @@ -23272,6 +23326,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) dw_die_ref die = NULL; rtx tloc = NULL_RTX, tlocc = NULL_RTX; rtx arg, next_arg; + tree arg_decl = NULL_TREE; for (arg = (ca_loc->call_arg_loc_note != NULL_RTX ? XEXP (ca_loc->call_arg_loc_note, 0) @@ -23336,6 +23391,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) tdie = lookup_decl_die (tdecl); if (tdie == NULL) continue; + arg_decl = tdecl; } else continue; @@ -23352,6 +23408,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) die = gen_call_site_die (decl, subr_die, ca_loc); cdie = new_die (dwarf_TAG (DW_TAG_call_site_parameter), die, NULL_TREE); + add_desc_attribute (cdie, arg_decl); if (reg != NULL) add_AT_loc (cdie, DW_AT_location, reg); else if (tdie != NULL) diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index 990cc21..2c089b1 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -162,6 +162,16 @@ print_generic_expr (FILE *file, tree t, dump_flags_t flags) pp_flush (tree_pp); } +/* Print a single expression T to string, and return it. */ + +char * +print_generic_expr_to_str (tree t) +{ + pretty_printer pp; + dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false); + return xstrdup (pp_formatted_text (&pp)); +} + /* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences in it are replaced with Dxxxx, as long as they are at the start or preceded by $ and at the end or followed by $. See make_fancy_name diff --git a/gcc/tree-pretty-print.h b/gcc/tree-pretty-print.h index adfc77b..4de0e09 100644 --- a/gcc/tree-pretty-print.h +++ b/gcc/tree-pretty-print.h @@ -38,6 +38,7 @@ extern void print_generic_decl (FILE *, tree, dump_flags_t); extern void print_generic_stmt (FILE *, tree, dump_flags_t = TDF_NONE); extern void print_generic_stmt_indented (FILE *, tree, dump_flags_t, int); extern void print_generic_expr (FILE *, tree, dump_flags_t = TDF_NONE); +extern char *print_generic_expr_to_str (tree); extern void dump_omp_clauses (pretty_printer *, tree, int, dump_flags_t); extern int dump_generic_node (pretty_printer *, tree, int, dump_flags_t, bool); extern void print_declaration (pretty_printer *, tree, int, dump_flags_t); |