diff options
author | Mark Wielaard <mark@klomp.org> | 2020-09-29 00:02:06 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2020-09-29 14:08:51 +0200 |
commit | 1c9f770d16a715662564d810a1c1efefd7a66540 (patch) | |
tree | 3b897f79e96d21885f5e5435c2a8e65e32159a91 /binutils/dwarf.c | |
parent | 9aed480c3a725d3651d9035cba05c2daaeb5d7d0 (diff) | |
download | gdb-1c9f770d16a715662564d810a1c1efefd7a66540.zip gdb-1c9f770d16a715662564d810a1c1efefd7a66540.tar.gz gdb-1c9f770d16a715662564d810a1c1efefd7a66540.tar.bz2 |
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.
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r-- | binutils/dwarf.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 5f32e95..e152b20 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, |