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.
This commit is contained in:
parent
2da2eaf4ce
commit
3112ed9799
@ -1,3 +1,8 @@
|
||||
2020-01-16 Nitika Achra <Nitika.Achra@amd.com>
|
||||
|
||||
* dwarf2loc.c (decode_debug_loclists_addresses): Handle
|
||||
DW_LLE_base_addressx, DW_LLE_startx_length, DW_LLE_start_length.
|
||||
|
||||
2020-01-15 Simon Marchi <simon.marchi@efficios.com>
|
||||
|
||||
* infcmd.c (post_create_inferior): Use get_thread_regcache
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user