#include "defs.h"
#include "dwarf2/attribute.h"
+#include "dwarf2/stringify.h"
+#include "complaints.h"
/* See attribute.h. */
CORE_ADDR
-attr_value_as_address (struct attribute *attr)
+attribute::value_as_address () const
{
CORE_ADDR addr;
- if (attr->form != DW_FORM_addr && attr->form != DW_FORM_addrx
- && attr->form != DW_FORM_GNU_addr_index)
+ if (form != DW_FORM_addr && form != DW_FORM_addrx
+ && form != DW_FORM_GNU_addr_index)
{
/* Aside from a few clearly defined exceptions, attributes that
contain an address must always be in DW_FORM_addr form.
as well as update callers to pass in at least the CU's DWARF
version. This is more overhead than what we're willing to
expand for a pretty rare case. */
- addr = DW_UNSND (attr);
+ addr = DW_UNSND (this);
}
else
- addr = DW_ADDR (attr);
+ addr = DW_ADDR (this);
return addr;
}
/* See attribute.h. */
-int
-attr_form_is_block (const struct attribute *attr)
+const char *
+attribute::value_as_string () const
{
- return (attr == NULL ? 0 :
- attr->form == DW_FORM_block1
- || attr->form == DW_FORM_block2
- || attr->form == DW_FORM_block4
- || attr->form == DW_FORM_block
- || attr->form == DW_FORM_exprloc);
+ 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. */
-int
-attr_form_is_section_offset (const struct attribute *attr)
+bool
+attribute::form_is_block () const
{
- return (attr->form == DW_FORM_data4
- || attr->form == DW_FORM_data8
- || attr->form == DW_FORM_sec_offset);
+ return (form == DW_FORM_block1
+ || form == DW_FORM_block2
+ || form == DW_FORM_block4
+ || form == DW_FORM_block
+ || form == DW_FORM_exprloc);
}
/* See attribute.h. */
-int
-attr_form_is_constant (const struct attribute *attr)
+bool
+attribute::form_is_section_offset () const
{
- switch (attr->form)
+ return (form == DW_FORM_data4
+ || form == DW_FORM_data8
+ || form == DW_FORM_sec_offset
+ || form == DW_FORM_loclistx);
+}
+
+/* See attribute.h. */
+
+bool
+attribute::form_is_constant () const
+{
+ switch (form)
{
case DW_FORM_sdata:
case DW_FORM_udata:
case DW_FORM_data4:
case DW_FORM_data8:
case DW_FORM_implicit_const:
- return 1;
+ return true;
default:
- return 0;
+ return false;
}
}
-/* DW_ADDR is always stored already as sect_offset; despite for the forms
- besides DW_FORM_ref_addr it is stored as cu_offset in the DWARF file. */
+/* See attribute.h. */
-int
-attr_form_is_ref (const struct attribute *attr)
+void
+attribute::get_ref_die_offset_complaint () const
{
- switch (attr->form)
+ complaint (_("unsupported die ref attribute form: '%s'"),
+ dwarf_form_name (form));
+}
+
+/* See attribute.h. */
+
+LONGEST
+attribute::constant_value (int default_value) const
+{
+ if (form == DW_FORM_sdata || form == DW_FORM_implicit_const)
+ return DW_SND (this);
+ else if (form == DW_FORM_udata
+ || form == DW_FORM_data1
+ || form == DW_FORM_data2
+ || form == DW_FORM_data4
+ || form == DW_FORM_data8)
+ return DW_UNSND (this);
+ else
{
- case DW_FORM_ref_addr:
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- case DW_FORM_GNU_ref_alt:
- return 1;
- default:
- return 0;
+ /* For DW_FORM_data16 see attribute::form_is_constant. */
+ complaint (_("Attribute value is not a constant (%s)"),
+ dwarf_form_name (form));
+ return default_value;
}
}