ubsan: d30v: left shift cannot be represented in type 'int'

Alan Modra amodra@gmail.com
Sat Jan 4 08:51:00 GMT 2020


	* d30v-dis.c (print_insn): Avoid signed overflow in left shift.

diff --git a/opcodes/d30v-dis.c b/opcodes/d30v-dis.c
index 61bb16d6d2..212d24a708 100644
--- a/opcodes/d30v-dis.c
+++ b/opcodes/d30v-dis.c
@@ -271,14 +271,10 @@ print_insn (struct disassemble_info *info,
 	  /* IMM6S3 is unsigned.  */
 	  if (oper->flags & OPERAND_SIGNED || bits == 32)
 	    {
-	      long max;
-	      max = (1 << (bits - 1));
-	      if (val & max)
+	      unsigned int sign = 1u << (bits - 1);
+	      if (val & sign)
 		{
-		  if (bits == 32)
-		    val = -val;
-		  else
-		    val = -val & ((1 << bits) - 1);
+		  val = -val & (sign + sign - 1);
 		  neg = 1;
 		}
 	    }
@@ -303,13 +299,11 @@ print_insn (struct disassemble_info *info,
 	{
 	  if (oper->flags & OPERAND_SIGNED)
 	    {
-	      int max = (1 << (bits - 1));
+	      unsigned int sign = 1u << (bits - 1);
 
-	      if (val & max)
+	      if (val & sign)
 		{
-		  val = -val;
-		  if (bits < 32)
-		    val &= ((1 << bits) - 1);
+		  val = -val & (sign + sign - 1);
 		  (*info->fprintf_func) (info->stream, "-");
 		}
 	    }

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list