aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-01-10 08:27:33 +1030
committerAlan Modra <amodra@gmail.com>2020-01-10 17:32:33 +1030
commit7f578b959c3d4b4a1756c66aec4426743b82c6b8 (patch)
tree96b17e2e3cc3d4f33f80bd6b42c4d6da50b94986
parent441af85bd9c68dbc0c2a1dbe23bf07c6cb3c3f5d (diff)
downloadgdb-7f578b959c3d4b4a1756c66aec4426743b82c6b8.zip
gdb-7f578b959c3d4b4a1756c66aec4426743b82c6b8.tar.gz
gdb-7f578b959c3d4b4a1756c66aec4426743b82c6b8.tar.bz2
ubsan: tilepro: signed integer overflow
* tilepro-opc.c (parse_insn_tilepro): Make opval unsigned. * tilegx-opc.c (parse_insn_tilegx): Likewise. Delete raw_opval.
-rw-r--r--opcodes/ChangeLog5
-rw-r--r--opcodes/tilegx-opc.c9
-rw-r--r--opcodes/tilepro-opc.c7
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;