aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2read.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2018-02-04 13:10:28 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2018-02-04 22:21:08 -0500
commite61b4af73de761ca2b877b09c1ad710f44ba0f54 (patch)
treeb82ac5f4a15dca00cd1231e162d73176af548b8a /gdb/dwarf2read.c
parent9f7393d8fc8b79a92b027cd8ac6fda9441d3fff9 (diff)
downloadgdb-users/simark/template-suffix.zip
gdb-users/simark/template-suffix.tar.gz
gdb-users/simark/template-suffix.tar.bz2
Don't trust templates from DW_AT_nameusers/simark/template-suffix
With gcc 8 (and clang?) the non-type template arguments (constants) don't include the integer suffixes anymore. For example, with template <unsigned int X> class foo { ... }; foo<10u> used to generate foo<10u> as the DW_AT_name, now it generates foo<10>. This is a problem when things look up "foo<10u>" and don't find it. For example, when trying to print an instance of that class through a base class pointer, GDB would first demangle the symbol for that class' vtable, which would give "vtable for foo<10u>". GDB would then take the "foo<10u>" from that string and try to look up the type. With the new DW_AT_name, it would fail to look it up, and fail to print the value. This patch makes it so GDB doesn't trust the templates contained in DW_AT_name. Instead, it re-builds the name from the DW_AT_template_* DIES in the format that it expects (with the integer suffixes).
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r--gdb/dwarf2read.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 51d0f39..1960ccc 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9211,7 +9211,7 @@ partial_die_full_name (struct partial_die_info *pdi,
{
fixup_partial_die (pdi, cu);
- if (pdi->name != NULL && strchr (pdi->name, '<') == NULL)
+ if (pdi->name != NULL)
{
struct die_info *die;
struct attribute attr;
@@ -10875,6 +10875,22 @@ dwarf2_compute_name (const char *name,
if (name == NULL)
name = dwarf2_name (die, cu);
+ /* If there is a template in the name, strip it and let the code below
+ re-compute it. */
+ gdb::unique_xmalloc_ptr<char> holder;
+ if (name != NULL)
+ {
+ const char *opening = strchr (name, '<');
+ if (opening != NULL)
+ {
+ /* In this case, name will get copied/modified and re-assigned,
+ so we can free this copy. */
+ holder.reset (xstrdup (name));
+ holder.get ()[opening - name] = '\0';
+ name = holder.get ();
+ }
+ }
+
/* For Fortran GDB prefers DW_AT_*linkage_name for the physname if present
but otherwise compute it by typename_concat inside GDB.
FIXME: Actually this is not really true, or at least not always true.
@@ -10942,7 +10958,7 @@ dwarf2_compute_name (const char *name,
templates; two instantiated function templates are allowed to
differ only by their return types, which we do not add here. */
- if (cu->language == language_cplus && strchr (name, '<') == NULL)
+ if (cu->language == language_cplus)
{
struct attribute *attr;
struct die_info *child;
@@ -11026,6 +11042,7 @@ dwarf2_compute_name (const char *name,
the radix. */
get_formatted_print_options (&opts, 'd');
opts.raw = 1;
+ opts.print_suffix = true;
value_print (v, &buf, &opts);
release_value (v);
value_free (v);