diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2018-08-23 14:32:33 +0900 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2018-08-23 14:32:54 +0900 |
commit | 93915e5d8eb3f0dc6faa4e7a691aceca6c1e861a (patch) | |
tree | 40231d36efbc047d6b886cc803271675690024d7 | |
parent | 0388ee68f38667e4bbc8fddca3a0c2c9f9461c1e (diff) |
refactor dwarf_get_offset/dwarf_get_size in shared dwarf_get_attribute_value helper
-rw-r--r-- | dwarf-extract-struct.c | 84 |
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, |