Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom de Vries <tdevries@suse.de>
To: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 08/10] Use the linkage name if it exists
Date: Fri, 24 Apr 2020 18:06:38 +0200	[thread overview]
Message-ID: <b58a663e-b5fe-024c-9c65-f88562a34a7e@suse.de> (raw)
In-Reply-To: <20200325200715.12947-9-tom@tromey.com>

On 25-03-2020 21:07, Tom Tromey wrote:
> The DWARF reader has had some odd code since the "physname" patches landed.
> 
> In particular, these patches caused PR symtab/12707; namely, they made
> it so "set print demangle off" no longer works.
> 
> This patch attempts to fix the problem.  It arranges to store the
> linkage name on the symbol if it exists, and it changes the DWARF
> reader so that the demangled name is no longer (usually) stored in the
> symbol's "linkage name" field.
> 
> c-linkage-name.exp needed a tweak, because it started working
> correctly.  This conforms to what I think ought to happen, so this
> seems like an improvement here.
> 
> compile-object-load.c needed a small change to use
> symbol_matches_search_name rather than directly examining the linkage
> name.  Looking directly at the name does the wrong thing for C++.
> 
> There is still some name-related confusion in the DWARF reader:
> 
> * "physname" often refers to the logical name and not what I would
>   consider to be the "physical" name;
> 
> * dwarf2_full_name, dwarf2_name, and dwarf2_physname all exist and
>   return different strings -- but this seems like at least one name
>   too many.  For example, Fortran requires dwarf2_full_name, but other
>   languages do not.
> 
> * To my surprise, dwarf2_physname prefers the form emitted by the
>   demangler over the one that it computes.  This seems backward to me,
>   given that the partial symbol reader prefers the opposite, and it
>   seems to me that this choice may perform better as well.
> 
> I didn't attempt to clean up these things.  It would be good to do,
> but whenever I contemplate it I get caught up in dreams of truly
> rewriting the DWARF reader instead.
> 

Hi,

As you mentioned on IRC, there's a regression with
gdb.dwarf2/dw2-bad-mips-linkage-name.exp and target board
cc-with-debug-names. I tracked that down to this patch in the series.

Using readelf -w, I can read the .debug_names section, and see without
this patch:
...
[  6] #0002b60b f: <3> DW_TAG_subprogram DW_IDX_compile_unit=3
DW_IDX_GNU_internal=1
[  8] #0002b60c g: <3> DW_TAG_subprogram DW_IDX_compile_unit=3
DW_IDX_GNU_internal=1
...
and with this patch:
...
[  6] #0ef9dc4b _Z1fv: <3> DW_TAG_subprogram DW_IDX_compile_unit=3
DW_IDX_GNU_internal=1
[  8] #0002b60c g: <3> DW_TAG_subprogram DW_IDX_compile_unit=3
DW_IDX_GNU_internal=1
...

So we end up with the mangled name for f in the index.  That looks
significant, but I'm not sure yet if that is the reason why we're not
able to print the type of f.

Thanks,
- Tom

