[binutils-gdb] ubsan: tilepro: signed integer overflow
Alan Modra
amodra@sourceware.org
Fri Jan 10 11:11:00 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7f578b959c3d4b4a1756c66aec4426743b82c6b8
commit 7f578b959c3d4b4a1756c66aec4426743b82c6b8
Author: Alan Modra <amodra@gmail.com>
Date: Fri Jan 10 08:27:33 2020 +1030
ubsan: tilepro: signed integer overflow
* tilepro-opc.c (parse_insn_tilepro): Make opval unsigned.
* tilegx-opc.c (parse_insn_tilegx): Likewise. Delete raw_opval.
Diff:
---
opcodes/ChangeLog | 5 +++++
opcodes/tilegx-opc.c | 9 +++------
opcodes/tilepro-opc.c | 7 ++-----
3 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 7c5f16b..68538bd 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,10 @@
2020-01-10 Alan Modra <amodra@gmail.com>
+ * tilepro-opc.c (parse_insn_tilepro): Make opval unsigned.
+ * tilegx-opc.c (parse_insn_tilegx): Likewise. Delete raw_opval.
+
+2020-01-10 Alan Modra <amodra@gmail.com>
+
* m10300-dis.c (disassemble): Move extraction of DREG, AREG, RREG,
and XRREG value earlier to avoid a shift with negative exponent.
* m10200-dis.c (disassemble): Similarly.
diff --git a/opcodes/tilegx-opc.c b/opcodes/tilegx-opc.c
index f49dae5..a122f49 100644
--- a/opcodes/tilegx-opc.c
+++ b/opcodes/tilegx-opc.c
@@ -8096,21 +8096,18 @@ parse_insn_tilegx (tilegx_bundle_bits bits,
{
const struct tilegx_operand *op =
&tilegx_operands[opc->operands[pipe][i]];
- int raw_opval = op->extract (bits);
- long long opval;
+ unsigned int opval = op->extract (bits);
if (op->is_signed)
{
/* Sign-extend the operand. */
unsigned int sign = 1u << (op->num_bits - 1);
- raw_opval = ((raw_opval & (sign + sign - 1)) ^ sign) - sign;
+ opval = ((opval & (sign + sign - 1)) ^ sign) - sign;
}
/* Adjust PC-relative scaled branch offsets. */
if (op->type == TILEGX_OP_TYPE_ADDRESS)
- opval = (raw_opval * TILEGX_BUNDLE_SIZE_IN_BYTES) + pc;
- else
- opval = raw_opval;
+ opval = opval * TILEGX_BUNDLE_SIZE_IN_BYTES + pc;
/* Record the final value. */
d->operands[i] = op;
diff --git a/opcodes/tilepro-opc.c b/opcodes/tilepro-opc.c
index 6449945..dbe0605 100644
--- a/opcodes/tilepro-opc.c
+++ b/opcodes/tilepro-opc.c
@@ -10215,7 +10215,7 @@ parse_insn_tilepro (tilepro_bundle_bits bits,
{
const struct tilepro_operand *op =
&tilepro_operands[opc->operands[pipe][i]];
- int opval = op->extract (bits);
+ unsigned int opval = op->extract (bits);
if (op->is_signed)
{
@@ -10226,10 +10226,7 @@ parse_insn_tilepro (tilepro_bundle_bits bits,
/* Adjust PC-relative scaled branch offsets. */
if (op->type == TILEPRO_OP_TYPE_ADDRESS)
- {
- opval *= TILEPRO_BUNDLE_SIZE_IN_BYTES;
- opval += (int)pc;
- }
+ opval = opval * TILEPRO_BUNDLE_SIZE_IN_BYTES + pc;
/* Record the final value. */
d->operands[i] = op;
More information about the Binutils-cvs
mailing list