summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitika Achra <Nitika.Achra@amd.com>2020-01-16 11:51:06 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-01-16 11:51:19 -0500
commit3112ed9799124edf4d1f9c903da0d59f5a4ca102 (patch)
tree63fc6bd2ce5133d777ac8bf31d46778d3c862d56
parent2da2eaf4ce299c84c5a1f1bc6f7944266cb36d6e (diff)
downloadbinutils-gdb-3112ed9799124edf4d1f9c903da0d59f5a4ca102.tar.gz
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.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/dwarf2loc.c39
2 files changed, 44 insertions, 0 deletions
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 <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
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;
}