More 1 << 31 signed overflows
[deliverable/binutils-gdb.git] / gas / config / tc-csky.c
index 1c4b44b209b4e6f5dfcaf917d8f61afd5f60d6f8..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.
 
@@ -29,7 +29,6 @@
 #include "subsegs.h"
 #include "obstack.h"
 #include "libiberty.h"
-#include "struc-symbol.h"
 
 #ifdef OBJ_ELF
 #include "elf/csky.h"
@@ -1778,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;
@@ -1789,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);
 
@@ -1819,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;
@@ -3166,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];
@@ -3179,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];
@@ -4427,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.  */
@@ -5495,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)
@@ -6783,8 +6785,9 @@ v2_work_movih (void)
           || (csky_insn.e1.X_op == O_symbol && insn_reloc != BFD_RELOC_NONE))
     {
       if (csky_insn.e1.X_op_symbol != 0
-         && csky_insn.e1.X_op_symbol->sy_value.X_op == O_constant
-         && 16 == csky_insn.e1.X_op_symbol->sy_value.X_add_number)
+         && symbol_constant_p (csky_insn.e1.X_op_symbol)
+         && S_GET_SEGMENT (csky_insn.e1.X_op_symbol) == absolute_section
+         && 16 == S_GET_VALUE (csky_insn.e1.X_op_symbol))
        {
          csky_insn.e1.X_op = O_symbol;
          if (insn_reloc == BFD_RELOC_CKCORE_GOT32)
@@ -6833,8 +6836,9 @@ v2_work_ori (void)
     }
   else if (csky_insn.e1.X_op == O_bit_and)
     {
-      if (csky_insn.e1.X_op_symbol->sy_value.X_op == O_constant
-         && 0xffff == csky_insn.e1.X_op_symbol->sy_value.X_add_number)
+      if (symbol_constant_p (csky_insn.e1.X_op_symbol)
+         && S_GET_SEGMENT (csky_insn.e1.X_op_symbol) == absolute_section
+         && 0xffff == S_GET_VALUE (csky_insn.e1.X_op_symbol))
        {
          csky_insn.e1.X_op = O_symbol;
          if (insn_reloc == BFD_RELOC_CKCORE_GOT32)
This page took 0.027451 seconds and 4 git commands to generate.