From: Nitika Achra Date: Thu, 16 Jan 2020 16:51:06 +0000 (-0500) Subject: Support for DWARF5 location lists entries X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3112ed9799124edf4d1f9c903da0d59f5a4ca102;p=binutils-gdb.git Support for DWARF5 location lists entries This patch handles DW_LLE_base_addressx, DW_LLE_startx_length and DW_LLE_start_length. Tested by running the testsuite before and after the patch and there is no increase in the number of test cases that fails. Tested with both -gdwarf-4 and -gdwarf-5 flags. Also tested -gslit-dwarf along with -gdwarf-4 as well as -gdwarf5 flags. This is an effort to support DWARF5 in gdb. gdb/ChangeLog: * dwarf2loc.c (decode_debug_loclists_addresses): Handle DW_LLE_base_addressx, DW_LLE_startx_length, DW_LLE_start_length. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cd89a44733a..5513bea8182 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-01-16 Nitika Achra + + * dwarf2loc.c (decode_debug_loclists_addresses): Handle + DW_LLE_base_addressx, DW_LLE_startx_length, DW_LLE_start_length. + 2020-01-15 Simon Marchi * infcmd.c (post_create_inferior): Use get_thread_regcache diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 1fe6829100d..405b239ed42 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -173,6 +173,41 @@ decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, switch (*loc_ptr++) { + case DW_LLE_base_addressx: + *low = 0; + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *high = dwarf2_read_addr_index (per_cu, u64); + *new_ptr = loc_ptr; + return DEBUG_LOC_BASE_ADDRESS; + case DW_LLE_startx_length: + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *low = dwarf2_read_addr_index (per_cu, u64); + *high = *low; + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *high += u64; + *new_ptr = loc_ptr; + return DEBUG_LOC_START_LENGTH; + case DW_LLE_start_length: + if (buf_end - loc_ptr < addr_size) + return DEBUG_LOC_BUFFER_OVERFLOW; + if (signed_addr_p) + *low = extract_signed_integer (loc_ptr, addr_size, byte_order); + else + *low = extract_unsigned_integer (loc_ptr, addr_size, byte_order); + loc_ptr += addr_size; + *high = *low; + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *high += u64; + *new_ptr = loc_ptr; + return DEBUG_LOC_START_LENGTH; case DW_LLE_end_of_list: *new_ptr = loc_ptr; return DEBUG_LOC_END_OF_LIST; @@ -197,6 +232,10 @@ decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, *high = u64; *new_ptr = loc_ptr; return DEBUG_LOC_START_END; + /* Following cases are not supported yet. */ + case DW_LLE_startx_endx: + case DW_LLE_start_end: + case DW_LLE_default_location: default: return DEBUG_LOC_INVALID_ENTRY; }