gdb: Convert language la_watch_location_expression field to a method
[deliverable/binutils-gdb.git] / gdb / dwarf2 / attribute.c
index 75a2fa3774bc01e4f7182ad7ceaad4879154a455..b39cfe2c00dbd74c6d31df8d2fc26815be56be13 100644 (file)
 
 #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.
@@ -49,43 +51,61 @@ attr_value_as_address (struct attribute *attr)
         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:
@@ -94,29 +114,39 @@ attr_form_is_constant (const struct attribute *attr)
     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;
     }
 }
This page took 0.024926 seconds and 4 git commands to generate.