aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/dwarf2/attribute.h10
-rw-r--r--gdb/dwarf2/read.c8
3 files changed, 21 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f6e0138..60cba0b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2020-09-29 Tom Tromey <tom@tromey.com>
+ * dwarf2/read.c (anonymous_struct_prefix, dwarf2_name)
+ (dump_die_shallow): Use canonical_string_p.
+ * dwarf2/attribute.h (struct attribute) <canonical_string_p>: New
+ method.
+
+2020-09-29 Tom Tromey <tom@tromey.com>
+
* dwarf2/read.c (partial_die_info::read)
(dwarf2_const_value_attr, anonymous_struct_prefix, )
(dwarf2_name, dwarf2_fetch_constant_bytes): Use
diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h
index 86b9136..a2c41f2 100644
--- a/gdb/dwarf2/attribute.h
+++ b/gdb/dwarf2/attribute.h
@@ -115,6 +115,16 @@ struct attribute
LONGEST constant_value (int default_value) const;
+ /* Return true if this attribute holds a canonical string. In some
+ cases, like C++ names, gdb will rewrite the name of a DIE to a
+ canonical form. This makes lookups robust when a name can be
+ spelled different ways (e.g., "signed" or "signed int"). This
+ flag indicates whether the value has been canonicalized. */
+ bool canonical_string_p () const
+ {
+ return string_is_canonical;
+ }
+
ENUM_BITFIELD(dwarf_attribute) name : 16;
ENUM_BITFIELD(dwarf_form) form : 15;
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 70d2091..f090cb3 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -22312,7 +22312,7 @@ anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu)
return NULL;
/* dwarf2_name had to be already called. */
- gdb_assert (DW_STRING_IS_CANONICAL (attr));
+ gdb_assert (attr->canonical_string_p ());
/* Strip the base name, keep any leading namespaces/classes. */
base = strrchr (attr_name, ':');
@@ -22638,7 +22638,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
/* Avoid demangling attr_name the second time on a second
call for the same DIE. */
- if (!DW_STRING_IS_CANONICAL (attr))
+ if (!attr->canonical_string_p ())
{
gdb::unique_xmalloc_ptr<char> demangled
(gdb_demangle (attr_name, DMGL_TYPES));
@@ -22664,7 +22664,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
break;
}
- if (!DW_STRING_IS_CANONICAL (attr))
+ if (!attr->canonical_string_p ())
{
DW_STRING (attr) = dwarf2_canonicalize_name (attr_name, cu,
objfile);
@@ -22786,7 +22786,7 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
fprintf_unfiltered (f, "string: \"%s\" (%s canonicalized)",
DW_STRING (&die->attrs[i])
? DW_STRING (&die->attrs[i]) : "",
- DW_STRING_IS_CANONICAL (&die->attrs[i]) ? "is" : "not");
+ die->attrs[i].canonical_string_p () ? "is" : "not");
break;
case DW_FORM_flag:
if (DW_UNSND (&die->attrs[i]))