binutils: dwarf.c handle DWARF5 DW_LLE_start_end and DW_LLE_start_length.
authorMark Wielaard <mark@klomp.org>
Mon, 28 Sep 2020 22:02:06 +0000 (00:02 +0200)
committerMark Wielaard <mark@klomp.org>
Tue, 29 Sep 2020 12:08:51 +0000 (14:08 +0200)
display_loclists_list only handled DW_LLE_offset_pair as bounded
location description. Also handle DW_LLE_start_end and DW_LLE_start_lenght.
These don't use the base_address.

binutils/ChangeLog:

      * dwarf.c (display_loclists_list): Handle DW_LLE_start_end and
      DW_LLE_start_length. Only add base_address for DW_LLE_offset_pair.

binutils/ChangeLog
binutils/dwarf.c

index 59750dd1a262842fea54e8d6fe00f1434c002725..4838c80d31105d2d2b5d1a65abc0d77c44ae47af 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-29  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf.c (display_loclists_list): Handle DW_LLE_start_end and
+       DW_LLE_start_length. Only add base_address for DW_LLE_offset_pair.
+
 2020-09-25  Alan Modra  <amodra@gmail.com>
 
        * elfcomm.c (byte_put_little_endian, byte_put_big_endian): Support
index 5f32e957a04576cf8a9f17d4a4aa517b16975f3f..e152b20438cc160e76d72dce9b64632aaabbc922 100644 (file)
@@ -6055,7 +6055,9 @@ display_loclists_list (struct dwarf_section *section,
 
       SAFE_BYTE_GET_AND_INC (llet, start, 1, section_end);
 
-      if (vstart && llet == DW_LLE_offset_pair)
+      if (vstart && (llet == DW_LLE_offset_pair
+                    || llet == DW_LLE_start_end
+                    || llet == DW_LLE_start_length))
        {
          off = offset + (vstart - *start_ptr);
 
@@ -6076,7 +6078,18 @@ display_loclists_list (struct dwarf_section *section,
          break;
        case DW_LLE_offset_pair:
          READ_ULEB (begin, start, section_end);
+         begin += base_address;
          READ_ULEB (end, start, section_end);
+         end += base_address;
+         break;
+       case DW_LLE_start_end:
+         SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
+         SAFE_BYTE_GET_AND_INC (end, start, pointer_size, section_end);
+         break;
+       case DW_LLE_start_length:
+         SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, section_end);
+         READ_ULEB (end, start, section_end);
+         end += begin;
          break;
        case DW_LLE_base_address:
          SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size,
@@ -6103,7 +6116,9 @@ display_loclists_list (struct dwarf_section *section,
        }
       if (llet == DW_LLE_end_of_list)
        break;
-      if (llet != DW_LLE_offset_pair)
+      if (llet != DW_LLE_offset_pair
+         && llet != DW_LLE_start_end
+         && llet != DW_LLE_start_length)
        continue;
 
       if (start + 2 > section_end)
@@ -6115,8 +6130,8 @@ display_loclists_list (struct dwarf_section *section,
 
       READ_ULEB (length, start, section_end);
 
-      print_dwarf_vma (begin + base_address, pointer_size);
-      print_dwarf_vma (end + base_address, pointer_size);
+      print_dwarf_vma (begin, pointer_size);
+      print_dwarf_vma (end, pointer_size);
 
       putchar ('(');
       need_frame_base = decode_location_expression (start,