summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dwarf-extract-struct.c84
1 files changed, 21 insertions, 63 deletions
diff --git a/dwarf-extract-struct.c b/dwarf-extract-struct.c
index e2b8a4f..141bb83 100644
--- a/dwarf-extract-struct.c
+++ b/dwarf-extract-struct.c
@@ -206,13 +206,13 @@ static void find_struct(Dwarf_Debug dbg, Dwarf_Die die, const char *struct_name,
} while (die);
}
-static int dwarf_get_offset(Dwarf_Debug dbg, Dwarf_Die die,
- int *poffset, Dwarf_Error *perr) {
+static int dwarf_get_attribute_value(Dwarf_Debug dbg, Dwarf_Die die,
+ int attr_index, int *pval, Dwarf_Error *perr) {
Dwarf_Attribute attr;
- Dwarf_Unsigned offset;
+ Dwarf_Unsigned val;
int rc;
- rc = dwarf_attr(die, DW_AT_data_member_location, &attr, perr);
+ rc = dwarf_attr(die, attr_index, &attr, perr);
if (rc != DW_DLV_OK) {
return rc;
}
@@ -226,22 +226,22 @@ static int dwarf_get_offset(Dwarf_Debug dbg, Dwarf_Die die,
if (form == DW_FORM_data1 || form == DW_FORM_data2
|| form == DW_FORM_data2 || form == DW_FORM_data4
|| form == DW_FORM_data8 || form == DW_FORM_udata) {
- dwarf_formudata(attr, &offset, 0);
+ dwarf_formudata(attr, &val, 0);
} else if (form == DW_FORM_sdata) {
- Dwarf_Signed soffset;
- dwarf_formsdata(attr, &soffset, 0);
- if (soffset < 0) {
+ Dwarf_Signed sval;
+ dwarf_formsdata(attr, &sval, 0);
+ if (sval < 0) {
fprintf(stderr,
- "unsupported negative offset\n");
+ "unsupported negative val\n");
exit(5);
}
- offset = (Dwarf_Unsigned) soffset;
+ val = (Dwarf_Unsigned) sval;
} else {
Dwarf_Locdesc **locdescs;
Dwarf_Signed len;
if (dwarf_loclist_n(attr, &locdescs, &len, perr)
== DW_DLV_ERROR) {
- fprintf(stderr, "unsupported member offset\n");
+ fprintf(stderr, "unsupported member val\n");
exit(5);
}
if (len != 1
@@ -252,66 +252,24 @@ static int dwarf_get_offset(Dwarf_Debug dbg, Dwarf_Die die,
"unsupported location expression\n");
exit(5);
}
- offset = (locdescs[0]->ld_s[0]).lr_number;
+ val = (locdescs[0]->ld_s[0]).lr_number;
}
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
- *poffset = (int) offset;
+ *pval = (int) val;
return DW_DLV_OK;
}
+static int dwarf_get_offset(Dwarf_Debug dbg, Dwarf_Die die,
+ int *poffset, Dwarf_Error *perr) {
+ return dwarf_get_attribute_value(dbg, die, DW_AT_data_member_location,
+ poffset, perr);
+}
+
static int dwarf_get_size(Dwarf_Debug dbg, Dwarf_Die die,
int *psize, Dwarf_Error *perr) {
- Dwarf_Attribute attr;
- Dwarf_Unsigned size;
- int rc;
-
- rc = dwarf_attr(die, DW_AT_byte_size, &attr, perr);
- if (rc != DW_DLV_OK) {
- return rc;
- }
- Dwarf_Half form;
- rc = dwarf_whatform(attr, &form, perr);
- if (rc != DW_DLV_OK) {
- fprintf(stderr, "Error getting whatform: %s\n",
- dwarf_errmsg(*perr));
- exit(5);
- }
- if (form == DW_FORM_data1 || form == DW_FORM_data2
- || form == DW_FORM_data2 || form == DW_FORM_data4
- || form == DW_FORM_data8 || form == DW_FORM_udata) {
- dwarf_formudata(attr, &size, 0);
- } else if (form == DW_FORM_sdata) {
- Dwarf_Signed ssize;
- dwarf_formsdata(attr, &ssize, 0);
- if (ssize < 0) {
- fprintf(stderr,
- "unsupported negative size\n");
- exit(5);
- }
- size = (Dwarf_Unsigned) ssize;
- } else {
- Dwarf_Locdesc **locdescs;
- Dwarf_Signed len;
- if (dwarf_loclist_n(attr, &locdescs, &len, perr)
- == DW_DLV_ERROR) {
- fprintf(stderr, "unsupported member size\n");
- exit(5);
- }
- if (len != 1
- || locdescs[0]->ld_cents != 1
- || (locdescs[0]->ld_s[0]).lr_atom
- != DW_OP_plus_uconst) {
- fprintf(stderr,
- "unsupported location expression\n");
- exit(5);
- }
- size = (locdescs[0]->ld_s[0]).lr_number;
- }
- dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
-
- *psize = (int) size;
- return DW_DLV_OK;
+ return dwarf_get_attribute_value(dbg, die, DW_AT_byte_size,
+ psize, perr);
}
static int deref_type(Dwarf_Debug dbg, Dwarf_Die type_die,