[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