From 1c9f770d16a715662564d810a1c1efefd7a66540 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 29 Sep 2020 00:02:06 +0200 Subject: [PATCH] binutils: dwarf.c handle DWARF5 DW_LLE_start_end and DW_LLE_start_length. 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 | 5 +++++ binutils/dwarf.c | 23 +++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 59750dd1a26..4838c80d311 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2020-09-29 Mark Wielaard + + * 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 * elfcomm.c (byte_put_little_endian, byte_put_big_endian): Support diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 5f32e957a04..e152b20438c 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -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, -- 2.30.2