aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog33
-rw-r--r--binutils/dwarf.c332
-rw-r--r--binutils/dwarf.h3
-rw-r--r--binutils/testsuite/binutils-all/locview-1.s270
-rw-r--r--binutils/testsuite/binutils-all/locview-2.s335
-rw-r--r--binutils/testsuite/binutils-all/readelf.exp29
-rw-r--r--binutils/testsuite/binutils-all/readelf.locview-135
-rw-r--r--binutils/testsuite/binutils-all/readelf.locview-246
-rw-r--r--include/ChangeLog7
-rw-r--r--include/dwarf2.def2
-rw-r--r--include/dwarf2.h8
11 files changed, 1065 insertions, 35 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 87ee8a4..0374084 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,36 @@
+2017-09-22 Alexandre Oliva <aoliva@redhat.com>
+
+ * dwarf.h (debug_info): Add loc_views and num_loc_views.
+ * dwarf.c (vm1): New constant.
+ (print_dwarf_view): New function.
+ (read_and_display_attr_value): Support DW_AT_GNU_locviews.
+ (process_debug_info): Keep num_loc_offsets and num_loc_views
+ in sync.
+ (display_view_pair_list): New function.
+ (display_loc_list_dwo): Take vstart_ptr; update it. Dump
+ location view pairs before the range they apply to, when a
+ viewlist augments the loc list.
+ (display_loc_list): Likewise. Check view numbers in range
+ tests.
+ (display_loclists_list): Likewise. Handle view pair entries,
+ and warn on trailing ones.
+ (loc_views): New variable.
+ (loc_offsets_compar): Compare loc_views if loc_offsets are the
+ same.
+ (display_debug_loc): Check and sort loc_views too. Accept
+ loc_view as expected_start. Skip if lists and views are the
+ same. Dump locview list separately in order, and pass the
+ locview list base to each list dump function. Warn and skip
+ overlap and hole checking if we find loclists and locviews to
+ not be adjacent.
+ * testsuite/binutils-all/locview-1.s: New.
+ * testsuite/binutils-all/readelf.locview-1: New.
+ * testsuite/binutils-all/locview-2.s: New.
+ * testsuite/binutils-all/readelf.locview-2: New.
+ * testsuite/binutils-all/readelf.exp: Run new tests. Fix
+ option spelling in pr18374 fail message. XFAIL dw5 test on
+ nds32*-elf.
+
2017-09-22 Alan Modra <amodra@gmail.com>
* testsuite/binutils-all/readelf.exp: Don't perror and exit on
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index d2fc799..af8732b 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -74,6 +74,10 @@ unsigned long dwarf_start_die;
int dwarf_check = 0;
+/* Convenient constant, to avoid having to cast -1 to dwarf_vma when
+ testing whether e.g. a locview list is present. */
+static const dwarf_vma vm1 = -1;
+
/* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index
sections. For version 1 package files, each set is stored in SHNDX_POOL
as a zero-terminated list of section indexes comprising one set of debug
@@ -239,6 +243,26 @@ print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
}
+/* Print a view number in hexadecimal value, with the same width
+ print_dwarf_vma would have printed it with the same num_bytes.
+ Print blanks for zero view, unless force is nonzero. */
+
+static void
+print_dwarf_view (dwarf_vma value, unsigned num_bytes, int force)
+{
+ int len;
+ if (!num_bytes)
+ len = 4;
+ else
+ len = num_bytes * 2;
+
+ assert (value == (unsigned long) value);
+ if (value || force)
+ printf ("v%0*lx ", len - 1, (unsigned long) value);
+ else
+ printf ("%*s", len + 1, "");
+}
+
/* Format a 64-bit value, given as two 32-bit values, in hex.
For reentrancy, this uses a buffer provided by the caller. */
@@ -2012,6 +2036,7 @@ read_and_display_attr_value (unsigned long attribute,
have_frame_base = 1;
/* Fall through. */
case DW_AT_location:
+ case DW_AT_GNU_locviews:
case DW_AT_string_length:
case DW_AT_return_addr:
case DW_AT_data_member_location:
@@ -2041,6 +2066,9 @@ read_and_display_attr_value (unsigned long attribute,
debug_info_p->loc_offsets = (dwarf_vma *)
xcrealloc (debug_info_p->loc_offsets,
lmax, sizeof (*debug_info_p->loc_offsets));
+ debug_info_p->loc_views = (dwarf_vma *)
+ xcrealloc (debug_info_p->loc_views,
+ lmax, sizeof (*debug_info_p->loc_views));
debug_info_p->have_frame_base = (int *)
xcrealloc (debug_info_p->have_frame_base,
lmax, sizeof (*debug_info_p->have_frame_base));
@@ -2048,9 +2076,23 @@ read_and_display_attr_value (unsigned long attribute,
}
if (this_set != NULL)
uvalue += this_set->section_offsets [DW_SECT_LOC];
- debug_info_p->loc_offsets [num] = uvalue;
debug_info_p->have_frame_base [num] = have_frame_base;
- debug_info_p->num_loc_offsets++;
+ if (attribute != DW_AT_GNU_locviews)
+ {
+ debug_info_p->loc_offsets [num] = uvalue;
+ debug_info_p->num_loc_offsets++;
+ assert (debug_info_p->num_loc_offsets
+ - debug_info_p->num_loc_views <= 1);
+ }
+ else
+ {
+ assert (debug_info_p->num_loc_views <= num);
+ num = debug_info_p->num_loc_views;
+ debug_info_p->loc_views [num] = uvalue;
+ debug_info_p->num_loc_views++;
+ assert (debug_info_p->num_loc_views
+ - debug_info_p->num_loc_offsets <= 1);
+ }
}
break;
@@ -2858,21 +2900,22 @@ process_debug_info (struct dwarf_section *section,
break;
}
+ debug_info *debug_info_p =
+ (debug_information && unit < alloc_num_debug_info_entries)
+ ? debug_information + unit : NULL;
+
+ assert (!debug_info_p
+ || (debug_info_p->num_loc_offsets
+ == debug_info_p->num_loc_views));
+
for (attr = entry->first_attr;
attr && attr->attribute;
attr = attr->next)
{
- debug_info *arg;
-
if (! do_loc && do_printing)
/* Show the offset from where the tag was extracted. */
printf (" <%lx>", (unsigned long)(tags - section_begin));
- if (debug_information && unit < alloc_num_debug_info_entries)
- arg = debug_information + unit;
- else
- arg = NULL;
-
tags = read_and_display_attr (attr->attribute,
attr->form,
attr->implicit_const,
@@ -2882,12 +2925,37 @@ process_debug_info (struct dwarf_section *section,
compunit.cu_pointer_size,
offset_size,
compunit.cu_version,
- arg,
+ debug_info_p,
do_loc || ! do_printing,
section,
this_set);
}
+ /* If a locview attribute appears before a location one,
+ make sure we don't associate it with an earlier
+ loclist. */
+ if (debug_info_p)
+ switch (debug_info_p->num_loc_offsets - debug_info_p->num_loc_views)
+ {
+ case 1:
+ debug_info_p->loc_views [debug_info_p->num_loc_views] = vm1;
+ debug_info_p->num_loc_views++;
+ assert (debug_info_p->num_loc_views
+ == debug_info_p->num_loc_offsets);
+ break;
+
+ case 0:
+ break;
+
+ case -1:
+ warn(_("DIE has locviews without loclist\n"));
+ debug_info_p->num_loc_views--;
+ break;
+
+ default:
+ assert (0);
+ }
+
if (entry->children)
++level;
}
@@ -5023,6 +5091,52 @@ is_max_address (dwarf_vma addr, unsigned int pointer_size)
return ((addr & mask) == mask);
}
+/* Display a view pair list starting at *VSTART_PTR and ending at
+ VLISTEND within SECTION. */
+
+static void
+display_view_pair_list (struct dwarf_section *section,
+ unsigned char **vstart_ptr,
+ unsigned int debug_info_entry,
+ unsigned char *vlistend)
+{
+ unsigned char *vstart = *vstart_ptr;
+ unsigned char *section_end = section->start + section->size;
+ unsigned int pointer_size = debug_information [debug_info_entry].pointer_size;
+
+ if (vlistend < section_end)
+ section_end = vlistend;
+
+ putchar ('\n');
+
+ while (vstart < section_end)
+ {
+ dwarf_vma off = vstart - section->start;
+ dwarf_vma vbegin, vend;
+
+ unsigned int bytes_read;
+ vbegin = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ if (vstart == section_end)
+ {
+ vstart -= bytes_read;
+ break;
+ }
+
+ vend = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+
+ printf (" %8.8lx ", (unsigned long) off);
+
+ print_dwarf_view (vbegin, pointer_size, 1);
+ print_dwarf_view (vend, pointer_size, 1);
+ printf (_("location view pair\n"));
+ }
+
+ putchar ('\n');
+ *vstart_ptr = vstart;
+}
+
/* Display a location list from a normal (ie, non-dwo) .debug_loc section. */
static void
@@ -5031,9 +5145,10 @@ display_loc_list (struct dwarf_section *section,
unsigned int debug_info_entry,
dwarf_vma offset,
dwarf_vma base_address,
+ unsigned char **vstart_ptr,
int has_frame_base)
{
- unsigned char *start = *start_ptr;
+ unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
unsigned char *section_end = section->start + section->size;
unsigned long cu_offset;
unsigned int pointer_size;
@@ -5067,6 +5182,7 @@ display_loc_list (struct dwarf_section *section,
while (1)
{
dwarf_vma off = offset + (start - *start_ptr);
+ dwarf_vma vbegin = vm1, vend = vm1;
if (start + 2 * pointer_size > section_end)
{
@@ -5107,6 +5223,24 @@ display_loc_list (struct dwarf_section *section,
continue;
}
+ if (vstart)
+ {
+ unsigned int bytes_read;
+
+ off = offset + (vstart - *start_ptr);
+
+ vbegin = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (vbegin, pointer_size, 1);
+
+ vend = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (vend, pointer_size, 1);
+
+ printf (_("views at %8.8lx for:\n %*s "),
+ (unsigned long) off, 8, "");
+ }
+
if (start + 2 > section_end)
{
warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
@@ -5138,9 +5272,9 @@ display_loc_list (struct dwarf_section *section,
if (need_frame_base && !has_frame_base)
printf (_(" [without DW_AT_frame_base]"));
- if (begin == end)
+ if (begin == end && vbegin == vend)
fputs (_(" (start == end)"), stdout);
- else if (begin > end)
+ else if (begin > end || (begin == end && vbegin > vend))
fputs (_(" (start > end)"), stdout);
putchar ('\n');
@@ -5149,6 +5283,7 @@ display_loc_list (struct dwarf_section *section,
}
*start_ptr = start;
+ *vstart_ptr = vstart;
}
/* Display a location list from a normal (ie, non-dwo) .debug_loclists section. */
@@ -5159,9 +5294,10 @@ display_loclists_list (struct dwarf_section *section,
unsigned int debug_info_entry,
dwarf_vma offset,
dwarf_vma base_address,
+ unsigned char **vstart_ptr,
int has_frame_base)
{
- unsigned char *start = *start_ptr;
+ unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
unsigned char *section_end = section->start + section->size;
unsigned long cu_offset;
unsigned int pointer_size;
@@ -5170,8 +5306,8 @@ display_loclists_list (struct dwarf_section *section,
unsigned int bytes_read;
/* Initialize it due to a false compiler warning. */
- dwarf_vma begin = -1;
- dwarf_vma end = -1;
+ dwarf_vma begin = -1, vbegin = -1;
+ dwarf_vma end = -1, vend = -1;
dwarf_vma length;
int need_frame_base;
@@ -5211,6 +5347,22 @@ display_loclists_list (struct dwarf_section *section,
SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
+ if (vstart && llet == DW_LLE_offset_pair)
+ {
+ off = offset + (vstart - *start_ptr);
+
+ vbegin = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (vbegin, pointer_size, 1);
+
+ vend = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (vend, pointer_size, 1);
+
+ printf (_("views at %8.8lx for:\n %*s "),
+ (unsigned long) off, 8, "");
+ }
+
switch (llet)
{
case DW_LLE_end_of_list:
@@ -5228,6 +5380,21 @@ display_loclists_list (struct dwarf_section *section,
print_dwarf_vma (base_address, pointer_size);
printf (_("(base address)\n"));
break;
+#ifdef DW_LLE_view_pair
+ case DW_LLE_view_pair:
+ if (vstart)
+ printf (_("View pair entry in loclist with locviews attribute\n"));
+ vbegin = read_uleb128 (start, &bytes_read, section_end);
+ start += bytes_read;
+ print_dwarf_view (vbegin, pointer_size, 1);
+
+ vend = read_uleb128 (start, &bytes_read, section_end);
+ start += bytes_read;
+ print_dwarf_view (vend, pointer_size, 1);
+
+ printf (_("views for:\n"));
+ continue;
+#endif
default:
error (_("Invalid location list entry type %d\n"), llet);
return;
@@ -5262,17 +5429,22 @@ display_loclists_list (struct dwarf_section *section,
if (need_frame_base && !has_frame_base)
printf (_(" [without DW_AT_frame_base]"));
- if (begin == end)
+ if (begin == end && vbegin == vend)
fputs (_(" (start == end)"), stdout);
- else if (begin > end)
+ else if (begin > end || (begin == end && vbegin > vend))
fputs (_(" (start > end)"), stdout);
putchar ('\n');
start += length;
+ vbegin = vend = -1;
}
+ if (vbegin != vm1 || vend != vm1)
+ printf (_("Trailing view pair not used in a range"));
+
*start_ptr = start;
+ *vstart_ptr = vstart;
}
/* Print a .debug_addr table index in decimal, surrounded by square brackets,
@@ -5295,9 +5467,10 @@ display_loc_list_dwo (struct dwarf_section *section,
unsigned char **start_ptr,
unsigned int debug_info_entry,
dwarf_vma offset,
+ unsigned char **vstart_ptr,
int has_frame_base)
{
- unsigned char *start = *start_ptr;
+ unsigned char *start = *start_ptr, *vstart = *vstart_ptr;
unsigned char *section_end = section->start + section->size;
unsigned long cu_offset;
unsigned int pointer_size;
@@ -5340,17 +5513,47 @@ display_loc_list_dwo (struct dwarf_section *section,
}
SAFE_BYTE_GET_AND_INC (entry_type, start, 1, section_end);
+
+ if (vstart)
+ switch (entry_type)
+ {
+ default:
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ {
+ dwarf_vma view;
+ dwarf_vma off = offset + (vstart - *start_ptr);
+
+ view = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (view, 8, 1);
+
+ view = read_uleb128 (vstart, &bytes_read, section_end);
+ vstart += bytes_read;
+ print_dwarf_view (view, 8, 1);
+
+ printf (_("views at %8.8lx for:\n %*s "),
+ (unsigned long) off, 8, "");
+
+ }
+ break;
+ }
+
switch (entry_type)
{
case 0: /* A terminating entry. */
*start_ptr = start;
+ *vstart_ptr = vstart;
printf (_("<End of list>\n"));
return;
case 1: /* A base-address entry. */
idx = read_uleb128 (start, &bytes_read, section_end);
start += bytes_read;
print_addr_index (idx, 8);
- printf (" ");
+ printf ("%*s", 9 + (vstart ? 2 * 6 : 0), "");
printf (_("(base address selection entry)\n"));
continue;
case 2: /* A start/end entry. */
@@ -5377,6 +5580,7 @@ display_loc_list_dwo (struct dwarf_section *section,
default:
warn (_("Unknown location list entry type 0x%x.\n"), entry_type);
*start_ptr = start;
+ *vstart_ptr = vstart;
return;
}
@@ -5413,11 +5617,13 @@ display_loc_list_dwo (struct dwarf_section *section,
}
*start_ptr = start;
+ *vstart_ptr = vstart;
}
-/* Sort array of indexes in ascending order of loc_offsets[idx]. */
+/* Sort array of indexes in ascending order of loc_offsets[idx] and
+ loc_views. */
-static dwarf_vma *loc_offsets;
+static dwarf_vma *loc_offsets, *loc_views;
static int
loc_offsets_compar (const void *ap, const void *bp)
@@ -5425,23 +5631,33 @@ loc_offsets_compar (const void *ap, const void *bp)
dwarf_vma a = loc_offsets[*(const unsigned int *) ap];
dwarf_vma b = loc_offsets[*(const unsigned int *) bp];
- return (a > b) - (b > a);
+ int ret = (a > b) - (b > a);
+ if (ret)
+ return ret;
+
+ a = loc_views[*(const unsigned int *) ap];
+ b = loc_views[*(const unsigned int *) bp];
+
+ ret = (a > b) - (b > a);
+
+ return ret;
}
static int
display_debug_loc (struct dwarf_section *section, void *file)
{
- unsigned char *start = section->start;
+ unsigned char *start = section->start, *vstart = NULL;
unsigned long bytes;
unsigned char *section_begin = start;
unsigned int num_loc_list = 0;
unsigned long last_offset = 0;
+ unsigned long last_view = 0;
unsigned int first = 0;
unsigned int i;
unsigned int j;
int seen_first_offset = 0;
int locs_sorted = 1;
- unsigned char *next;
+ unsigned char *next = start, *vnext = vstart;
unsigned int *array = NULL;
const char *suffix = strrchr (section->name, '.');
int is_dwo = 0;
@@ -5529,6 +5745,7 @@ display_debug_loc (struct dwarf_section *section, void *file)
{
/* This is the first location list. */
last_offset = debug_information [i].loc_offsets [0];
+ last_view = debug_information [i].loc_views [0];
first = i;
seen_first_offset = 1;
j = 1;
@@ -5539,12 +5756,15 @@ display_debug_loc (struct dwarf_section *section, void *file)
for (; j < num; j++)
{
if (last_offset >
- debug_information [i].loc_offsets [j])
+ debug_information [i].loc_offsets [j]
+ || (last_offset == debug_information [i].loc_offsets [j]
+ && last_view > debug_information [i].loc_views [j]))
{
locs_sorted = 0;
break;
}
last_offset = debug_information [i].loc_offsets [j];
+ last_view = debug_information [i].loc_views [j];
}
}
}
@@ -5553,7 +5773,8 @@ display_debug_loc (struct dwarf_section *section, void *file)
error (_("No location lists in .debug_info section!\n"));
if (debug_information [first].num_loc_offsets > 0
- && debug_information [first].loc_offsets [0] != expected_start)
+ && debug_information [first].loc_offsets [0] != expected_start
+ && debug_information [first].loc_views [0] != expected_start)
warn (_("Location lists in %s section start at 0x%s\n"),
section->name,
dwarf_vmatoa ("x", debug_information [first].loc_offsets [0]));
@@ -5568,7 +5789,7 @@ display_debug_loc (struct dwarf_section *section, void *file)
seen_first_offset = 0;
for (i = first; i < num_debug_info_entries; i++)
{
- dwarf_vma offset;
+ dwarf_vma offset, voffset;
dwarf_vma base_address;
unsigned int k;
int has_frame_base;
@@ -5578,24 +5799,42 @@ display_debug_loc (struct dwarf_section *section, void *file)
for (k = 0; k < debug_information [i].num_loc_offsets; k++)
array[k] = k;
loc_offsets = debug_information [i].loc_offsets;
+ loc_views = debug_information [i].loc_views;
qsort (array, debug_information [i].num_loc_offsets,
sizeof (*array), loc_offsets_compar);
}
+ int adjacent_view_loclists = 1;
for (k = 0; k < debug_information [i].num_loc_offsets; k++)
{
j = locs_sorted ? k : array[k];
if (k
- && debug_information [i].loc_offsets [locs_sorted
+ && (debug_information [i].loc_offsets [locs_sorted
? k - 1 : array [k - 1]]
- == debug_information [i].loc_offsets [j])
+ == debug_information [i].loc_offsets [j])
+ && (debug_information [i].loc_views [locs_sorted
+ ? k - 1 : array [k - 1]]
+ == debug_information [i].loc_views [j]))
continue;
has_frame_base = debug_information [i].have_frame_base [j];
offset = debug_information [i].loc_offsets [j];
next = section_begin + offset;
+ voffset = debug_information [i].loc_views [j];
+ if (voffset != vm1)
+ vnext = section_begin + voffset;
+ else
+ vnext = NULL;
base_address = debug_information [i].base_address;
- if (!seen_first_offset)
+ if (vnext && vnext < next)
+ {
+ vstart = vnext;
+ display_view_pair_list (section, &vstart, i, next);
+ if (start == vnext)
+ start = vstart;
+ }
+
+ if (!seen_first_offset || !adjacent_view_loclists)
seen_first_offset = 1;
else
{
@@ -5609,6 +5848,7 @@ display_debug_loc (struct dwarf_section *section, void *file)
(unsigned long) offset);
}
start = next;
+ vstart = vnext;
if (offset >= bytes)
{
@@ -5617,14 +5857,21 @@ display_debug_loc (struct dwarf_section *section, void *file)
continue;
}
+ if (vnext && voffset >= bytes)
+ {
+ warn (_("View Offset 0x%lx is bigger than .debug_loc section size.\n"),
+ (unsigned long) voffset);
+ continue;
+ }
+
if (!is_loclists)
{
if (is_dwo)
display_loc_list_dwo (section, &start, i, offset,
- has_frame_base);
+ &vstart, has_frame_base);
else
display_loc_list (section, &start, i, offset, base_address,
- has_frame_base);
+ &vstart, has_frame_base);
}
else
{
@@ -5632,8 +5879,25 @@ display_debug_loc (struct dwarf_section *section, void *file)
warn (_("DWO is not yet supported.\n"));
else
display_loclists_list (section, &start, i, offset, base_address,
- has_frame_base);
+ &vstart, has_frame_base);
+ }
+
+ /* FIXME: this arrangement is quite simplistic. Nothing
+ requires locview lists to be adjacent to corresponding
+ loclists, and a single loclist could be augmented by
+ different locview lists, and vice-versa, unlikely as it
+ is that it would make sense to do so. Hopefully we'll
+ have view pair support built into loclists before we ever
+ need to address all these possibilities. */
+ if (adjacent_view_loclists && vnext
+ && vnext != start && vstart != next)
+ {
+ adjacent_view_loclists = 0;
+ warn (_("Hole and overlap detection requires adjacent view lists and loclists.\n"));
}
+
+ if (vnext && vnext == start)
+ display_view_pair_list (section, &start, i, vstart);
}
}
diff --git a/binutils/dwarf.h b/binutils/dwarf.h
index 4d3330c..15719ee 100644
--- a/binutils/dwarf.h
+++ b/binutils/dwarf.h
@@ -170,9 +170,12 @@ typedef struct
dwarf_vma ranges_base;
/* This is an array of offsets to the location list table. */
dwarf_vma * loc_offsets;
+ /* This is an array of offsets to the location view table. */
+ dwarf_vma * loc_views;
int * have_frame_base;
unsigned int num_loc_offsets;
unsigned int max_loc_offsets;
+ unsigned int num_loc_views;
/* List of .debug_ranges offsets seen in this .debug_info. */
dwarf_vma * range_lists;
unsigned int num_range_lists;
diff --git a/binutils/testsuite/binutils-all/locview-1.s b/binutils/testsuite/binutils-all/locview-1.s
new file mode 100644
index 0000000..d9d9b5b
--- /dev/null
+++ b/binutils/testsuite/binutils-all/locview-1.s
@@ -0,0 +1,270 @@
+ .text
+.Ltext0:
+.LFB0:
+ /* locview.c:1 */
+.LM1:
+ /* view -0 */
+ /* locview.c:2 */
+.LM2:
+ /* view 1 */
+.LVL0:
+ /* DEBUG i => 0 */
+ /* locview.c:3 */
+.LM3:
+ /* view 2 */
+ /* DEBUG j => 0x1 */
+ /* locview.c:4 */
+.LM4:
+ /* view 3 */
+ /* DEBUG i => 0x2 */
+ /* locview.c:5 */
+.LM5:
+ /* view 4 */
+ /* DEBUG j => 0x3 */
+ /* locview.c:6 */
+.LM6:
+ /* view 5 */
+ /* DEBUG k => 0x4 */
+ /* DEBUG l => 0x4 */
+ /* locview.c:7 */
+.LM7:
+ /* view 6 */
+ /* DEBUG k => 0x5 */
+ /* DEBUG l => 0x5 */
+ /* locview.c:8 */
+.LM8:
+ /* view 7 */
+ /* DEBUG k => 0x6 */
+ /* DEBUG l => 0x6 */
+ /* locview.c:9 */
+.LM9:
+ /* view 8 */
+ .byte 0
+.LFE0:
+.Letext0:
+
+ .section .debug_info
+.Ldebug_info0:
+.LIbase:
+ .4byte .LIend - .LIstart /* Length of Compilation Unit Info */
+.LIstart:
+ .2byte 0x4 /* DWARF version number */
+ .4byte .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte 0x4 /* Pointer Size (in bytes) */
+.LIcu:
+ .uleb128 0x1 /* (DIE (cu) DW_TAG_compile_unit) */
+ .ascii "hand-crafted based on GCC output\0"
+ .byte 0xc /* DW_AT_language */
+ .ascii "locview.c\0"
+ .ascii "/tmp\0"
+ .4byte 0 /* DW_AT_low_pc */
+.LIsubf:
+ .uleb128 0x2 /* (DIE (subf) DW_TAG_subprogram) */
+ .ascii "f\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x1 /* DW_AT_decl_line */
+ .4byte .LIint-.LIbase /* DW_AT_type */
+ .4byte .LFB0 /* DW_AT_low_pc */
+ .4byte 1 /* .LFE0-.LFB0 */ /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_AT_frame_base */
+ .byte 0x9c /* DW_OP_call_frame_cfa */
+ /* DW_AT_GNU_all_call_sites */
+ .4byte .LIint - .LIbase /* DW_AT_sibling */
+.LIvari:
+ .uleb128 0x3 /* (DIE (vari) DW_TAG_variable) */
+ .ascii "i\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x2 /* DW_AT_decl_line */
+ .4byte .LIint-.LIbase /* DW_AT_type */
+ .4byte .LLST0 /* DW_AT_location */
+ .4byte .LVUS0 /* DW_AT_GNU_locviews */
+.LIvarj:
+ .uleb128 0x3 /* (DIE (varf) DW_TAG_variable) */
+ .ascii "j\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x3 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LLST1 /* DW_AT_location */
+ .4byte .LVUS1 /* DW_AT_GNU_locviews */
+.LIvark:
+ .uleb128 0x5 /* (DIE (vark) DW_TAG_variable) */
+ .ascii "k\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x6 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LVUS2 /* DW_AT_GNU_locviews */
+ .4byte .LLST2 /* DW_AT_location */
+ .byte 0 /* end of children of subf */
+.LIvarl:
+ .uleb128 0x5 /* (DIE (varl) DW_TAG_variable) */
+ .ascii "l\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x6 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LVUS2 /* DW_AT_GNU_locviews */
+ .4byte .LLST2 /* DW_AT_location */
+ .byte 0 /* end of children of subf */
+
+.LIint:
+ .uleb128 0x4 /* (DIE (int) DW_TAG_base_type) */
+ .byte 0x4 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "int\0" /* DW_AT_name */
+ .byte 0 /* end of children of cu */
+.LIend:
+
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+.LAbrv1:
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x1b /* (DW_AT_comp_dir) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x1 /* (DW_FORM_addr) */
+ .byte 0
+ .byte 0
+.LAbrv2:
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x1 /* (DW_FORM_addr) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x40 /* (DW_AT_frame_base) */
+ .uleb128 0x18 /* (DW_FORM_exprloc) */
+ .uleb128 0x2117 /* (DW_AT_GNU_all_call_sites) */
+ .uleb128 0x19 /* (DW_FORM_flag_present) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+.LAbrv3:
+ .uleb128 0x3 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .uleb128 0x2137 /* (DW_AT_GNU_locviews) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .byte 0
+ .byte 0
+.LAbrv4:
+ .uleb128 0x4 /* (abbrev code) */
+ .uleb128 0x24 /* (TAG: DW_TAG_base_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3e /* (DW_AT_encoding) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0
+ .byte 0
+.LAbrv5:
+ .uleb128 0x5 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2137 /* (DW_AT_GNU_locviews) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .byte 0
+ .byte 0
+ .byte 0
+
+ .section .debug_loc
+.Ldebug_loc0:
+.LVUS0:
+ .uleb128 0x2 /* View list begin (*.LVUS0) */
+ .uleb128 0x4 /* View list end (*.LVUS0) */
+ .uleb128 0x4 /* View list begin (*.LVUS0) */
+ .uleb128 0 /* View list end (*.LVUS0) */
+.LLST0:
+ .4byte .LVL0 /* Location list begin address (*.LLST0) */
+ .4byte .LVL0 /* Location list end address (*.LLST0) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x30 /* DW_OP_lit0 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte .LVL0 /* Location list begin address (*.LLST0) */
+ .4byte .LFE0 /* Location list end address (*.LLST0) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x32 /* DW_OP_lit2 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte 0 /* Location list terminator begin (*.LLST0) */
+ .4byte 0 /* Location list terminator end (*.LLST0) */
+.LLST1:
+ .4byte .LVL0 /* Location list begin address (*.LLST1) */
+ .4byte .LVL0 /* Location list end address (*.LLST1) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x31 /* DW_OP_lit1 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte .LVL0 /* Location list begin address (*.LLST1) */
+ .4byte .LFE0 /* Location list end address (*.LLST1) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x33 /* DW_OP_lit3 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte 0 /* Location list terminator begin (*.LLST1) */
+ .4byte 0 /* Location list terminator end (*.LLST1) */
+.LVUS1:
+ .uleb128 0x3 /* View list begin (*.LVUS1) */
+ .uleb128 0x5 /* View list end (*.LVUS1) */
+ .uleb128 0x5 /* View list begin (*.LVUS1) */
+ .uleb128 0 /* View list end (*.LVUS1) */
+.LVUS2:
+ .uleb128 0x6 /* View list begin (*.LVUS2) */
+ .uleb128 0x7 /* View list end (*.LVUS2) */
+ .uleb128 0x7 /* View list begin (*.LVUS2) */
+ .uleb128 0x8 /* View list end (*.LVUS2) */
+ .uleb128 0x8 /* View list begin (*.LVUS2) */
+ .uleb128 0 /* View list end (*.LVUS2) */
+.LLST2:
+ .4byte .LVL0 /* Location list begin address (*.LLST2) */
+ .4byte .LVL0 /* Location list end address (*.LLST2) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x34 /* DW_OP_lit4 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte .LVL0 /* Location list begin address (*.LLST2) */
+ .4byte .LVL0 /* Location list end address (*.LLST2) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x35 /* DW_OP_lit5 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte .LVL0 /* Location list begin address (*.LLST2) */
+ .4byte .LFE0 /* Location list end address (*.LLST2) */
+ .2byte 0x2 /* Location expression size */
+ .byte 0x36 /* DW_OP_lit6 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .4byte 0 /* Location list terminator begin (*.LLST2) */
+ .4byte 0 /* Location list terminator end (*.LLST2) */
diff --git a/binutils/testsuite/binutils-all/locview-2.s b/binutils/testsuite/binutils-all/locview-2.s
new file mode 100644
index 0000000..d9b1d58
--- /dev/null
+++ b/binutils/testsuite/binutils-all/locview-2.s
@@ -0,0 +1,335 @@
+ .text
+.Ltext0:
+.LFB0:
+ /* locview.c:1 */
+.LM1:
+ /* view -0 */
+ /* locview.c:2 */
+.LM2:
+ /* view 1 */
+.LVL0:
+ /* DEBUG i => 0 */
+ /* locview.c:3 */
+.LM3:
+ /* view 2 */
+ /* DEBUG j => 0x1 */
+ /* locview.c:4 */
+.LM4:
+ /* view 3 */
+ /* DEBUG i => 0x2 */
+ /* locview.c:5 */
+.LM5:
+ /* view 4 */
+ /* DEBUG j => 0x3 */
+ /* locview.c:6 */
+.LM6:
+ /* view 5 */
+ /* DEBUG k => 0x4 */
+ /* DEBUG l => 0x4 */
+ /* locview.c:7 */
+.LM7:
+ /* view 6 */
+ /* DEBUG k => 0x5 */
+ /* DEBUG l => 0x5 */
+ /* locview.c:8 */
+.LM8:
+ /* view 7 */
+ /* DEBUG k => 0x6 */
+ /* DEBUG l => 0x6 */
+ /* locview.c:9 */
+.LM9:
+ /* view 8 */
+ .byte 0
+.LFE0:
+.Letext0:
+
+ .section .debug_info
+.Ldebug_info0:
+.LIbase:
+ .4byte .LIend - .LIstart /* Length of Compilation Unit Info */
+.LIstart:
+ .2byte 0x5 /* DWARF version number */
+ .byte 0x1 /* DW_UT_compile */
+ .byte 0x4 /* Pointer Size (in bytes) */
+ .4byte .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+.LIcu:
+ .uleb128 0x2 /* (DIE (cu) DW_TAG_compile_unit) */
+ .ascii "hand-crafted based on GCC output\0"
+ .byte 0x1d /* DW_AT_language */
+ .ascii "locview.c\0"
+ .ascii "/tmp\0"
+ .4byte 0 /* DW_AT_low_pc */
+.LIsubf:
+ .uleb128 0x3 /* (DIE (subf) DW_TAG_subprogram) */
+ .ascii "f\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_decl_file (locview.c) */
+ .byte 0x1 /* DW_AT_decl_line */
+ .4byte .LIint-.LIbase /* DW_AT_type */
+ .4byte .LFB0 /* DW_AT_low_pc */
+ .4byte 1 /* .LFE0-.LFB0 */ /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_AT_frame_base */
+ .byte 0x9c /* DW_OP_call_frame_cfa */
+ /* DW_AT_call_all_calls */
+ .4byte .LIint - .LIbase /* DW_AT_sibling */
+.LIvari:
+ .uleb128 0x1 /* (DIE (vari) DW_TAG_variable) */
+ .ascii "i\0" /* DW_AT_name */
+ /* DW_AT_decl_file (1, locview.c) */
+ .byte 0x2 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LLST0 /* DW_AT_location */
+ .4byte .LVUS0 /* DW_AT_GNU_locviews */
+.LIvarj:
+ .uleb128 0x1 /* (DIE (varj) DW_TAG_variable) */
+ .ascii "j\0" /* DW_AT_name */
+ /* DW_AT_decl_file (1, locview.c) */
+ .byte 0x3 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LLST1 /* DW_AT_location */
+ .4byte .LVUS1 /* DW_AT_GNU_locviews */
+.LIvark:
+ .uleb128 0x5 /* (DIE (vark) DW_TAG_variable) */
+ .ascii "k\0" /* DW_AT_name */
+ /* DW_AT_decl_file (1, locview.c) */
+ .byte 0x6 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LVUS2 /* DW_AT_GNU_locviews */
+ .4byte .LLST2 /* DW_AT_location */
+.LIvarl:
+ .uleb128 0x6 /* (DIE (varl) DW_TAG_variable) */
+ .ascii "l\0" /* DW_AT_name */
+ /* DW_AT_decl_file (1, locview.c) */
+ .byte 0x6 /* DW_AT_decl_line */
+ .4byte .LIint - .LIbase /* DW_AT_type */
+ .4byte .LLST3 /* DW_AT_location */
+ .byte 0 /* end of children of DIE subf */
+
+.LIint:
+ .uleb128 0x4 /* (DIE (int) DW_TAG_base_type) */
+ .byte 0x4 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "int\0" /* DW_AT_name */
+ .byte 0 /* end of children of DIE cu */
+.LIend:
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+.LAbrv1:
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0x21 /* (DW_FORM_implicit_const) */
+ .sleb128 1 /* (locview.c) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .uleb128 0x2137 /* (DW_AT_GNU_locviews) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .byte 0
+ .byte 0
+.LAbrv2:
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x1b /* (DW_AT_comp_dir) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x1 /* (DW_FORM_addr) */
+ .byte 0
+ .byte 0
+.LAbrv3:
+ .uleb128 0x3 /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x1 /* (DW_FORM_addr) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x40 /* (DW_AT_frame_base) */
+ .uleb128 0x18 /* (DW_FORM_exprloc) */
+ .uleb128 0x7a /* (DW_AT_call_all_calls) */
+ .uleb128 0x19 /* (DW_FORM_flag_present) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+.LAbrv4:
+ .uleb128 0x4 /* (abbrev code) */
+ .uleb128 0x24 /* (TAG: DW_TAG_base_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3e /* (DW_AT_encoding) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0
+ .byte 0
+.LAbrv5:
+ .uleb128 0x5 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0x21 /* (DW_FORM_implicit_const) */
+ .sleb128 1 /* (locview.c) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2137 /* (DW_AT_GNU_locviews) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .byte 0
+ .byte 0
+.LAbrv6:
+ .uleb128 0x6 /* (abbrev code) */
+ .uleb128 0x34 /* (TAG: DW_TAG_variable) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0x21 /* (DW_FORM_implicit_const) */
+ .sleb128 1 /* (locview.c) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0x17 /* (DW_FORM_sec_offset) */
+ .byte 0
+ .byte 0
+ .byte 0
+
+ .section .debug_loclists
+ .4byte .Ldebug_loc2-.Ldebug_loc1 /* Length of Location Lists */
+.Ldebug_loc1:
+ .2byte 0x5 /* DWARF version number */
+ .byte 0x4 /* Address Size */
+ .byte 0 /* Segment Size */
+ .4byte 0 /* Offset Entry Count */
+.Ldebug_loc0:
+.LVUS0:
+ .uleb128 0x2 /* View list begin (*.LVUS0) */
+ .uleb128 0x4 /* View list end (*.LVUS0) */
+ .uleb128 0x4 /* View list begin (*.LVUS0) */
+ .uleb128 0 /* View list end (*.LVUS0) */
+.LLST0:
+ .byte 0x6 /* DW_LLE_base_address (*.LLST0) */
+ .4byte .LVL0 /* Base address (*.LLST0) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST0) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST0) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST0) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x30 /* DW_OP_lit0 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST0) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST0) */
+ .uleb128 1 /* .LFE0-.LVL0 */ /* Location list end address (*.LLST0) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x32 /* DW_OP_lit2 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0 /* DW_LLE_end_of_list (*.LLST0) */
+.LLST1:
+ .byte 0x6 /* DW_LLE_base_address (*.LLST1) */
+ .4byte .LVL0 /* Base address (*.LLST1) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST1) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST1) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST1) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x31 /* DW_OP_lit1 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST1) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST1) */
+ .uleb128 1 /* .LFE0-.LVL0 */ /* Location list end address (*.LLST1) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x33 /* DW_OP_lit3 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0 /* DW_LLE_end_of_list (*.LLST1) */
+.LVUS1:
+ .uleb128 0x3 /* View list begin (*.LVUS1) */
+ .uleb128 0x5 /* View list end (*.LVUS1) */
+ .uleb128 0x5 /* View list begin (*.LVUS1) */
+ .uleb128 0 /* View list end (*.LVUS1) */
+.LVUS2:
+ .uleb128 0x6 /* View list begin (*.LVUS2) */
+ .uleb128 0x7 /* View list end (*.LVUS2) */
+ .uleb128 0x7 /* View list begin (*.LVUS2) */
+ .uleb128 0x8 /* View list end (*.LVUS2) */
+ .uleb128 0x8 /* View list begin (*.LVUS2) */
+ .uleb128 0 /* View list end (*.LVUS2) */
+.LLST2:
+ .byte 0x6 /* DW_LLE_base_address (*.LLST2) */
+ .4byte .LVL0 /* Base address (*.LLST2) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST2) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST2) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST2) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x34 /* DW_OP_lit4 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST2) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST2) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST2) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x35 /* DW_OP_lit5 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST2) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST2) */
+ .uleb128 1 /* .LFE0-.LVL0 */ /* Location list end address (*.LLST2) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x36 /* DW_OP_lit6 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0 /* DW_LLE_end_of_list (*.LLST2) */
+.LLST3:
+ .byte 0x6 /* DW_LLE_base_address (*.LLST3) */
+ .4byte .LVL0 /* Base address (*.LLST3) */
+ .byte 0x9 /* DW_LLE_view_pair (extension proposed for DWARF6) */
+ .uleb128 0x6 /* View list begin (*.LLST3) */
+ .uleb128 0x7 /* View list end (*.LVUS3) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST3) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST3) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST3) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x34 /* DW_OP_lit4 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x9 /* DW_LLE_view_pair */
+ .uleb128 0x7 /* View list begin (*.LLST3) */
+ .uleb128 0x8 /* View list end (*.LVUS3) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST3) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST3) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list end address (*.LLST3) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x35 /* DW_OP_lit5 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0x9 /* DW_LLE_view_pair */
+ .uleb128 0x8 /* View list begin (*.LLST3) */
+ .uleb128 0x0 /* View list end (*.LVUS3) */
+ .byte 0x4 /* DW_LLE_offset_pair (*.LLST3) */
+ .uleb128 0 /* .LVL0-.LVL0 */ /* Location list begin address (*.LLST3) */
+ .uleb128 1 /* .LFE0-.LVL0 */ /* Location list end address (*.LLST3) */
+ .uleb128 0x2 /* Location expression size */
+ .byte 0x36 /* DW_OP_lit6 */
+ .byte 0x9f /* DW_OP_stack_value */
+ .byte 0 /* DW_LLE_end_of_list (*.LLST3) */
+.Ldebug_loc2:
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 6a7b562..81d1809 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -379,6 +379,33 @@ if {![binutils_assemble $srcdir/$subdir/pr18374.s tmpdir/pr18374.o]} then {
}
+# locview - Check dumping of location lists with location views.
+if {![binutils_assemble $srcdir/$subdir/locview-1.s tmpdir/locview-1.o]} then {
+ unresolved "readelf --debug-dump=loc locview-1 (failed to assemble)"
+} else {
+
+ if ![is_remote host] {
+ set tempfile tmpdir/locview-1.o
+ } else {
+ set tempfile [remote_download host tmpdir/locview-1.o]
+ }
+
+ readelf_test --debug-dump=loc $tempfile readelf.locview-1 {}
+}
+if {![binutils_assemble $srcdir/$subdir/locview-2.s tmpdir/locview-2.o]} then {
+ unresolved "readelf --debug-dump=loc locview-2 (failed to assemble)"
+} else {
+
+ if ![is_remote host] {
+ set tempfile tmpdir/locview-2.o
+ } else {
+ set tempfile [remote_download host tmpdir/locview-2.o]
+ }
+
+ readelf_test --debug-dump=loc $tempfile readelf.locview-2 {}
+}
+
+
# Check that decompressed dumps work.
if {![binutils_assemble $srcdir/$subdir/z.s tmpdir/z.o]} then {
unresolved "readelf --decompress --hex-dump .debug_loc z (failed to assemble)"
@@ -417,6 +444,6 @@ if ![istarget "riscv*-*-*"] then {
readelf_find_size $tempfile
# Make sure that readelf can decode the contents.
- readelf_test -wiaoRlL $tempfile dw5.W {}
+ readelf_test -wiaoRlL $tempfile dw5.W { nds32*-elf }
}
}
diff --git a/binutils/testsuite/binutils-all/readelf.locview-1 b/binutils/testsuite/binutils-all/readelf.locview-1
new file mode 100644
index 0000000..6148520
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.locview-1
@@ -0,0 +1,35 @@
+Contents of the .*ebug_loc section:
+
+ Offset Begin End Expression
+
+ 00000000 v0000002 v0000004 location view pair
+ 00000002 v0000004 v0000000 location view pair
+
+ 00000004 v0000002 v0000004 views at 00000000 for:
+ 00000000 00000000 \(DW_OP_lit0; DW_OP_stack_value\)
+ 00000010 v0000004 v0000000 views at 00000002 for:
+ 00000000 00000001 \(DW_OP_lit2; DW_OP_stack_value\)
+ 0000001c <End of list>
+ 00000024 v0000003 v0000005 views at 00000044 for:
+ 00000000 00000000 \(DW_OP_lit1; DW_OP_stack_value\)
+ 00000030 v0000005 v0000000 views at 00000046 for:
+ 00000000 00000001 \(DW_OP_lit3; DW_OP_stack_value\)
+ 0000003c <End of list>
+
+ 00000044 v0000003 v0000005 location view pair
+ 00000046 v0000005 v0000000 location view pair
+
+
+ 00000048 v0000006 v0000007 location view pair
+ 0000004a v0000007 v0000008 location view pair
+ 0000004c v0000008 v0000000 location view pair
+
+ 0000004e v0000006 v0000007 views at 00000048 for:
+ 00000000 00000000 \(DW_OP_lit4; DW_OP_stack_value\)
+ 0000005a v0000007 v0000008 views at 0000004a for:
+ 00000000 00000000 \(DW_OP_lit5; DW_OP_stack_value\)
+ 00000066 v0000008 v0000000 views at 0000004c for:
+ 00000000 00000001 \(DW_OP_lit6; DW_OP_stack_value\)
+ 00000072 <End of list>
+
+#pass
diff --git a/binutils/testsuite/binutils-all/readelf.locview-2 b/binutils/testsuite/binutils-all/readelf.locview-2
new file mode 100644
index 0000000..f064ad7
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.locview-2
@@ -0,0 +1,46 @@
+Contents of the .*ebug_loclists section:
+#...
+ Offset Begin End Expression
+
+ 0000000c v0000002 v0000004 location view pair
+ 0000000e v0000004 v0000000 location view pair
+
+ 00000010 00000000 \(base address\)
+ 00000015 v0000002 v0000004 views at 0000000c for:
+ 00000000 00000000 \(DW_OP_lit0; DW_OP_stack_value\)
+ 0000001b v0000004 v0000000 views at 0000000e for:
+ 00000000 00000001 \(DW_OP_lit2; DW_OP_stack_value\)
+ 00000021 <End of list>
+ 00000022 00000000 \(base address\)
+ 00000027 v0000003 v0000005 views at 00000034 for:
+ 00000000 00000000 \(DW_OP_lit1; DW_OP_stack_value\)
+ 0000002d v0000005 v0000000 views at 00000036 for:
+ 00000000 00000001 \(DW_OP_lit3; DW_OP_stack_value\)
+ 00000033 <End of list>
+
+ 00000034 v0000003 v0000005 location view pair
+ 00000036 v0000005 v0000000 location view pair
+
+
+ 00000038 v0000006 v0000007 location view pair
+ 0000003a v0000007 v0000008 location view pair
+ 0000003c v0000008 v0000000 location view pair
+
+ 0000003e 00000000 \(base address\)
+ 00000043 v0000006 v0000007 views at 00000038 for:
+ 00000000 00000000 \(DW_OP_lit4; DW_OP_stack_value\)
+ 00000049 v0000007 v0000008 views at 0000003a for:
+ 00000000 00000000 \(DW_OP_lit5; DW_OP_stack_value\)
+ 0000004f v0000008 v0000000 views at 0000003c for:
+ 00000000 00000001 \(DW_OP_lit6; DW_OP_stack_value\)
+ 00000055 <End of list>
+ 00000056 00000000 \(base address\)
+ 0000005b v0000006 v0000007 views for:
+ 0000005e 00000000 00000000 \(DW_OP_lit4; DW_OP_stack_value\)
+ 00000064 v0000007 v0000008 views for:
+ 00000067 00000000 00000000 \(DW_OP_lit5; DW_OP_stack_value\)
+ 0000006d v0000008 v0000000 views for:
+ 00000070 00000000 00000001 \(DW_OP_lit6; DW_OP_stack_value\)
+ 00000076 <End of list>
+
+#pass
diff --git a/include/ChangeLog b/include/ChangeLog
index 1ba7de3..0ece8de 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,10 @@
+2017-09-22 Alexandre Oliva <aoliva@redhat.com>
+
+ * dwarf2.def (DW_AT_GNU_locviews): New.
+ * dwarf2.h (enum dwarf_location_list_entry_type): Add
+ DW_LLE_GNU_view_pair.
+ (DW_LLE_view_pair): Define.
+
2017-09-15 Pedro Alves <palves@redhat.com>
Sync with mainline gcc sources (r252823)
diff --git a/include/dwarf2.def b/include/dwarf2.def
index 2a3b23f..8e731a3 100644
--- a/include/dwarf2.def
+++ b/include/dwarf2.def
@@ -443,6 +443,8 @@ DW_AT (DW_AT_GNU_pubtypes, 0x2135)
/* Attribute for discriminator.
See http://gcc.gnu.org/wiki/Discriminator */
DW_AT (DW_AT_GNU_discriminator, 0x2136)
+DW_AT (DW_AT_GNU_locviews, 0x2137)
+DW_AT (DW_AT_GNU_entry_view, 0x2138)
/* VMS extensions. */
DW_AT (DW_AT_VMS_rtnbeg_pd_address, 0x2201)
/* GNAT extensions. */
diff --git a/include/dwarf2.h b/include/dwarf2.h
index a2e022d..fd76d82 100644
--- a/include/dwarf2.h
+++ b/include/dwarf2.h
@@ -298,6 +298,14 @@ enum dwarf_location_list_entry_type
DW_LLE_start_end = 0x07,
DW_LLE_start_length = 0x08,
+ /* <http://lists.dwarfstd.org/private.cgi/dwarf-discuss-dwarfstd.org/2017-April/004347.html>
+ has the proposal for now; only available to list members.
+
+ A (possibly updated) copy of the proposal is available at
+ <http://people.redhat.com/aoliva/papers/sfn/dwarf6-sfn-lvu.txt>. */
+ DW_LLE_GNU_view_pair = 0x09,
+#define DW_LLE_view_pair DW_LLE_GNU_view_pair
+
/* Former extension for Fission.
See http://gcc.gnu.org/wiki/DebugFission. */
DW_LLE_GNU_end_of_list_entry = 0x00,