> gdb/ChangeLog
> 2020-03-25  Tom Tromey  <tom@tromey.com>
> 
> 	PR symtab/12707:
> 	* dwarf2/read.c (add_partial_symbol): Use the linkage name if it
> 	exists.
> 	(new_symbol): Likewise.
> 	* compile/compile-object-load.c (get_out_value_type): Use
> 	symbol_matches_search_name.
> 
> gdb/testsuite/ChangeLog
> 2020-03-25  Tom Tromey  <tom@tromey.com>
> 
> 	PR symtab/12707:
> 	* gdb.python/py-symbol.exp: Update expected results for
> 	linkage_name test.
> 	* gdb.cp/print-demangle.exp: New file.
> 	* gdb.base/c-linkage-name.exp: Fix test.
> 	* gdb.guile/scm-symbol.exp: Update expected results for
> 	linkage_name test.
> ---
>  gdb/ChangeLog                             |  9 +++++++
>  gdb/compile/compile-object-load.c         |  7 ++---
>  gdb/dwarf2/read.c                         | 29 ++++++++++++++------
>  gdb/testsuite/ChangeLog                   | 10 +++++++
>  gdb/testsuite/gdb.base/c-linkage-name.exp |  2 +-
>  gdb/testsuite/gdb.cp/print-demangle.exp   | 32 +++++++++++++++++++++++
>  gdb/testsuite/gdb.guile/scm-symbol.exp    |  4 +--
>  gdb/testsuite/gdb.python/py-symbol.exp    |  2 +-
>  8 files changed, 79 insertions(+), 16 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.cp/print-demangle.exp
> 
> diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c
> index 3fe95183e32..be4fa767142 100644
> --- a/gdb/compile/compile-object-load.c
> +++ b/gdb/compile/compile-object-load.c
> @@ -402,6 +402,9 @@ get_out_value_type (struct symbol *func_sym, struct objfile *objfile,
>    int nblocks = 0;
>    int block_loop = 0;
>  
> +  lookup_name_info func_matcher (GCC_FE_WRAPPER_FUNCTION,
> +				 symbol_name_match_type::SEARCH_NAME);
> +
>    bv = SYMTAB_BLOCKVECTOR (func_sym->owner.symtab);
>    nblocks = BLOCKVECTOR_NBLOCKS (bv);
>  
> @@ -433,9 +436,7 @@ get_out_value_type (struct symbol *func_sym, struct objfile *objfile,
>        if (function != NULL
>  	  && (BLOCK_SUPERBLOCK (function_block)
>  	      == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK))
> -	  && (strcmp_iw (function->linkage_name (),
> -			 GCC_FE_WRAPPER_FUNCTION)
> -	      == 0))
> +	  && symbol_matches_search_name (function, func_matcher))
>  	break;
>      }
>    if (block_loop == nblocks)
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
> index 2bc7b521f2e..1e824ca399d 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -8370,7 +8370,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
>      {
>        if (built_actual_name != nullptr)
>  	actual_name = objfile->intern (actual_name);
> -      psymbol.ginfo.set_linkage_name (actual_name);
> +      if (pdi->linkage_name == nullptr || cu->language == language_ada)
> +	psymbol.ginfo.set_linkage_name (actual_name);
> +      else
> +	{
> +	  psymbol.ginfo.set_demangled_name (actual_name,
> +					    &objfile->objfile_obstack);
> +	  psymbol.ginfo.set_linkage_name (pdi->linkage_name);
> +	}
>        add_psymbol_to_list (psymbol, *where, objfile);
>      }
>  }
> @@ -20550,7 +20557,6 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
>    name = dwarf2_name (die, cu);
>    if (name)
>      {
> -      const char *linkagename;
>        int suppress_add = 0;
>  
>        if (space)
> @@ -20561,14 +20567,21 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
>  
>        /* Cache this symbol's name and the name's demangled form (if any).  */
>        sym->set_language (cu->language, &objfile->objfile_obstack);
> -      linkagename = dwarf2_physname (name, die, cu);
> -      sym->compute_and_set_names (linkagename, false, objfile->per_bfd);
> -
>        /* Fortran does not have mangling standard and the mangling does differ
>  	 between gfortran, iFort etc.  */
> -      if (cu->language == language_fortran
> -          && symbol_get_demangled_name (sym) == NULL)
> -	sym->set_demangled_name (dwarf2_full_name (name, die, cu), NULL);
> +      const char *physname
> +	= (cu->language == language_fortran
> +	   ? dwarf2_full_name (name, die, cu)
> +	   : dwarf2_physname (name, die, cu));
> +      const char *linkagename = dw2_linkage_name (die, cu);
> +
> +      if (linkagename == nullptr || cu->language == language_ada)
> +	sym->set_linkage_name (physname);
> +      else
> +	{
> +	  sym->set_demangled_name (physname, &objfile->objfile_obstack);
> +	  sym->set_linkage_name (linkagename);
> +	}
>  
>        /* Default assumptions.
>           Use the passed type or decode it from the die.  */
> diff --git a/gdb/testsuite/gdb.base/c-linkage-name.exp b/gdb/testsuite/gdb.base/c-linkage-name.exp
> index 4551c8dcac2..cf3e3780bb6 100644
> --- a/gdb/testsuite/gdb.base/c-linkage-name.exp
> +++ b/gdb/testsuite/gdb.base/c-linkage-name.exp
> @@ -48,7 +48,7 @@ verify_psymtab_expanded c-linkage-name-2.c no
>  # Try to print MUNDANE, but using its linkage name.
>  
>  gdb_test "print symada__cS" \
> -         "'symada__cS' has unknown type; cast it to its declared type" \
> +         " = {a = 100829103}" \
>           "print symada__cS before partial symtab expansion"
>  
>  # Force the symbols to be expanded for the unit that contains
> diff --git a/gdb/testsuite/gdb.cp/print-demangle.exp b/gdb/testsuite/gdb.cp/print-demangle.exp
> new file mode 100644
> index 00000000000..9e0f706febf
> --- /dev/null
> +++ b/gdb/testsuite/gdb.cp/print-demangle.exp
> @@ -0,0 +1,32 @@
> +# Copyright (C) 2013, 2020 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +if { [skip_cplus_tests] } { continue }
> +
> +standard_testfile bool.cc
> +
> +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
> +    return -1
> +}
> +
> +runto_main
> +
> +gdb_breakpoint "return_true"
> +
> +gdb_continue_to_breakpoint "return_true"
> +
> +gdb_test_no_output "set print demangle off"
> +
> +gdb_test "frame" " _Z11return_truev .*"
> diff --git a/gdb/testsuite/gdb.guile/scm-symbol.exp b/gdb/testsuite/gdb.guile/scm-symbol.exp
> index 4addc0d10d0..486fc8fcfdb 100644
> --- a/gdb/testsuite/gdb.guile/scm-symbol.exp
> +++ b/gdb/testsuite/gdb.guile/scm-symbol.exp
> @@ -169,10 +169,8 @@ gdb_test "guile (print (symbol-name cplusfunc))" \
>      "= SimpleClass::valueofi().*" "test method.name"
>  gdb_test "guile (print (symbol-print-name cplusfunc))" \
>      "= SimpleClass::valueofi().*" "test method.print_name"
> -# FIXME: GDB is broken here and we're verifying broken behaviour.
> -# (linkage-name should be the mangled name)
>  gdb_test "guile (print (symbol-linkage-name cplusfunc))" \
> -    "SimpleClass::valueofi().*" "test method.linkage_name"
> +    "_ZN11SimpleClass8valueofiEv.*" "test method.linkage_name"
>  gdb_test "guile (print (= (symbol-addr-class cplusfunc) SYMBOL_LOC_BLOCK))" "= #t"
>  
>  # Test is_valid when the objfile is unloaded.  This must be the last
> diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp
> index c4bae9f07f2..caa7ddc8007 100644
> --- a/gdb/testsuite/gdb.python/py-symbol.exp
> +++ b/gdb/testsuite/gdb.python/py-symbol.exp
> @@ -211,7 +211,7 @@ gdb_test "python print (cplusfunc.is_function)" \
>  
>  gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "test method.name"
>  gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "test method.print_name"
> -gdb_test "python print (cplusfunc.linkage_name)" "SimpleClass::valueofi().*" "test method.linkage_name"
> +gdb_test "python print (cplusfunc.linkage_name)" "_ZN11SimpleClass8valueofiEv.*" "test method.linkage_name"
>  gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test method.addr_class"
>  
>  # Test is_valid when the objfile is unloaded.  This must be the last
> 


  reply	other threads:[~2020-04-24 16:06 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-25 20:07 [PATCH 00/10] Fix two name-related bugs in DWARF reader Tom Tromey
2020-03-25 20:07 ` [PATCH 01/10] Convert symbol_set_demangled_name to a method Tom Tromey
2020-03-25 20:07 ` [PATCH 02/10] Move the rust "{" hack Tom Tromey
2020-03-25 20:07 ` [PATCH 03/10] Fix two latent Rust bugs Tom Tromey
2020-03-25 20:07 ` [PATCH 04/10] Add attribute::value_as_string method Tom Tromey
2020-03-25 20:07 ` [PATCH 05/10] Introduce new add_psymbol_to_list overload Tom Tromey
2020-03-25 20:07 ` [PATCH 06/10] Use the " Tom Tromey
2020-03-25 20:07 ` [PATCH 07/10] Don't call compute_and_set_names for partial symbols Tom Tromey
2020-03-25 20:07 ` [PATCH 08/10] Use the linkage name if it exists Tom Tromey
2020-04-24 16:06   ` Tom de Vries [this message]
2020-04-24 18:09     ` Tom de Vries
2020-04-24 20:50       ` Tom Tromey
2020-04-24 21:27         ` [committed][gdb/testsuite] Fix language in dw2-bad-mips-linkage-name.exp Tom de Vries
2020-04-24 21:34           ` Tom Tromey
2020-03-25 20:07 ` [PATCH 09/10] Fix Rust test cases Tom Tromey
2020-03-25 20:07 ` [PATCH 10/10] Remove symbol_get_demangled_name Tom Tromey
2020-03-25 22:48 ` [PATCH 00/10] Fix two name-related bugs in DWARF reader Christian Biesinger
2020-03-25 23:50   ` Tom Tromey
2020-04-24 14:18 ` Tom de Vries
2020-04-24 14:45   ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b58a663e-b5fe-024c-9c65-f88562a34a7e@suse.de \
    --to=tdevries@suse.de \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox