diff options
Diffstat (limited to 'libdw')
| -rw-r--r-- | libdw/ChangeLog | 15 | ||||
| -rw-r--r-- | libdw/dwarf.h | 16 | ||||
| -rw-r--r-- | libdw/dwarf_begin_elf.c | 1 | ||||
| -rw-r--r-- | libdw/dwarf_error.c | 4 | ||||
| -rw-r--r-- | libdw/dwarf_formudata.c | 23 | ||||
| -rw-r--r-- | libdw/dwarf_getlocation.c | 4 | ||||
| -rw-r--r-- | libdw/libdwP.h | 5 |
7 files changed, 59 insertions, 9 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 99916865..0db49bf8 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,18 @@ +2018-04-12 Mark Wielaard <[email protected]> + + * dwarf.h: Add DWARF5 location list entry DW_LLE encodings. + * begin_elf.c (dwarf_scnnames): Add IDX_debug_loclists. + * dwarf_error.c (errmsgs): Remove DWARF_E_NO_LOCLIST. And replace + with DWARF_E_NO_DEBUG_LOC, DWARF_E_NO_DEBUG_LOCLISTS and + DWARF_E_NO_LOC_VALUE. + * dwarf_formudata.c (dwarf_formudata): Handle DW_AT_loclists_base + and DW_FORM_loclistx. + * dwarf_getlocation.c (attr_ok): Use DWARF_E_NO_LOC_VALUE. + (initial_offset): Use DWARF_E_NO_DEBUG_LOC. + * libdwP.h: Add IDX_debug_rnglists. Remove DWARF_E_NO_LOCLIST. + Add DWARF_E_NO_DEBUG_LOC, DWARF_E_NO_DEBUG_LOCLISTS and + DWARF_E_NO_LOC_VALUE. + 2018-05-25 Mark Wielaard <[email protected]> * libdw_find_split_unit.c (__libdw_find_split_unit): Extract linking diff --git a/libdw/dwarf.h b/libdw/dwarf.h index 9c2495e6..8985a9d4 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -899,6 +899,22 @@ enum DW_RLE_start_length = 0x7 }; + +/* Location list entry encoding. */ +enum + { + DW_LLE_end_of_list = 0x0, + DW_LLE_base_addressx = 0x1, + DW_LLE_startx_endx = 0x2, + DW_LLE_startx_length = 0x3, + DW_LLE_offset_pair = 0x4, + DW_LLE_default_location = 0x5, + DW_LLE_base_address = 0x6, + DW_LLE_start_end = 0x7, + DW_LLE_start_length = 0x8 + }; + + /* DWARF call frame instruction encodings. */ enum { diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c index 2e8c5f35..af5096fb 100644 --- a/libdw/dwarf_begin_elf.c +++ b/libdw/dwarf_begin_elf.c @@ -58,6 +58,7 @@ static const char dwarf_scnnames[IDX_last][19] = [IDX_debug_line_str] = ".debug_line_str", [IDX_debug_frame] = ".debug_frame", [IDX_debug_loc] = ".debug_loc", + [IDX_debug_loclists] = ".debug_loclists", [IDX_debug_pubnames] = ".debug_pubnames", [IDX_debug_str] = ".debug_str", [IDX_debug_str_offsets] = ".debug_str_offsets", diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c index 2e8cd77b..46ea16b3 100644 --- a/libdw/dwarf_error.c +++ b/libdw/dwarf_error.c @@ -85,7 +85,9 @@ static const char *errmsgs[] = [DWARF_E_VERSION] = N_("invalid DWARF version"), [DWARF_E_INVALID_DIR_IDX] = N_("invalid directory index"), [DWARF_E_ADDR_OUTOFRANGE] = N_("address out of range"), - [DWARF_E_NO_LOCLIST] = N_("no location list value"), + [DWARF_E_NO_DEBUG_LOC] = N_(".debug_loc section missing"), + [DWARF_E_NO_DEBUG_LOCLISTS] = N_(".debug_loclists section missing"), + [DWARF_E_NO_LOC_VALUE] = N_("not a location list value"), [DWARF_E_NO_BLOCK] = N_("no block data"), [DWARF_E_INVALID_LINE_IDX] = N_("invalid line index"), [DWARF_E_INVALID_ARANGE_IDX] = N_("invalid address range index"), diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c index 280fef2f..26f86f12 100644 --- a/libdw/dwarf_formudata.c +++ b/libdw/dwarf_formudata.c @@ -184,11 +184,23 @@ dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) case DW_AT_use_location: case DW_AT_vtable_elem_location: case DW_AT_GNU_locviews: - /* loclistptr */ - if (__libdw_formptr (attr, IDX_debug_loc, - DWARF_E_NO_LOCLIST, NULL, - return_uval) == NULL) - return -1; + case DW_AT_loclists_base: + if (attr->cu->version < 5) + { + /* loclistptr */ + if (__libdw_formptr (attr, IDX_debug_loc, + DWARF_E_NO_DEBUG_LOC, NULL, + return_uval) == NULL) + return -1; + } + else + { + /* loclist, loclistsptr */ + if (__libdw_formptr (attr, IDX_debug_loclists, + DWARF_E_NO_DEBUG_LOCLISTS, NULL, + return_uval) == NULL) + return -1; + } break; case DW_AT_macro_info: @@ -291,6 +303,7 @@ dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) case DW_FORM_udata: case DW_FORM_rnglistx: + case DW_FORM_loclistx: if (datap + 1 > endp) goto invalid; get_uleb128 (*return_uval, datap, endp); diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c index 0e7115f8..d4b8effe 100644 --- a/libdw/dwarf_getlocation.c +++ b/libdw/dwarf_getlocation.c @@ -87,7 +87,7 @@ attr_ok (Dwarf_Attribute *attr) break; default: - __libdw_seterrno (DWARF_E_NO_LOCLIST); + __libdw_seterrno (DWARF_E_NO_LOC_VALUE); return false; } @@ -700,7 +700,7 @@ initial_offset (Dwarf_Attribute *attr, ptrdiff_t *offset) Dwarf_Word start_offset; if (__libdw_formptr (attr, secidx, - DWARF_E_NO_LOCLIST, + DWARF_E_NO_DEBUG_LOC, NULL, &start_offset) == NULL) return -1; diff --git a/libdw/libdwP.h b/libdw/libdwP.h index 18576d6b..f99ea584 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -78,6 +78,7 @@ enum IDX_debug_line_str, IDX_debug_frame, IDX_debug_loc, + IDX_debug_loclists, IDX_debug_pubnames, IDX_debug_str, IDX_debug_str_offsets, @@ -124,7 +125,9 @@ enum DWARF_E_VERSION, DWARF_E_INVALID_DIR_IDX, DWARF_E_ADDR_OUTOFRANGE, - DWARF_E_NO_LOCLIST, + DWARF_E_NO_DEBUG_LOC, + DWARF_E_NO_DEBUG_LOCLISTS, + DWARF_E_NO_LOC_VALUE, DWARF_E_NO_BLOCK, DWARF_E_INVALID_LINE_IDX, DWARF_E_INVALID_ARANGE_IDX, |
