From: Jenkins as Icarus Sparry Date: Tue, 24 Dec 2019 03:08:14 +0000 (+0000) Subject: Merge branch 'master' into merge-job X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=0520666f7582ab3511dc0be50fbc5232971f7933;hp=1899614f262e7f031b3c1b3abd8b20fc49461c9c;p=deliverable%2Fbinutils-gdb.git Merge branch 'master' into merge-job --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 40f4b66364..073bbb6f2b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2019-12-23 Alan Modra + + * vms-alpha.c (add_symbol): Add "max" parameter. Error on string + length larger than max. + (_bfd_vms_slurp_egsd): Ensure record is at least large enough to + read string length byte, error if not. Pass size to add_symbol. + (_bfd_vms_slurp_etir): Don't read past end of buffer when reading + type and length. Allow read of last byte in buffer. + +2019-12-23 Alan Modra + + * wasm-module.c (wasm_read_leb128): Don't allow oversize shifts. + Catch value overflow. Sign extend only on terminating byte. + 2019-12-20 Alan Modra * xtensa-isa.c (xtensa_insnbuf_from_chars): Avoid signed overflow. diff --git a/bfd/version.h b/bfd/version.h index ef444b2875..4dbbaadf9b 100644 --- a/bfd/version.h +++ b/bfd/version.h @@ -16,7 +16,7 @@ In releases, the date is not included in either version strings or sonames. */ -#define BFD_VERSION_DATE 20191223 +#define BFD_VERSION_DATE 20191224 #define BFD_VERSION @bfd_version@ #define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@ #define REPORT_BUGS_TO @report_bugs_to@ diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index 4dde056e1e..0b1b4ca8d8 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -1137,12 +1137,20 @@ add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym) Return NULL in case of error. */ static struct vms_symbol_entry * -add_symbol (bfd *abfd, const unsigned char *ascic) +add_symbol (bfd *abfd, const unsigned char *ascic, unsigned int max) { struct vms_symbol_entry *entry; - int len; + unsigned int len; len = *ascic++; + max -= 1; + if (len > max) + { + _bfd_error_handler (_("record is too small for symbol name length")); + bfd_set_error (bfd_error_bad_value); + return NULL; + } + entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len); if (entry == NULL) return NULL; @@ -1292,7 +1300,7 @@ _bfd_vms_slurp_egsd (bfd *abfd) case EGSD__C_SYM: { - int nameoff; + unsigned int nameoff; struct vms_symbol_entry *entry; struct vms_egsy *egsy = (struct vms_egsy *) vms_rec; flagword old_flags; @@ -1303,7 +1311,13 @@ _bfd_vms_slurp_egsd (bfd *abfd) else nameoff = ESRF__B_NAMLNG; - entry = add_symbol (abfd, vms_rec + nameoff); + if (nameoff >= gsd_size) + { + _bfd_error_handler (_("ECSD__C_SYM record is too small")); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + entry = add_symbol (abfd, vms_rec + nameoff, gsd_size - nameoff); if (entry == NULL) return FALSE; @@ -1363,11 +1377,17 @@ _bfd_vms_slurp_egsd (bfd *abfd) struct vms_symbol_entry *entry; struct vms_egst *egst = (struct vms_egst *)vms_rec; flagword old_flags; + unsigned int nameoff = offsetof (struct vms_egst, namlng); old_flags = bfd_getl16 (egst->header.flags); - entry = add_symbol (abfd, &egst->namlng); - + if (nameoff >= gsd_size) + { + _bfd_error_handler (_("ECSD__C_SYMG record is too small")); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + entry = add_symbol (abfd, &egst->namlng, gsd_size - nameoff); if (entry == NULL) return FALSE; @@ -1854,19 +1874,23 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) while (ptr < maxptr) { - int cmd = bfd_getl16 (ptr); - int cmd_length = bfd_getl16 (ptr + 2); + int cmd, cmd_length; - ptr += 4; + if (ptr + 4 > maxptr) + goto corrupt_etir; + + cmd = bfd_getl16 (ptr); + cmd_length = bfd_getl16 (ptr + 2); /* PR 21589 and 21579: Check for a corrupt ETIR record. */ - if (cmd_length < 4 || (ptr + cmd_length > maxptr + 4)) + if (cmd_length < 4 || ptr + cmd_length > maxptr) { corrupt_etir: _bfd_error_handler (_("corrupt ETIR record encountered")); bfd_set_error (bfd_error_bad_value); return FALSE; } + ptr += 4; #if VMS_DEBUG _bfd_vms_debug (4, "etir: %s(%d)\n", @@ -1890,7 +1914,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) stack 32 bit value, sign extend to 64 bit. */ case ETIR__C_STA_LW: - if (ptr + 4 >= maxptr) + if (ptr + 4 > maxptr) goto corrupt_etir; _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE); break; @@ -1900,7 +1924,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) stack 64 bit value of symbol. */ case ETIR__C_STA_QW: - if (ptr + 8 >= maxptr) + if (ptr + 8 > maxptr) goto corrupt_etir; _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE); break; @@ -1915,7 +1939,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { int psect; - if (ptr + 12 >= maxptr) + if (ptr + 12 > maxptr) goto corrupt_etir; psect = bfd_getl32 (ptr); if ((unsigned int) psect >= PRIV (section_count)) @@ -2006,7 +2030,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { int size; - if (ptr + 4 >= maxptr) + if (ptr + 4 > maxptr) goto corrupt_etir; size = bfd_getl32 (ptr); _bfd_vms_pop (abfd, &op1, &rel1); @@ -2089,7 +2113,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { unsigned int size; - if (ptr + 4 >= maxptr) + if (ptr + 4 > maxptr) goto corrupt_etir; size = bfd_getl32 (ptr); image_write (abfd, ptr + 4, size); @@ -2252,7 +2276,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) /* Augment relocation base: increment image location counter by offset arg: lw offset value. */ case ETIR__C_CTL_AUGRB: - if (ptr + 4 >= maxptr) + if (ptr + 4 > maxptr) goto corrupt_etir; op1 = bfd_getl32 (ptr); image_inc_ptr (abfd, op1); diff --git a/bfd/wasm-module.c b/bfd/wasm-module.c index a827d108ed..3fa2a87fb4 100644 --- a/bfd/wasm-module.c +++ b/bfd/wasm-module.c @@ -111,18 +111,28 @@ wasm_read_leb128 (bfd * abfd, unsigned int num_read = 0; unsigned int shift = 0; unsigned char byte = 0; - bfd_boolean success = FALSE; + int status = 1; while (bfd_bread (&byte, 1, abfd) == 1) { num_read++; - result |= ((bfd_vma) (byte & 0x7f)) << shift; + if (shift < sizeof (result) * 8) + { + result |= ((bfd_vma) (byte & 0x7f)) << shift; + if ((result >> shift) != (byte & 0x7f)) + /* Overflow. */ + status |= 2; + shift += 7; + } + else if ((byte & 0x7f) != 0) + status |= 2; - shift += 7; if ((byte & 0x80) == 0) { - success = TRUE; + status &= ~1; + if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -((bfd_vma) 1 << shift); break; } } @@ -130,10 +140,7 @@ wasm_read_leb128 (bfd * abfd, if (length_return != NULL) *length_return = num_read; if (error_return != NULL) - *error_return = ! success; - - if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) - result |= -((bfd_vma) 1 << shift); + *error_return = status != 0; return result; } diff --git a/binutils/ChangeLog b/binutils/ChangeLog index d6dbbf3cd1..a3e15cc26a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,52 @@ +2019-12-23 Hans-Peter Nilsson + + * dwarf.c (display_debug_lines_decoded): Cast printf parameter to + format type to correct last change. + +2019-12-23 Alan Modra + + * dwarf.h (read_leb128): Update prototype. + (report_leb_status): New inline function. + (SKIP_ULEB, SKIP_SLEB, READ_ULEB, READ_SLEB): Define. + * dwarf.c: Use above macros throughout file. Formatting. + (read_leb128): Reorder params. Add status return param. + Don't stop reading until finding terminator or end of data. + Detect loss of significant bits. Sign extend only on + terminating byte. + (read_sleb128, read_uleb128): Delete functions. + (SKIP_ULEB, SKIP_SLEB, READ_ULEB, READ_SLEB): Delete macros. + (read_and_print_leb128): Rewrite. + (process_extended_line_op): Return a size_t. Use size_t vars. + Adjust to suit new macros. Add proper name size to "data" when + processing DW_LNE_define_file. + (process_abbrev_section): Adjust to suit new macros. + (decode_location_expression, skip_attr_bytes): Likewise. + (get_type_signedness): Likewise. + (read_and_display_attr_value): Likewise. Consolidate block code. + (process_debug_info): Adjust to suit new macros. + (display_formatted_table, display_debug_lines_raw): Likewise. + (display_debug_lines_decoded): Likewise. Properly check for end + of DW_LNS_extended_op. + (display_debug_macinfo): Adjust to suit new macros. + (get_line_filename_and_dirname, display_debug_macro): Likewise. + (display_view_pair_list): Likewise. Don't back off when hitting + end of data. + (display_loc_list): Adjust to suit new macros. + (display_loclists_list, display_loc_list_dwo): Likewise. + (display_debug_rnglists_list, read_cie): Likewise. + (display_debug_frames): Likewise. + * readelf.c: Use new ULEB macros throughout file. + (read_uleb128): Delete. + (decode_arm_unwind_bytecode): Use read_leb128. + (decode_tic6x_unwind_bytecode): Likewise. + (display_tag_value): Adjust to suit new macros. + (display_arc_attribute, display_arm_attribute): Likewise. + (display_gnu_attribute, display_power_gnu_attribute): Likewise. + (display_s390_gnu_attribute, display_sparc_gnu_attribute): Likewise. + (display_mips_gnu_attribute, display_tic6x_attribute): Likewise. + (display_msp430x_attribute, display_msp430_gnu_attribute): Likewise. + (display_riscv_attribute, process_attributes): Likewise. + 2019-12-17 Alan Modra * objdump.c (compare_section): New static var. diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 06ef1f7285..97973123c5 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -319,93 +319,56 @@ dwarf_vmatoa64 (dwarf_vma hvalue, dwarf_vma lvalue, char *buf, /* Read in a LEB128 encoded value starting at address DATA. If SIGN is true, return a signed LEB128 value. If LENGTH_RETURN is not NULL, return in it the number of bytes read. + If STATUS_RETURN in not NULL, return with bit 0 (LSB) set if the + terminating byte was not found and with bit 1 set if the value + overflows a dwarf_vma. No bytes will be read at address END or beyond. */ dwarf_vma read_leb128 (unsigned char *data, - unsigned int *length_return, + const unsigned char *const end, bfd_boolean sign, - const unsigned char * const end) + unsigned int *length_return, + int *status_return) { dwarf_vma result = 0; unsigned int num_read = 0; unsigned int shift = 0; - unsigned char byte = 0; + int status = 1; while (data < end) { - byte = *data++; + unsigned char byte = *data++; num_read++; - result |= ((dwarf_vma) (byte & 0x7f)) << shift; + if (shift < sizeof (result) * 8) + { + result |= ((dwarf_vma) (byte & 0x7f)) << shift; + if ((result >> shift) != (byte & 0x7f)) + /* Overflow. */ + status |= 2; + shift += 7; + } + else if ((byte & 0x7f) != 0) + status |= 2; - shift += 7; if ((byte & 0x80) == 0) - break; - - /* PR 17512: file: 0ca183b8. - FIXME: Should we signal this error somehow ? */ - if (shift >= sizeof (result) * 8) - break; + { + status &= ~1; + if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -((dwarf_vma) 1 << shift); + break; + } } if (length_return != NULL) *length_return = num_read; - - if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) - result |= -((dwarf_vma) 1 << shift); + if (status_return != NULL) + *status_return = status; return result; } -/* Create a signed version to avoid painful typecasts. */ -static inline dwarf_signed_vma -read_sleb128 (unsigned char * data, - unsigned int * length_return, - const unsigned char * const end) -{ - return (dwarf_signed_vma) read_leb128 (data, length_return, TRUE, end); -} - -static inline dwarf_vma -read_uleb128 (unsigned char * data, - unsigned int * length_return, - const unsigned char * const end) -{ - return read_leb128 (data, length_return, FALSE, end); -} - -#define SKIP_ULEB() read_uleb128 (start, & length_return, end); start += length_return -#define SKIP_SLEB() read_sleb128 (start, & length_return, end); start += length_return - -#define READ_ULEB(var) \ - do \ - { \ - dwarf_vma _val; \ - \ - (var) = _val = read_uleb128 (start, &length_return, end); \ - if ((var) != _val) \ - error (_("Internal error: %s:%d: LEB value (%s) " \ - "too large for containing variable\n"), \ - __FILE__, __LINE__, dwarf_vmatoa ("u", _val)); \ - start += length_return; \ - } \ - while (0) - -#define READ_SLEB(var) \ - do \ - { \ - dwarf_signed_vma _val; \ - \ - (var) = _val = read_sleb128 (start, &length_return, end); \ - if ((var) != _val) \ - error (_("Internal error: %s:%d: LEB value (%s) " \ - "too large for containing variable\n"), \ - __FILE__, __LINE__, dwarf_vmatoa ("d", _val)); \ - start += length_return; \ - } \ - while (0) - /* Read AMOUNT bytes from PTR and store them in VAL as an unsigned value. Checks to make sure that the read will not reach or pass END and that VAL is big enough to hold AMOUNT bytes. */ @@ -524,28 +487,26 @@ reset_state_machine (int is_stmt) /* Handled an extend line op. Returns the number of bytes read. */ -static int +static size_t process_extended_line_op (unsigned char * data, int is_stmt, unsigned char * end) { unsigned char op_code; - unsigned int bytes_read; - unsigned int len; + size_t len, header_len; unsigned char *name; unsigned char *orig_data = data; - dwarf_vma adr; + dwarf_vma adr, val; - len = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (len, data, end); + header_len = data - orig_data; - if (len == 0 || data == end || len > (uintptr_t) (end - data)) + if (len == 0 || data == end || len > (size_t) (end - data)) { warn (_("Badly formed extended line op encountered!\n")); - return bytes_read; + return header_len; } - len += bytes_read; op_code = *data++; printf (_(" Extended opcode %d: "), op_code); @@ -559,14 +520,14 @@ process_extended_line_op (unsigned char * data, case DW_LNE_set_address: /* PR 17512: file: 002-100480-0.004. */ - if (len - bytes_read - 1 > 8) + if (len - 1 > 8) { - warn (_("Length (%d) of DW_LNE_set_address op is too long\n"), - len - bytes_read - 1); + warn (_("Length (%lu) of DW_LNE_set_address op is too long\n"), + (unsigned long) len - 1); adr = 0; } else - SAFE_BYTE_GET (adr, data, len - bytes_read - 1, end); + SAFE_BYTE_GET (adr, data, len - 1, end); printf (_("set Address to 0x%s\n"), dwarf_vmatoa ("x", adr)); state_machine_regs.address = adr; state_machine_regs.view = 0; @@ -583,23 +544,23 @@ process_extended_line_op (unsigned char * data, name = data; l = strnlen ((char *) data, end - data); - data += len + 1; - printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; - printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; - printf ("%s\t", dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; + data += l + 1; + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); printf ("%.*s\n\n", (int) l, name); } - if (((unsigned int) (data - orig_data) != len) || data == end) + if (((size_t) (data - orig_data) != len + header_len) || data == end) warn (_("DW_LNE_define_file: Bad opcode length\n")); break; case DW_LNE_set_discriminator: - printf (_("set Discriminator to %s\n"), - dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); + READ_ULEB (val, data, end); + printf (_("set Discriminator to %s\n"), dwarf_vmatoa ("u", val)); break; /* HP extensions. */ @@ -635,7 +596,7 @@ process_extended_line_op (unsigned char * data, break; case DW_LNE_HP_source_file_correlation: { - unsigned char *edata = data + len - bytes_read - 1; + unsigned char *edata = data + len - 1; printf ("DW_LNE_HP_source_file_correlation\n"); @@ -643,8 +604,7 @@ process_extended_line_op (unsigned char * data, { unsigned int opc; - opc = read_uleb128 (data, & bytes_read, edata); - data += bytes_read; + READ_ULEB (opc, data, edata); switch (opc) { @@ -652,25 +612,18 @@ process_extended_line_op (unsigned char * data, printf (" DW_LNE_HP_SFC_formfeed\n"); break; case DW_LNE_HP_SFC_set_listing_line: + READ_ULEB (val, data, edata); printf (" DW_LNE_HP_SFC_set_listing_line (%s)\n", - dwarf_vmatoa ("u", - read_uleb128 (data, & bytes_read, edata))); - data += bytes_read; + dwarf_vmatoa ("u", val)); break; case DW_LNE_HP_SFC_associate: printf (" DW_LNE_HP_SFC_associate "); - printf ("(%s", - dwarf_vmatoa ("u", - read_uleb128 (data, & bytes_read, edata))); - data += bytes_read; - printf (",%s", - dwarf_vmatoa ("u", - read_uleb128 (data, & bytes_read, edata))); - data += bytes_read; - printf (",%s)\n", - dwarf_vmatoa ("u", - read_uleb128 (data, & bytes_read, edata))); - data += bytes_read; + READ_ULEB (val, data, edata); + printf ("(%s", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, edata); + printf (",%s", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, edata); + printf (",%s)\n", dwarf_vmatoa ("u", val)); break; default: printf (_(" UNKNOWN DW_LNE_HP_SFC opcode (%u)\n"), opc); @@ -683,7 +636,7 @@ process_extended_line_op (unsigned char * data, default: { - unsigned int rlen = len - bytes_read - 1; + unsigned int rlen = len - 1; if (op_code >= DW_LNE_lo_user /* The test against DW_LNW_hi_user is redundant due to @@ -701,7 +654,7 @@ process_extended_line_op (unsigned char * data, break; } - return len; + return len + header_len; } static const unsigned char * @@ -941,14 +894,12 @@ process_abbrev_section (unsigned char *start, unsigned char *end) while (start < end) { - unsigned int bytes_read; unsigned long entry; unsigned long tag; unsigned long attribute; int children; - entry = read_uleb128 (start, & bytes_read, end); - start += bytes_read; + READ_ULEB (entry, start, end); /* A single zero is supposed to end the section according to the standard. If there's more, then signal that to @@ -958,8 +909,7 @@ process_abbrev_section (unsigned char *start, unsigned char *end) if (entry == 0) return start; - tag = read_uleb128 (start, & bytes_read, end); - start += bytes_read; + READ_ULEB (tag, start, end); if (start == end) return NULL; @@ -973,20 +923,17 @@ process_abbrev_section (unsigned char *start, unsigned char *end) /* Initialize it due to a false compiler warning. */ bfd_signed_vma implicit_const = -1; - attribute = read_uleb128 (start, & bytes_read, end); - start += bytes_read; + READ_ULEB (attribute, start, end); if (start == end) break; - form = read_uleb128 (start, & bytes_read, end); - start += bytes_read; + READ_ULEB (form, start, end); if (start == end) break; if (form == DW_FORM_implicit_const) { - implicit_const = read_sleb128 (start, & bytes_read, end); - start += bytes_read; + READ_SLEB (implicit_const, start, end); if (start == end) break; } @@ -1087,7 +1034,6 @@ decode_location_expression (unsigned char * data, struct dwarf_section * section) { unsigned op; - unsigned int bytes_read; dwarf_vma uvalue; dwarf_signed_vma svalue; unsigned char *end = data + length; @@ -1143,14 +1089,12 @@ decode_location_expression (unsigned char * data, printf ("%ld", (long) svalue); break; case DW_OP_constu: - printf ("DW_OP_constu: %s", - dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_ULEB (uvalue, data, end); + printf ("DW_OP_constu: %s", dwarf_vmatoa ("u", uvalue)); break; case DW_OP_consts: - printf ("DW_OP_consts: %s", - dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_SLEB (svalue, data, end); + printf ("DW_OP_consts: %s", dwarf_vmatoa ("d", svalue)); break; case DW_OP_dup: printf ("DW_OP_dup"); @@ -1205,9 +1149,8 @@ decode_location_expression (unsigned char * data, printf ("DW_OP_plus"); break; case DW_OP_plus_uconst: - printf ("DW_OP_plus_uconst: %s", - dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_ULEB (uvalue, data, end); + printf ("DW_OP_plus_uconst: %s", dwarf_vmatoa ("u", uvalue)); break; case DW_OP_shl: printf ("DW_OP_shl"); @@ -1351,37 +1294,31 @@ decode_location_expression (unsigned char * data, case DW_OP_breg29: case DW_OP_breg30: case DW_OP_breg31: - printf ("DW_OP_breg%d (%s): %s", - op - DW_OP_breg0, - regname (op - DW_OP_breg0, 1), - dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_SLEB (svalue, data, end); + printf ("DW_OP_breg%d (%s): %s", op - DW_OP_breg0, + regname (op - DW_OP_breg0, 1), dwarf_vmatoa ("d", svalue)); break; case DW_OP_regx: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("DW_OP_regx: %s (%s)", dwarf_vmatoa ("u", uvalue), regname (uvalue, 1)); break; case DW_OP_fbreg: need_frame_base = 1; - printf ("DW_OP_fbreg: %s", - dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_SLEB (svalue, data, end); + printf ("DW_OP_fbreg: %s", dwarf_vmatoa ("d", svalue)); break; case DW_OP_bregx: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); + READ_SLEB (svalue, data, end); printf ("DW_OP_bregx: %s (%s) %s", dwarf_vmatoa ("u", uvalue), regname (uvalue, 1), - dwarf_vmatoa ("d", read_sleb128 (data, &bytes_read, end))); - data += bytes_read; + dwarf_vmatoa ("d", svalue)); break; case DW_OP_piece: - printf ("DW_OP_piece: %s", - dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_ULEB (uvalue, data, end); + printf ("DW_OP_piece: %s", dwarf_vmatoa ("u", uvalue)); break; case DW_OP_deref_size: SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); @@ -1440,12 +1377,10 @@ decode_location_expression (unsigned char * data, break; case DW_OP_bit_piece: printf ("DW_OP_bit_piece: "); - printf (_("size: %s "), - dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); - data += bytes_read; - printf (_("offset: %s "), - dwarf_vmatoa ("u", read_uleb128 (data, &bytes_read, end))); - data += bytes_read; + READ_ULEB (uvalue, data, end); + printf (_("size: %s "), dwarf_vmatoa ("u", uvalue)); + READ_ULEB (uvalue, data, end); + printf (_("offset: %s "), dwarf_vmatoa ("u", uvalue)); break; /* DWARF 4 extensions. */ @@ -1455,8 +1390,7 @@ decode_location_expression (unsigned char * data, case DW_OP_implicit_value: printf ("DW_OP_implicit_value"); - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); data = display_block (data, uvalue, end, ' '); break; @@ -1502,18 +1436,16 @@ decode_location_expression (unsigned char * data, { SAFE_BYTE_GET_AND_INC (uvalue, data, offset_size, end); } + READ_SLEB (svalue, data, end); printf ("%s: <0x%s> %s", (op == DW_OP_implicit_pointer ? "DW_OP_implicit_pointer" : "DW_OP_GNU_implicit_pointer"), dwarf_vmatoa ("x", uvalue), - dwarf_vmatoa ("d", read_sleb128 (data, - &bytes_read, end))); - data += bytes_read; + dwarf_vmatoa ("d", svalue)); break; case DW_OP_entry_value: case DW_OP_GNU_entry_value: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); /* PR 17531: file: 0cc9cd00. */ if (uvalue > (dwarf_vma) (end - data)) uvalue = end - data; @@ -1530,8 +1462,7 @@ decode_location_expression (unsigned char * data, break; case DW_OP_const_type: case DW_OP_GNU_const_type: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("%s: <0x%s> ", (op == DW_OP_const_type ? "DW_OP_const_type" : "DW_OP_GNU_const_type"), @@ -1541,14 +1472,12 @@ decode_location_expression (unsigned char * data, break; case DW_OP_regval_type: case DW_OP_GNU_regval_type: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("%s: %s (%s)", (op == DW_OP_regval_type ? "DW_OP_regval_type" : "DW_OP_GNU_regval_type"), dwarf_vmatoa ("u", uvalue), regname (uvalue, 1)); - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue)); break; case DW_OP_deref_type: @@ -1558,22 +1487,19 @@ decode_location_expression (unsigned char * data, (op == DW_OP_deref_type ? "DW_OP_deref_type" : "DW_OP_GNU_deref_type"), (long) uvalue); - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf (" <0x%s>", dwarf_vmatoa ("x", cu_offset + uvalue)); break; case DW_OP_convert: case DW_OP_GNU_convert: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("%s <0x%s>", (op == DW_OP_convert ? "DW_OP_convert" : "DW_OP_GNU_convert"), dwarf_vmatoa ("x", uvalue ? cu_offset + uvalue : 0)); break; case DW_OP_reinterpret: case DW_OP_GNU_reinterpret: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("%s <0x%s>", (op == DW_OP_reinterpret ? "DW_OP_reinterpret" : "DW_OP_GNU_reinterpret"), @@ -1585,13 +1511,11 @@ decode_location_expression (unsigned char * data, dwarf_vmatoa ("x", cu_offset + uvalue)); break; case DW_OP_GNU_addr_index: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue)); break; case DW_OP_GNU_const_index: - uvalue = read_uleb128 (data, &bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue)); break; case DW_OP_GNU_variable_value: @@ -1869,8 +1793,8 @@ skip_attr_bytes (unsigned long form, int dwarf_version, dwarf_vma * value_return) { - unsigned int bytes_read; - dwarf_vma uvalue = 0; + dwarf_signed_vma svalue; + dwarf_vma uvalue = 0; * value_return = 0; @@ -1918,16 +1842,15 @@ skip_attr_bytes (unsigned long form, break; case DW_FORM_sdata: - uvalue = read_sleb128 (data, & bytes_read, end); - data += bytes_read; + READ_SLEB (svalue, data, end); + uvalue = svalue; break; case DW_FORM_ref_udata: case DW_FORM_udata: case DW_FORM_GNU_str_index: case DW_FORM_GNU_addr_index: - uvalue = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (uvalue, data, end); break; case DW_FORM_ref8: @@ -1945,8 +1868,7 @@ skip_attr_bytes (unsigned long form, case DW_FORM_block: case DW_FORM_exprloc: - uvalue = read_uleb128 (data, & bytes_read, end); - data += bytes_read + uvalue; + READ_ULEB (uvalue, data, end); break; case DW_FORM_block1: @@ -1994,14 +1916,12 @@ get_type_signedness (unsigned char * start, bfd_boolean is_nested) { unsigned long abbrev_number; - unsigned int bytes_read; abbrev_entry * entry; abbrev_attr * attr; * is_signed = FALSE; - abbrev_number = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (abbrev_number, data, end); for (entry = first_abbrev; entry != NULL && entry->entry != abbrev_number; @@ -2081,16 +2001,12 @@ read_and_print_leb128 (unsigned char * data, unsigned const char * end, bfd_boolean is_signed) { - if (is_signed) - { - dwarf_signed_vma sval = read_sleb128 (data, bytes_read, end); - printf ("%ld", (long) sval); - } + int status; + dwarf_vma val = read_leb128 (data, end, is_signed, bytes_read, &status); + if (status != 0) + report_leb_status (status); else - { - dwarf_vma uval = read_uleb128 (data, bytes_read, end); - printf ("%lu", (unsigned long) uval); - } + printf ("%s", dwarf_vmatoa (is_signed ? "d" : "u", val)); } static void @@ -2202,10 +2118,10 @@ read_and_display_attr_value (unsigned long attribute, char delimiter, int level) { + dwarf_signed_vma svalue; dwarf_vma uvalue = 0; unsigned char * block_start = NULL; unsigned char * orig_data = data; - unsigned int bytes_read; if (data > end || (data == end && form != DW_FORM_flag_present)) { @@ -2261,41 +2177,29 @@ read_and_display_attr_value (unsigned long attribute, break; case DW_FORM_sdata: - uvalue = read_sleb128 (data, & bytes_read, end); - data += bytes_read; + READ_SLEB (svalue, data, end); + uvalue = svalue; break; case DW_FORM_GNU_str_index: - uvalue = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - break; - case DW_FORM_ref_udata: case DW_FORM_udata: - uvalue = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + case DW_FORM_GNU_addr_index: + READ_ULEB (uvalue, data, end); break; case DW_FORM_indirect: - form = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (form, data, end); if (!do_loc) printf ("%c%s", delimiter, get_FORM_name (form)); if (form == DW_FORM_implicit_const) - { - implicit_const = read_sleb128 (data, & bytes_read, end); - data += bytes_read; - } + READ_SLEB (implicit_const, data, end); return read_and_display_attr_value (attribute, form, implicit_const, start, data, end, cu_offset, pointer_size, offset_size, dwarf_version, debug_info_p, do_loc, section, this_set, delimiter, level); - case DW_FORM_GNU_addr_index: - uvalue = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - break; } switch (form) @@ -2403,8 +2307,9 @@ read_and_display_attr_value (unsigned long attribute, case DW_FORM_block: case DW_FORM_exprloc: - uvalue = read_uleb128 (data, & bytes_read, end); - block_start = data + bytes_read; + READ_ULEB (uvalue, data, end); + do_block: + block_start = data; if (block_start >= end) { warn (_("Block ends prematurely\n")); @@ -2421,59 +2326,16 @@ read_and_display_attr_value (unsigned long attribute, break; case DW_FORM_block1: - SAFE_BYTE_GET (uvalue, data, 1, end); - block_start = data + 1; - if (block_start >= end) - { - warn (_("Block ends prematurely\n")); - uvalue = 0; - block_start = end; - } - - uvalue = check_uvalue (block_start, uvalue, end); - - if (do_loc) - data = block_start + uvalue; - else - data = display_block (block_start, uvalue, end, delimiter); - break; + SAFE_BYTE_GET_AND_INC (uvalue, data, 1, end); + goto do_block; case DW_FORM_block2: - SAFE_BYTE_GET (uvalue, data, 2, end); - block_start = data + 2; - if (block_start >= end) - { - warn (_("Block ends prematurely\n")); - uvalue = 0; - block_start = end; - } - - uvalue = check_uvalue (block_start, uvalue, end); - - if (do_loc) - data = block_start + uvalue; - else - data = display_block (block_start, uvalue, end, delimiter); - break; + SAFE_BYTE_GET_AND_INC (uvalue, data, 2, end); + goto do_block; case DW_FORM_block4: - SAFE_BYTE_GET (uvalue, data, 4, end); - block_start = data + 4; - /* PR 17512: file: 3371-3907-0.004. */ - if (block_start >= end) - { - warn (_("Block ends prematurely\n")); - uvalue = 0; - block_start = end; - } - - uvalue = check_uvalue (block_start, uvalue, end); - - if (do_loc) - data = block_start + uvalue; - else - data = display_block (block_start, uvalue, end, delimiter); - break; + SAFE_BYTE_GET_AND_INC (uvalue, data, 4, end); + goto do_block; case DW_FORM_strp: if (!do_loc) @@ -3070,9 +2932,10 @@ read_and_display_attr_value (unsigned long attribute, else { unsigned long abbrev_number; - abbrev_entry * entry; + abbrev_entry *entry; + unsigned char *p = section->start + uvalue; - abbrev_number = read_uleb128 (section->start + uvalue, NULL, end); + READ_ULEB (abbrev_number, p, end); printf (_("\t[Abbrev Number: %ld"), abbrev_number); /* Don't look up abbrev for DW_FORM_ref_addr, as it very often will @@ -3517,7 +3380,6 @@ process_debug_info (struct dwarf_section * section, saved_level = -1; while (tags < start) { - unsigned int bytes_read; unsigned long abbrev_number; unsigned long die_offset; abbrev_entry *entry; @@ -3526,8 +3388,7 @@ process_debug_info (struct dwarf_section * section, die_offset = tags - section_begin; - abbrev_number = read_uleb128 (tags, & bytes_read, start); - tags += bytes_read; + READ_ULEB (abbrev_number, tags, start); /* A null DIE marks the end of a list of siblings or it may also be a section padding. */ @@ -3871,16 +3732,14 @@ display_formatted_table (unsigned char * data, { unsigned char *format_start, format_count, *format, formati; dwarf_vma data_count, datai; - unsigned int bytes_read, namepass, last_entry = 0; + unsigned int namepass, last_entry = 0; SAFE_BYTE_GET_AND_INC (format_count, data, 1, end); format_start = data; for (formati = 0; formati < format_count; formati++) { - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; + SKIP_ULEB (data, end); + SKIP_ULEB (data, end); if (data == end) { if (is_dir) @@ -3891,8 +3750,7 @@ display_formatted_table (unsigned char * data, } } - data_count = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (data_count, data, end); if (data == end) { if (is_dir) @@ -3927,8 +3785,7 @@ display_formatted_table (unsigned char * data, { dwarf_vma content_type; - content_type = read_uleb128 (format, & bytes_read, end); - format += bytes_read; + READ_ULEB (content_type, format, end); if ((content_type == DW_LNCT_path) == (namepass == 1)) switch (content_type) { @@ -3951,8 +3808,7 @@ display_formatted_table (unsigned char * data, printf (_("\t(Unknown format content type %s)"), dwarf_vmatoa ("u", content_type)); } - read_uleb128 (format, & bytes_read, end); - format += bytes_read; + SKIP_ULEB (format, end); } } putchar ('\n'); @@ -3971,12 +3827,10 @@ display_formatted_table (unsigned char * data, { dwarf_vma content_type, form; - content_type = read_uleb128 (format, & bytes_read, end); - format += bytes_read; - form = read_uleb128 (format, & bytes_read, end); - format += bytes_read; - data = read_and_display_attr_value (0, form, 0, start, data, end, 0, 0, - linfo->li_offset_size, + READ_ULEB (content_type, format, end); + READ_ULEB (form, format, end); + data = read_and_display_attr_value (0, form, 0, start, data, end, + 0, 0, linfo->li_offset_size, linfo->li_version, NULL, ((content_type == DW_LNCT_path) != (namepass == 1)), section, NULL, '\t', -1); @@ -4137,21 +3991,18 @@ display_debug_lines_raw (struct dwarf_section * section, while (data < end && *data != 0) { unsigned char *name; - unsigned int bytes_read; + dwarf_vma val; printf (" %d\t", ++state_machine_regs.last_file_entry); name = data; data += strnlen ((char *) data, end - data) + 1; - printf ("%s\t", - dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; - printf ("%s\t", - dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; - printf ("%s\t", - dwarf_vmatoa ("u", read_uleb128 (data, & bytes_read, end))); - data += bytes_read; + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); + READ_ULEB (val, data, end); + printf ("%s\t", dwarf_vmatoa ("u", val)); printf ("%.*s\n", (int)(end - name), name); if (data == end) @@ -4182,7 +4033,6 @@ display_debug_lines_raw (struct dwarf_section * section, unsigned char op_code; dwarf_signed_vma adv; dwarf_vma uladv; - unsigned int bytes_read; printf (" [0x%08lx]", (long)(data - start)); @@ -4236,169 +4086,166 @@ display_debug_lines_raw (struct dwarf_section * section, putchar ('\n'); state_machine_regs.view++; } - else switch (op_code) - { - case DW_LNS_extended_op: - data += process_extended_line_op (data, linfo.li_default_is_stmt, end); - break; - - case DW_LNS_copy: - printf (_(" Copy")); - if (verbose_view || state_machine_regs.view) - printf (_(" (view %u)\n"), state_machine_regs.view); - else - putchar ('\n'); - state_machine_regs.view++; - break; - - case DW_LNS_advance_pc: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - if (linfo.li_max_ops_per_insn == 1) - { - uladv *= linfo.li_min_insn_length; - state_machine_regs.address += uladv; - if (uladv) - state_machine_regs.view = 0; - printf (_(" Advance PC by %s to 0x%s%s\n"), - dwarf_vmatoa ("u", uladv), - dwarf_vmatoa ("x", state_machine_regs.address), - verbose_view && uladv - ? _(" (reset view)") : ""); - } - else - { - unsigned addrdelta - = ((state_machine_regs.op_index + uladv) - / linfo.li_max_ops_per_insn) - * linfo.li_min_insn_length; - state_machine_regs.address - += addrdelta; - state_machine_regs.op_index - = (state_machine_regs.op_index + uladv) - % linfo.li_max_ops_per_insn; - if (addrdelta) - state_machine_regs.view = 0; - printf (_(" Advance PC by %s to 0x%s[%d]%s\n"), - dwarf_vmatoa ("u", uladv), - dwarf_vmatoa ("x", state_machine_regs.address), - state_machine_regs.op_index, - verbose_view && addrdelta - ? _(" (reset view)") : ""); - } - break; - - case DW_LNS_advance_line: - adv = read_sleb128 (data, & bytes_read, end); - data += bytes_read; - state_machine_regs.line += adv; - printf (_(" Advance Line by %s to %d\n"), - dwarf_vmatoa ("d", adv), - state_machine_regs.line); - break; - - case DW_LNS_set_file: - adv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - printf (_(" Set File Name to entry %s in the File Name Table\n"), - dwarf_vmatoa ("d", adv)); - state_machine_regs.file = adv; - break; - - case DW_LNS_set_column: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - printf (_(" Set column to %s\n"), - dwarf_vmatoa ("u", uladv)); - state_machine_regs.column = uladv; - break; - - case DW_LNS_negate_stmt: - adv = state_machine_regs.is_stmt; - adv = ! adv; - printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv)); - state_machine_regs.is_stmt = adv; - break; - - case DW_LNS_set_basic_block: - printf (_(" Set basic block\n")); - state_machine_regs.basic_block = 1; - break; - - case DW_LNS_const_add_pc: - uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range); - if (linfo.li_max_ops_per_insn) - { - uladv *= linfo.li_min_insn_length; - state_machine_regs.address += uladv; - if (uladv) - state_machine_regs.view = 0; - printf (_(" Advance PC by constant %s to 0x%s%s\n"), - dwarf_vmatoa ("u", uladv), - dwarf_vmatoa ("x", state_machine_regs.address), - verbose_view && uladv - ? _(" (reset view)") : ""); - } - else - { - unsigned addrdelta - = ((state_machine_regs.op_index + uladv) - / linfo.li_max_ops_per_insn) - * linfo.li_min_insn_length; - state_machine_regs.address - += addrdelta; - state_machine_regs.op_index - = (state_machine_regs.op_index + uladv) - % linfo.li_max_ops_per_insn; - if (addrdelta) - state_machine_regs.view = 0; - printf (_(" Advance PC by constant %s to 0x%s[%d]%s\n"), - dwarf_vmatoa ("u", uladv), - dwarf_vmatoa ("x", state_machine_regs.address), - state_machine_regs.op_index, - verbose_view && addrdelta - ? _(" (reset view)") : ""); - } - break; - - case DW_LNS_fixed_advance_pc: - SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); - state_machine_regs.address += uladv; - state_machine_regs.op_index = 0; - printf (_(" Advance PC by fixed size amount %s to 0x%s\n"), - dwarf_vmatoa ("u", uladv), - dwarf_vmatoa ("x", state_machine_regs.address)); - /* Do NOT reset view. */ - break; - - case DW_LNS_set_prologue_end: - printf (_(" Set prologue_end to true\n")); - break; - - case DW_LNS_set_epilogue_begin: - printf (_(" Set epilogue_begin to true\n")); - break; - - case DW_LNS_set_isa: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv)); - break; - - default: - printf (_(" Unknown opcode %d with operands: "), op_code); - - if (standard_opcodes != NULL) - for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) - { - printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data, - &bytes_read, end)), - i == 1 ? "" : ", "); - data += bytes_read; - } - putchar ('\n'); - break; - } + else + switch (op_code) + { + case DW_LNS_extended_op: + data += process_extended_line_op (data, + linfo.li_default_is_stmt, + end); + break; + + case DW_LNS_copy: + printf (_(" Copy")); + if (verbose_view || state_machine_regs.view) + printf (_(" (view %u)\n"), state_machine_regs.view); + else + putchar ('\n'); + state_machine_regs.view++; + break; + + case DW_LNS_advance_pc: + READ_ULEB (uladv, data, end); + if (linfo.li_max_ops_per_insn == 1) + { + uladv *= linfo.li_min_insn_length; + state_machine_regs.address += uladv; + if (uladv) + state_machine_regs.view = 0; + printf (_(" Advance PC by %s to 0x%s%s\n"), + dwarf_vmatoa ("u", uladv), + dwarf_vmatoa ("x", state_machine_regs.address), + verbose_view && uladv + ? _(" (reset view)") : ""); + } + else + { + unsigned addrdelta + = ((state_machine_regs.op_index + uladv) + / linfo.li_max_ops_per_insn) + * linfo.li_min_insn_length; + state_machine_regs.address + += addrdelta; + state_machine_regs.op_index + = (state_machine_regs.op_index + uladv) + % linfo.li_max_ops_per_insn; + if (addrdelta) + state_machine_regs.view = 0; + printf (_(" Advance PC by %s to 0x%s[%d]%s\n"), + dwarf_vmatoa ("u", uladv), + dwarf_vmatoa ("x", state_machine_regs.address), + state_machine_regs.op_index, + verbose_view && addrdelta + ? _(" (reset view)") : ""); + } + break; + + case DW_LNS_advance_line: + READ_SLEB (adv, data, end); + state_machine_regs.line += adv; + printf (_(" Advance Line by %s to %d\n"), + dwarf_vmatoa ("d", adv), + state_machine_regs.line); + break; + + case DW_LNS_set_file: + READ_ULEB (uladv, data, end); + printf (_(" Set File Name to entry %s in the File Name Table\n"), + dwarf_vmatoa ("u", uladv)); + state_machine_regs.file = uladv; + break; + + case DW_LNS_set_column: + READ_ULEB (uladv, data, end); + printf (_(" Set column to %s\n"), + dwarf_vmatoa ("u", uladv)); + state_machine_regs.column = uladv; + break; + + case DW_LNS_negate_stmt: + adv = state_machine_regs.is_stmt; + adv = ! adv; + printf (_(" Set is_stmt to %s\n"), dwarf_vmatoa ("d", adv)); + state_machine_regs.is_stmt = adv; + break; + + case DW_LNS_set_basic_block: + printf (_(" Set basic block\n")); + state_machine_regs.basic_block = 1; + break; + + case DW_LNS_const_add_pc: + uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range); + if (linfo.li_max_ops_per_insn) + { + uladv *= linfo.li_min_insn_length; + state_machine_regs.address += uladv; + if (uladv) + state_machine_regs.view = 0; + printf (_(" Advance PC by constant %s to 0x%s%s\n"), + dwarf_vmatoa ("u", uladv), + dwarf_vmatoa ("x", state_machine_regs.address), + verbose_view && uladv + ? _(" (reset view)") : ""); + } + else + { + unsigned addrdelta + = ((state_machine_regs.op_index + uladv) + / linfo.li_max_ops_per_insn) + * linfo.li_min_insn_length; + state_machine_regs.address + += addrdelta; + state_machine_regs.op_index + = (state_machine_regs.op_index + uladv) + % linfo.li_max_ops_per_insn; + if (addrdelta) + state_machine_regs.view = 0; + printf (_(" Advance PC by constant %s to 0x%s[%d]%s\n"), + dwarf_vmatoa ("u", uladv), + dwarf_vmatoa ("x", state_machine_regs.address), + state_machine_regs.op_index, + verbose_view && addrdelta + ? _(" (reset view)") : ""); + } + break; + + case DW_LNS_fixed_advance_pc: + SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); + state_machine_regs.address += uladv; + state_machine_regs.op_index = 0; + printf (_(" Advance PC by fixed size amount %s to 0x%s\n"), + dwarf_vmatoa ("u", uladv), + dwarf_vmatoa ("x", state_machine_regs.address)); + /* Do NOT reset view. */ + break; + + case DW_LNS_set_prologue_end: + printf (_(" Set prologue_end to true\n")); + break; + + case DW_LNS_set_epilogue_begin: + printf (_(" Set epilogue_begin to true\n")); + break; + + case DW_LNS_set_isa: + READ_ULEB (uladv, data, end); + printf (_(" Set ISA to %s\n"), dwarf_vmatoa ("u", uladv)); + break; + + default: + printf (_(" Unknown opcode %d with operands: "), op_code); + + if (standard_opcodes != NULL) + for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) + { + READ_ULEB (uladv, data, end); + printf ("0x%s%s", dwarf_vmatoa ("x", uladv), + i == 1 ? "" : ", "); + } + putchar ('\n'); + break; + } } putchar ('\n'); } @@ -4490,7 +4337,6 @@ display_debug_lines_decoded (struct dwarf_section * section, { unsigned char *format_start, format_count, *format; dwarf_vma formati, entryi; - unsigned int bytes_read; load_debug_section_with_follow (line_str, fileptr); @@ -4499,14 +4345,11 @@ display_debug_lines_decoded (struct dwarf_section * section, format_start = data; for (formati = 0; formati < format_count; formati++) { - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; + SKIP_ULEB (data, end); + SKIP_ULEB (data, end); } - n_directories = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (n_directories, data, end); if (data == end) { warn (_("Corrupt directories list\n")); @@ -4526,10 +4369,8 @@ display_debug_lines_decoded (struct dwarf_section * section, dwarf_vma content_type, form; dwarf_vma uvalue; - content_type = read_uleb128 (format, & bytes_read, end); - format += bytes_read; - form = read_uleb128 (format, & bytes_read, end); - format += bytes_read; + READ_ULEB (content_type, format, end); + READ_ULEB (form, format, end); if (data == end) { warn (_("Corrupt directories list\n")); @@ -4553,8 +4394,8 @@ display_debug_lines_decoded (struct dwarf_section * section, } break; } - data = read_and_display_attr_value (0, form, 0, start, data, end, - 0, 0, + data = read_and_display_attr_value (0, form, 0, start, + data, end, 0, 0, linfo.li_offset_size, linfo.li_version, NULL, 1, section, @@ -4572,14 +4413,11 @@ display_debug_lines_decoded (struct dwarf_section * section, format_start = data; for (formati = 0; formati < format_count; formati++) { - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; + SKIP_ULEB (data, end); + SKIP_ULEB (data, end); } - n_files = read_uleb128 (data, & bytes_read, end); - data += bytes_read; + READ_ULEB (n_files, data, end); if (data == end) { warn (_("Corrupt file name list\n")); @@ -4598,11 +4436,10 @@ display_debug_lines_decoded (struct dwarf_section * section, { dwarf_vma content_type, form; dwarf_vma uvalue; + unsigned char *tmp; - content_type = read_uleb128 (format, & bytes_read, end); - format += bytes_read; - form = read_uleb128 (format, & bytes_read, end); - format += bytes_read; + READ_ULEB (content_type, format, end); + READ_ULEB (form, format, end); if (data == end) { warn (_("Corrupt file name list\n")); @@ -4637,14 +4474,14 @@ display_debug_lines_decoded (struct dwarf_section * section, end); break; case DW_FORM_udata: - file->directory_index = read_uleb128 (data, NULL, - end); + tmp = data; + READ_ULEB (file->directory_index, tmp, end); break; } break; } - data = read_and_display_attr_value (0, form, 0, start, data, end, - 0, 0, + data = read_and_display_attr_value (0, form, 0, start, + data, end, 0, 0, linfo.li_offset_size, linfo.li_version, NULL, 1, section, @@ -4700,18 +4537,12 @@ display_debug_lines_decoded (struct dwarf_section * section, while (data < end && *data != 0) { - unsigned int bytes_read; - - /* Skip Name, directory index, last modification time and length - of file. */ + /* Skip Name, directory index, last modification + time and length of file. */ data += strnlen ((char *) data, end - data) + 1; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - read_uleb128 (data, & bytes_read, end); - data += bytes_read; - + SKIP_ULEB (data, end); + SKIP_ULEB (data, end); + SKIP_ULEB (data, end); n_files++; } @@ -4728,21 +4559,17 @@ display_debug_lines_decoded (struct dwarf_section * section, i = 0; while (*ptr_file_name_table != 0) { - unsigned int bytes_read; - file_table[i].name = ptr_file_name_table; ptr_file_name_table += strnlen ((char *) ptr_file_name_table, end - ptr_file_name_table) + 1; /* We are not interested in directory, time or size. */ - file_table[i].directory_index = read_uleb128 (ptr_file_name_table, - & bytes_read, end); - ptr_file_name_table += bytes_read; - file_table[i].modification_date = read_uleb128 (ptr_file_name_table, - & bytes_read, end); - ptr_file_name_table += bytes_read; - file_table[i].length = read_uleb128 (ptr_file_name_table, & bytes_read, end); - ptr_file_name_table += bytes_read; + READ_ULEB (file_table[i].directory_index, + ptr_file_name_table, end); + READ_ULEB (file_table[i].modification_date, + ptr_file_name_table, end); + READ_ULEB (file_table[i].length, + ptr_file_name_table, end); i++; } i = 0; @@ -4793,7 +4620,6 @@ display_debug_lines_decoded (struct dwarf_section * section, int xop; int adv; unsigned long int uladv; - unsigned int bytes_read; int is_special_opcode = 0; op_code = *data++; @@ -4830,228 +4656,216 @@ display_debug_lines_decoded (struct dwarf_section * section, is_special_opcode = 1; /* Increment view after printing this row. */ } - else switch (op_code) - { - case DW_LNS_extended_op: - { - unsigned int ext_op_code_len; - unsigned char ext_op_code; - unsigned char *op_code_data = data; - - ext_op_code_len = read_uleb128 (op_code_data, &bytes_read, - end_of_sequence); - op_code_data += bytes_read; - - if (ext_op_code_len == 0) - { - warn (_("Badly formed extended line op encountered!\n")); - break; - } - ext_op_code_len += bytes_read; - ext_op_code = *op_code_data++; - xop = ext_op_code; - xop = -xop; - - switch (ext_op_code) - { - case DW_LNE_end_sequence: - /* Reset stuff after printing this row. */ - break; - case DW_LNE_set_address: - SAFE_BYTE_GET_AND_INC (state_machine_regs.address, - op_code_data, - ext_op_code_len - bytes_read - 1, - end); - state_machine_regs.op_index = 0; - state_machine_regs.view = 0; - break; - case DW_LNE_define_file: - { - file_table = (File_Entry *) xrealloc - (file_table, (n_files + 1) * sizeof (File_Entry)); - - ++state_machine_regs.last_file_entry; - /* Source file name. */ - file_table[n_files].name = op_code_data; - op_code_data += strlen ((char *) op_code_data) + 1; - /* Directory index. */ - file_table[n_files].directory_index = - read_uleb128 (op_code_data, & bytes_read, - end_of_sequence); - op_code_data += bytes_read; - /* Last modification time. */ - file_table[n_files].modification_date = - read_uleb128 (op_code_data, & bytes_read, - end_of_sequence); - op_code_data += bytes_read; - /* File length. */ - file_table[n_files].length = - read_uleb128 (op_code_data, & bytes_read, - end_of_sequence); - - n_files++; - break; - } - case DW_LNE_set_discriminator: - case DW_LNE_HP_set_sequence: - /* Simply ignored. */ - break; - - default: - printf (_("UNKNOWN (%u): length %d\n"), - ext_op_code, ext_op_code_len - bytes_read); - break; - } - data += ext_op_code_len; - break; - } - case DW_LNS_copy: - /* Increment view after printing this row. */ - break; - - case DW_LNS_advance_pc: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - if (linfo.li_max_ops_per_insn == 1) - { - uladv *= linfo.li_min_insn_length; - state_machine_regs.address += uladv; - if (uladv) - state_machine_regs.view = 0; - } - else - { - unsigned addrdelta - = ((state_machine_regs.op_index + uladv) - / linfo.li_max_ops_per_insn) - * linfo.li_min_insn_length; - state_machine_regs.address - += addrdelta; - state_machine_regs.op_index - = (state_machine_regs.op_index + uladv) - % linfo.li_max_ops_per_insn; - if (addrdelta) - state_machine_regs.view = 0; - } - break; - - case DW_LNS_advance_line: - adv = read_sleb128 (data, & bytes_read, end); - data += bytes_read; - state_machine_regs.line += adv; - break; - - case DW_LNS_set_file: - adv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - state_machine_regs.file = adv; - - { - unsigned file = state_machine_regs.file - 1; - unsigned dir; - - if (file_table == NULL || n_files == 0) - printf (_("\n [Use file table entry %d]\n"), file); - /* PR 20439 */ - else if (file >= n_files) - { - warn (_("file index %u > number of files %u\n"), file + 1, n_files); - printf (_("\n "), file); - } - else if ((dir = file_table[file].directory_index) == 0) - /* If directory index is 0, that means current directory. */ - printf ("\n./%s:[++]\n", file_table[file].name); - else if (directory_table == NULL || n_directories == 0) - printf (_("\n [Use file %s in directory table entry %d]\n"), - file_table[file].name, dir); - /* PR 20439 */ - else if (dir > n_directories) - { - warn (_("directory index %u > number of directories %s\n"), - dir, dwarf_vmatoa ("u", n_directories)); - printf (_("\n \n"), dir); - } - else - printf ("\n%s/%s:\n", - /* The directory index starts counting at 1. */ - directory_table[dir - 1], file_table[file].name); - } - break; - - case DW_LNS_set_column: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - state_machine_regs.column = uladv; - break; - - case DW_LNS_negate_stmt: - adv = state_machine_regs.is_stmt; - adv = ! adv; - state_machine_regs.is_stmt = adv; - break; - - case DW_LNS_set_basic_block: - state_machine_regs.basic_block = 1; - break; - - case DW_LNS_const_add_pc: - uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range); - if (linfo.li_max_ops_per_insn == 1) - { - uladv *= linfo.li_min_insn_length; - state_machine_regs.address += uladv; - if (uladv) - state_machine_regs.view = 0; - } - else - { - unsigned addrdelta - = ((state_machine_regs.op_index + uladv) - / linfo.li_max_ops_per_insn) - * linfo.li_min_insn_length; - state_machine_regs.address - += addrdelta; - state_machine_regs.op_index - = (state_machine_regs.op_index + uladv) - % linfo.li_max_ops_per_insn; - if (addrdelta) - state_machine_regs.view = 0; - } - break; - - case DW_LNS_fixed_advance_pc: - SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); - state_machine_regs.address += uladv; - state_machine_regs.op_index = 0; - /* Do NOT reset view. */ - break; - - case DW_LNS_set_prologue_end: - break; - - case DW_LNS_set_epilogue_begin: - break; - - case DW_LNS_set_isa: - uladv = read_uleb128 (data, & bytes_read, end); - data += bytes_read; - printf (_(" Set ISA to %lu\n"), uladv); - break; - - default: - printf (_(" Unknown opcode %d with operands: "), op_code); - - if (standard_opcodes != NULL) - for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) - { - printf ("0x%s%s", dwarf_vmatoa ("x", read_uleb128 (data, - &bytes_read, end)), - i == 1 ? "" : ", "); - data += bytes_read; - } - putchar ('\n'); - break; - } + else + switch (op_code) + { + case DW_LNS_extended_op: + { + unsigned int ext_op_code_len; + unsigned char ext_op_code; + unsigned char *op_code_end; + unsigned char *op_code_data = data; + + READ_ULEB (ext_op_code_len, op_code_data, end_of_sequence); + op_code_end = op_code_data + ext_op_code_len; + if (ext_op_code_len == 0 || op_code_end > end_of_sequence) + { + warn (_("Badly formed extended line op encountered!\n")); + break; + } + ext_op_code = *op_code_data++; + xop = ext_op_code; + xop = -xop; + + switch (ext_op_code) + { + case DW_LNE_end_sequence: + /* Reset stuff after printing this row. */ + break; + case DW_LNE_set_address: + SAFE_BYTE_GET_AND_INC (state_machine_regs.address, + op_code_data, + op_code_end - op_code_data, + op_code_end); + state_machine_regs.op_index = 0; + state_machine_regs.view = 0; + break; + case DW_LNE_define_file: + file_table = (File_Entry *) xrealloc + (file_table, (n_files + 1) * sizeof (File_Entry)); + + ++state_machine_regs.last_file_entry; + /* Source file name. */ + file_table[n_files].name = op_code_data; + op_code_data += strlen ((char *) op_code_data) + 1; + /* Directory index. */ + READ_ULEB (file_table[n_files].directory_index, + op_code_data, op_code_end); + /* Last modification time. */ + READ_ULEB (file_table[n_files].modification_date, + op_code_data, op_code_end); + /* File length. */ + READ_ULEB (file_table[n_files].length, + op_code_data, op_code_end); + n_files++; + break; + + case DW_LNE_set_discriminator: + case DW_LNE_HP_set_sequence: + /* Simply ignored. */ + break; + + default: + printf (_("UNKNOWN (%u): length %ld\n"), + ext_op_code, (long int) (op_code_data - data)); + break; + } + data = op_code_end; + break; + } + case DW_LNS_copy: + /* Increment view after printing this row. */ + break; + + case DW_LNS_advance_pc: + READ_ULEB (uladv, data, end); + if (linfo.li_max_ops_per_insn == 1) + { + uladv *= linfo.li_min_insn_length; + state_machine_regs.address += uladv; + if (uladv) + state_machine_regs.view = 0; + } + else + { + unsigned addrdelta + = ((state_machine_regs.op_index + uladv) + / linfo.li_max_ops_per_insn) + * linfo.li_min_insn_length; + state_machine_regs.address + += addrdelta; + state_machine_regs.op_index + = (state_machine_regs.op_index + uladv) + % linfo.li_max_ops_per_insn; + if (addrdelta) + state_machine_regs.view = 0; + } + break; + + case DW_LNS_advance_line: + READ_SLEB (adv, data, end); + state_machine_regs.line += adv; + break; + + case DW_LNS_set_file: + READ_ULEB (uladv, data, end); + state_machine_regs.file = uladv; + + { + unsigned file = state_machine_regs.file - 1; + unsigned dir; + + if (file_table == NULL || n_files == 0) + printf (_("\n [Use file table entry %d]\n"), file); + /* PR 20439 */ + else if (file >= n_files) + { + warn (_("file index %u > number of files %u\n"), file + 1, n_files); + printf (_("\n "), file); + } + else if ((dir = file_table[file].directory_index) == 0) + /* If directory index is 0, that means current directory. */ + printf ("\n./%s:[++]\n", file_table[file].name); + else if (directory_table == NULL || n_directories == 0) + printf (_("\n [Use file %s in directory table entry %d]\n"), + file_table[file].name, dir); + /* PR 20439 */ + else if (dir > n_directories) + { + warn (_("directory index %u > number of directories %s\n"), + dir, dwarf_vmatoa ("u", n_directories)); + printf (_("\n \n"), dir); + } + else + printf ("\n%s/%s:\n", + /* The directory index starts counting at 1. */ + directory_table[dir - 1], file_table[file].name); + } + break; + + case DW_LNS_set_column: + READ_ULEB (uladv, data, end); + state_machine_regs.column = uladv; + break; + + case DW_LNS_negate_stmt: + adv = state_machine_regs.is_stmt; + adv = ! adv; + state_machine_regs.is_stmt = adv; + break; + + case DW_LNS_set_basic_block: + state_machine_regs.basic_block = 1; + break; + + case DW_LNS_const_add_pc: + uladv = ((255 - linfo.li_opcode_base) / linfo.li_line_range); + if (linfo.li_max_ops_per_insn == 1) + { + uladv *= linfo.li_min_insn_length; + state_machine_regs.address += uladv; + if (uladv) + state_machine_regs.view = 0; + } + else + { + unsigned addrdelta + = ((state_machine_regs.op_index + uladv) + / linfo.li_max_ops_per_insn) + * linfo.li_min_insn_length; + state_machine_regs.address + += addrdelta; + state_machine_regs.op_index + = (state_machine_regs.op_index + uladv) + % linfo.li_max_ops_per_insn; + if (addrdelta) + state_machine_regs.view = 0; + } + break; + + case DW_LNS_fixed_advance_pc: + SAFE_BYTE_GET_AND_INC (uladv, data, 2, end); + state_machine_regs.address += uladv; + state_machine_regs.op_index = 0; + /* Do NOT reset view. */ + break; + + case DW_LNS_set_prologue_end: + break; + + case DW_LNS_set_epilogue_begin: + break; + + case DW_LNS_set_isa: + READ_ULEB (uladv, data, end); + printf (_(" Set ISA to %lu\n"), uladv); + break; + + default: + printf (_(" Unknown opcode %d with operands: "), op_code); + + if (standard_opcodes != NULL) + for (i = standard_opcodes[op_code - 1]; i > 0 ; --i) + { + dwarf_vma val; + + READ_ULEB (val, data, end); + printf ("0x%s%s", dwarf_vmatoa ("x", val), + i == 1 ? "" : ", "); + } + putchar ('\n'); + break; + } /* Only Special opcodes, DW_LNS_copy and DW_LNE_end_sequence adds a row to the DWARF address/line matrix. */ @@ -5373,7 +5187,6 @@ display_debug_macinfo (struct dwarf_section *section, unsigned char *start = section->start; unsigned char *end = start + section->size; unsigned char *curr = start; - unsigned int bytes_read; enum dwarf_macinfo_record_type op; introduce (section, FALSE); @@ -5392,11 +5205,8 @@ display_debug_macinfo (struct dwarf_section *section, { unsigned int filenum; - lineno = read_uleb128 (curr, & bytes_read, end); - curr += bytes_read; - filenum = read_uleb128 (curr, & bytes_read, end); - curr += bytes_read; - + READ_ULEB (lineno, curr, end); + READ_ULEB (filenum, curr, end); printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum); } @@ -5407,8 +5217,7 @@ display_debug_macinfo (struct dwarf_section *section, break; case DW_MACINFO_define: - lineno = read_uleb128 (curr, & bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); string = curr; curr += strnlen ((char *) string, end - string) + 1; printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), @@ -5416,8 +5225,7 @@ display_debug_macinfo (struct dwarf_section *section, break; case DW_MACINFO_undef: - lineno = read_uleb128 (curr, & bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); string = curr; curr += strnlen ((char *) string, end - string) + 1; printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), @@ -5428,8 +5236,7 @@ display_debug_macinfo (struct dwarf_section *section, { unsigned int constant; - constant = read_uleb128 (curr, & bytes_read, end); - curr += bytes_read; + READ_ULEB (constant, curr, end); string = curr; curr += strnlen ((char *) string, end - string) + 1; printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), @@ -5454,7 +5261,7 @@ get_line_filename_and_dirname (dwarf_vma line_offset, struct dwarf_section *section = &debug_displays [line].section; unsigned char *hdrptr, *dirtable, *file_name; unsigned int offset_size, initial_length_size; - unsigned int version, opcode_base, bytes_read; + unsigned int version, opcode_base; dwarf_vma length, diridx; const unsigned char * end; @@ -5514,12 +5321,9 @@ get_line_filename_and_dirname (dwarf_vma line_offset, for (; hdrptr < end && *hdrptr != '\0' && fileidx > 1; fileidx--) { hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1; - read_uleb128 (hdrptr, &bytes_read, end); - hdrptr += bytes_read; - read_uleb128 (hdrptr, &bytes_read, end); - hdrptr += bytes_read; - read_uleb128 (hdrptr, &bytes_read, end); - hdrptr += bytes_read; + SKIP_ULEB (hdrptr, end); + SKIP_ULEB (hdrptr, end); + SKIP_ULEB (hdrptr, end); } if (hdrptr >= end || *hdrptr == '\0') return NULL; @@ -5528,7 +5332,7 @@ get_line_filename_and_dirname (dwarf_vma line_offset, hdrptr += strnlen ((char *) hdrptr, end - hdrptr) + 1; if (hdrptr >= end) return NULL; - diridx = read_uleb128 (hdrptr, &bytes_read, end); + READ_ULEB (diridx, hdrptr, end); if (diridx == 0) return file_name; for (; dirtable < end && *dirtable != '\0' && diridx > 1; diridx--) @@ -5547,7 +5351,6 @@ display_debug_macro (struct dwarf_section *section, unsigned char *end = start + section->size; unsigned char *curr = start; unsigned char *extended_op_buf[256]; - unsigned int bytes_read; load_debug_section_with_follow (str, file); load_debug_section_with_follow (line, file); @@ -5599,8 +5402,7 @@ display_debug_macro (struct dwarf_section *section, { SAFE_BYTE_GET_AND_INC (op, curr, 1, end); extended_ops[op] = curr; - nargs = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (nargs, curr, end); if (nargs == 0) printf (_(" DW_MACRO_%02x has no arguments\n"), op); else @@ -5663,10 +5465,8 @@ display_debug_macro (struct dwarf_section *section, unsigned int filenum; unsigned char *file_name = NULL, *dir_name = NULL; - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; - filenum = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); + READ_ULEB (filenum, curr, end); if ((flags & 2) == 0) error (_("DW_MACRO_start_file used, but no .debug_line offset provided.\n")); @@ -5690,8 +5490,7 @@ display_debug_macro (struct dwarf_section *section, break; case DW_MACRO_define: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); string = curr; curr += strnlen ((char *) string, end - string) + 1; printf (_(" DW_MACRO_define - lineno : %d macro : %s\n"), @@ -5699,8 +5498,7 @@ display_debug_macro (struct dwarf_section *section, break; case DW_MACRO_undef: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); string = curr; curr += strnlen ((char *) string, end - string) + 1; printf (_(" DW_MACRO_undef - lineno : %d macro : %s\n"), @@ -5708,8 +5506,7 @@ display_debug_macro (struct dwarf_section *section, break; case DW_MACRO_define_strp: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); string = fetch_indirect_string (offset); printf (_(" DW_MACRO_define_strp - lineno : %d macro : %s\n"), @@ -5717,8 +5514,7 @@ display_debug_macro (struct dwarf_section *section, break; case DW_MACRO_undef_strp: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); string = fetch_indirect_string (offset); printf (_(" DW_MACRO_undef_strp - lineno : %d macro : %s\n"), @@ -5732,16 +5528,14 @@ display_debug_macro (struct dwarf_section *section, break; case DW_MACRO_define_sup: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); printf (_(" DW_MACRO_define_sup - lineno : %d macro offset : 0x%lx\n"), lineno, (unsigned long) offset); break; case DW_MACRO_undef_sup: - lineno = read_uleb128 (curr, &bytes_read, end); - curr += bytes_read; + READ_ULEB (lineno, curr, end); SAFE_BYTE_GET_AND_INC (offset, curr, offset_size, end); printf (_(" DW_MACRO_undef_sup - lineno : %d macro offset : 0x%lx\n"), lineno, (unsigned long) offset); @@ -5764,8 +5558,7 @@ display_debug_macro (struct dwarf_section *section, /* Skip over unhandled opcodes. */ dwarf_vma nargs, n; unsigned char *desc = extended_ops[op]; - nargs = read_uleb128 (desc, &bytes_read, end); - desc += bytes_read; + READ_ULEB (nargs, desc, end); if (nargs == 0) { printf (_(" DW_MACRO_%02x\n"), op); @@ -5882,18 +5675,11 @@ display_view_pair_list (struct dwarf_section *section, dwarf_vma off = vstart - section->start; dwarf_vma vbegin, vend; - unsigned int bytes_read; - vbegin = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (vbegin, vstart, section_end); if (vstart == section_end) - { - vstart -= bytes_read; - break; - } - - vend = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + break; + READ_ULEB (vend, vstart, section_end); printf (" %8.8lx ", (unsigned long) off); print_dwarf_view (vbegin, pointer_size, 1); @@ -5993,16 +5779,12 @@ display_loc_list (struct dwarf_section *section, if (vstart) { - unsigned int bytes_read; - off = offset + (vstart - *start_ptr); - vbegin = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (vbegin, vstart, section_end); print_dwarf_view (vbegin, pointer_size, 1); - vend = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (vend, vstart, section_end); print_dwarf_view (vend, pointer_size, 1); printf (_("views at %8.8lx for:\n %*s "), @@ -6071,7 +5853,6 @@ display_loclists_list (struct dwarf_section *section, unsigned int pointer_size; unsigned int offset_size; int dwarf_version; - unsigned int bytes_read; /* Initialize it due to a false compiler warning. */ dwarf_vma begin = -1, vbegin = -1; @@ -6119,12 +5900,10 @@ display_loclists_list (struct dwarf_section *section, { off = offset + (vstart - *start_ptr); - vbegin = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (vbegin, vstart, section_end); print_dwarf_view (vbegin, pointer_size, 1); - vend = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (vend, vstart, section_end); print_dwarf_view (vend, pointer_size, 1); printf (_("views at %8.8lx for:\n %*s "), @@ -6137,10 +5916,8 @@ display_loclists_list (struct dwarf_section *section, printf (_("\n")); break; case DW_LLE_offset_pair: - begin = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; - end = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (begin, start, section_end); + READ_ULEB (end, start, section_end); break; case DW_LLE_base_address: SAFE_BYTE_GET_AND_INC (base_address, start, pointer_size, @@ -6152,12 +5929,10 @@ display_loclists_list (struct dwarf_section *section, case DW_LLE_view_pair: if (vstart) printf (_("View pair entry in loclist with locviews attribute\n")); - vbegin = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (vbegin, start, section_end); print_dwarf_view (vbegin, pointer_size, 1); - vend = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (vend, start, section_end); print_dwarf_view (vend, pointer_size, 1); printf (_("views for:\n")); @@ -6179,8 +5954,7 @@ display_loclists_list (struct dwarf_section *section, break; } - length = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (length, start, section_end); print_dwarf_vma (begin + base_address, pointer_size); print_dwarf_vma (end + base_address, pointer_size); @@ -6248,7 +6022,6 @@ display_loc_list_dwo (struct dwarf_section *section, unsigned short length; int need_frame_base; unsigned int idx; - unsigned int bytes_read; if (debug_info_entry >= num_debug_info_entries) { @@ -6295,12 +6068,10 @@ display_loc_list_dwo (struct dwarf_section *section, dwarf_vma view; dwarf_vma off = offset + (vstart - *start_ptr); - view = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (view, vstart, section_end); print_dwarf_view (view, 8, 1); - view = read_uleb128 (vstart, &bytes_read, section_end); - vstart += bytes_read; + READ_ULEB (view, vstart, section_end); print_dwarf_view (view, 8, 1); printf (_("views at %8.8lx for:\n %*s "), @@ -6318,23 +6089,19 @@ display_loc_list_dwo (struct dwarf_section *section, printf (_("\n")); return; case 1: /* A base-address entry. */ - idx = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (idx, start, section_end); print_addr_index (idx, 8); printf ("%*s", 9 + (vstart ? 2 * 6 : 0), ""); printf (_("(base address selection entry)\n")); continue; case 2: /* A start/end entry. */ - idx = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (idx, start, section_end); print_addr_index (idx, 8); - idx = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (idx, start, section_end); print_addr_index (idx, 8); break; case 3: /* A start/length entry. */ - idx = read_uleb128 (start, &bytes_read, section_end); - start += bytes_read; + READ_ULEB (idx, start, section_end); print_addr_index (idx, 8); SAFE_BYTE_GET_AND_INC (idx, start, 4, section_end); printf ("%08x ", idx); @@ -7079,7 +6846,6 @@ display_debug_rnglists_list (unsigned char *start, unsigned char *finish, enum dwarf_range_list_entry rlet; /* Initialize it due to a false compiler warning. */ dwarf_vma begin = -1, length, end = -1; - unsigned int bytes_read; if (start + 1 > finish) { @@ -7104,15 +6870,12 @@ display_debug_rnglists_list (unsigned char *start, unsigned char *finish, break; case DW_RLE_start_length: SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish); - length = read_uleb128 (start, &bytes_read, finish); - start += bytes_read; + READ_ULEB (length, start, finish); end = begin + length; break; case DW_RLE_offset_pair: - begin = read_uleb128 (start, &bytes_read, finish); - start += bytes_read; - end = read_uleb128 (start, &bytes_read, finish); - start += bytes_read; + READ_ULEB (begin, start, finish); + READ_ULEB (end, start, finish); break; case DW_RLE_start_end: SAFE_BYTE_GET_AND_INC (begin, start, pointer_size, finish); @@ -7836,7 +7599,6 @@ read_cie (unsigned char *start, unsigned char *end, { int version; Frame_Chunk *fc; - unsigned int length_return; unsigned char *augmentation_data = NULL; bfd_size_type augmentation_data_len = 0; @@ -7893,8 +7655,8 @@ read_cie (unsigned char *start, unsigned char *end, fc->segment_size = 0; } - READ_ULEB (fc->code_factor); - READ_SLEB (fc->data_factor); + READ_ULEB (fc->code_factor, start, end); + READ_SLEB (fc->data_factor, start, end); if (version == 1) { @@ -7902,12 +7664,12 @@ read_cie (unsigned char *start, unsigned char *end, } else { - READ_ULEB (fc->ra); + READ_ULEB (fc->ra, start, end); } if (fc->augmentation[0] == 'z') { - READ_ULEB (augmentation_data_len); + READ_ULEB (augmentation_data_len, start, end); augmentation_data = start; /* PR 17512: file: 11042-2589-0.004. */ if (augmentation_data_len > (bfd_size_type) (end - start)) @@ -8014,7 +7776,6 @@ display_debug_frames (struct dwarf_section *section, Frame_Chunk *remembered_state = NULL; Frame_Chunk *rs; bfd_boolean is_eh = strcmp (section->name, ".eh_frame") == 0; - unsigned int length_return; unsigned int max_regs = 0; const char *bad_reg = _("bad register: "); unsigned int saved_eh_addr_size = eh_addr_size; @@ -8279,7 +8040,7 @@ display_debug_frames (struct dwarf_section *section, if (cie->augmentation[0] == 'z') { - READ_ULEB (augmentation_data_len); + READ_ULEB (augmentation_data_len, start, end); augmentation_data = start; /* PR 17512 file: 722-8446-0.004 and PR 22386. */ if (augmentation_data_len > (bfd_size_type) (end - start)) @@ -8346,7 +8107,7 @@ display_debug_frames (struct dwarf_section *section, case DW_CFA_advance_loc: break; case DW_CFA_offset: - SKIP_ULEB (); + SKIP_ULEB (start, end); if (frame_need_space (fc, opa) >= 0) fc->col_type[opa] = DW_CFA_undefined; break; @@ -8368,44 +8129,44 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_offset_extended: case DW_CFA_val_offset: - READ_ULEB (reg); - SKIP_ULEB (); + READ_ULEB (reg, start, end); + SKIP_ULEB (start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_restore_extended: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_undefined: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_same_value: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_register: - READ_ULEB (reg); - SKIP_ULEB (); + READ_ULEB (reg, start, end); + SKIP_ULEB (start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_def_cfa: - SKIP_ULEB (); - SKIP_ULEB (); + SKIP_ULEB (start, end); + SKIP_ULEB (start, end); break; case DW_CFA_def_cfa_register: - SKIP_ULEB (); + SKIP_ULEB (start, end); break; case DW_CFA_def_cfa_offset: - SKIP_ULEB (); + SKIP_ULEB (start, end); break; case DW_CFA_def_cfa_expression: - READ_ULEB (temp); + READ_ULEB (temp, start, end); new_start = start + temp; if (new_start < start) { @@ -8417,8 +8178,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_expression: case DW_CFA_val_expression: - READ_ULEB (reg); - READ_ULEB (temp); + READ_ULEB (reg, start, end); + READ_ULEB (temp, start, end); new_start = start + temp; if (new_start < start) { @@ -8433,27 +8194,27 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_offset_extended_sf: case DW_CFA_val_offset_sf: - READ_ULEB (reg); - SKIP_SLEB (); + READ_ULEB (reg, start, end); + SKIP_SLEB (start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; case DW_CFA_def_cfa_sf: - SKIP_ULEB (); - SKIP_SLEB (); + SKIP_ULEB (start, end); + SKIP_SLEB (start, end); break; case DW_CFA_def_cfa_offset_sf: - SKIP_SLEB (); + SKIP_SLEB (start, end); break; case DW_CFA_MIPS_advance_loc8: start += 8; break; case DW_CFA_GNU_args_size: - SKIP_ULEB (); + SKIP_ULEB (start, end); break; case DW_CFA_GNU_negative_offset_extended: - READ_ULEB (reg); - SKIP_ULEB (); + READ_ULEB (reg, start, end); + SKIP_ULEB (start, end); if (frame_need_space (fc, reg) >= 0) fc->col_type[reg] = DW_CFA_undefined; break; @@ -8509,7 +8270,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_offset: - READ_ULEB (roffs); + READ_ULEB (roffs, start, end); if (opa >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8596,8 +8357,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_offset_extended: - READ_ULEB (reg); - READ_ULEB (roffs); + READ_ULEB (reg, start, end); + READ_ULEB (roffs, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8612,8 +8373,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_val_offset: - READ_ULEB (reg); - READ_ULEB (roffs); + READ_ULEB (reg, start, end); + READ_ULEB (roffs, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8628,7 +8389,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_restore_extended: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8650,7 +8411,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_undefined: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8664,7 +8425,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_same_value: - READ_ULEB (reg); + READ_ULEB (reg, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8678,8 +8439,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_register: - READ_ULEB (reg); - READ_ULEB (roffs); + READ_ULEB (reg, start, end); + READ_ULEB (roffs, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8742,8 +8503,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa: - READ_ULEB (fc->cfa_reg); - READ_ULEB (fc->cfa_offset); + READ_ULEB (fc->cfa_reg, start, end); + READ_ULEB (fc->cfa_offset, start, end); fc->cfa_exp = 0; if (! do_debug_frames_interp) printf (" DW_CFA_def_cfa: %s ofs %d\n", @@ -8751,7 +8512,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_register: - READ_ULEB (fc->cfa_reg); + READ_ULEB (fc->cfa_reg, start, end); fc->cfa_exp = 0; if (! do_debug_frames_interp) printf (" DW_CFA_def_cfa_register: %s\n", @@ -8759,7 +8520,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_offset: - READ_ULEB (fc->cfa_offset); + READ_ULEB (fc->cfa_offset, start, end); if (! do_debug_frames_interp) printf (" DW_CFA_def_cfa_offset: %d\n", (int) fc->cfa_offset); break; @@ -8770,7 +8531,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_expression: - READ_ULEB (ul); + READ_ULEB (ul, start, end); if (start >= block_end || ul > (unsigned long) (block_end - start)) { printf (_(" DW_CFA_def_cfa_expression: \n"), ul); @@ -8788,8 +8549,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_expression: - READ_ULEB (reg); - READ_ULEB (ul); + READ_ULEB (reg, start, end); + READ_ULEB (ul, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; /* PR 17512: file: 069-133014-0.006. */ @@ -8814,8 +8575,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_val_expression: - READ_ULEB (reg); - READ_ULEB (ul); + READ_ULEB (reg, start, end); + READ_ULEB (ul, start, end); if (reg >= (unsigned int) fc->ncols) reg_prefix = bad_reg; tmp = start + ul; @@ -8838,8 +8599,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_offset_extended_sf: - READ_ULEB (reg); - READ_SLEB (l); + READ_ULEB (reg, start, end); + READ_SLEB (l, start, end); if (frame_need_space (fc, reg) < 0) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8854,8 +8615,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_val_offset_sf: - READ_ULEB (reg); - READ_SLEB (l); + READ_ULEB (reg, start, end); + READ_SLEB (l, start, end); if (frame_need_space (fc, reg) < 0) reg_prefix = bad_reg; if (! do_debug_frames_interp || *reg_prefix != '\0') @@ -8870,8 +8631,8 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_sf: - READ_ULEB (fc->cfa_reg); - READ_ULEB (fc->cfa_offset); + READ_ULEB (fc->cfa_reg, start, end); + READ_ULEB (fc->cfa_offset, start, end); fc->cfa_offset = fc->cfa_offset * fc->data_factor; fc->cfa_exp = 0; if (! do_debug_frames_interp) @@ -8880,7 +8641,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_offset_sf: - READ_ULEB (fc->cfa_offset); + READ_ULEB (fc->cfa_offset, start, end); fc->cfa_offset *= fc->data_factor; if (! do_debug_frames_interp) printf (" DW_CFA_def_cfa_offset_sf: %d\n", (int) fc->cfa_offset); @@ -8905,14 +8666,14 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_GNU_args_size: - READ_ULEB (ul); + READ_ULEB (ul, start, end); if (! do_debug_frames_interp) printf (" DW_CFA_GNU_args_size: %ld\n", ul); break; case DW_CFA_GNU_negative_offset_extended: - READ_ULEB (reg); - READ_SLEB (l); + READ_ULEB (reg, start, end); + READ_SLEB (l, start, end); l = - l; if (frame_need_space (fc, reg) < 0) reg_prefix = bad_reg; @@ -9203,10 +8964,9 @@ display_debug_names (struct dwarf_section *section, void *file) unsigned char *abbrevptr = abbrev_table; for (;;) { - unsigned int bytes_read; - const dwarf_vma abbrev_tag = read_uleb128 (abbrevptr, &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; + dwarf_vma abbrev_tag; + + READ_ULEB (abbrev_tag, abbrevptr, abbrev_table_end); if (abbrev_tag == 0) break; if (abbrev_lookup_used == abbrev_lookup_allocated) @@ -9234,17 +8994,13 @@ display_debug_names (struct dwarf_section *section, void *file) entry->abbrev_lookup_ptr = abbrevptr; /* Skip DWARF tag. */ - read_uleb128 (abbrevptr, &bytes_read, abbrev_table_end); - abbrevptr += bytes_read; + SKIP_ULEB (abbrevptr, abbrev_table_end); for (;;) { - const dwarf_vma xindex = read_uleb128 (abbrevptr, - &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; - const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; + dwarf_vma xindex, form; + + READ_ULEB (xindex, abbrevptr, abbrev_table_end); + READ_ULEB (form, abbrevptr, abbrev_table_end); if (xindex == 0 && form == 0) break; } @@ -9277,10 +9033,11 @@ display_debug_names (struct dwarf_section *section, void *file) dwarf_vma second_abbrev_tag = -1; for (;;) { - unsigned int bytes_read; - const dwarf_vma abbrev_tag = read_uleb128 (entryptr, &bytes_read, - unit_end); - entryptr += bytes_read; + dwarf_vma abbrev_tag; + dwarf_vma dwarf_tag; + const struct abbrev_lookup_entry *entry; + + READ_ULEB (abbrev_tag, entryptr, unit_end); if (tagno == -1) { second_abbrev_tag = abbrev_tag; @@ -9295,7 +9052,6 @@ display_debug_names (struct dwarf_section *section, void *file) (tagno == 0 && second_abbrev_tag == 0 ? " " : "\n\t"), (unsigned long) abbrev_tag); - const struct abbrev_lookup_entry *entry; for (entry = abbrev_lookup; entry < abbrev_lookup + abbrev_lookup_used; entry++) @@ -9310,20 +9066,15 @@ display_debug_names (struct dwarf_section *section, void *file) break; } abbrevptr = entry->abbrev_lookup_ptr; - const dwarf_vma dwarf_tag = read_uleb128 (abbrevptr, &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; + READ_ULEB (dwarf_tag, abbrevptr, abbrev_table_end); if (tagno >= 0) printf (" %s", get_TAG_name (dwarf_tag)); for (;;) { - const dwarf_vma xindex = read_uleb128 (abbrevptr, - &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; - const dwarf_vma form = read_uleb128 (abbrevptr, &bytes_read, - abbrev_table_end); - abbrevptr += bytes_read; + dwarf_vma xindex, form; + + READ_ULEB (xindex, abbrevptr, abbrev_table_end); + READ_ULEB (form, abbrevptr, abbrev_table_end); if (xindex == 0 && form == 0) break; diff --git a/binutils/dwarf.h b/binutils/dwarf.h index 5ea85d920a..cfb3abea3b 100644 --- a/binutils/dwarf.h +++ b/binutils/dwarf.h @@ -248,9 +248,65 @@ extern void * xcalloc2 (size_t, size_t); extern void * xcmalloc (size_t, size_t); extern void * xcrealloc (void *, size_t, size_t); -extern dwarf_vma read_leb128 (unsigned char *, unsigned int *, bfd_boolean, const unsigned char * const); - /* A callback into the client. Returns TRUE if there is a relocation against the given debug section at the given offset. */ extern bfd_boolean reloc_at (struct dwarf_section *, dwarf_vma); + +extern dwarf_vma read_leb128 (unsigned char *, const unsigned char *const, + bfd_boolean, unsigned int *, int *); + +static inline void +report_leb_status (int status) +{ + if ((status & 1) != 0) + error (_("LEB end of data\n")); + else if ((status & 2) != 0) + error (_("LEB value too large\n")); +} + +#define SKIP_ULEB(start, end) \ + do \ + { \ + unsigned int _len; \ + read_leb128 (start, end, FALSE, &_len, NULL); \ + start += _len; \ + } while (0) + +#define SKIP_SLEB(start, end) \ + do \ + { \ + unsigned int _len; \ + read_leb128 (start, end, TRUE, &_len, NULL); \ + start += _len; \ + } while (0) + +#define READ_ULEB(var, start, end) \ + do \ + { \ + dwarf_vma _val; \ + unsigned int _len; \ + int _status; \ + \ + _val = read_leb128 (start, end, FALSE, &_len, &_status); \ + start += _len; \ + (var) = _val; \ + if ((var) != _val) \ + _status |= 2; \ + report_leb_status (_status); \ + } while (0) + +#define READ_SLEB(var, start, end) \ + do \ + { \ + dwarf_signed_vma _val; \ + unsigned int _len; \ + int _status; \ + \ + _val = read_leb128 (start, end, TRUE, &_len, &_status); \ + start += _len; \ + (var) = _val; \ + if ((var) != _val) \ + _status |= 2; \ + report_leb_status (_status); \ + } while (0) diff --git a/binutils/readelf.c b/binutils/readelf.c index d16a8f195a..bd76242d15 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -751,17 +751,6 @@ find_section_in_set (Filedata * filedata, const char * name, unsigned int * set) return find_section (filedata, name); } -/* Read an unsigned LEB128 encoded value from DATA. - Set *LENGTH_RETURN to the number of bytes read. */ - -static inline unsigned long -read_uleb128 (unsigned char * data, - unsigned int * length_return, - const unsigned char * const end) -{ - return read_leb128 (data, length_return, FALSE, end); -} - /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI. This OS has so many departures from the ELF standard that we test it at many places. */ @@ -8818,7 +8807,7 @@ decode_arm_unwind_bytecode (Filedata * filedata, } else { - offset = read_uleb128 (buf, &len, buf + i + 1); + offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL); assert (len == i + 1); offset = offset * 4 + 0x204; printf ("vsp = vsp + %ld", offset); @@ -9037,7 +9026,7 @@ decode_tic6x_unwind_bytecode (Filedata * filedata, return FALSE; } - offset = read_uleb128 (buf, &len, buf + i + 1); + offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL); assert (len == i + 1); offset = offset * 8 + 0x408; printf (_("sp = sp + %ld"), offset); @@ -14528,10 +14517,7 @@ display_tag_value (signed int tag, } else { - unsigned int len; - - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf ("%ld (0x%lx)\n", val, val); } @@ -14546,17 +14532,14 @@ display_arc_attribute (unsigned char * p, const unsigned char * const end) { unsigned int tag; - unsigned int len; unsigned int val; - tag = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (tag, p, end); switch (tag) { case Tag_ARC_PCS_config: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_PCS_config: "); switch (val) { @@ -14582,8 +14565,7 @@ display_arc_attribute (unsigned char * p, break; case Tag_ARC_CPU_base: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_CPU_base: "); switch (val) { @@ -14607,8 +14589,7 @@ display_arc_attribute (unsigned char * p, break; case Tag_ARC_CPU_variation: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_CPU_variation: "); switch (val) { @@ -14631,21 +14612,18 @@ display_arc_attribute (unsigned char * p, break; case Tag_ARC_ABI_rf16: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no")); break; case Tag_ARC_ABI_osver: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_osver: v%d\n", val); break; case Tag_ARC_ABI_pic: case Tag_ARC_ABI_sda: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: " : " Tag_ARC_ABI_pic: "); switch (val) @@ -14666,28 +14644,24 @@ display_arc_attribute (unsigned char * p, break; case Tag_ARC_ABI_tls: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none"); break; case Tag_ARC_ABI_enumsize: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") : _("smallest")); break; case Tag_ARC_ABI_exceptions: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP") : _("default")); break; case Tag_ARC_ABI_double_size: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ABI_double_size: %d\n", val); break; @@ -14702,14 +14676,12 @@ display_arc_attribute (unsigned char * p, break; case Tag_ARC_ISA_mpy_option: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ISA_mpy_option: %d\n", val); break; case Tag_ARC_ATR_version: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ARC_ATR_version: %d\n", val); break; @@ -14854,14 +14826,12 @@ display_arm_attribute (unsigned char * p, const unsigned char * const end) { unsigned int tag; - unsigned int len; unsigned int val; arm_attr_public_tag * attr; unsigned i; unsigned int type; - tag = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (tag, p, end); attr = NULL; for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++) { @@ -14881,8 +14851,7 @@ display_arm_attribute (unsigned char * p, switch (tag) { case 7: /* Tag_CPU_arch_profile. */ - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -14895,8 +14864,7 @@ display_arm_attribute (unsigned char * p, break; case 24: /* Tag_align_needed. */ - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -14914,8 +14882,7 @@ display_arm_attribute (unsigned char * p, break; case 25: /* Tag_align_preserved. */ - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -14934,8 +14901,7 @@ display_arm_attribute (unsigned char * p, case 32: /* Tag_compatibility. */ { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (_("flag = %d, vendor = "), val); if (p < end - 1) { @@ -14961,12 +14927,10 @@ display_arm_attribute (unsigned char * p, break; case 65: /* Tag_also_compatible_with. */ - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); if (val == 6 /* Tag_CPU_arch. */) { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch)) printf ("??? (%d)\n", val); else @@ -14991,8 +14955,7 @@ display_arm_attribute (unsigned char * p, default: assert (attr->type & 0x80); - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); type = attr->type & 0x7f; if (val >= type) printf ("??? (%d)\n", val); @@ -15010,19 +14973,16 @@ display_gnu_attribute (unsigned char * p, unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const), const unsigned char * const end) { - int tag; - unsigned int len; + unsigned int tag; unsigned int val; - tag = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (tag, p, end); /* Tag_compatibility is the only generic GNU attribute defined at present. */ if (tag == 32) { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (_("flag = %d, vendor = "), val); if (p == end) @@ -15060,19 +15020,17 @@ display_power_gnu_attribute (unsigned char * p, unsigned int tag, const unsigned char * const end) { - unsigned int len; unsigned int val; if (tag == Tag_GNU_Power_ABI_FP) { - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_Power_ABI_FP: "); - if (len == 0) + if (p == end) { printf (_("\n")); return p; } + READ_ULEB (val, p, end); if (val > 15) printf ("(%#x), ", val); @@ -15113,14 +15071,13 @@ display_power_gnu_attribute (unsigned char * p, if (tag == Tag_GNU_Power_ABI_Vector) { - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_Power_ABI_Vector: "); - if (len == 0) + if (p == end) { printf (_("\n")); return p; } + READ_ULEB (val, p, end); if (val > 3) printf ("(%#x), ", val); @@ -15145,14 +15102,13 @@ display_power_gnu_attribute (unsigned char * p, if (tag == Tag_GNU_Power_ABI_Struct_Return) { - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_Power_ABI_Struct_Return: "); - if (len == 0) + if (p == end) { printf (_("\n")); return p; } + READ_ULEB (val, p, end); if (val > 2) printf ("(%#x), ", val); @@ -15183,14 +15139,12 @@ display_s390_gnu_attribute (unsigned char * p, unsigned int tag, const unsigned char * const end) { - unsigned int len; - int val; + unsigned int val; if (tag == Tag_GNU_S390_ABI_Vector) { - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_S390_ABI_Vector: "); + READ_ULEB (val, p, end); switch (val) { @@ -15298,21 +15252,18 @@ display_sparc_gnu_attribute (unsigned char * p, unsigned int tag, const unsigned char * const end) { - unsigned int len; - int val; + unsigned int val; if (tag == Tag_GNU_Sparc_HWCAPS) { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_GNU_Sparc_HWCAPS: "); display_sparc_hwcaps (val); return p; } if (tag == Tag_GNU_Sparc_HWCAPS2) { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_GNU_Sparc_HWCAPS2: "); display_sparc_hwcaps2 (val); return p; @@ -15366,26 +15317,20 @@ display_mips_gnu_attribute (unsigned char * p, { if (tag == Tag_GNU_MIPS_ABI_FP) { - unsigned int len; unsigned int val; - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_MIPS_ABI_FP: "); - + READ_ULEB (val, p, end); print_mips_fp_abi_value (val); - return p; } if (tag == Tag_GNU_MIPS_ABI_MSA) { - unsigned int len; unsigned int val; - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_MIPS_ABI_MSA: "); + READ_ULEB (val, p, end); switch (val) { @@ -15410,18 +15355,15 @@ display_tic6x_attribute (unsigned char * p, const unsigned char * const end) { unsigned int tag; - unsigned int len; - int val; + unsigned int val; - tag = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (tag, p, end); switch (tag) { case Tag_ISA: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_ISA: "); + READ_ULEB (val, p, end); switch (val) { @@ -15453,9 +15395,8 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_wchar_t: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_ABI_wchar_t: "); + READ_ULEB (val, p, end); switch (val) { case 0: @@ -15474,9 +15415,8 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_stack_align_needed: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_ABI_stack_align_needed: "); + READ_ULEB (val, p, end); switch (val) { case 0: @@ -15492,8 +15432,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_stack_align_preserved: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_stack_align_preserved: "); switch (val) { @@ -15510,8 +15449,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_DSBT: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_DSBT: "); switch (val) { @@ -15528,8 +15466,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_PID: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_PID: "); switch (val) { @@ -15549,8 +15486,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_PIC: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_PIC: "); switch (val) { @@ -15567,8 +15503,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_array_object_alignment: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_array_object_alignment: "); switch (val) { @@ -15588,8 +15523,7 @@ display_tic6x_attribute (unsigned char * p, return p; case Tag_ABI_array_object_align_expected: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_array_object_align_expected: "); switch (val) { @@ -15610,8 +15544,7 @@ display_tic6x_attribute (unsigned char * p, case Tag_ABI_compatibility: { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf (" Tag_ABI_compatibility: "); printf (_("flag = %d, vendor = "), val); if (p < end - 1) @@ -15702,19 +15635,16 @@ static unsigned char * display_msp430x_attribute (unsigned char * p, const unsigned char * const end) { - unsigned int len; unsigned int val; unsigned int tag; - tag = read_uleb128 (p, & len, end); - p += len; + READ_ULEB (tag, p, end); switch (tag) { case OFBA_MSPABI_Tag_ISA: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_ISA: "); + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -15725,9 +15655,8 @@ display_msp430x_attribute (unsigned char * p, break; case OFBA_MSPABI_Tag_Code_Model: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_Code_Model: "); + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -15738,9 +15667,8 @@ display_msp430x_attribute (unsigned char * p, break; case OFBA_MSPABI_Tag_Data_Model: - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_Data_Model: "); + READ_ULEB (val, p, end); switch (val) { case 0: printf (_("None\n")); break; @@ -15773,8 +15701,7 @@ display_msp430x_attribute (unsigned char * p, } else { - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); printf ("%d (0x%x)\n", val, val); } break; @@ -15791,12 +15718,10 @@ display_msp430_gnu_attribute (unsigned char * p, { if (tag == Tag_GNU_MSP430_Data_Region) { - unsigned int len; - int val; + unsigned int val; - val = read_uleb128 (p, &len, end); - p += len; printf (" Tag_GNU_MSP430_Data_Region: "); + READ_ULEB (val, p, end); switch (val) { @@ -15807,7 +15732,7 @@ display_msp430_gnu_attribute (unsigned char * p, printf (_("Lower Region Only\n")); break; default: - printf ("??? (%d)\n", val); + printf ("??? (%u)\n", val); } return p; } @@ -15816,7 +15741,7 @@ display_msp430_gnu_attribute (unsigned char * p, struct riscv_attr_tag_t { const char *name; - int tag; + unsigned int tag; }; static struct riscv_attr_tag_t riscv_attr_tag[] = @@ -15835,14 +15760,12 @@ static unsigned char * display_riscv_attribute (unsigned char *p, const unsigned char * const end) { - unsigned int len; - int val; - int tag; + unsigned int val; + unsigned int tag; struct riscv_attr_tag_t *attr = NULL; unsigned i; - tag = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (tag, p, end); /* Find the name of attribute. */ for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++) @@ -15864,13 +15787,11 @@ display_riscv_attribute (unsigned char *p, case Tag_RISCV_priv_spec: case Tag_RISCV_priv_spec_minor: case Tag_RISCV_priv_spec_revision: - val = read_uleb128 (p, &len, end); - p += len; - printf (_("%d\n"), val); + READ_ULEB (val, p, end); + printf (_("%u\n"), val); break; case Tag_RISCV_unaligned_access: - val = read_uleb128 (p, &len, end); - p += len; + READ_ULEB (val, p, end); switch (val) { case 0: @@ -15882,9 +15803,8 @@ display_riscv_attribute (unsigned char *p, } break; case Tag_RISCV_stack_align: - val = read_uleb128 (p, &len, end); - p += len; - printf (_("%d-bytes\n"), val); + READ_ULEB (val, p, end); + printf (_("%u-bytes\n"), val); break; case Tag_RISCV_arch: p = display_tag_value (-1, p, end); @@ -16003,7 +15923,7 @@ process_attributes (Filedata * filedata, while (attr_len > 0 && p < contents + sect->sh_size) { int tag; - int val; + unsigned int val; bfd_vma size; unsigned char * end; @@ -16054,10 +15974,7 @@ process_attributes (Filedata * filedata, do_numlist: for (;;) { - unsigned int j; - - val = read_uleb128 (p, &j, end); - p += j; + READ_ULEB (val, p, end); if (val == 0) break; printf (" %d", val); diff --git a/cpu/ChangeLog b/cpu/ChangeLog index 1729efd266..3e6a8d8c4d 100644 --- a/cpu/ChangeLog +++ b/cpu/ChangeLog @@ -1,3 +1,7 @@ +2019-12-23 Alan Modra + + * iq2000.cpu (f-offset): Avoid left shift of negative values. + 2019-12-20 Alan Modra * or1korbis.cpu (f-disp26, f-disp21): Don't left shift negative values. diff --git a/cpu/iq2000.cpu b/cpu/iq2000.cpu index e25ba69392..cb9cfae1d4 100644 --- a/cpu/iq2000.cpu +++ b/cpu/iq2000.cpu @@ -207,7 +207,7 @@ (df f-offset "pc offset field" (PCREL-ADDR) 15 16 INT ; Actually, this is relative to the address of the delay slot. ((value pc) (sra SI (sub SI value pc) 2)) - ((value pc) (add SI (sll SI value 2) (add pc 4)))) + ((value pc) (add SI (mul SI value 4) (add pc 4)))) ; Instruction fields that scarcely appear in instructions. diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index d6d7311132..979ca97b4b 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,32 @@ +2019-12-23 Jan Beulich + + * ppc-dis.c (print_insn_powerpc): Rename local variable "spaces" + to "blanks". + * ppc-opc.c (D34, SI34, NSI34): Use UINT64_C(). + +2019-12-23 Alan Modra + + * score-dis.c (print_insn_score32): Avoid signed overflow. + (print_insn_score48): Likewise. Don't cast to int when printing + hex values. + +2019-12-23 Alan Modra + + * iq2000-ibld.c: Regenerate. + +2019-12-23 Alan Modra + + * d30v-dis.c (extract_value): Make num param a uint64_t, constify + oper. Use unsigned vars. + (print_insn): Make num var uint64_t. Constify oper and remove now + unnecessary casts on extract_value calls. + (print_insn_d30v): Use unsigned vars. Adjust printf formats. + +2019-12-23 Alan Modra + + * wasm32-dis.c (wasm_read_leb128): Don't allow oversize shifts. + Catch value overflow. Sign extend only on terminating byte. + 2019-12-20 Alan Modra PR 25281 diff --git a/opcodes/d30v-dis.c b/opcodes/d30v-dis.c index d2e0caa39d..8d96c28e6d 100644 --- a/opcodes/d30v-dis.c +++ b/opcodes/d30v-dis.c @@ -90,11 +90,11 @@ lookup_opcode (struct d30v_insn *insn, long num, int is_long) } static int -extract_value (long long num, struct d30v_operand *oper, int is_long) +extract_value (uint64_t num, const struct d30v_operand *oper, int is_long) { - int val; + unsigned int val; int shift = 12 - oper->position; - int mask = (0xFFFFFFFF >> (32 - oper->bits)); + unsigned int mask = (0xFFFFFFFF >> (32 - oper->bits)); if (is_long) { @@ -118,13 +118,13 @@ extract_value (long long num, struct d30v_operand *oper, int is_long) static void print_insn (struct disassemble_info *info, bfd_vma memaddr, - long long num, + uint64_t num, struct d30v_insn *insn, int is_long, int show_ext) { int val, opnum, need_comma = 0; - struct d30v_operand *oper; + const struct d30v_operand *oper; int i, match, need_paren = 0, found_control = 0; unsigned int opind = 0; @@ -136,7 +136,7 @@ print_insn (struct disassemble_info *info, opind++; val = extract_value (num, - (struct d30v_operand *) &d30v_operand_table[insn->form->operands[0]], + &d30v_operand_table[insn->form->operands[0]], is_long); (*info->fprintf_func) (info->stream, "%s", d30v_cc_names[val]); } @@ -160,7 +160,7 @@ print_insn (struct disassemble_info *info, { int bits; - oper = (struct d30v_operand *) &d30v_operand_table[opnum]; + oper = &d30v_operand_table[opnum]; bits = oper->bits; if (oper->flags & OPERAND_SHIFT) bits += 3; @@ -210,8 +210,8 @@ print_insn (struct disassemble_info *info, match = 0; if (oper->flags & OPERAND_CONTROL) { - struct d30v_operand *oper3 = - (struct d30v_operand *) &d30v_operand_table[insn->form->operands[2]]; + const struct d30v_operand *oper3 + = &d30v_operand_table[insn->form->operands[2]]; int id = extract_value (num, oper3, is_long); found_control = 1; @@ -330,9 +330,9 @@ print_insn_d30v (bfd_vma memaddr, struct disassemble_info *info) { int status, result; bfd_byte buffer[12]; - unsigned long in1, in2; + uint32_t in1, in2; struct d30v_insn insn; - long long num; + uint64_t num; insn.form = NULL; @@ -353,9 +353,9 @@ print_insn_d30v (bfd_vma memaddr, struct disassemble_info *info) { info->bytes_per_line = 8; if (!(result = lookup_opcode (&insn, in1, 0))) - (*info->fprintf_func) (info->stream, ".long\t0x%lx", in1); + (*info->fprintf_func) (info->stream, ".long\t0x%x", in1); else - print_insn (info, memaddr, (long long) in1, &insn, 0, result); + print_insn (info, memaddr, (uint64_t) in1, &insn, 0, result); return 4; } in2 = bfd_getb32 (buffer); @@ -365,17 +365,17 @@ print_insn_d30v (bfd_vma memaddr, struct disassemble_info *info) /* LONG instruction. */ if (!(result = lookup_opcode (&insn, in1, 1))) { - (*info->fprintf_func) (info->stream, ".long\t0x%lx,0x%lx", in1, in2); + (*info->fprintf_func) (info->stream, ".long\t0x%x,0x%x", in1, in2); return 8; } - num = (long long) in1 << 32 | in2; + num = (uint64_t) in1 << 32 | in2; print_insn (info, memaddr, num, &insn, 1, result); } else { num = in1; if (!(result = lookup_opcode (&insn, in1, 0))) - (*info->fprintf_func) (info->stream, ".long\t0x%lx", in1); + (*info->fprintf_func) (info->stream, ".long\t0x%x", in1); else print_insn (info, memaddr, num, &insn, 0, result); @@ -396,7 +396,7 @@ print_insn_d30v (bfd_vma memaddr, struct disassemble_info *info) insn.form = NULL; num = in2; if (!(result = lookup_opcode (&insn, in2, 0))) - (*info->fprintf_func) (info->stream, ".long\t0x%lx", in2); + (*info->fprintf_func) (info->stream, ".long\t0x%x", in2); else print_insn (info, memaddr, num, &insn, 0, result); } diff --git a/opcodes/iq2000-ibld.c b/opcodes/iq2000-ibld.c index 34482b366a..3059fe167a 100644 --- a/opcodes/iq2000-ibld.c +++ b/opcodes/iq2000-ibld.c @@ -838,7 +838,7 @@ iq2000_cgen_extract_operand (CGEN_CPU_DESC cd, { long value; length = extract_normal (cd, ex_info, insn_value, 0|(1<f_offset = value; } break; diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c index 9add60272a..7add08d156 100644 --- a/opcodes/ppc-dis.c +++ b/opcodes/ppc-dis.c @@ -824,16 +824,16 @@ print_insn_powerpc (bfd_vma memaddr, need_paren } op_separator; bfd_boolean skip_optional; - int spaces; + int blanks; (*info->fprintf_func) (info->stream, "%s", opcode->name); /* gdb fprintf_func doesn't return count printed. */ - spaces = 8 - strlen (opcode->name); - if (spaces <= 0) - spaces = 1; + blanks = 8 - strlen (opcode->name); + if (blanks <= 0) + blanks = 1; /* Now extract and print the operands. */ - op_separator = spaces; + op_separator = blanks; skip_optional = FALSE; for (opindex = opcode->operands; *opindex != 0; opindex++) { diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c index 403c9daff5..8dbe7b6abd 100644 --- a/opcodes/ppc-opc.c +++ b/opcodes/ppc-opc.c @@ -2147,17 +2147,17 @@ const struct powerpc_operand powerpc_operands[] = off a register, and implies that the next operand is a register in parentheses. */ #define D34 DS + 1 - { 0x3ffffffff, PPC_OPSHIFT_INV, insert_d34, extract_d34, + { UINT64_C(0x3ffffffff), PPC_OPSHIFT_INV, insert_d34, extract_d34, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, /* The SI field in an 8-byte D form prefix instruction. */ #define SI34 D34 + 1 - { 0x3ffffffff, PPC_OPSHIFT_INV, insert_d34, extract_d34, PPC_OPERAND_SIGNED }, + { UINT64_C(0x3ffffffff), PPC_OPSHIFT_INV, insert_d34, extract_d34, PPC_OPERAND_SIGNED }, /* The NSI field in an 8-byte D form prefix instruction. This is the same as the SI34 field, only negated. */ #define NSI34 SI34 + 1 - { 0x3ffffffff, PPC_OPSHIFT_INV, insert_nsi34, extract_nsi34, + { UINT64_C(0x3ffffffff), PPC_OPSHIFT_INV, insert_nsi34, extract_nsi34, PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, /* The DUIS or BHRBE fields in a XFX form instruction, 10 bits diff --git a/opcodes/score-dis.c b/opcodes/score-dis.c index 74a1f1d932..e760b92f1f 100644 --- a/opcodes/score-dis.c +++ b/opcodes/score-dis.c @@ -568,7 +568,7 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%s", score_regnames[reg]); } @@ -578,7 +578,7 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%ld", reg); } @@ -587,9 +587,9 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) { long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; - reg = ((reg ^ (1 << (bitend - bitstart))) - - (1 << (bitend - bitstart))); + reg &= (2u << (bitend - bitstart)) - 1; + reg = ((reg ^ (1u << (bitend - bitstart))) + - (1u << (bitend - bitstart))); /* Fix bug: s3_testsuite 64-bit. Remove high 32 bits. */ reg = (int) reg; @@ -610,10 +610,7 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; - /* Fix bug: s3_testsuite 64-bit. - Remove high 32 bits. */ - reg = (int) reg; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%lx", reg); } @@ -622,8 +619,8 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) { long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; - reg <<=2; + reg &= (2u << (bitend - bitstart)) - 1; + reg <<= 2; func (stream, "%lx", reg); } break; @@ -635,12 +632,12 @@ print_insn_score48 (struct disassemble_info *info, bfd_vma given) case '`': c++; - if ((given & (1 << bitstart)) == 0) + if ((given & (1u << bitstart)) == 0) func (stream, "%c", *c); break; case '\'': c++; - if ((given & (1 << bitstart)) != 0) + if ((given & (1u << bitstart)) != 0) func (stream, "%c", *c); break; default: @@ -738,7 +735,7 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) int bitstart = 10; int bitend = 14; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; /* Sign-extend a 20-bit number. */ int disp = (given&1)<<1 |((given>>7)&7)<<2 |((given>>20)&0x1f)<<5; int target = (pc + SEXT10 (disp)); @@ -790,7 +787,7 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%s", score_regnames[reg]); } @@ -800,7 +797,7 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%ld", reg); } @@ -810,9 +807,9 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; - reg = ((reg ^ (1 << (bitend - bitstart))) - - (1 << (bitend - bitstart))); + reg &= (2u << (bitend - bitstart)) - 1; + reg = ((reg ^ (1u << (bitend - bitstart))) + - (1u << (bitend - bitstart))); if (((given & insn->mask) == 0x0c00000a) /* ldc1 */ || ((given & insn->mask) == 0x0c000012) /* ldc2 */ @@ -830,7 +827,7 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) long reg; reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; func (stream, "%lx", reg); } @@ -842,12 +839,12 @@ print_insn_score32 (bfd_vma pc, struct disassemble_info *info, long given) case '`': c++; - if ((given & (1 << bitstart)) == 0) + if ((given & (1u << bitstart)) == 0) func (stream, "%c", *c); break; case '\'': c++; - if ((given & (1 << bitstart)) != 0) + if ((given & (1u << bitstart)) != 0) func (stream, "%c", *c); break; default: @@ -952,7 +949,7 @@ print_insn_score16 (bfd_vma pc, struct disassemble_info *info, long given) if (!bitend) abort (); reg = given >> bitstart; - reg &= (2 << (bitend - bitstart)) - 1; + reg &= (2u << (bitend - bitstart)) - 1; switch (*c) { @@ -995,7 +992,7 @@ print_insn_score16 (bfd_vma pc, struct disassemble_info *info, long given) } break; case 'i': - reg = ((reg ^ (1 << bitend)) - (1 << bitend)); + reg = (reg ^ (1u << bitend)) - (1u << bitend); func (stream, "%ld", reg); break; default: @@ -1006,7 +1003,7 @@ print_insn_score16 (bfd_vma pc, struct disassemble_info *info, long given) case '\'': c++; - if ((given & (1 << bitstart)) != 0) + if ((given & (1u << bitstart)) != 0) func (stream, "%c", *c); break; default: diff --git a/opcodes/wasm32-dis.c b/opcodes/wasm32-dis.c index b1042793a5..a885148c8b 100644 --- a/opcodes/wasm32-dis.c +++ b/opcodes/wasm32-dis.c @@ -192,29 +192,36 @@ wasm_read_leb128 (bfd_vma pc, unsigned int num_read = 0; unsigned int shift = 0; unsigned char byte = 0; - bfd_boolean success = FALSE; + int status = 1; while (info->read_memory_func (pc + num_read, &byte, 1, info) == 0) { num_read++; - result |= ((bfd_vma) (byte & 0x7f)) << shift; + if (shift < sizeof (result) * 8) + { + result |= ((uint64_t) (byte & 0x7f)) << shift; + if ((result >> shift) != (byte & 0x7f)) + /* Overflow. */ + status |= 2; + shift += 7; + } + else if ((byte & 0x7f) != 0) + status |= 2; - shift += 7; if ((byte & 0x80) == 0) - { - success = TRUE; - break; - } + { + status &= ~1; + if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -((uint64_t) 1 << shift); + break; + } } if (length_return != NULL) *length_return = num_read; if (error_return != NULL) - *error_return = ! success; - - if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40)) - result |= -((uint64_t) 1 << shift); + *error_return = status != 0; return result; } diff --git a/readline/readline/CHANGELOG b/readline/readline/CHANGELOG index 18265ab105..6fa1ebb9e6 100644 --- a/readline/readline/CHANGELOG +++ b/readline/readline/CHANGELOG @@ -1,3 +1,10 @@ +2019-12-23 Eli Zaretskii + + * posixstat.h (S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH) + (S_IXOTH, S_IRWXG, S_IRWXO): Define if undefined, even if S_IRWXU + is defined, because non-Posix systems may defined only the user + bits. + [Readline-specific changelog. Descriptions of changes to the source are found in the bash changelog.] diff --git a/readline/readline/posixstat.h b/readline/readline/posixstat.h index 3eb7f2906f..b9d8eb3761 100644 --- a/readline/readline/posixstat.h +++ b/readline/readline/posixstat.h @@ -132,6 +132,26 @@ # define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) # define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) # define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#else /* !S_IRWXU */ + /* S_IRWXU is defined, but "group" and "other" bits might not be + (happens in certain versions of MinGW). */ +# if !defined (S_IRGRP) +# define S_IRGRP (S_IREAD >> 3) /* read, group */ +# define S_IWGRP (S_IWRITE >> 3) /* write, group */ +# define S_IXGRP (S_IEXEC >> 3) /* execute, group */ +# endif /* !S_IRGRP */ + +# if !defined (S_IROTH) +# define S_IROTH (S_IREAD >> 6) /* read, other */ +# define S_IWOTH (S_IWRITE >> 6) /* write, other */ +# define S_IXOTH (S_IEXEC >> 6) /* execute, other */ +# endif /* !S_IROTH */ +# if !defined (S_IRWXG) +# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +# endif +# if !defined (S_IRWXO) +# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +# endif #endif /* !S_IRWXU */ /* These are non-standard, but are used in builtins.c$symbolic_umask() */