123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- From 175b91507b83ad42607d2f6dadaf55b7b511bdbe Mon Sep 17 00:00:00 2001
- From: Alan Modra <amodra@gmail.com>
- Date: Wed, 20 Jul 2022 18:28:50 +0930
- Subject: [PATCH] miscellaneous dwarf.c tidies
- * dwarf.c: Leading and trailing whitespace fixes.
- (free_abbrev_list): New function.
- (free_all_abbrevs): Use the above. Free cu_abbrev_map here too.
- (process_abbrev_set): Print actual section name on error.
- (get_type_abbrev_from_form): Add overflow check.
- (free_debug_memory): Don't free cu_abbrev_map here..
- (process_debug_info): ..or here. Warn on another case of not
- finding a neeeded abbrev.
- Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=175b91507b83ad42607d2f6dadaf55b7b511bdbe]
- Signed-off-by: Pgowda <pgowda.cve@gmail.com>
- ---
- binutils/dwarf.c | 216 +++++++++++++++++++++++------------------------
- 1 file changed, 106 insertions(+), 110 deletions(-)
- diff --git a/binutils/dwarf.c b/binutils/dwarf.c
- index 2b1eec49422..267ed3bb382 100644
- --- a/binutils/dwarf.c
- +++ b/binutils/dwarf.c
- @@ -806,7 +806,7 @@ fetch_indexed_value (dwarf_vma idx,
- pointer_size = 4;
- bias = 12;
- }
- -
- +
- dwarf_vma offset = idx * pointer_size;
-
- /* Offsets are biased by the size of the section header
- @@ -908,38 +908,41 @@ record_abbrev_list_for_cu (dwarf_vma sta
- next_free_abbrev_map_entry ++;
- }
-
- -static void
- -free_all_abbrevs (void)
- +static abbrev_list *
- +free_abbrev_list (abbrev_list *list)
- {
- - abbrev_list * list;
- + abbrev_entry *abbrv = list->first_abbrev;
-
- - for (list = abbrev_lists; list != NULL;)
- + while (abbrv)
- {
- - abbrev_list * next = list->next;
- - abbrev_entry * abbrv;
- + abbrev_attr *attr = abbrv->first_attr;
-
- - for (abbrv = list->first_abbrev; abbrv != NULL;)
- + while (attr)
- {
- - abbrev_entry * next_abbrev = abbrv->next;
- - abbrev_attr * attr;
- -
- - for (attr = abbrv->first_attr; attr;)
- - {
- - abbrev_attr *next_attr = attr->next;
- -
- - free (attr);
- - attr = next_attr;
- - }
- -
- - free (abbrv);
- - abbrv = next_abbrev;
- + abbrev_attr *next_attr = attr->next;
- + free (attr);
- + attr = next_attr;
- }
-
- - free (list);
- - list = next;
- + abbrev_entry *next_abbrev = abbrv->next;
- + free (abbrv);
- + abbrv = next_abbrev;
- }
-
- - abbrev_lists = NULL;
- + abbrev_list *next = list->next;
- + free (list);
- + return next;
- +}
- +
- +static void
- +free_all_abbrevs (void)
- +{
- + while (abbrev_lists)
- + abbrev_lists = free_abbrev_list (abbrev_lists);
- +
- + free (cu_abbrev_map);
- + cu_abbrev_map = NULL;
- + next_free_abbrev_map_entry = 0;
- }
-
- static abbrev_list *
- @@ -971,7 +974,7 @@ find_abbrev_map_by_offset (dwarf_vma off
- && cu_abbrev_map[i].end > offset)
- return cu_abbrev_map + i;
-
- - return NULL;
- + return NULL;
- }
-
- static void
- @@ -1094,7 +1097,7 @@ process_abbrev_set (struct dwarf_section
- }
-
- /* Report the missing single zero which ends the section. */
- - error (_(".debug_abbrev section not zero terminated\n"));
- + error (_("%s section not zero terminated\n"), section->name);
-
- free (list);
- return NULL;
- @@ -1875,7 +1878,7 @@ fetch_alt_indirect_string (dwarf_vma off
- dwarf_vmatoa ("x", offset));
- return _("<offset is too big>");
- }
- -
- +
- static const char *
- get_AT_name (unsigned long attribute)
- {
- @@ -2157,7 +2160,8 @@ get_type_abbrev_from_form (unsigned long
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- - if (uvalue + cu_offset > (size_t) (cu_end - section->start))
- + if (uvalue + cu_offset < uvalue
- + || uvalue + cu_offset > (size_t) (cu_end - section->start))
- {
- warn (_("Unable to resolve ref form: uvalue %lx + cu_offset %lx > CU size %lx\n"),
- uvalue, (long) cu_offset, (long) (cu_end - section->start));
- @@ -2194,7 +2198,7 @@ get_type_abbrev_from_form (unsigned long
- else
- *map_return = NULL;
- }
- -
- +
- READ_ULEB (abbrev_number, data, section->start + section->size);
-
- for (entry = map->list->first_abbrev; entry != NULL; entry = entry->next)
- @@ -2783,10 +2787,10 @@ read_and_display_attr_value (unsigned lo
- if (form == DW_FORM_loclistx)
- {
- if (dwo)
- - {
- - index = fetch_indexed_value (uvalue, loclists_dwo, 0);
- - index += (offset_size == 8) ? 20 : 12;
- - }
- + {
- + index = fetch_indexed_value (uvalue, loclists_dwo, 0);
- + index += (offset_size == 8) ? 20 : 12;
- + }
- else if (debug_info_p == NULL)
- {
- index = fetch_indexed_value (uvalue, loclists, 0);
- @@ -2804,21 +2808,21 @@ read_and_display_attr_value (unsigned lo
- else if (form == DW_FORM_rnglistx)
- {
- if (dwo)
- - {
- - index = fetch_indexed_value (uvalue, rnglists_dwo, 0);
- - index += (offset_size == 8) ? 20 : 12;
- - }
- + {
- + index = fetch_indexed_value (uvalue, rnglists_dwo, 0);
- + index += (offset_size == 8) ? 20 : 12;
- + }
- else
- - {
- - if (debug_info_p == NULL)
- - base = 0;
- - else
- - base = debug_info_p->rnglists_base;
- - /* We do not have a cached value this time, so we perform the
- - computation manually. */
- - index = fetch_indexed_value (uvalue, rnglists, base);
- - index += base;
- - }
- + {
- + if (debug_info_p == NULL)
- + base = 0;
- + else
- + base = debug_info_p->rnglists_base;
- + /* We do not have a cached value this time, so we perform the
- + computation manually. */
- + index = fetch_indexed_value (uvalue, rnglists, base);
- + index += base;
- + }
- }
- else
- {
- @@ -2844,7 +2848,7 @@ read_and_display_attr_value (unsigned lo
- if (!do_loc)
- printf ("%c<0x%s>", delimiter, dwarf_vmatoa ("x", uvalue + cu_offset));
- break;
- -
- +
- default:
- warn (_("Unrecognized form: 0x%lx\n"), form);
- /* What to do? Consume a byte maybe? */
- @@ -2869,9 +2873,9 @@ read_and_display_attr_value (unsigned lo
- case DW_AT_rnglists_base:
- if (debug_info_p->rnglists_base)
- warn (_("CU @ 0x%s has multiple rnglists_base values (0x%s and 0x%s)"),
- - dwarf_vmatoa ("x", debug_info_p->cu_offset),
- - dwarf_vmatoa ("x", debug_info_p->rnglists_base),
- - dwarf_vmatoa ("x", uvalue));
- + dwarf_vmatoa ("x", debug_info_p->cu_offset),
- + dwarf_vmatoa ("x", debug_info_p->rnglists_base),
- + dwarf_vmatoa ("x", uvalue));
- debug_info_p->rnglists_base = uvalue;
- break;
- case DW_AT_str_offsets_base:
- @@ -3021,7 +3025,7 @@ read_and_display_attr_value (unsigned lo
- case DW_FORM_strx3:
- case DW_FORM_strx4:
- add_dwo_name (fetch_indexed_string (uvalue, this_set, offset_size, false,
- - debug_info_p->str_offsets_base),
- + debug_info_p->str_offsets_base),
- cu_offset);
- break;
- case DW_FORM_string:
- @@ -3055,7 +3059,7 @@ read_and_display_attr_value (unsigned lo
- case DW_FORM_strx3:
- case DW_FORM_strx4:
- add_dwo_dir (fetch_indexed_string (uvalue, this_set, offset_size, false,
- - debug_info_p->str_offsets_base),
- + debug_info_p->str_offsets_base),
- cu_offset);
- break;
- case DW_FORM_string:
- @@ -3686,11 +3690,8 @@ process_debug_info (struct dwarf_section
- introduce (section, false);
-
- free_all_abbrevs ();
- - free (cu_abbrev_map);
- - cu_abbrev_map = NULL;
- - next_free_abbrev_map_entry = 0;
-
- - /* In order to be able to resolve DW_FORM_ref_attr forms we need
- + /* In order to be able to resolve DW_FORM_ref_addr forms we need
- to load *all* of the abbrevs for all CUs in this .debug_info
- section. This does effectively mean that we (partially) read
- every CU header twice. */
- @@ -4045,12 +4046,11 @@ process_debug_info (struct dwarf_section
-
- /* Scan through the abbreviation list until we reach the
- correct entry. */
- - if (list == NULL)
- - continue;
- -
- - for (entry = list->first_abbrev; entry != NULL; entry = entry->next)
- - if (entry->number == abbrev_number)
- - break;
- + entry = NULL;
- + if (list != NULL)
- + for (entry = list->first_abbrev; entry != NULL; entry = entry->next)
- + if (entry->number == abbrev_number)
- + break;
-
- if (entry == NULL)
- {
- @@ -4074,7 +4074,7 @@ process_debug_info (struct dwarf_section
- break;
- case DW_TAG_compile_unit:
- case DW_TAG_skeleton_unit:
- - need_base_address = 1;
- + need_base_address = 1;
- need_dwo_info = do_loc;
- break;
- case DW_TAG_entry_point:
- @@ -4459,7 +4459,7 @@ display_debug_sup (struct dwarf_section
-
- SAFE_BYTE_GET_AND_INC (is_supplementary, start, 1, end);
- if (is_supplementary != 0 && is_supplementary != 1)
- - warn (_("corrupt .debug_sup section: is_supplementary not 0 or 1\n"));
- + warn (_("corrupt .debug_sup section: is_supplementary not 0 or 1\n"));
-
- sup_filename = start;
- if (is_supplementary && sup_filename[0] != 0)
- @@ -5638,7 +5638,7 @@ display_debug_lines_decoded (struct dwar
- printf ("%s %11d %#18" DWARF_VMA_FMT "x",
- newFileName, state_machine_regs.line,
- state_machine_regs.address);
- - }
- + }
- else
- {
- if (xop == -DW_LNE_end_sequence)
- @@ -6092,7 +6092,7 @@ display_debug_macro (struct dwarf_sectio
- load_debug_section_with_follow (str, file);
- load_debug_section_with_follow (line, file);
- load_debug_section_with_follow (str_index, file);
- -
- +
- introduce (section, false);
-
- while (curr < end)
- @@ -6537,7 +6537,7 @@ display_loc_list (struct dwarf_section *
-
- /* Check base address specifiers. */
- if (is_max_address (begin, pointer_size)
- - && !is_max_address (end, pointer_size))
- + && !is_max_address (end, pointer_size))
- {
- base_address = end;
- print_dwarf_vma (begin, pointer_size);
- @@ -6715,7 +6715,7 @@ display_loclists_list (struct dwarf_sect
- case DW_LLE_default_location:
- begin = end = 0;
- break;
- -
- +
- case DW_LLE_offset_pair:
- READ_ULEB (begin, start, section_end);
- begin += base_address;
- @@ -7011,7 +7011,7 @@ display_offset_entry_loclists (struct dw
- unsigned char * start = section->start;
- unsigned char * const end = start + section->size;
-
- - introduce (section, false);
- + introduce (section, false);
-
- do
- {
- @@ -7060,14 +7060,14 @@ display_offset_entry_loclists (struct dw
- section->name, segment_selector_size);
- return 0;
- }
- -
- +
- if (offset_entry_count == 0)
- {
- warn (_("The %s section contains a table without offset\n"),
- section->name);
- return 0;
- }
- -
- +
- printf (_("\n Offset Entries starting at 0x%lx:\n"),
- (long)(start - section->start));
-
- @@ -8229,7 +8229,7 @@ display_debug_rnglists (struct dwarf_sec
- start = display_debug_rnglists_list
- (start, end, address_size, offset, 0, offset_size);
- if (start >= end)
- - break;
- + break;
- }
-
- start = end;
- @@ -8347,12 +8347,12 @@ display_debug_ranges (struct dwarf_secti
- next = section_begin + offset + debug_info_p->rnglists_base;
-
- /* 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
- - the `range_entries' list, so we can easily ignore duplicates
- - here. */
- + have multiple entries in the `range_entries' list for the same
- + offset. Thanks to the sort above these will all be consecutive in
- + the `range_entries' list, so we can easily ignore duplicates
- + here. */
- if (i > 0 && last_offset == offset)
- - continue;
- + continue;
- last_offset = offset;
-
- if (dwarf_check != 0 && i > 0)
- @@ -10286,7 +10286,7 @@ display_debug_names (struct dwarf_sectio
- printf (_("Out of %lu items there are %zu bucket clashes"
- " (longest of %zu entries).\n"),
- (unsigned long) name_count, hash_clash_count, longest_clash);
- -
- +
- if (name_count != buckets_filled + hash_clash_count)
- warn (_("The name_count (%lu) is not the same as the used bucket_count (%lu) + the hash clash count (%lu)"),
- (unsigned long) name_count,
- @@ -10390,7 +10390,7 @@ display_debug_names (struct dwarf_sectio
- break;
- if (tagno >= 0)
- printf ("%s<%lu>",
- - (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
- + (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"),
- (unsigned long) abbrev_tag);
-
- for (entry = abbrev_lookup;
- @@ -10919,7 +10919,7 @@ process_cu_tu_index (struct dwarf_sectio
- Check for integer overflow (can occur when size_t is 32-bit)
- with overlarge ncols or nused values. */
- if (nused == -1u
- - || _mul_overflow ((size_t) ncols, 4, &temp)
- + || _mul_overflow ((size_t) ncols, 4, &temp)
- || _mul_overflow ((size_t) nused + 1, temp, &total)
- || total > (size_t) (limit - ppool))
- {
- @@ -10927,7 +10927,7 @@ process_cu_tu_index (struct dwarf_sectio
- section->name);
- return 0;
- }
- -
- +
- if (do_display)
- {
- printf (_(" Offset table\n"));
- @@ -11431,8 +11431,8 @@ add_separate_debug_file (const char * fi
-
- static bool
- debuginfod_fetch_separate_debug_info (struct dwarf_section * section,
- - char ** filename,
- - void * file)
- + char ** filename,
- + void * file)
- {
- size_t build_id_len;
- unsigned char * build_id;
- @@ -11450,14 +11450,14 @@ debuginfod_fetch_separate_debug_info (st
-
- filelen = strnlen ((const char *)section->start, section->size);
- if (filelen == section->size)
- - /* Corrupt debugaltlink. */
- - return false;
- + /* Corrupt debugaltlink. */
- + return false;
-
- build_id = section->start + filelen + 1;
- build_id_len = section->size - (filelen + 1);
-
- if (build_id_len == 0)
- - return false;
- + return false;
- }
- else
- return false;
- @@ -11469,25 +11469,25 @@ debuginfod_fetch_separate_debug_info (st
-
- client = debuginfod_begin ();
- if (client == NULL)
- - return false;
- + return false;
-
- /* Query debuginfod servers for the target file. If found its path
- - will be stored in filename. */
- + will be stored in filename. */
- fd = debuginfod_find_debuginfo (client, build_id, build_id_len, filename);
- debuginfod_end (client);
-
- /* Only free build_id if we allocated space for a hex string
- - in get_build_id (). */
- + in get_build_id (). */
- if (build_id_len == 0)
- - free (build_id);
- + free (build_id);
-
- if (fd >= 0)
- - {
- - /* File successfully retrieved. Close fd since we want to
- - use open_debug_file () on filename instead. */
- - close (fd);
- - return true;
- - }
- + {
- + /* File successfully retrieved. Close fd since we want to
- + use open_debug_file () on filename instead. */
- + close (fd);
- + return true;
- + }
- }
-
- return false;
- @@ -11500,7 +11500,7 @@ load_separate_debug_info (const char *
- parse_func_type parse_func,
- check_func_type check_func,
- void * func_data,
- - void * file ATTRIBUTE_UNUSED)
- + void * file ATTRIBUTE_UNUSED)
- {
- const char * separate_filename;
- char * debug_filename;
- @@ -11616,11 +11616,11 @@ load_separate_debug_info (const char *
- & tmp_filename,
- file))
- {
- - /* File successfully downloaded from server, replace
- - debug_filename with the file's path. */
- - free (debug_filename);
- - debug_filename = tmp_filename;
- - goto found;
- + /* File successfully downloaded from server, replace
- + debug_filename with the file's path. */
- + free (debug_filename);
- + debug_filename = tmp_filename;
- + goto found;
- }
- }
- #endif
- @@ -11787,12 +11787,12 @@ load_build_id_debug_file (const char * m
- /* In theory we should extract the contents of the section into
- a note structure and then check the fields. For now though
- just use hard coded offsets instead:
- -
- +
- Field Bytes Contents
- NSize 0...3 4
- DSize 4...7 8+
- Type 8..11 3 (NT_GNU_BUILD_ID)
- - Name 12.15 GNU\0
- + Name 12.15 GNU\0
- Data 16.... */
-
- /* FIXME: Check the name size, name and type fields. */
- @@ -11804,7 +11804,7 @@ load_build_id_debug_file (const char * m
- warn (_(".note.gnu.build-id data size is too small\n"));
- return;
- }
- -
- +
- if (build_id_size > (section->size - 16))
- {
- warn (_(".note.gnu.build-id data size is too bug\n"));
- @@ -12100,10 +12100,6 @@ free_debug_memory (void)
-
- free_all_abbrevs ();
-
- - free (cu_abbrev_map);
- - cu_abbrev_map = NULL;
- - next_free_abbrev_map_entry = 0;
- -
- free (shndx_pool);
- shndx_pool = NULL;
- shndx_pool_size = 0;
|