mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 03:29:47 +08:00
ubsan: spu: left shift of negative value
Also fixes a real bug. The DECODE_INSN_I9a and DECODE_INSN_I9b both use UNSIGNED_EXTRACT for 7 low bits of the result, but this was an unsigned value due to "insn" being unsigned. DECODE_INSN_I9* is therefore unsigned too, leading to a zero extension in an expression using a bfd_vma if bfd_vma is 64 bits. * opcode/spu.h: Formatting. (UNSIGNED_EXTRACT): Use 1u. (SIGNED_EXTRACT): Don't sign extend with shifts. (DECODE_INSN_I9a, DECODE_INSN_I9b): Avoid left shift of signed value. Keep result signed. (DECODE_INSN_U9a, DECODE_INSN_U9b): Delete.
This commit is contained in:
@ -1,3 +1,12 @@
|
||||
2020-01-10 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* opcode/spu.h: Formatting.
|
||||
(UNSIGNED_EXTRACT): Use 1u.
|
||||
(SIGNED_EXTRACT): Don't sign extend with shifts.
|
||||
(DECODE_INSN_I9a, DECODE_INSN_I9b): Avoid left shift of signed value.
|
||||
Keep result signed.
|
||||
(DECODE_INSN_U9a, DECODE_INSN_U9b): Delete.
|
||||
|
||||
2020-01-07 Shahab Vahedi <shahab@synopsys.com>
|
||||
|
||||
* opcode/arc.h (insn_class_t): Add 'LLOCK' and 'SCOND'.
|
||||
|
@ -87,8 +87,11 @@ struct spu_opcode
|
||||
int arg[5];
|
||||
};
|
||||
|
||||
#define SIGNED_EXTRACT(insn,size,pos) (((int)((insn) << (32-size-pos))) >> (32-size))
|
||||
#define UNSIGNED_EXTRACT(insn,size,pos) (((insn) >> pos) & ((1 << size)-1))
|
||||
#define UNSIGNED_EXTRACT(insn, size, pos) \
|
||||
(((insn) >> (pos)) & ((1u << (size)) - 1))
|
||||
#define SIGNED_EXTRACT(insn, size, pos) \
|
||||
(((int) UNSIGNED_EXTRACT(insn, size, pos) \
|
||||
^ (1 << ((size) - 1))) - (1 << ((size) - 1)))
|
||||
|
||||
#define DECODE_INSN_RT(insn) (insn & 0x7f)
|
||||
#define DECODE_INSN_RA(insn) ((insn >> 7) & 0x7f)
|
||||
@ -118,8 +121,8 @@ struct spu_opcode
|
||||
#define DECODE_INSN_U8(insn) UNSIGNED_EXTRACT (insn, 8, 14)
|
||||
|
||||
/* For hbr */
|
||||
#define DECODE_INSN_I9a(insn) ((SIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0))
|
||||
#define DECODE_INSN_I9b(insn) ((SIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0))
|
||||
#define DECODE_INSN_U9a(insn) ((UNSIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0))
|
||||
#define DECODE_INSN_U9b(insn) ((UNSIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0))
|
||||
#define DECODE_INSN_I9a(insn) \
|
||||
((SIGNED_EXTRACT (insn, 2, 23) * 128) | (int) UNSIGNED_EXTRACT (insn, 7, 0))
|
||||
#define DECODE_INSN_I9b(insn) \
|
||||
((SIGNED_EXTRACT (insn, 2, 14) * 128) | (int) UNSIGNED_EXTRACT (insn, 7, 0))
|
||||
|
||||
|
Reference in New Issue
Block a user