summaryrefslogtreecommitdiff
path: root/opcodes/tic30-dis.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-12-18 15:37:44 +1030
committerAlan Modra <amodra@gmail.com>2019-12-18 18:38:13 +1030
commit2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8 (patch)
treece542aad0a4875a62960e77e23c4729b92d87da4 /opcodes/tic30-dis.c
parent4a422785822ec9302f681c8fbc6ba2cc35231b09 (diff)
downloadbinutils-gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.tar.gz
More signed overflow fixes
The arc fix in create_map avoiding signed overflow by casting an unsigned char to unsigned int before shifting, shows one of the dangers of blinding doing that. The problem in this case was that the variable storing the value, newAuxRegister->address, was a long. Using the unsigned cast meant that the 32-bit value was zero extended when long is 64 bits. Previously we had a sign extension. Net result was that comparisons in arcExtMap_auxRegName didn't match. Of course, I could have cast the 32-bit unsigned value back to signed before storing in a long, but it's neater to just use an unsigned int for the address. opcodes/ * alpha-opc.c (OP): Avoid signed overflow. * arm-dis.c (print_insn): Likewise. * mcore-dis.c (print_insn_mcore): Likewise. * pj-dis.c (get_int): Likewise. * ppc-opc.c (EBD15, EBD15BI): Likewise. * score7-dis.c (s7_print_insn): Likewise. * tic30-dis.c (print_insn_tic30): Likewise. * v850-opc.c (insert_SELID): Likewise. * vax-dis.c (print_insn_vax): Likewise. * arc-ext.c (create_map): Likewise. (struct ExtAuxRegister): Make "address" field unsigned int. (arcExtMap_auxRegName): Pass unsigned address. (dump_ARC_extmap): Adjust. * arc-ext.h (arcExtMap_auxRegName): Update prototype.
Diffstat (limited to 'opcodes/tic30-dis.c')
-rw-r--r--opcodes/tic30-dis.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/opcodes/tic30-dis.c b/opcodes/tic30-dis.c
index 29948f40196..a695159d77c 100644
--- a/opcodes/tic30-dis.c
+++ b/opcodes/tic30-dis.c
@@ -696,8 +696,10 @@ print_insn_tic30 (bfd_vma pc, disassemble_info *info)
bfd_vma bufaddr = pc - info->buffer_vma;
/* Obtain the current instruction word from the buffer. */
- insn_word = (*(info->buffer + bufaddr) << 24) | (*(info->buffer + bufaddr + 1) << 16) |
- (*(info->buffer + bufaddr + 2) << 8) | *(info->buffer + bufaddr + 3);
+ insn_word = (((unsigned) *(info->buffer + bufaddr) << 24)
+ | (*(info->buffer + bufaddr + 1) << 16)
+ | (*(info->buffer + bufaddr + 2) << 8)
+ | *(info->buffer + bufaddr + 3));
_pc = pc / 4;
/* Get the instruction refered to by the current instruction word
and print it out based on its type. */