diff options
author | Diego Novillo <dnovillo@gcc.gnu.org> | 2004-05-13 02:41:07 -0400 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2004-05-13 02:41:07 -0400 |
commit | 6de9cd9a886ea695aa892c3c7c07818a7b7e9e6f (patch) | |
tree | a2568888a519c077427b133de9ece5879a8484a5 /gcc/c-semantics.c | |
parent | ac1a20aec53364d77f3bdff94a2a0a06840e0fe9 (diff) | |
download | gcc-6de9cd9a886ea695aa892c3c7c07818a7b7e9e6f.zip gcc-6de9cd9a886ea695aa892c3c7c07818a7b7e9e6f.tar.gz gcc-6de9cd9a886ea695aa892c3c7c07818a7b7e9e6f.tar.bz2 |
Merge tree-ssa-20020619-branch into mainline.
From-SVN: r81764
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 824 |
1 files changed, 34 insertions, 790 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index a8693f9..b74fda6 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -44,23 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "timevar.h" #include "predict.h" #include "tree-inline.h" - -/* If non-NULL, the address of a language-specific function for - expanding statements. */ -void (*lang_expand_stmt) (tree); - -/* If non-NULL, the address of a language-specific function for - expanding a DECL_STMT. After the language-independent cases are - handled, this function will be called. If this function is not - defined, it is assumed that declarations other than those for - variables and labels do not require any RTL generation. */ -void (*lang_expand_decl_stmt) (tree); - -static tree find_reachable_label_1 (tree *, int *, void *); -static tree find_reachable_label (tree); -static bool expand_unreachable_if_stmt (tree); -static tree expand_unreachable_stmt (tree, int); -static void genrtl_do_stmt_1 (tree, tree); +#include "langhooks.h" /* Create an empty statement tree rooted at T. */ @@ -81,18 +65,8 @@ begin_stmt_tree (tree *t) tree add_stmt (tree t) { - if (input_filename != last_expr_filename) - { - /* If the filename has changed, also add in a FILE_STMT. Do a string - compare first, though, as it might be an equivalent string. */ - int add = (strcmp (input_filename, last_expr_filename) != 0); - last_expr_filename = input_filename; - if (add) - { - tree pos = build_nt (FILE_STMT, get_identifier (input_filename)); - add_stmt (pos); - } - } + if (!EXPR_LOCUS (t)) + annotate_with_locus (t, input_location); /* Add T to the statement-tree. */ TREE_CHAIN (last_tree) = t; @@ -171,58 +145,53 @@ finish_stmt_tree (tree *t) stmt = TREE_CHAIN (*t); *t = stmt; last_tree = NULL_TREE; - - if (cfun && stmt) - { - /* The line-number recorded in the outermost statement in a function - is the line number of the end of the function. */ - STMT_LINENO (stmt) = input_line; - STMT_LINENO_FOR_FN_P (stmt) = 1; - } } /* Build a generic statement based on the given type of node and arguments. Similar to `build_nt', except that we set - STMT_LINENO to be the current line number. */ + EXPR_LOCUS to be the current source location. */ /* ??? This should be obsolete with the lineno_stmt productions in the grammar. */ tree build_stmt (enum tree_code code, ...) { - tree t; - int length; - int i; + tree ret; + int length, i; va_list p; + bool side_effects; va_start (p, code); - t = make_node (code); + ret = make_node (code); length = TREE_CODE_LENGTH (code); - STMT_LINENO (t) = input_line; - - for (i = 0; i < length; i++) - TREE_OPERAND (t, i) = va_arg (p, tree); - - va_end (p); - return t; -} + annotate_with_locus (ret, input_location); -/* Some statements, like for-statements or if-statements, require a - condition. This condition can be a declaration. If T is such a - declaration it is processed, and an expression appropriate to use - as the condition is returned. Otherwise, T itself is returned. */ + /* Most statements have implicit side effects all on their own, + such as control transfer. For those that do, we'll compute + the real value of TREE_SIDE_EFFECTS from its arguments. */ + switch (code) + { + case EXPR_STMT: + side_effects = false; + break; + default: + side_effects = true; + break; + } -tree -expand_cond (tree t) -{ - if (t && TREE_CODE (t) == TREE_LIST) + for (i = 0; i < length; i++) { - expand_stmt (TREE_PURPOSE (t)); - return TREE_VALUE (t); + tree t = va_arg (p, tree); + if (t && IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))) + side_effects |= TREE_SIDE_EFFECTS (t); + TREE_OPERAND (ret, i) = t; } - else - return t; + + TREE_SIDE_EFFECTS (ret) = side_effects; + + va_end (p); + return ret; } /* Create RTL for the local static variable DECL. */ @@ -268,7 +237,7 @@ emit_local_var (tree decl) /* Create RTL for this variable. */ if (!DECL_RTL_SET_P (decl)) { - if (DECL_C_HARD_REGISTER (decl)) + if (DECL_HARD_REGISTER (decl)) /* The user specified an assembler name for this variable. Set that up now. */ rest_of_decl_compilation @@ -291,214 +260,6 @@ emit_local_var (tree decl) } } -/* Helper for generating the RTL at the beginning of a scope. */ - -void -genrtl_do_pushlevel (void) -{ - emit_line_note (input_location); - clear_last_expr (); -} - -/* Generate the RTL for DESTINATION, which is a GOTO_STMT. */ - -void -genrtl_goto_stmt (tree destination) -{ - if (TREE_CODE (destination) == IDENTIFIER_NODE) - abort (); - - /* We warn about unused labels with -Wunused. That means we have to - mark the used labels as used. */ - if (TREE_CODE (destination) == LABEL_DECL) - TREE_USED (destination) = 1; - - emit_line_note (input_location); - - if (TREE_CODE (destination) == LABEL_DECL) - { - label_rtx (destination); - expand_goto (destination); - } - else - expand_computed_goto (destination); -} - -/* Generate the RTL for EXPR, which is an EXPR_STMT. Provided just - for backward compatibility. genrtl_expr_stmt_value() should be - used for new code. */ - -void -genrtl_expr_stmt (tree expr) -{ - genrtl_expr_stmt_value (expr, -1, 1); -} - -/* Generate the RTL for EXPR, which is an EXPR_STMT. WANT_VALUE tells - 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 nonzero if this EXPR_STMT might be the last statement - in expression statement. */ - -void -genrtl_expr_stmt_value (tree expr, int want_value, int maybe_last) -{ - if (expr != NULL_TREE) - { - emit_line_note (input_location); - - if (stmts_are_full_exprs_p ()) - expand_start_target_temps (); - - if (expr != error_mark_node) - expand_expr_stmt_value (expr, want_value, maybe_last); - - if (stmts_are_full_exprs_p ()) - expand_end_target_temps (); - } -} - -/* Generate the RTL for T, which is a DECL_STMT. */ - -void -genrtl_decl_stmt (tree t) -{ - tree decl; - emit_line_note (input_location); - decl = DECL_STMT_DECL (t); - /* If this is a declaration for an automatic local - variable, initialize it. Note that we might also see a - declaration for a namespace-scope object (declared with - `extern'). We don't have to handle the initialization - of those objects here; they can only be declarations, - rather than definitions. */ - if (TREE_CODE (decl) == VAR_DECL - && !TREE_STATIC (decl) - && !DECL_EXTERNAL (decl)) - { - /* Let the back-end know about this variable. */ - if (!anon_aggr_type_p (TREE_TYPE (decl))) - emit_local_var (decl); - else - expand_anon_union_decl (decl, NULL_TREE, - DECL_ANON_UNION_ELEMS (decl)); - } - else if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) - make_rtl_for_local_static (decl); - else if (TREE_CODE (decl) == LABEL_DECL - && C_DECLARED_LABEL_FLAG (decl)) - declare_nonlocal_label (decl); - else if (TREE_CODE (decl) == TYPE_DECL) - force_type_save_exprs (TREE_TYPE (decl)); - else if (lang_expand_decl_stmt) - (*lang_expand_decl_stmt) (t); -} - -/* Generate the RTL for T, which is an IF_STMT. */ - -void -genrtl_if_stmt (tree t) -{ - tree cond; - genrtl_do_pushlevel (); - cond = expand_cond (IF_COND (t)); - emit_line_note (input_location); - expand_start_cond (cond, 0); - if (THEN_CLAUSE (t)) - { - tree nextt = THEN_CLAUSE (t); - - if (cond && integer_zerop (cond)) - 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)) - nextt = expand_unreachable_stmt (nextt, warn_notreached); - expand_stmt (nextt); - } - expand_end_cond (); -} - -/* Generate the RTL for T, which is a WHILE_STMT. */ - -void -genrtl_while_stmt (tree t) -{ - tree cond = WHILE_COND (t); - - emit_line_note (input_location); - expand_start_loop (1); - genrtl_do_pushlevel (); - - if (cond && !integer_nonzerop (cond)) - { - cond = expand_cond (cond); - emit_line_note (input_location); - expand_exit_loop_top_cond (0, cond); - genrtl_do_pushlevel (); - } - - expand_stmt (WHILE_BODY (t)); - - expand_end_loop (); -} - -/* Generate the RTL for a DO_STMT with condition COND and loop BODY - body. This is reused for expanding unreachable WHILE_STMTS. */ - -static void -genrtl_do_stmt_1 (tree cond, tree body) -{ - /* 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. COND can be NULL due to parse - errors. */ - if (!cond || integer_zerop (cond)) - { - expand_start_null_loop (); - expand_stmt (body); - expand_end_null_loop (); - } - else if (integer_nonzerop (cond)) - { - emit_line_note (input_location); - expand_start_loop (1); - - expand_stmt (body); - - emit_line_note (input_location); - expand_end_loop (); - } - else - { - emit_line_note (input_location); - expand_start_loop_continue_elsewhere (1); - - expand_stmt (body); - - expand_loop_continue_here (); - cond = expand_cond (cond); - emit_line_note (input_location); - expand_exit_loop_if_false (0, cond); - expand_end_loop (); - } -} - -/* Generate the RTL for T, which is a DO_STMT. */ - -void -genrtl_do_stmt (tree t) -{ - genrtl_do_stmt_1 (DO_COND (t), DO_BODY (t)); -} - /* Build the node for a return statement and return it. */ tree @@ -507,74 +268,6 @@ build_return_stmt (tree expr) return (build_stmt (RETURN_STMT, expr)); } -/* Generate the RTL for STMT, which is a RETURN_STMT. */ - -void -genrtl_return_stmt (tree stmt) -{ - tree expr; - - expr = RETURN_STMT_EXPR (stmt); - - emit_line_note (input_location); - if (!expr) - expand_null_return (); - else - { - expand_start_target_temps (); - expand_return (expr); - expand_end_target_temps (); - } -} - -/* Generate the RTL for T, which is a FOR_STMT. */ - -void -genrtl_for_stmt (tree t) -{ - tree cond = FOR_COND (t); - location_t saved_loc; - - if (NEW_FOR_SCOPE_P (t)) - genrtl_do_pushlevel (); - - expand_stmt (FOR_INIT_STMT (t)); - - /* Expand the initialization. */ - emit_line_note (input_location); - if (FOR_EXPR (t)) - expand_start_loop_continue_elsewhere (1); - else - expand_start_loop (1); - genrtl_do_pushlevel (); - - /* Save the filename and line number so that we expand the FOR_EXPR - we can reset them back to the saved values. */ - saved_loc = input_location; - - /* Expand the condition. */ - if (cond && !integer_nonzerop (cond)) - { - cond = expand_cond (cond); - emit_line_note (input_location); - expand_exit_loop_top_cond (0, cond); - genrtl_do_pushlevel (); - } - - /* Expand the body. */ - expand_stmt (FOR_BODY (t)); - - /* Expand the increment expression. */ - input_location = saved_loc; - emit_line_note (input_location); - if (FOR_EXPR (t)) - { - expand_loop_continue_here (); - genrtl_expr_stmt (FOR_EXPR (t)); - } - expand_end_loop (); -} - /* Build a break statement node and return it. */ tree @@ -583,16 +276,6 @@ build_break_stmt (void) return (build_stmt (BREAK_STMT)); } -/* Generate the RTL for a BREAK_STMT. */ - -void -genrtl_break_stmt (void) -{ - emit_line_note (input_location); - if ( ! expand_exit_something ()) - abort (); -} - /* Build a continue statement node and return it. */ tree @@ -601,80 +284,6 @@ build_continue_stmt (void) return (build_stmt (CONTINUE_STMT)); } -/* Generate the RTL for a CONTINUE_STMT. */ - -void -genrtl_continue_stmt (void) -{ - emit_line_note (input_location); - if (! expand_continue_loop (0)) - abort (); -} - -/* Generate the RTL for T, which is a SCOPE_STMT. */ - -void -genrtl_scope_stmt (tree t) -{ - tree block = SCOPE_STMT_BLOCK (t); - - if (!SCOPE_NO_CLEANUPS_P (t)) - { - if (SCOPE_BEGIN_P (t)) - expand_start_bindings_and_block (2 * SCOPE_NULLIFIED_P (t), block); - else if (SCOPE_END_P (t)) - expand_end_bindings (NULL_TREE, !SCOPE_NULLIFIED_P (t), 0); - } - else if (!SCOPE_NULLIFIED_P (t)) - { - rtx note = emit_note (SCOPE_BEGIN_P (t) - ? NOTE_INSN_BLOCK_BEG : NOTE_INSN_BLOCK_END); - NOTE_BLOCK (note) = block; - } - - /* If we're at the end of a scope that contains inlined nested - functions, we have to decide whether or not to write them out. */ - if (block && SCOPE_END_P (t)) - { - tree fn; - - for (fn = BLOCK_VARS (block); fn; fn = TREE_CHAIN (fn)) - { - if (TREE_CODE (fn) == FUNCTION_DECL - && DECL_CONTEXT (fn) == current_function_decl - && DECL_STRUCT_FUNCTION (fn) - && DECL_STRUCT_FUNCTION (fn)->saved_for_inline - && !TREE_ASM_WRITTEN (fn) - && TREE_ADDRESSABLE (fn)) - { - push_function_context (); - output_inline_function (fn); - pop_function_context (); - } - } - } -} - -/* Generate the RTL for T, which is a SWITCH_STMT. */ - -void -genrtl_switch_stmt (tree t) -{ - tree cond; - genrtl_do_pushlevel (); - - cond = expand_cond (SWITCH_COND (t)); - if (cond == error_mark_node) - /* The code is in error, but we don't want expand_end_case to - crash. */ - cond = truthvalue_false_node; - - emit_line_note (input_location); - expand_start_case (1, cond, TREE_TYPE (cond), "switch statement"); - expand_stmt (expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached)); - expand_end_case_type (cond, SWITCH_TYPE (t)); -} - /* Create a CASE_LABEL tree node and return it. */ tree @@ -683,378 +292,13 @@ build_case_label (tree low_value, tree high_value, tree label_decl) return build_stmt (CASE_LABEL, low_value, high_value, label_decl); } - -/* Generate the RTL for a CASE_LABEL. */ - -void -genrtl_case_label (tree case_label) -{ - tree duplicate; - tree cleanup; - - cleanup = last_cleanup_this_contour (); - if (cleanup) - { - static int explained = 0; - warning ("destructor needed for `%D'", (TREE_PURPOSE (cleanup))); - warning ("where case label appears here"); - if (!explained) - { - warning ("(enclose actions of previous case statements requiring destructors in their own scope.)"); - explained = 1; - } - } - - add_case_node (CASE_LOW (case_label), CASE_HIGH (case_label), - CASE_LABEL_DECL (case_label), &duplicate); -} - -/* Generate the RTL for T, which is a COMPOUND_STMT. */ - -void -genrtl_compound_stmt (tree t) -{ -#ifdef ENABLE_CHECKING - struct nesting *n = current_nesting_level (); -#endif - - expand_stmt (COMPOUND_BODY (t)); - -#ifdef ENABLE_CHECKING - /* Make sure that we've pushed and popped the same number of levels. */ - if (!COMPOUND_STMT_NO_SCOPE (t) && n != current_nesting_level ()) - abort (); -#endif -} - -/* Generate the RTL for an ASM_STMT. */ - -void -genrtl_asm_stmt (tree cv_qualifier, tree string, tree output_operands, - tree input_operands, tree clobbers, int asm_input_p) -{ - if (cv_qualifier != NULL_TREE - && cv_qualifier != ridpointers[(int) RID_VOLATILE]) - { - warning ("%s qualifier ignored on asm", - IDENTIFIER_POINTER (cv_qualifier)); - cv_qualifier = NULL_TREE; - } - - emit_line_note (input_location); - 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_location); -} - -/* Generate the RTL for a CLEANUP_STMT. */ - -void -genrtl_cleanup_stmt (tree t) -{ - tree decl = CLEANUP_DECL (t); - if (!decl || !DECL_P (decl) - || (DECL_SIZE (decl) && TREE_TYPE (decl) != error_mark_node)) - expand_decl_cleanup_eh (decl, CLEANUP_EXPR (t), CLEANUP_EH_ONLY (t)); -} - /* We're about to expand T, a statement. Set up appropriate context for the substitution. */ void prep_stmt (tree t) { - if (!STMT_LINENO_FOR_FN_P (t)) - input_line = STMT_LINENO (t); + if (EXPR_LOCUS (t)) + input_location = *EXPR_LOCUS (t); current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t); } - -/* Generate the RTL for the statement T, its substatements, and any - other statements at its nesting level. */ - -void -expand_stmt (tree t) -{ - while (t && t != error_mark_node) - { - int saved_stmts_are_full_exprs_p; - - /* Set up context appropriately for handling this statement. */ - saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); - prep_stmt (t); - - switch (TREE_CODE (t)) - { - case FILE_STMT: - input_filename = FILE_STMT_FILENAME (t); - break; - - case RETURN_STMT: - genrtl_return_stmt (t); - t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached); - goto process_t; - - case EXPR_STMT: - genrtl_expr_stmt_value (EXPR_STMT_EXPR (t), TREE_ADDRESSABLE (t), - TREE_CHAIN (t) == NULL - || (TREE_CODE (TREE_CHAIN (t)) == SCOPE_STMT - && TREE_CHAIN (TREE_CHAIN (t)) == NULL)); - break; - - case DECL_STMT: - genrtl_decl_stmt (t); - break; - - case FOR_STMT: - genrtl_for_stmt (t); - break; - - case WHILE_STMT: - genrtl_while_stmt (t); - break; - - case DO_STMT: - genrtl_do_stmt (t); - break; - - case IF_STMT: - genrtl_if_stmt (t); - break; - - case COMPOUND_STMT: - genrtl_compound_stmt (t); - break; - - case BREAK_STMT: - genrtl_break_stmt (); - t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached); - goto process_t; - - case CONTINUE_STMT: - genrtl_continue_stmt (); - t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached); - goto process_t; - - case SWITCH_STMT: - genrtl_switch_stmt (t); - break; - - case CASE_LABEL: - genrtl_case_label (t); - break; - - case LABEL_STMT: - expand_label (LABEL_STMT_LABEL (t)); - break; - - case GOTO_STMT: - /* Emit information for branch prediction. */ - if (!GOTO_FAKE_P (t) - && TREE_CODE (GOTO_DESTINATION (t)) == LABEL_DECL - && flag_guess_branch_prob) - { - rtx note = emit_note (NOTE_INSN_PREDICTION); - - NOTE_PREDICTION (note) = NOTE_PREDICT (PRED_GOTO, NOT_TAKEN); - } - genrtl_goto_stmt (GOTO_DESTINATION (t)); - t = expand_unreachable_stmt (TREE_CHAIN (t), warn_notreached); - goto process_t; - - case ASM_STMT: - genrtl_asm_stmt (ASM_CV_QUAL (t), ASM_STRING (t), - ASM_OUTPUTS (t), ASM_INPUTS (t), - ASM_CLOBBERS (t), ASM_INPUT_P (t)); - break; - - case SCOPE_STMT: - genrtl_scope_stmt (t); - break; - - case CLEANUP_STMT: - genrtl_cleanup_stmt (t); - break; - - default: - if (lang_expand_stmt) - (*lang_expand_stmt) (t); - else - abort (); - break; - } - - /* Go on to the next statement in this scope. */ - t = TREE_CHAIN (t); - - process_t: - /* Restore saved state. */ - current_stmt_tree ()->stmts_are_full_exprs_p - = saved_stmts_are_full_exprs_p; - } -} - -/* If *TP is a potentially reachable label, return nonzero. */ - -static tree -find_reachable_label_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, - void *data ATTRIBUTE_UNUSED) -{ - switch (TREE_CODE (*tp)) - { - case LABEL_STMT: - case CASE_LABEL: - return *tp; - - default: - break; - } - return NULL_TREE; -} - -/* Determine whether expression EXP contains a potentially - reachable label. */ -static tree -find_reachable_label (tree exp) -{ - location_t saved_loc = input_location; - tree ret = walk_tree_without_duplicates - (&exp, find_reachable_label_1, NULL); - input_location = saved_loc; - return ret; -} - -/* Expand an unreachable if statement, T. This function returns - true if the IF_STMT contains a potentially reachable code_label. */ -static bool -expand_unreachable_if_stmt (tree t) -{ - tree n; - - if (find_reachable_label (IF_COND (t)) != NULL_TREE) - { - genrtl_if_stmt (t); - return true; - } - - if (THEN_CLAUSE (t) && ELSE_CLAUSE (t)) - { - n = expand_unreachable_stmt (THEN_CLAUSE (t), 0); - - if (n != NULL_TREE) - { - rtx label; - expand_stmt (n); - label = gen_label_rtx (); - emit_jump (label); - expand_stmt (expand_unreachable_stmt (ELSE_CLAUSE (t), 0)); - emit_label (label); - return true; - } - else - n = expand_unreachable_stmt (ELSE_CLAUSE (t), 0); - } - else if (THEN_CLAUSE (t)) - n = expand_unreachable_stmt (THEN_CLAUSE (t), 0); - else if (ELSE_CLAUSE (t)) - n = expand_unreachable_stmt (ELSE_CLAUSE (t), 0); - else - n = NULL_TREE; - - expand_stmt (n); - - return n != NULL_TREE; -} - -/* Expand an unreachable statement list. This function skips all - statements preceding the first potentially reachable label and - then returns the label (or, in same cases, the statement after - one containing the label). */ -static tree -expand_unreachable_stmt (tree t, int warn) -{ - int saved; - - while (t && t != error_mark_node) - { - if (warn) - switch (TREE_CODE (t)) - { - case BREAK_STMT: - case CONTINUE_STMT: - case EXPR_STMT: - case GOTO_STMT: - case IF_STMT: - case RETURN_STMT: - if (!STMT_LINENO_FOR_FN_P (t)) - input_line = STMT_LINENO (t); - warning("will never be executed"); - warn = false; - break; - - default: - break; - } - - switch (TREE_CODE (t)) - { - case GOTO_STMT: - case CONTINUE_STMT: - case BREAK_STMT: - break; - - case FILE_STMT: - input_filename = FILE_STMT_FILENAME (t); - break; - - case RETURN_STMT: - if (find_reachable_label (RETURN_STMT_EXPR (t)) != NULL_TREE) - return t; - break; - - case EXPR_STMT: - if (find_reachable_label (EXPR_STMT_EXPR (t)) != NULL_TREE) - return t; - break; - - case IF_STMT: - if (expand_unreachable_if_stmt (t)) - 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; - n = expand_unreachable_stmt (COMPOUND_BODY (t), warn); - if (n != NULL_TREE) - { - expand_stmt (n); - return TREE_CHAIN (t); - } - warn = false; - break; - } - - case SCOPE_STMT: - saved = stmts_are_full_exprs_p (); - prep_stmt (t); - genrtl_scope_stmt (t); - current_stmt_tree ()->stmts_are_full_exprs_p = saved; - break; - - default: - return t; - } - t = TREE_CHAIN (t); - } - return NULL_TREE; -} |