More 1 << 31 signed overflows
[deliverable/binutils-gdb.git] / gas / config / tc-csky.c
index 3ef9860ed6c18a73bdabf60ac53fac8f4fd3ed8a..83fca2af73db63f4b81b82590f34164dda2f9465 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-csky.c -- Assembler for C-SKY
-   Copyright (C) 1989-2018 Free Software Foundation, Inc.
+   Copyright (C) 1989-2020 Free Software Foundation, Inc.
    Created by Lifang Xia (lifang_xia@c-sky.com)
    Contributed by C-SKY Microsystems and Mentor Graphics.
 
@@ -1777,8 +1777,8 @@ static char *
 parse_fexp (char *s, expressionS *e, unsigned char isdouble, uint64_t *dbnum)
 {
   int length;                       /* Number of chars in an object.  */
-  register char const *err = NULL;  /* Error from scanning float literal.  */
-  char temp[8];
+  const char *err = NULL;           /* Error from scanning float literal.  */
+  unsigned char temp[8];
 
   /* input_line_pointer->1st char of a flonum (we hope!).  */
   input_line_pointer = s;
@@ -1788,9 +1788,9 @@ parse_fexp (char *s, expressionS *e, unsigned char isdouble, uint64_t *dbnum)
     input_line_pointer += 2;
 
   if (isdouble)
-    err = md_atof ('d', temp, &length);
+    err = md_atof ('d', (char *) temp, &length);
   else
-    err = md_atof ('f', temp, &length);
+    err = md_atof ('f', (char *) temp, &length);
   know (length <= 8);
   know (err != NULL || length > 0);
 
@@ -1818,41 +1818,42 @@ parse_fexp (char *s, expressionS *e, unsigned char isdouble, uint64_t *dbnum)
     {
       uint32_t fnum;
       if (target_big_endian)
-       fnum = (((temp[0] << 24) & 0xffffffff)
-               | ((temp[1] << 16) & 0xffffff)
-               | ((temp[2] << 8) & 0xffff)
-               | (temp[3] & 0xff));
+       fnum = (((uint32_t) temp[0] << 24)
+               | (temp[1] << 16)
+               | (temp[2] << 8)
+               | temp[3]);
       else
-       fnum = (((temp[3] << 24) & 0xffffffff)
-                          | ((temp[2] << 16) & 0xffffff)
-                          | ((temp[1] << 8) & 0xffff)
-                          | (temp[0] & 0xff));
-      e->X_add_number = fnum;    }
+       fnum = (((uint32_t) temp[3] << 24)
+               | (temp[2] << 16)
+               | (temp[1] << 8)
+               | temp[0]);
+      e->X_add_number = fnum;
+    }
   else
     {
       if (target_big_endian)
        {
-         *dbnum = (((temp[0] << 24) & 0xffffffff)
-                   | ((temp[1] << 16) & 0xffffff)
-                   | ((temp[2] << 8) & 0xffff)
-                   | (temp[3] & 0xff));
+         *dbnum = (((uint32_t) temp[0] << 24)
+                   | (temp[1] << 16)
+                   | (temp[2] << 8)
+                   | temp[3]);
          *dbnum <<= 32;
-         *dbnum |= (((temp[4] << 24) & 0xffffffff)
-                    | ((temp[5] << 16) & 0xffffff)
-                    | ((temp[6] << 8) & 0xffff)
-                    | (temp[7] & 0xff));
+         *dbnum |= (((uint32_t) temp[4] << 24)
+                    | (temp[5] << 16)
+                    | (temp[6] << 8)
+                    | temp[7]);
        }
       else
        {
-         *dbnum = (((temp[7] << 24) & 0xffffffff)
-                   | ((temp[6] << 16) & 0xffffff)
-                   | ((temp[5] << 8) & 0xffff)
-                   | (temp[4] & 0xff));
+         *dbnum = (((uint32_t) temp[7] << 24)
+                   | (temp[6] << 16)
+                   | (temp[5] << 8)
+                   | temp[4]);
          *dbnum <<= 32;
-         *dbnum |= (((temp[3] << 24) & 0xffffffff)
-                    | ((temp[2] << 16) & 0xffffff)
-                    | ((temp[1] << 8) & 0xffff)
-                    | (temp[0] & 0xff));
+         *dbnum |= (((uint32_t) temp[3] << 24)
+                    | (temp[2] << 16)
+                    | (temp[1] << 8)
+                    | temp[0]);
       }
     }
   return input_line_pointer;
@@ -3165,7 +3166,7 @@ get_operand_value (struct csky_opcode_info *op,
     case OPRND_TYPE_IMM5b_1_31:
       return is_imm_over_range (oper, 1, 31, -1);
     case OPRND_TYPE_IMM5b_POWER:
-      if (is_imm_over_range (oper, 1, ~(1 << 31), 1 << 31))
+      if (is_imm_over_range (oper, 1, (1u << 31) - 1, 1u << 31))
        {
          int log;
          int val = csky_insn.val[csky_insn.idx - 1];
@@ -3178,7 +3179,7 @@ get_operand_value (struct csky_opcode_info *op,
 
       /* This type for "mgeni" in csky v1 ISA.  */
       case OPRND_TYPE_IMM5b_7_31_POWER:
-       if (is_imm_over_range (oper, 1, ~(1 << 31), 1 << 31))
+       if (is_imm_over_range (oper, 1, (1u << 31) - 1, 1u << 31))
          {
            int log;
            int val = csky_insn.val[csky_insn.idx - 1];
@@ -4426,6 +4427,8 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec,  fragS *fragp)
                buf[20] = (disp >> 8) & 0xff;
                buf[21] = disp & 0xff;
              }
+           buf[22] = 0;  /* initialise.  */
+           buf[23] = 0;
            fragp->fr_fix += C32_LEN_PIC;
 
          } /* end if is_unaligned.  */
@@ -5494,7 +5497,7 @@ get_macro_reg_vals (int *reg1, int *reg2, int *reg3)
   s += nlen;
   if (*s != '\0')
     {
-      csky_show_error (ERROR_BAD_END, 0, NULL, NULL);
+      csky_show_error (ERROR_BAD_END, 0, s, NULL);
       return FALSE;
     }
   if (*reg1 == -1 || *reg2 == -1 || *reg3 == -1)
This page took 0.027454 seconds and 4 git commands to generate.