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