X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fstmt.c;h=099c5e76f603c27554191846fe782d573b4d08f5;hb=d12e862b93167edd9aee40bdad48a00e60cf5514;hp=760be9f3516bc490c05e7cf131c1baf3812c87b9;hpb=a1ad748385a81e37a0a381402fd07450c702f837;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/stmt.c b/gcc/stmt.c index 760be9f3516..099c5e76f60 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -39,7 +39,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "expr.h" #include "libfuncs.h" #include "hard-reg-set.h" -#include "loop.h" #include "recog.h" #include "machmode.h" #include "toplev.h" @@ -132,8 +131,7 @@ static struct case_node *add_case_node (struct case_node *, tree, tree, tree); rtx label_rtx (tree label) { - if (TREE_CODE (label) != LABEL_DECL) - abort (); + gcc_assert (TREE_CODE (label) == LABEL_DECL); if (!DECL_RTL_SET_P (label)) { @@ -155,8 +153,7 @@ force_label_rtx (tree label) tree function = decl_function_context (label); struct function *p; - if (!function) - abort (); + gcc_assert (function); if (function != current_function_decl) p = find_function_data (function); @@ -241,8 +238,7 @@ expand_goto (tree label) /* Check for a nonlocal goto to a containing function. Should have gotten translated to __builtin_nonlocal_goto. */ tree context = decl_function_context (label); - if (context != 0 && context != current_function_decl) - abort (); + gcc_assert (!context || context == current_function_decl); #endif emit_jump (label_rtx (label)); @@ -271,7 +267,8 @@ expand_asm (tree string, int vol) if (TREE_CODE (string) == ADDR_EXPR) string = TREE_OPERAND (string, 0); - body = gen_rtx_ASM_INPUT (VOIDmode, TREE_STRING_POINTER (string)); + body = gen_rtx_ASM_INPUT (VOIDmode, + ggc_strdup (TREE_STRING_POINTER (string))); MEM_VOLATILE_P (body) = vol; @@ -316,7 +313,7 @@ parse_output_constraint (const char **constraint_p, int operand_num, message. */ if (!p) { - error ("output operand constraint lacks `='"); + error ("output operand constraint lacks %<=%>"); return false; } @@ -331,7 +328,8 @@ parse_output_constraint (const char **constraint_p, int operand_num, size_t c_len = strlen (constraint); if (p != constraint) - warning ("output constraint `%c' for operand %d is not at the beginning", + warning ("output constraint %qc for operand %d " + "is not at the beginning", *p, operand_num); /* Make a copy of the constraint. */ @@ -353,13 +351,14 @@ parse_output_constraint (const char **constraint_p, int operand_num, { case '+': case '=': - error ("operand constraint contains incorrectly positioned '+' or '='"); + error ("operand constraint contains incorrectly positioned " + "%<+%> or %<=%>"); return false; case '%': if (operand_num + 1 == ninputs + noutputs) { - error ("`%%' constraint used with last operand"); + error ("%<%%%> constraint used with last operand"); return false; } break; @@ -449,7 +448,7 @@ parse_input_constraint (const char **constraint_p, int input_num, case '+': case '=': case '&': if (constraint == orig_constraint) { - error ("input operand constraint contains `%c'", constraint[j]); + error ("input operand constraint contains %qc", constraint[j]); return false; } break; @@ -458,7 +457,7 @@ parse_input_constraint (const char **constraint_p, int input_num, if (constraint == orig_constraint && input_num + 1 == ninputs - ninout) { - error ("`%%' constraint used with last operand"); + error ("%<%%%> constraint used with last operand"); return false; } break; @@ -529,7 +528,7 @@ parse_input_constraint (const char **constraint_p, int input_num, default: if (! ISALPHA (constraint[j])) { - error ("invalid punctuation `%c' in constraint", constraint[j]); + error ("invalid punctuation %qc in constraint", constraint[j]); return false; } if (REG_CLASS_FROM_CONSTRAINT (constraint[j], constraint + j) @@ -608,7 +607,8 @@ decl_conflicts_with_clobbers_p (tree decl, const HARD_REG_SET clobbered_regs) regno++) if (TEST_HARD_REG_BIT (clobbered_regs, regno)) { - error ("asm-specifier for variable `%s' conflicts with asm clobber list", + error ("asm-specifier for variable %qs conflicts with " + "asm clobber list", IDENTIFIER_POINTER (DECL_NAME (decl))); /* Reset registerness to stop multiple errors emitted for a @@ -696,7 +696,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, if (i >= 0 || i == -4) ++nclobbers; else if (i == -2) - error ("unknown register name `%s' in `asm'", regname); + error ("unknown register name %qs in %", regname); /* Mark clobbered registers. */ if (i >= 0) @@ -704,7 +704,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, /* Clobbering the PIC register is an error */ if (i == (int) PIC_OFFSET_TABLE_REGNUM) { - error ("PIC register `%s' clobbered in `asm'", regname); + error ("PIC register %qs clobbered in %", regname); return; } @@ -751,7 +751,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, ninputs += ninout; if (ninputs + noutputs > MAX_RECOG_OPERANDS) { - error ("more than %d operands in `asm'", MAX_RECOG_OPERANDS); + error ("more than %d operands in %", MAX_RECOG_OPERANDS); return; } @@ -785,11 +785,12 @@ expand_asm_operands (tree string, tree outputs, tree inputs, bool allows_reg; bool allows_mem; rtx op; + bool ok; - if (!parse_output_constraint (&constraints[i], i, ninputs, + ok = parse_output_constraint (&constraints[i], i, ninputs, noutputs, &allows_mem, &allows_reg, - &is_inout)) - abort (); + &is_inout); + gcc_assert (ok); /* If an output operand is not a decl or indirect ref and our constraint allows a register, make a temporary to act as an intermediate. @@ -851,7 +852,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode : GET_MODE (output_rtx[0])), - TREE_STRING_POINTER (string), + ggc_strdup (TREE_STRING_POINTER (string)), empty_string, 0, argvec, constraintvec, locus); @@ -866,11 +867,12 @@ expand_asm_operands (tree string, tree outputs, tree inputs, const char *constraint; tree val, type; rtx op; + bool ok; constraint = constraints[i + noutputs]; - if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout, - constraints, &allows_mem, &allows_reg)) - abort (); + ok = parse_input_constraint (&constraint, i, ninputs, noutputs, ninout, + constraints, &allows_mem, &allows_reg); + gcc_assert (ok); generating_concat_p = 0; @@ -891,7 +893,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, if (allows_reg) op = force_reg (TYPE_MODE (type), op); else if (!allows_mem) - warning ("asm operand %d probably doesn't match constraints", + warning ("asm operand %d probably doesn%'t match constraints", i + noutputs); else if (MEM_P (op)) { @@ -931,7 +933,8 @@ expand_asm_operands (tree string, tree outputs, tree inputs, ASM_OPERANDS_INPUT (body, i) = op; ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i) - = gen_rtx_ASM_INPUT (TYPE_MODE (type), constraints[i + noutputs]); + = gen_rtx_ASM_INPUT (TYPE_MODE (type), + ggc_strdup (constraints[i + noutputs])); if (decl_conflicts_with_clobbers_p (val, clobbered_regs)) clobber_conflict_found = 1; @@ -965,7 +968,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, if (noutputs == 1 && nclobbers == 0) { - ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0]; + ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = ggc_strdup (constraints[0]); emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body)); } @@ -993,9 +996,9 @@ expand_asm_operands (tree string, tree outputs, tree inputs, output_rtx[i], gen_rtx_ASM_OPERANDS (GET_MODE (output_rtx[i]), - TREE_STRING_POINTER (string), - constraints[i], i, argvec, constraintvec, - locus)); + ggc_strdup (TREE_STRING_POINTER (string)), + ggc_strdup (constraints[i]), + i, argvec, constraintvec, locus)); MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol; } @@ -1129,7 +1132,7 @@ check_operand_nalternatives (tree outputs, tree inputs) if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES) { - error ("too many alternatives in `asm'"); + error ("too many alternatives in %"); return false; } @@ -1141,7 +1144,8 @@ check_operand_nalternatives (tree outputs, tree inputs) if (n_occurrences (',', constraint) != nalternatives) { - error ("operand constraints for `asm' differ in number of alternatives"); + error ("operand constraints for % differ " + "in number of alternatives"); return false; } @@ -1193,7 +1197,7 @@ check_unique_operand_names (tree outputs, tree inputs) return true; failure: - error ("duplicate asm operand name '%s'", + error ("duplicate asm operand name %qs", TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i)))); return false; } @@ -1319,7 +1323,7 @@ resolve_operand_name_1 (char *p, tree outputs, tree inputs) } *q = '\0'; - error ("undefined named operand '%s'", p + 1); + error ("undefined named operand %qs", p + 1); op = 0; found: @@ -1330,8 +1334,7 @@ resolve_operand_name_1 (char *p, tree outputs, tree inputs) p = strchr (p, '\0'); /* Verify the no extra buffer space assumption. */ - if (p > q) - abort (); + gcc_assert (p <= q); /* Shift the rest of the buffer down to fill the gap. */ memmove (p, q + 1, strlen (q + 1) + 1); @@ -1470,16 +1473,14 @@ warn_if_unused_value (tree exp, location_t locus) default: /* Referencing a volatile value is a side effect, so don't warn. */ - if ((DECL_P (exp) - || TREE_CODE_CLASS (TREE_CODE (exp)) == 'r') + if ((DECL_P (exp) || REFERENCE_CLASS_P (exp)) && TREE_THIS_VOLATILE (exp)) return 0; /* If this is an expression which has no operands, there is no value to be unused. There are no such language-independent codes, but front ends may define such. */ - if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'e' - && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0) + if (EXPRESSION_CLASS_P (exp) && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0) return 0; maybe_warn: @@ -1546,7 +1547,7 @@ shift_return_value (rtx val) if (shift > 0) val = expand_shift (LSHIFT_EXPR, GET_MODE (target), gen_lowpart (GET_MODE (target), val), - build_int_cst (NULL_TREE, shift, 0), target, 1); + build_int_cst (NULL_TREE, shift), target, 1); } return val; } @@ -1733,9 +1734,8 @@ expand_return (tree retval) if (GET_MODE_SIZE (tmpmode) >= bytes) break; - /* No suitable mode found. */ - if (tmpmode == VOIDmode) - abort (); + /* A suitable mode should have been found. */ + gcc_assert (tmpmode != VOIDmode); PUT_MODE (result_rtl, tmpmode); } @@ -1956,8 +1956,6 @@ expand_decl (tree decl) mark_reg_pointer (DECL_RTL (decl), TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); } - - maybe_set_unchanging (DECL_RTL (decl), decl); } else if (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST @@ -1976,9 +1974,8 @@ expand_decl (tree decl) to the proper address. */ if (DECL_RTL_SET_P (decl)) { - if (!MEM_P (DECL_RTL (decl)) - || !REG_P (XEXP (DECL_RTL (decl), 0))) - abort (); + gcc_assert (MEM_P (DECL_RTL (decl))); + gcc_assert (REG_P (XEXP (DECL_RTL (decl), 0))); oldaddr = XEXP (DECL_RTL (decl), 0); } @@ -2124,6 +2121,7 @@ expand_anon_union_decl (tree decl, tree cleanup ATTRIBUTE_UNUSED, { tree decl_elt = TREE_VALUE (t); enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt)); + rtx decl_rtl; /* If any of the elements are addressable, so is the entire union. */ @@ -2141,24 +2139,18 @@ expand_anon_union_decl (tree decl, tree cleanup ATTRIBUTE_UNUSED, DECL_MODE (decl_elt) = mode = mode_for_size_tree (DECL_SIZE (decl_elt), MODE_INT, 1); - /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we - instead create a new MEM rtx with the proper mode. */ - if (MEM_P (x)) - { - if (mode == GET_MODE (x)) - SET_DECL_RTL (decl_elt, x); - else - SET_DECL_RTL (decl_elt, adjust_address_nv (x, mode, 0)); - } - else if (REG_P (x)) + if (mode == GET_MODE (x)) + decl_rtl = x; + else if (MEM_P (x)) + /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we + instead create a new MEM rtx with the proper mode. */ + decl_rtl = adjust_address_nv (x, mode, 0); + else { - if (mode == GET_MODE (x)) - SET_DECL_RTL (decl_elt, x); - else - SET_DECL_RTL (decl_elt, gen_lowpart_SUBREG (mode, x)); + gcc_assert (REG_P (x)); + decl_rtl = gen_lowpart_SUBREG (mode, x); } - else - abort (); + SET_DECL_RTL (decl_elt, decl_rtl); } } @@ -2282,10 +2274,9 @@ emit_case_bit_tests (tree index_type, tree index_expr, tree minval, if (i == count) { - if (count >= MAX_CASE_BIT_TESTS) - abort (); - test[i].hi = 0; - test[i].lo = 0; + gcc_assert (count < MAX_CASE_BIT_TESTS); + test[i].hi = 0; + test[i].lo = 0; test[i].label = label; test[i].bits = 1; count++; @@ -2380,8 +2371,8 @@ expand_case (tree exp) /* The switch body is lowered in gimplify.c, we should never have switches with a non-NULL SWITCH_BODY here. */ - if (SWITCH_BODY (exp) || !SWITCH_LABELS (exp)) - abort (); + gcc_assert (!SWITCH_BODY (exp)); + gcc_assert (SWITCH_LABELS (exp)); for (i = TREE_VEC_LENGTH (vec); --i >= 0; ) { @@ -2390,15 +2381,12 @@ expand_case (tree exp) /* Handle default labels specially. */ if (!CASE_HIGH (elt) && !CASE_LOW (elt)) { -#ifdef ENABLE_CHECKING - if (default_label_decl != 0) - abort (); -#endif - default_label_decl = CASE_LABEL (elt); + gcc_assert (!default_label_decl); + default_label_decl = CASE_LABEL (elt); } else case_list = add_case_node (case_list, CASE_LOW (elt), CASE_HIGH (elt), - CASE_LABEL (elt)); + CASE_LABEL (elt)); } do_pending_stack_adjust (); @@ -2413,6 +2401,8 @@ expand_case (tree exp) /* An ERROR_MARK occurs for various reasons including invalid data type. */ if (index_type != error_mark_node) { + int fail; + /* If we don't have a default-label, create one here, after the body of the switch. */ if (default_label_decl == 0) @@ -2433,10 +2423,8 @@ expand_case (tree exp) for (n = case_list; n; n = n->right) { /* Check low and high label values are integers. */ - if (TREE_CODE (n->low) != INTEGER_CST) - abort (); - if (TREE_CODE (n->high) != INTEGER_CST) - abort (); + gcc_assert (TREE_CODE (n->low) == INTEGER_CST); + gcc_assert (TREE_CODE (n->high) == INTEGER_CST); n->low = convert (index_type, n->low); n->high = convert (index_type, n->high); @@ -2556,8 +2544,9 @@ expand_case (tree exp) if (TREE_CODE (index_expr) != INTEGER_CST) { index_expr - = build_int_cst (NULL_TREE, INTVAL (index), - unsignedp || INTVAL (index) >= 0 ? 0 : -1); + = build_int_cst_wide (NULL_TREE, INTVAL (index), + unsignedp || INTVAL (index) >= 0 + ? 0 : -1); index_expr = convert (index_type, index_expr); } @@ -2606,6 +2595,7 @@ expand_case (tree exp) if (! try_casesi (index_type, index_expr, minval, range, table_label, default_label)) { + bool ok; index_type = integer_type_node; /* Index jumptables from zero for suitable values of @@ -2618,9 +2608,9 @@ expand_case (tree exp) range = maxval; } - if (! try_tablejump (index_type, index_expr, minval, range, - table_label, default_label)) - abort (); + ok = try_tablejump (index_type, index_expr, minval, range, + table_label, default_label); + gcc_assert (ok); } /* Get table of labels to jump to, in order of case index. */ @@ -2676,8 +2666,8 @@ expand_case (tree exp) before_case = NEXT_INSN (before_case); end = get_last_insn (); - if (squeeze_notes (&before_case, &end)) - abort (); + fail = squeeze_notes (&before_case, &end); + gcc_assert (!fail); reorder_insns (before_case, end, start); } @@ -2729,7 +2719,7 @@ estimate_case_costs (case_node_ptr node) { tree min_ascii = integer_minus_one_node; tree max_ascii = convert (TREE_TYPE (node->high), - build_int_cst (NULL_TREE, 127, 0)); + build_int_cst (NULL_TREE, 127)); case_node_ptr n; int i;