Hi!

This patch is an attempt to fix various signed integer overflows,
invalid shifts and loads of uninialized bool value.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

This is solely from gcc build, make check has other issues too, but I'd
prefer to do it incrementally, because otherwise there are way too many
errors everywhere.

There are also two issues I've left unfixed, Andrew/Tom and Vlad, can you
please have a look?

The first one is in java/boehm.c:

java/boehm.c:
          /* First word in object corresponds to most significant byte of 
             bitmap. 
             
             In the case of a multiple-word record, we set pointer 
             bits for all words in the record. This is conservative, but the 
             size_words != 1 case is impossible in regular java code. */
          for (i = 0; i < size_words; ++i)
            *mask = (*mask).set_bit (ubit - count - i - 1);

(gdb) p ubit
$1 = 64
(gdb) p count
$2 = 67
(gdb) p i
$3 = 0

*mask is double_int, so set_bit has only 0 to HOST_BITS_PER_DOUBLE_INT - 1
valid arguments, but in this case ubit - count - i - 1 is e.g. -4
(but as the value is unsigned, it is just very large number).  I have no
idea what this code is meant to do, Andrew/Tom, could you please fix this
up?

ira-color.c:
                if (index < 0)
                  continue;
                cost = conflict_costs [i] * mult / div;
                if (cost == 0)
                  continue;

../../gcc/ira-color.c:1508:29: runtime error: signed integer overflow: 
-65535000 * 1000 cannot be represented in type 'int'
../../gcc/ira-color.c:1508:29: runtime error: signed integer overflow: 
-65535000 * 61 cannot be represented in type 'int'
../../gcc/ira-color.c:1508:29: runtime error: signed integer overflow: 
-71760825 * 976 cannot be represented in type 'int'
../../gcc/ira-color.c:1508:29: runtime error: signed integer overflow: -7659400 
* 394 cannot be represented in type 'int'

(hundreds of similar messages).  I have no idea if negative and so large
conflict_costs are valid, whether overflow is ok (then perhaps it should be
unsigned rather than int multiplication) etc.  Vlad, can you please check it
out?

2013-12-19  Jakub Jelinek  <ja...@redhat.com>

        PR other/59545
        * genattrtab.c (struct attr_hash): Change hashcode type to unsigned.
        (attr_hash_add_rtx, attr_hash_add_string): Change hashcode parameter
        to unsigned.
        (attr_rtx_1): Change hashcode variable to unsigned.
        (attr_string): Likewise.  Perform first multiplication in unsigned
        type.
        * ifcvt.c (noce_try_store_flag_constants): Avoid signed integer
        overflows.
        * double-int.c (neg_double): Likewise.
        * stor-layout.c (set_min_and_max_values_for_integral_type): Likewise.
        * combine.c (force_to_mode): Likewise.
        * postreload.c (move2add_use_add2_insn, move2add_use_add3_insn,
        reload_cse_move2add, move2add_note_store): Likewise.
        * simplify-rtx.c (simplify_const_unary_operation,
        simplify_const_binary_operation): Likewise.
        * ipa-split.c (find_split_points): Initialize first.can_split
        and first.non_ssa_vars.
        * gengtype-state.c (read_state_files_list): Fix up check.
        * genautomata.c (reserv_sets_hash_value): Use portable rotation
        idiom.
java/
        * class.c (hashUtf8String): Compute hash in unsigned type.
        * javaop.h (WORD_TO_INT): Avoid signed integer overflow.

