diff options
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 13 | ||||
-rw-r--r-- | binutils/dwarf.c | 24 | ||||
-rw-r--r-- | binutils/dwarf.h | 10 |
3 files changed, 26 insertions, 21 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index be5fd77..6f4946b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,16 @@ +2021-07-10 Alan Modra <amodra@gmail.com> + + PR 28069 + * dwarf.c (display_discr_list): Remove assertions. Delete "end" + parameter, use initial "data" pointer as the end. Formatting. + Don't count down bytes as they are read. + (read_and_display_attr_value): Adjust display_discr_list call. + (read_and_print_leb128): Don't pass __FILE__ and __LINE__ to + report_leb_status. + * dwarf.h (report_leb_status): Don't report file and line + numbers. Delete file and lnum parameters, + (READ_ULEB, READ_SLEB): Adjust. + 2021-07-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * configure.ac: Check for strnlen declaration. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index ad1ee97..fbd5d6a 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -2280,7 +2280,7 @@ read_and_print_leb128 (unsigned char *data, int status; dwarf_vma val = read_leb128 (data, end, is_signed, bytes_read, &status); if (status != 0) - report_leb_status (status, __FILE__, __LINE__); + report_leb_status (status); else printf ("%s", dwarf_vmatoa (is_signed ? "d" : "u", val)); } @@ -2289,9 +2289,10 @@ static void display_discr_list (unsigned long form, dwarf_vma uvalue, unsigned char * data, - unsigned const char * end, int level) { + unsigned char *end = data; + if (uvalue == 0) { printf ("[default]"); @@ -2320,41 +2321,32 @@ display_discr_list (unsigned long form, return; } - bool is_signed = - (level > 0 && level <= MAX_CU_NESTING) - ? level_type_signed [level - 1] : false; + bool is_signed = (level > 0 && level <= MAX_CU_NESTING + ? level_type_signed [level - 1] : false); printf ("("); - while (uvalue) + while (data < end) { unsigned char discriminant; unsigned int bytes_read; SAFE_BYTE_GET_AND_INC (discriminant, data, 1, end); - -- uvalue; - assert (uvalue > 0); switch (discriminant) { case DW_DSC_label: printf ("label "); read_and_print_leb128 (data, & bytes_read, end, is_signed); - assert (bytes_read <= uvalue && bytes_read > 0); - uvalue -= bytes_read; data += bytes_read; break; case DW_DSC_range: printf ("range "); read_and_print_leb128 (data, & bytes_read, end, is_signed); - assert (bytes_read <= uvalue && bytes_read > 0); - uvalue -= bytes_read; data += bytes_read; printf (".."); read_and_print_leb128 (data, & bytes_read, end, is_signed); - assert (bytes_read <= uvalue && bytes_read > 0); - uvalue -= bytes_read; data += bytes_read; break; @@ -2365,7 +2357,7 @@ display_discr_list (unsigned long form, return; } - if (uvalue) + if (data < end) printf (", "); } @@ -3230,7 +3222,7 @@ read_and_display_attr_value (unsigned long attribute, case DW_AT_discr_list: printf ("\t"); - display_discr_list (form, uvalue, data, end, level); + display_discr_list (form, uvalue, data, level); break; case DW_AT_frame_base: diff --git a/binutils/dwarf.h b/binutils/dwarf.h index 2070c6f..887b720 100644 --- a/binutils/dwarf.h +++ b/binutils/dwarf.h @@ -264,12 +264,12 @@ extern unsigned char * get_build_id (void *); #endif static inline void -report_leb_status (int status, const char *file, unsigned long lnum) +report_leb_status (int status) { if ((status & 1) != 0) - error (_("%s:%lu: end of data encountered whilst reading LEB\n"), file, lnum); + error (_("end of data encountered whilst reading LEB\n")); else if ((status & 2) != 0) - error (_("%s:%lu: read LEB value is too large to store in destination variable\n"), file, lnum); + error (_("read LEB value is too large to store in destination variable\n")); } #define SKIP_ULEB(start, end) \ @@ -302,7 +302,7 @@ report_leb_status (int status, const char *file, unsigned long lnum) (var) = _val; \ if ((var) != _val) \ _status |= 2; \ - report_leb_status (_status, __FILE__, __LINE__); \ + report_leb_status (_status); \ } \ while (0) @@ -318,6 +318,6 @@ report_leb_status (int status, const char *file, unsigned long lnum) (var) = _val; \ if ((var) != _val) \ _status |= 2; \ - report_leb_status (_status, __FILE__, __LINE__); \ + report_leb_status (_status); \ } \ while (0) |