+2020-04-24 Tom Tromey <tom@tromey.com>
+
+ * dwarf2/read.c (partial_die_info::read) <case
+ DW_AT_linkage_name>: Use value_as_string.
+ (dwarf2_string_attr): Use value_as_string.
+ * dwarf2/attribute.h (struct attribute) <value_as_string>: Declare
+ method.
+ * dwarf2/attribute.c (attribute::value_as_string): New method.
+
2020-04-24 Tom Tromey <tom@tromey.com>
* symtab.c (general_symbol_info::natural_name)
/* See attribute.h. */
+const char *
+attribute::value_as_string () const
+{
+ if (form == DW_FORM_strp || form == DW_FORM_line_strp
+ || form == DW_FORM_string
+ || form == DW_FORM_strx
+ || form == DW_FORM_strx1
+ || form == DW_FORM_strx2
+ || form == DW_FORM_strx3
+ || form == DW_FORM_strx4
+ || form == DW_FORM_GNU_str_index
+ || form == DW_FORM_GNU_strp_alt)
+ return DW_STRING (this);
+ return nullptr;
+}
+
+/* See attribute.h. */
+
bool
attribute::form_is_block () const
{
attribute's form into account. */
CORE_ADDR value_as_address () const;
+ /* If the attribute has a string form, return the string value;
+ otherwise return NULL. */
+ const char *value_as_string () const;
+
/* Return non-zero if ATTR's value is a section offset --- classes
lineptr, loclistptr, macptr or rangelistptr --- or zero, otherwise.
You may use DW_UNSND (attr) to retrieve such offsets.
/* Note that both forms of linkage name might appear. We
assume they will be the same, and we only store the last
one we see. */
- linkage_name = DW_STRING (&attr);
+ linkage_name = attr.value_as_string ();
/* rustc emits invalid values for DW_AT_linkage_name. Ignore these.
See https://github.com/rust-lang/rust/issues/32925. */
if (cu->language == language_rust && linkage_name != NULL
if (attr != NULL)
{
- if (attr->form == DW_FORM_strp || attr->form == DW_FORM_line_strp
- || attr->form == DW_FORM_string
- || attr->form == DW_FORM_strx
- || attr->form == DW_FORM_strx1
- || attr->form == DW_FORM_strx2
- || attr->form == DW_FORM_strx3
- || attr->form == DW_FORM_strx4
- || attr->form == DW_FORM_GNU_str_index
- || attr->form == DW_FORM_GNU_strp_alt)
- str = DW_STRING (attr);
- else
+ str = attr->value_as_string ();
+ if (str == nullptr)
complaint (_("string type expected for attribute %s for "
"DIE at %s in module %s"),
dwarf_attr_name (name), sect_offset_str (die->sect_off),