--- gcc/genattrtab.c.jj 2013-11-19 21:56:29.000000000 +0100
+++ gcc/genattrtab.c    2013-12-19 16:32:23.758030495 +0100
@@ -320,7 +320,7 @@ static FILE *attr_file, *dfa_file, *late
 struct attr_hash
 {
   struct attr_hash *next;      /* Next structure in the bucket.  */
-  int hashcode;                        /* Hash code of this rtx or string.  */
+  unsigned int hashcode;       /* Hash code of this rtx or string.  */
   union
     {
       char *str;               /* The string (negative hash codes) */
@@ -345,7 +345,7 @@ static struct attr_hash *attr_hash_table
 /* Add an entry to the hash table for RTL with hash code HASHCODE.  */
 
 static void
-attr_hash_add_rtx (int hashcode, rtx rtl)
+attr_hash_add_rtx (unsigned int hashcode, rtx rtl)
 {
   struct attr_hash *h;
 
@@ -359,7 +359,7 @@ attr_hash_add_rtx (int hashcode, rtx rtl
 /* Add an entry to the hash table for STRING with hash code HASHCODE.  */
 
 static void
-attr_hash_add_string (int hashcode, char *str)
+attr_hash_add_string (unsigned int hashcode, char *str)
 {
   struct attr_hash *h;
 
@@ -384,7 +384,7 @@ static rtx
 attr_rtx_1 (enum rtx_code code, va_list p)
 {
   rtx rt_val = NULL_RTX;/* RTX to return to caller...          */
-  int hashcode;
+  unsigned int hashcode;
   struct attr_hash *h;
   struct obstack *old_obstack = rtl_obstack;
 
@@ -612,15 +612,15 @@ static char *
 attr_string (const char *str, int len)
 {
   struct attr_hash *h;
-  int hashcode;
+  unsigned int hashcode;
   int i;
   char *new_str;
 
   /* Compute the hash code.  */
-  hashcode = (len + 1) * 613 + (unsigned) str[0];
+  hashcode = (len + 1) * 613U + (unsigned) str[0];
   for (i = 1; i < len; i += 2)
     hashcode = ((hashcode * 613) + (unsigned) str[i]);
-  if (hashcode < 0)
+  if ((int) hashcode < 0)
     hashcode = -hashcode;
 
   /* Search the table for the string.  */
--- gcc/ifcvt.c.jj      2013-12-19 09:03:11.000000000 +0100
+++ gcc/ifcvt.c 2013-12-19 16:20:32.849650410 +0100
@@ -1112,12 +1112,13 @@ noce_try_store_flag_constants (struct no
       ifalse = INTVAL (if_info->a);
       itrue = INTVAL (if_info->b);
 
+      diff = (unsigned HOST_WIDE_INT) itrue - ifalse;
       /* Make sure we can represent the difference between the two values.  */
-      if ((itrue - ifalse > 0)
+      if ((diff > 0)
          != ((ifalse < 0) != (itrue < 0) ? ifalse < 0 : ifalse < itrue))
        return FALSE;
 
-      diff = trunc_int_for_mode (itrue - ifalse, mode);
+      diff = trunc_int_for_mode (diff, mode);
 
       can_reverse = (reversed_comparison_code (if_info->cond, if_info->jump)
                     != UNKNOWN);
@@ -1148,7 +1149,7 @@ noce_try_store_flag_constants (struct no
       if (reversep)
        {
          tmp = itrue; itrue = ifalse; ifalse = tmp;
-         diff = trunc_int_for_mode (-diff, mode);
+         diff = trunc_int_for_mode (-(unsigned HOST_WIDE_INT) diff, mode);
        }
 
       start_sequence ();
--- gcc/double-int.c.jj 2013-11-12 11:31:22.000000000 +0100
+++ gcc/double-int.c    2013-12-19 16:36:43.023408200 +0100
@@ -138,7 +138,7 @@ neg_double (unsigned HOST_WIDE_INT l1, H
   if (l1 == 0)
     {
       *lv = 0;
-      *hv = - h1;
+      *hv = - (unsigned HOST_WIDE_INT) h1;
       return (*hv & h1) < 0;
     }
   else
--- gcc/stor-layout.c.jj        2013-12-02 14:33:34.000000000 +0100
+++ gcc/stor-layout.c   2013-12-19 17:07:32.379722616 +0100
@@ -2521,7 +2521,7 @@ set_min_and_max_values_for_integral_type
       max_value
        = build_int_cst_wide (type, precision - HOST_BITS_PER_WIDE_INT >= 0
                              ? -1
-                             : ((HOST_WIDE_INT) 1 << precision) - 1,
+                             : (HOST_WIDE_INT_1U << precision) - 1,
                              precision - HOST_BITS_PER_WIDE_INT > 0
                              ? ((unsigned HOST_WIDE_INT) ~0
                                 >> (HOST_BITS_PER_WIDE_INT
@@ -2534,7 +2534,7 @@ set_min_and_max_values_for_integral_type
        = build_int_cst_wide (type,
                              (precision - HOST_BITS_PER_WIDE_INT > 0
                               ? 0
-                              : (HOST_WIDE_INT) (-1) << (precision - 1)),
+                              : HOST_WIDE_INT_M1U << (precision - 1)),
                              (((HOST_WIDE_INT) (-1)
                                << (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
                                    ? precision - HOST_BITS_PER_WIDE_INT - 1
--- gcc/gengtype-state.c.jj     2013-11-12 11:31:10.000000000 +0100
+++ gcc/gengtype-state.c        2013-12-19 15:04:53.000000000 +0100
@@ -2651,7 +2651,7 @@ read_state_files_list (void)
                                 "expecting file in !fileslist of state file");
        };
       t0 = peek_state_token (0);
-      if (!state_token_kind (t0) == STOK_RIGHTPAR)
+      if (state_token_kind (t0) != STOK_RIGHTPAR)
        fatal_reading_state (t0, "missing ) for !fileslist in state file");
       next_state_tokens (1);
     }
--- gcc/ipa-split.c.jj  2013-12-18 17:32:59.000000000 +0100
+++ gcc/ipa-split.c     2013-12-19 15:30:14.000000000 +0100
@@ -950,7 +950,9 @@ find_split_points (int overall_time, int
   first.earliest = INT_MAX;
   first.set_ssa_names = 0;
   first.used_ssa_names = 0;
+  first.non_ssa_vars = 0;
   first.bbs_visited = 0;
+  first.can_split = false;
   stack.safe_push (first);
   ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux = (void *)(intptr_t)-1;
 
--- gcc/java/class.c.jj 2013-11-22 21:03:05.000000000 +0100
+++ gcc/java/class.c    2013-12-19 15:40:12.699793621 +0100
@@ -920,7 +920,7 @@ hashUtf8String (const char *str, int len
 {
   const unsigned char* ptr = (const unsigned char*) str;
   const unsigned char *limit = ptr + len;
-  int32 hash = 0;
+  uint32 hash = 0;
   for (; ptr < limit;)
     {
       int ch = UTF8_GET (ptr, limit);
--- gcc/java/javaop.h.jj        2013-01-11 09:02:30.000000000 +0100
+++ gcc/java/javaop.h   2013-12-19 15:54:46.963380710 +0100
@@ -154,7 +154,7 @@ WORD_TO_INT(jword w)
 {
   jint n = w & 0xffffffff; /* Mask lower 32 bits.  */
   n ^= (jint)1 << 31;
-  n -= (jint)1 << 31; /* Sign extend lower 32 bits to upper.  */
+  n -= (uint32)1 << 31; /* Sign extend lower 32 bits to upper.  */
   return n;
 } 
 
--- gcc/combine.c.jj    2013-12-10 08:52:13.000000000 +0100
+++ gcc/combine.c       2013-12-19 17:14:05.121706321 +0100
@@ -8200,9 +8200,7 @@ force_to_mode (rtx x, enum machine_mode
       /* If X is (minus C Y) where C's least set bit is larger than any bit
         in the mask, then we may replace with (neg Y).  */
       if (CONST_INT_P (XEXP (x, 0))
-         && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
-                                       & -INTVAL (XEXP (x, 0))))
-             > mask))
+         && ((UINTVAL (XEXP (x, 0)) & -UINTVAL (XEXP (x, 0))) > mask))
        {
          x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
                                  GET_MODE (x));
--- gcc/genautomata.c.jj        2013-11-22 13:15:54.000000000 +0100
+++ gcc/genautomata.c   2013-12-19 16:33:17.882757724 +0100
@@ -3494,7 +3494,7 @@ reserv_sets_hash_value (reserv_sets_t re
     {
       reservs_num--;
       hash_value += ((*reserv_ptr >> i)
-                    | (*reserv_ptr << (sizeof (set_el_t) * CHAR_BIT - i)));
+                    | (*reserv_ptr << ((sizeof (set_el_t) * CHAR_BIT) & -i)));
       i++;
       if (i == sizeof (set_el_t) * CHAR_BIT)
        i = 0;
--- gcc/postreload.c.jj 2013-12-10 08:52:06.000000000 +0100
+++ gcc/postreload.c    2013-12-19 16:59:18.592251929 +0100
@@ -1766,7 +1766,7 @@ move2add_use_add2_insn (rtx reg, rtx sym
   rtx pat = PATTERN (insn);
   rtx src = SET_SRC (pat);
   int regno = REGNO (reg);
-  rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[regno],
+  rtx new_src = gen_int_mode (UINTVAL (off) - reg_offset[regno],
                              GET_MODE (reg));
   bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
   bool changed = false;
@@ -1866,7 +1866,7 @@ move2add_use_add3_insn (rtx reg, rtx sym
        && reg_symbol_ref[i] != NULL_RTX
        && rtx_equal_p (sym, reg_symbol_ref[i]))
       {
-       rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[i],
+       rtx new_src = gen_int_mode (UINTVAL (off) - reg_offset[i],
                                    GET_MODE (reg));
        /* (set (reg) (plus (reg) (const_int 0))) is not canonical;
           use (set (reg) (reg)) instead.
@@ -1901,7 +1901,7 @@ move2add_use_add3_insn (rtx reg, rtx sym
       tem = gen_rtx_REG (GET_MODE (reg), min_regno);
       if (i != min_regno)
        {
-         rtx new_src = gen_int_mode (INTVAL (off) - reg_offset[min_regno],
+         rtx new_src = gen_int_mode (UINTVAL (off) - reg_offset[min_regno],
                                      GET_MODE (reg));
          tem = gen_rtx_PLUS (GET_MODE (reg), tem, new_src);
        }
@@ -2010,7 +2010,7 @@ reload_cse_move2add (rtx first)
                      && CONST_INT_P (XEXP (SET_SRC (set), 1)))
                    {
                      rtx src3 = XEXP (SET_SRC (set), 1);
-                     HOST_WIDE_INT added_offset = INTVAL (src3);
+                     unsigned HOST_WIDE_INT added_offset = UINTVAL (src3);
                      HOST_WIDE_INT base_offset = reg_offset[REGNO (src)];
                      HOST_WIDE_INT regno_offset = reg_offset[regno];
                      rtx new_src =
@@ -2224,7 +2224,7 @@ move2add_note_store (rtx dst, const_rtx
     {
       rtx src = SET_SRC (set);
       rtx base_reg;
-      HOST_WIDE_INT offset;
+      unsigned HOST_WIDE_INT offset;
       int base_regno;
 
       switch (GET_CODE (src))
@@ -2235,7 +2235,7 @@ move2add_note_store (rtx dst, const_rtx
              base_reg = XEXP (src, 0);
 
              if (CONST_INT_P (XEXP (src, 1)))
-               offset = INTVAL (XEXP (src, 1));
+               offset = UINTVAL (XEXP (src, 1));
              else if (REG_P (XEXP (src, 1))
                       && move2add_valid_value_p (REGNO (XEXP (src, 1)), mode))
                {
--- gcc/simplify-rtx.c.jj       2013-12-11 10:11:06.000000000 +0100
+++ gcc/simplify-rtx.c  2013-12-19 17:03:04.749092616 +0100
@@ -1647,7 +1647,7 @@ simplify_const_unary_operation (enum rtx
          break;
 
        case NEG:
-         val = - arg0;
+         val = - (unsigned HOST_WIDE_INT) arg0;
          break;
 
        case ABS:
@@ -4117,15 +4117,15 @@ simplify_const_binary_operation (enum rt
       switch (code)
        {
        case PLUS:
-         val = arg0s + arg1s;
+         val = (unsigned HOST_WIDE_INT) arg0s + arg1s;
          break;
 
        case MINUS:
-         val = arg0s - arg1s;
+         val = (unsigned HOST_WIDE_INT) arg0s - arg1s;
          break;
 
        case MULT:
-         val = arg0s * arg1s;
+         val = (unsigned HOST_WIDE_INT) arg0s * arg1s;
          break;
 
        case DIV:

        Jakub

Reply via email to