static tree find_reachable_label PARAMS ((tree));
static bool expand_unreachable_if_stmt PARAMS ((tree));
static tree expand_unreachable_stmt PARAMS ((tree, int));
+static void genrtl_do_stmt_1 PARAMS ((tree, tree));
/* Create an empty statement tree rooted at T. */
{
/* The line-number recorded in the outermost statement in a function
is the line number of the end of the function. */
- STMT_LINENO (stmt) = lineno;
+ STMT_LINENO (stmt) = input_line;
STMT_LINENO_FOR_FN_P (stmt) = 1;
}
}
in the grammar. */
tree
-build_stmt VPARAMS ((enum tree_code code, ...))
+build_stmt (enum tree_code code, ...)
{
tree t;
int length;
int i;
-
- VA_OPEN (p, code);
- VA_FIXEDARG (p, enum tree_code, code);
+ va_list p;
+
+ va_start (p, code);
t = make_node (code);
length = TREE_CODE_LENGTH (code);
- STMT_LINENO (t) = lineno;
+ STMT_LINENO (t) = input_line;
for (i = 0; i < length; i++)
TREE_OPERAND (t, i) = va_arg (p, tree);
- VA_CLOSE (p);
+ va_end (p);
return t;
}
expand_decl (decl);
}
- /* Actually do the initialization. */
- if (stmts_are_full_exprs_p ())
- expand_start_target_temps ();
+ if (DECL_INITIAL (decl))
+ {
+ /* Actually do the initialization. */
+ if (stmts_are_full_exprs_p ())
+ expand_start_target_temps ();
- expand_decl_init (decl);
+ expand_decl_init (decl);
- if (stmts_are_full_exprs_p ())
- expand_end_target_temps ();
+ if (stmts_are_full_exprs_p ())
+ expand_end_target_temps ();
+ }
}
/* Helper for generating the RTL at the beginning of a scope. */
void
genrtl_do_pushlevel ()
{
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
clear_last_expr ();
}
if (TREE_CODE (destination) == LABEL_DECL)
TREE_USED (destination) = 1;
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (TREE_CODE (destination) == LABEL_DECL)
{
{
if (expr != NULL_TREE)
{
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (stmts_are_full_exprs_p ())
expand_start_target_temps ();
tree t;
{
tree decl;
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
decl = DECL_STMT_DECL (t);
/* If this is a declaration for an automatic local
variable, initialize it. Note that we might also see a
tree cond;
genrtl_do_pushlevel ();
cond = expand_cond (IF_COND (t));
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_start_cond (cond, 0);
if (THEN_CLAUSE (t))
{
+ tree nextt = THEN_CLAUSE (t);
+
if (cond && integer_zerop (cond))
- expand_unreachable_stmt (THEN_CLAUSE (t), warn_notreached);
- else
- expand_stmt (THEN_CLAUSE (t));
+ nextt = expand_unreachable_stmt (nextt, warn_notreached);
+ expand_stmt (nextt);
}
if (ELSE_CLAUSE (t))
{
+ tree nextt = ELSE_CLAUSE (t);
expand_start_else ();
if (cond && integer_nonzerop (cond))
- expand_unreachable_stmt (ELSE_CLAUSE (t), warn_notreached);
- else
- expand_stmt (ELSE_CLAUSE (t));
+ nextt = expand_unreachable_stmt (nextt, warn_notreached);
+ expand_stmt (nextt);
}
expand_end_cond ();
}
tree cond = WHILE_COND (t);
emit_nop ();
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_start_loop (1);
genrtl_do_pushlevel ();
if (cond && !integer_nonzerop (cond))
{
cond = expand_cond (cond);
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_exit_loop_top_cond (0, cond);
genrtl_do_pushlevel ();
}
expand_end_loop ();
}
-/* Generate the RTL for T, which is a DO_STMT. */
+/* Generate the RTL for a DO_STMT with condition COND and loop BODY
+ body. This is reused for expanding unreachable WHILE_STMTS. */
-void
-genrtl_do_stmt (t)
- tree t;
+static void
+genrtl_do_stmt_1 (cond, body)
+ tree cond, body;
{
- tree cond = DO_COND (t);
-
/* Recognize the common special-case of do { ... } while (0) and do
not emit the loop widgetry in this case. In particular this
avoids cluttering the rtl with dummy loop notes, which can affect
if (!cond || integer_zerop (cond))
{
expand_start_null_loop ();
- expand_stmt (DO_BODY (t));
+ expand_stmt (body);
expand_end_null_loop ();
}
else if (integer_nonzerop (cond))
{
emit_nop ();
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_start_loop (1);
- expand_stmt (DO_BODY (t));
+ expand_stmt (body);
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_end_loop ();
}
else
{
emit_nop ();
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_start_loop_continue_elsewhere (1);
- expand_stmt (DO_BODY (t));
+ expand_stmt (body);
expand_loop_continue_here ();
cond = expand_cond (cond);
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_exit_loop_if_false (0, cond);
expand_end_loop ();
}
}
+/* Generate the RTL for T, which is a DO_STMT. */
+
+void
+genrtl_do_stmt (t)
+ tree t;
+{
+ genrtl_do_stmt_1 (DO_COND (t), DO_BODY (t));
+}
+
/* Build the node for a return statement and return it. */
tree
expr = RETURN_STMT_EXPR (stmt);
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (!expr)
expand_null_return ();
else
tree t;
{
tree cond = FOR_COND (t);
- const char *saved_filename;
- int saved_lineno;
+ location_t saved_loc;
if (NEW_FOR_SCOPE_P (t))
genrtl_do_pushlevel ();
/* Expand the initialization. */
emit_nop ();
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (FOR_EXPR (t))
expand_start_loop_continue_elsewhere (1);
else
/* Save the filename and line number so that we expand the FOR_EXPR
we can reset them back to the saved values. */
- saved_filename = input_filename;
- saved_lineno = lineno;
+ saved_loc = input_location;
/* Expand the condition. */
if (cond && !integer_nonzerop (cond))
{
cond = expand_cond (cond);
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_exit_loop_top_cond (0, cond);
genrtl_do_pushlevel ();
}
expand_stmt (FOR_BODY (t));
/* Expand the increment expression. */
- input_filename = saved_filename;
- lineno = saved_lineno;
- emit_line_note (input_filename, lineno);
+ input_location = saved_loc;
+ emit_line_note (input_filename, input_line);
if (FOR_EXPR (t))
{
expand_loop_continue_here ();
void
genrtl_break_stmt ()
{
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if ( ! expand_exit_something ())
error ("break statement not within loop or switch");
}
void
genrtl_continue_stmt ()
{
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (! expand_continue_loop (0))
error ("continue statement not within a loop");
}
crash. */
cond = boolean_false_node;
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
expand_start_case (1, cond, TREE_TYPE (cond), "switch statement");
- expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached);
+ expand_stmt (expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached));
expand_end_case_type (cond, SWITCH_TYPE (t));
}
cv_qualifier = NULL_TREE;
}
- emit_line_note (input_filename, lineno);
+ emit_line_note (input_filename, input_line);
if (asm_input_p)
expand_asm (string, cv_qualifier != NULL_TREE);
else
c_expand_asm_operands (string, output_operands, input_operands,
clobbers, cv_qualifier != NULL_TREE,
- input_filename, lineno);
+ input_filename, input_line);
}
/* Generate the RTL for a CLEANUP_STMT. */
tree t;
{
if (!STMT_LINENO_FOR_FN_P (t))
- lineno = STMT_LINENO (t);
+ input_line = STMT_LINENO (t);
current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t);
}
find_reachable_label (exp)
tree exp;
{
- int line = lineno;
- const char *file = input_filename;
+ location_t saved_loc = input_location;
tree ret = walk_tree (&exp, find_reachable_label_1, NULL, NULL);
- input_filename = file;
- lineno = line;
+ input_location = saved_loc;
return ret;
}
case IF_STMT:
case RETURN_STMT:
if (!STMT_LINENO_FOR_FN_P (t))
- lineno = STMT_LINENO (t);
+ input_line = STMT_LINENO (t);
warning("will never be executed");
warn = false;
break;
return TREE_CHAIN (t);
break;
+ case WHILE_STMT:
+ /* If the start of a while statement is unreachable, there is
+ no need to rotate the loop, instead the WHILE_STMT can be
+ expanded like a DO_STMT. */
+ genrtl_do_stmt_1 (WHILE_COND (t), WHILE_BODY (t));
+ return TREE_CHAIN (t);
+
case COMPOUND_STMT:
{
tree n;