[PATCH] Fix dwarf2_name caching bug

Simon Marchi simark@simark.ca
Mon Mar 16 17:26:36 GMT 2020


On 2020-03-13 11:17 a.m., Tom Tromey wrote:
> PR gdb/25663 points out that dwarf2_name will cache a value in the
> bcache and then return a substring.  However, this substring return is
> only done on the branch that caches the value -- so if the function is
> called twice with the same arguments, it will return different values.
> 
> This patch fixes this problem.
> 
> This area is strange.  We cache the entire demangled string, but only
> return the suffix.  I looked at caching just the suffix, but it turns
> out that anonymous_struct_prefix assumes that the entire string is
> stored.  Also weird is that this code is demangling the linkage name
> and then storing the demangled form back into the linkage name
> attribute -- that seems bad, because what if some code wants to find
> the actual linkage name?
> 
> Fixing these issues was non-trivial, though; and in the meantime this
> patch seems like an improvement.  Regression tested on x86-64
> Fedora 30.
> 
> gdb/ChangeLog
> 2020-03-13  Tom Tromey  <tromey@adacore.com>
> 
> 	PR gdb/25663:
> 	* dwarf2/read.c (dwarf2_name): Strip leading namespaces after
> 	putting value into bcache.
> ---
>  gdb/ChangeLog     |  6 ++++++
>  gdb/dwarf2/read.c | 18 ++++++++----------
>  2 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
> index 1706b96cc04..88a60c1c73b 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -21799,19 +21799,17 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
>  	      if (demangled == nullptr)
>  		return nullptr;
>  
> -	      const char *base;
> -
>  	      DW_STRING (attr) = objfile->intern (demangled.get ());
>  	      DW_STRING_IS_CANONICAL (attr) = 1;
> -
> -	      /* Strip any leading namespaces/classes, keep only the base name.
> -		 DW_AT_name for named DIEs does not contain the prefixes.  */
> -	      base = strrchr (DW_STRING (attr), ':');
> -	      if (base && base > DW_STRING (attr) && base[-1] == ':')
> -		return &base[1];
> -	      else
> -		return DW_STRING (attr);
>  	    }
> +
> +	  /* Strip any leading namespaces/classes, keep only the base name.
> +	     DW_AT_name for named DIEs does not contain the prefixes.  */
> +	  const char *base = strrchr (DW_STRING (attr), ':');
> +	  if (base && base > DW_STRING (attr) && base[-1] == ':')
> +	    return &base[1];
> +	  else
> +	    return DW_STRING (attr);
>  	}
>        break;
>  
> -- 
> 2.21.1

Hi Tom,

That LGTM.

Simon


More information about the Gdb-patches mailing list