X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-semantics.c;h=e19e73e47e88ddc4acfd3ab3e8693fbce799aaca;hb=2852f205f98755b7009fb41116377517344dd5f4;hp=35cb559e6f805348eb7b1e767b685e83e89a8f6f;hpb=852c026b8dde4dd1af018b2a6234a93f1f2c621e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index 35cb559e6f8..e19e73e47e8 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -1,7 +1,7 @@ /* 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. @@ -23,6 +23,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #include "tree.h" #include "function.h" #include "splay-tree.h" @@ -144,6 +146,8 @@ add_scope_stmt (begin_p, partial_p) } else { + if (partial_p != SCOPE_PARTIAL_P (TREE_PURPOSE (top))) + abort (); TREE_VALUE (top) = ss; *stack_ptr = TREE_CHAIN (top); } @@ -335,7 +339,7 @@ genrtl_expr_stmt (expr) 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 @@ -420,16 +424,20 @@ 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)); @@ -447,13 +455,25 @@ genrtl_do_stmt (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 (); @@ -506,7 +526,7 @@ void genrtl_for_stmt (t) tree t; { - tree cond; + tree cond = FOR_COND (t); const char *saved_filename; int saved_lineno; @@ -518,9 +538,11 @@ genrtl_for_stmt (t) /* 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. */ @@ -528,21 +550,26 @@ genrtl_for_stmt (t) 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 (); } @@ -616,6 +643,7 @@ genrtl_scope_stmt (t) { if (TREE_CODE (fn) == FUNCTION_DECL && DECL_CONTEXT (fn) == current_function_decl + && DECL_SAVED_INSNS (fn) && !TREE_ASM_WRITTEN (fn) && TREE_ADDRESSABLE (fn)) { @@ -727,7 +755,7 @@ genrtl_asm_stmt (cv_qualifier, string, output_operands, 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,