/* This file contains the definitions and documentation for the common
tree codes used in the GNU C and C++ compilers (see c-common.def
for the standard codes).
- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
Written by Benjamin Chelf (chelf@codesourcery.com).
This file is part of GCC.
#include "config.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "tree.h"
#include "function.h"
#include "splay-tree.h"
}
else
{
+ if (partial_p != SCOPE_PARTIAL_P (TREE_PURPOSE (top)))
+ abort ();
TREE_VALUE (top) = ss;
*stack_ptr = TREE_CHAIN (top);
}
whether to (1) save the value of the expression, (0) discard it or
(-1) use expr_stmts_for_value to tell. The use of -1 is
deprecated, and retained only for backward compatibility.
- MAYBE_LAST is non-zero if this EXPR_STMT might be the last statement
+ MAYBE_LAST is nonzero if this EXPR_STMT might be the last statement
in expression statement. */
void
genrtl_while_stmt (t)
tree t;
{
- tree cond;
+ tree cond = WHILE_COND (t);
+
emit_nop ();
emit_line_note (input_filename, lineno);
expand_start_loop (1);
genrtl_do_pushlevel ();
- cond = expand_cond (WHILE_COND (t));
- emit_line_note (input_filename, lineno);
- expand_exit_loop_top_cond (0, cond);
- genrtl_do_pushlevel ();
+ if (cond && !integer_nonzerop (cond))
+ {
+ cond = expand_cond (cond);
+ emit_line_note (input_filename, lineno);
+ expand_exit_loop_top_cond (0, cond);
+ genrtl_do_pushlevel ();
+ }
expand_stmt (WHILE_BODY (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
- alignment of adjacent labels. */
- if (integer_zerop (cond))
+ alignment of adjacent labels. COND can be NULL due to parse
+ errors. */
+ if (!cond || integer_zerop (cond))
{
expand_start_null_loop ();
expand_stmt (DO_BODY (t));
expand_end_null_loop ();
}
+ else if (integer_nonzerop (cond))
+ {
+ emit_nop ();
+ emit_line_note (input_filename, lineno);
+ expand_start_loop (1);
+
+ expand_stmt (DO_BODY (t));
+
+ emit_line_note (input_filename, lineno);
+ expand_end_loop ();
+ }
else
{
emit_nop ();
genrtl_for_stmt (t)
tree t;
{
- tree cond;
+ tree cond = FOR_COND (t);
const char *saved_filename;
int saved_lineno;
/* Expand the initialization. */
emit_nop ();
emit_line_note (input_filename, lineno);
- expand_start_loop_continue_elsewhere (1);
+ if (FOR_EXPR (t))
+ expand_start_loop_continue_elsewhere (1);
+ else
+ expand_start_loop (1);
genrtl_do_pushlevel ();
- cond = expand_cond (FOR_COND (t));
/* Save the filename and line number so that we expand the FOR_EXPR
we can reset them back to the saved values. */
saved_lineno = lineno;
/* Expand the condition. */
- emit_line_note (input_filename, lineno);
- if (cond)
- expand_exit_loop_top_cond (0, cond);
+ if (cond && !integer_nonzerop (cond))
+ {
+ cond = expand_cond (cond);
+ emit_line_note (input_filename, lineno);
+ expand_exit_loop_top_cond (0, cond);
+ genrtl_do_pushlevel ();
+ }
/* Expand the body. */
- 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);
- expand_loop_continue_here ();
if (FOR_EXPR (t))
- genrtl_expr_stmt (FOR_EXPR (t));
+ {
+ expand_loop_continue_here ();
+ genrtl_expr_stmt (FOR_EXPR (t));
+ }
expand_end_loop ();
}
{
if (TREE_CODE (fn) == FUNCTION_DECL
&& DECL_CONTEXT (fn) == current_function_decl
+ && DECL_SAVED_INSNS (fn)
&& !TREE_ASM_WRITTEN (fn)
&& TREE_ADDRESSABLE (fn))
{
emit_line_note (input_filename, lineno);
if (asm_input_p)
- expand_asm (string);
+ expand_asm (string, cv_qualifier != NULL_TREE);
else
c_expand_asm_operands (string, output_operands, input_operands,
clobbers, cv_qualifier != NULL_TREE,