From 3b64bf15bc96d83e49521048bfe3eacf25d3649d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 29 Sep 2020 18:49:08 -0600 Subject: [PATCH] Remove some uses of DW_STRING_IS_CANONICAL This removes the rvalue uses of DW_STRING_IS_CANONICAL, replacing them with an accessor method. gdb/ChangeLog 2020-09-29 Tom Tromey * dwarf2/read.c (anonymous_struct_prefix, dwarf2_name) (dump_die_shallow): Use canonical_string_p. * dwarf2/attribute.h (struct attribute) : New method. --- gdb/ChangeLog | 7 +++++++ gdb/dwarf2/attribute.h | 10 ++++++++++ gdb/dwarf2/read.c | 8 ++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f6e0138713f..60cba0b6ea6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2020-09-29 Tom Tromey + + * dwarf2/read.c (anonymous_struct_prefix, dwarf2_name) + (dump_die_shallow): Use canonical_string_p. + * dwarf2/attribute.h (struct attribute) : New + method. + 2020-09-29 Tom Tromey * dwarf2/read.c (partial_die_info::read) diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h index 86b9136fc13..a2c41f2738d 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 70d20911487..f090cb3f8d0 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 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])) -- 2.30.2