From patchwork Fri Aug 24 15:38:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 961899 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-484374-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="JK9DWBi6"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41xlmj0nSDz9s4V for ; Sat, 25 Aug 2018 01:38:27 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:content-transfer-encoding:in-reply-to; q=dns; s= default; b=i2kyY7to4CzZzaFEM3z81cAHoiM7eCRGgCQr03BQZcRLdOL4uowZW SeIK6S7e7l1bD4TsMviFf+Nf7KEGDl76rLk8r/3pjuY/edM2Y7SsAQTTNM8p1HvT fQNCLBQwtIDdv8hTb0A0oHYuTjsUMZV2mGt9gJDsgcietKuiJwg6+k= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:content-transfer-encoding:in-reply-to; s=default; bh=McQJXA8Nu2c9XcSxFL5FM7oKaak=; b=JK9DWBi6cqjEACIj9lXOl+W/02Pn i4EYlBVukBaTnMsZJcmYRs/+LPWVtZ5GUuFmCSKpSmBEw5A7bDdCZCPz0nLeEG+w FH9R4boW4MrJnnoRhrR5TwuS7/strNvJUvudTguJF+mT6J2u5i3b5v9pGH7Jyte5 ktjvX2JEQv9C91A= Received: (qmail 125492 invoked by alias); 24 Aug 2018 15:38:20 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 125482 invoked by uid 89); 24 Aug 2018 15:38:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.2 spammy=capable, DECL_NAME, add_scalar_info, DECL_ARTIFICIAL X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 24 Aug 2018 15:38:17 +0000 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 44A07AE5F; Fri, 24 Aug 2018 15:38:15 +0000 (UTC) Date: Fri, 24 Aug 2018 17:38:19 +0200 From: Tom de Vries To: Richard Biener Cc: gcc-patches@gcc.gnu.org, Jakub Jelinek , Jason Merrill , Cary Coutant Subject: [PATCH][debug] Add -gdescribe-dies Message-ID: <20180824153819.GA18240@delia> References: <20180815140258.GA1999@delia> <21062fd5-5697-8da0-44ea-1f0c14e81f33@suse.de> <077f3e77-79b8-4f33-a135-990a885cf999@suse.de> <516e20a1-0a30-958c-7cd2-848a4879dc4a@suse.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes [ 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 = > > >> ... > > > 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 * 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 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);