diff options
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r-- | binutils/dwarf.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 08bb623..5b3ece5 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -7324,7 +7324,7 @@ display_debug_loc (struct dwarf_section *section, void *file) unsigned int *array = NULL; const char *suffix = strrchr (section->name, '.'); bool is_dwo = false; - int is_loclists = strstr (section->name, "debug_loclists") != NULL; + bool is_loclists = strstr (section->name, "debug_loclists") != NULL; uint64_t next_header_offset = 0; if (suffix && strcmp (suffix, ".dwo") == 0) @@ -7450,6 +7450,16 @@ display_debug_loc (struct dwarf_section *section, void *file) debug_info *debug_info_p = debug_information + i; uint32_t offset_count; + /* .debug_loclists section is loaded into debug_information as + DWARF-5 debug info and .debug_loc section is loaded into + debug_information as pre-DWARF-5 debug info. When dumping + .debug_loc section, we should only process pre-DWARF-5 debug + info in debug_information. When dumping .debug_loclists + section, we should only process DWARF-5 info in + debug_information. */ + if ((debug_info_p->dwarf_version >= 5) != is_loclists) + continue; + if (!locs_sorted) { for (k = 0; k < debug_info_p->num_loc_offsets; k++) @@ -7462,7 +7472,7 @@ display_debug_loc (struct dwarf_section *section, void *file) /* .debug_loclists has a per-unit header. Update start if we are detecting it. */ - if (debug_info_p->dwarf_version == 5) + if (debug_info_p->dwarf_version >= 5) { j = locs_sorted ? 0 : array [0]; @@ -8080,7 +8090,7 @@ range_entry_compar (const void *ap, const void *bp) return (a > b) - (b > a); } -static void +static unsigned char * display_debug_ranges_list (unsigned char * start, unsigned char * finish, unsigned int pointer_size, @@ -8127,6 +8137,8 @@ display_debug_ranges_list (unsigned char * start, putchar ('\n'); } + + return start; } static unsigned char * @@ -8348,6 +8360,7 @@ display_debug_ranges (struct dwarf_section *section, { unsigned char *start = section->start; unsigned char *last_start = start; + unsigned char *last_end; uint64_t bytes = section->size; unsigned char *section_begin = start; unsigned char *finish = start + bytes; @@ -8411,14 +8424,11 @@ display_debug_ranges (struct dwarf_section *section, qsort (range_entries, num_range_list, sizeof (*range_entries), range_entry_compar); - if (dwarf_check != 0 && range_entries[0].ranges_offset != 0) - warn (_("Range lists in %s section start at %#" PRIx64 "\n"), - section->name, range_entries[0].ranges_offset); - putchar ('\n'); if (!is_rnglists) printf (_(" Offset Begin End\n")); + last_end = NULL; for (i = 0; i < num_range_list; i++) { struct range_entry *range_entry = &range_entries[i]; @@ -8457,6 +8467,12 @@ display_debug_ranges (struct dwarf_section *section, next = section_begin + offset; /* Offset is from the section start, the base has already been added. */ + if (i == 0) + { + last_end = section_begin; + if (is_rnglists) + last_end += 2 * offset_size - 4 + 2 + 1 + 1 + 4; + } /* If multiple DWARF entities reference the same range then we will have multiple entries in the `range_entries' list for the same offset. Thanks to the sort above these will all be consecutive in @@ -8466,11 +8482,15 @@ display_debug_ranges (struct dwarf_section *section, continue; last_offset = offset; - if (dwarf_check != 0 && i > 0) + if (dwarf_check != 0) { if (start < next) - warn (_("There is a hole [%#tx - %#tx] in %s section.\n"), - start - section_begin, next - section_begin, section->name); + { + if (last_end != next) + warn (_("There is a hole [%#tx - %#tx] in %s section.\n"), + last_end - section_begin, next - section_begin, + section->name); + } else if (start > next) { if (next == last_start) @@ -8484,11 +8504,14 @@ display_debug_ranges (struct dwarf_section *section, last_start = next; if (is_rnglists) - display_debug_rnglists_list - (start, finish, pointer_size, offset, base_address, debug_info_p->addr_base); + last_end + = display_debug_rnglists_list + (start, finish, pointer_size, offset, base_address, + debug_info_p->addr_base); else - display_debug_ranges_list - (start, finish, pointer_size, offset, base_address); + last_end + = display_debug_ranges_list + (start, finish, pointer_size, offset, base_address); } /* Display trailing empty (or unreferenced) compile units, if any. */ |