This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][debug] Add -gdescribe-dies
[ was: Re: [PATCH][debug] Add -gdescriptive-dies ]
On Fri, Aug 24, 2018 at 12:44:38PM +0200, Richard Biener wrote:
> On Wed, 22 Aug 2018, Tom de Vries wrote:
>
> > [ was: Re: [PATCH][debug] Add -gforce-named-dies ]
> >
> > On 08/22/2018 11:46 AM, Tom de Vries wrote:
> > > On 08/22/2018 08:56 AM, Tom de Vries wrote:
> > >> This is an undocumented developer-only option, because using this option may
> > >> change behaviour of dwarf consumers, f.i., gdb shows the artificial variables:
> > >> ...
> > >> (gdb) info locals
> > >> a = 0x7fffffffda90 "\005"
> > >> D.4278 = <optimized out>
> > >> ...
> > > I just found in the dwarf 5 spec the attribute DW_AT_description
> > > (present since version 3):
> > > ...
> > > 2.20 Entity Descriptions
> > > Some debugging information entries may describe entities in the program
> > > that are artificial, or which otherwise have a “name” that is not a
> > > valid identifier in the programming language.
> > >
> > > This attribute provides a means for the producer to indicate the purpose
> > > or usage of the containing debugging infor
> > >
> > > Generally, any debugging information entry that has, or may have, a
> > > DW_AT_name attribute, may also have a DW_AT_description attribute whose
> > > value is a null-terminated string providing a description of the entity.
> > >
> > > It is expected that a debugger will display these descriptions as part
> > > of displaying other properties of an entity.
> > > ...
> > >
> > > AFAICT, gdb currently does not explicitly handle this attribute, which I
> > > think means it's ignored.
> > >
> > > It seems applicable to use DW_AT_description at least for the artificial
> > > decls.
> > >
> > > Perhaps even for all cases that are added by the patch?
> > >
> >
> > I've chosen for this option. Using DW_AT_desciption instead of
> > DW_AT_name should minimize difference in gdb behaviour with and without
> > -gdescriptive-dies.
>
> -gdescribe-dies?
>
Done.
> > > I'll rewrite the patch.
> >
> > OK for trunk?
>
> Few comments:
>
> +static void
> +add_desc_attribute (dw_die_ref die, tree decl)
> +{
> + tree decl_name;
> +
> + if (!flag_descriptive_dies || dwarf_version < 3)
> + return;
> +
>
> you said this is a DWARF5 "feature",
No, it's a DWARF3 "feature". I copied the text from the DWARF5 spec.
> I'd suggest changing the
> check to
>
> if (!flag_desctiprive_dies || (dwarf_version < 5 && dwarf_strict))
>
> given -gdescribe-dies is enough of a user request to enable the
> feature.
Done.
> Not sure if we should warn about -gstrict-dwarf
> combination with it and -gdwarf-N < 5.
>
Not sure either, left it out.
> + else if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) ==
> CONST_DECL)
> + {
> + char buf[32];
> + char decl_letter = TREE_CODE (decl) == CONST_DECL ? 'C' : 'D';
> + sprintf (buf, "%c.%u", decl_letter, DECL_UID (decl));
> + add_desc_attribute (die, buf);
> + }
>
> I wondered before if we can use pretty-printing of decl here. At
> least I wouldn't restrict it to VAR_DECLs, FUNCTION_DECLs can
> certainly appear here I think.
>
Done.
> +@item -gdescriptive-dies
> +@opindex gdescriptive-dies
> +Add description attribute to DWARF DIEs that have no name attribute.
> +
>
> Either "description attributes" or "a description attribute", not
> 100% sure being a non-native speaker.
>
Went for "description attributes".
> Otherwise the patch looks OK to me but please leave Jason time
> to comment.
>
Will do.
Untested patch attached.
Thanks,
- Tom
[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)
...
2018-08-15 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.
---
gcc/common.opt | 4 ++++
gcc/doc/invoke.texi | 6 +++++-
gcc/dwarf2out.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
gcc/tree-pretty-print.c | 10 +++++++++
gcc/tree-pretty-print.h | 1 +
5 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/gcc/common.opt b/gcc/common.opt
index ebc3ef43ce2..f41f8f74b30 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 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 99849ec6467..5b51eeca594 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -372,7 +372,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
@@ -7395,6 +7395,10 @@ 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 DWARF DIEs that have no name attribute.
+
@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 fb71ff349fa..1fc1dbb3392 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3808,6 +3808,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,
@@ -6022,6 +6023,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);
}
@@ -20529,6 +20532,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.
@@ -21287,12 +21336,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
@@ -23265,6 +23319,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)
@@ -23329,6 +23384,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;
@@ -23345,6 +23401,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 627d8d7e2d7..a4489d7f5ab 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 adfc77b29cd..4de0e090cba 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);