From: Mark Wielaard Date: Mon, 28 Sep 2020 22:02:06 +0000 (+0200) Subject: binutils: dwarf.c handle DWARF5 DW_LLE_start_end and DW_LLE_start_length. X-Git-Tag: binutils-2_35_2~88 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6ccb0b25575511e699f2c32631717fdfe14f5ad5;p=thirdparty%2Fbinutils-gdb.git 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. (cherry picked from commit 1c9f770d16a715662564d810a1c1efefd7a66540) --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 5e048dbf347..0f756f778fc 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2020-11-15 Mark Wielaard + + Backport from the mainline: + 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-11-15 Mark Wielaard Backport from the mainline: diff --git a/binutils/dwarf.c b/binutils/dwarf.c index b163c5b64f3..eed0177b068 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -6018,7 +6018,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); @@ -6039,7 +6041,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, @@ -6066,7 +6079,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) @@ -6078,8 +6093,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,