X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-semantics.c;h=f011cb90a1e37e50e3f502fe975b5d16921b9937;hb=1b716045fc9e347b54af8e6c4b669dc8caff23b8;hp=8a98e07b3a3d367fb99ff8f136a41f8c1b7d9c89;hpb=8495c0caa5e5c7405db047eacf57e0bc0a98e473;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index 8a98e07b3a3..f011cb90a1e 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -128,16 +128,21 @@ pop_stmt_list (tree t) tree add_stmt (tree t) { - if (EXPR_P (t) || STATEMENT_CODE_P (TREE_CODE (t))) + enum tree_code code = TREE_CODE (t); + + if ((EXPR_P (t) || STATEMENT_CODE_P (code)) && code != LABEL_EXPR) { - if (!EXPR_LOCUS (t)) - annotate_with_locus (t, input_location); + if (!EXPR_HAS_LOCATION (t)) + SET_EXPR_LOCATION (t, input_location); /* When we expand a statement-tree, we must know whether or not the statements are full-expressions. We record that fact here. */ STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p (); } + if (code == LABEL_EXPR || code == CASE_LABEL_EXPR) + STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1; + /* Add T to the statement-tree. Non-side-effect statements need to be recorded during statement expressions. */ append_to_statement_list_force (t, &cur_stmt_list); @@ -145,35 +150,9 @@ add_stmt (tree t) return t; } -/* Create a declaration statement for the declaration given by the - DECL. */ - -void -add_decl_stmt (tree decl) -{ - tree decl_stmt; - - /* We need the type to last until instantiation time. */ - decl_stmt = build_stmt (DECL_STMT, decl); - add_stmt (decl_stmt); -} - -/* Queue a cleanup. CLEANUP is an expression/statement to be executed - when the current scope is exited. EH_ONLY is true when this is not - meant to apply to normal control flow transfer. */ - -void -push_cleanup (tree decl, tree cleanup, bool eh_only) -{ - tree stmt = build_stmt (CLEANUP_STMT, NULL, cleanup, decl); - CLEANUP_EH_ONLY (stmt) = eh_only; - add_stmt (stmt); - CLEANUP_BODY (stmt) = push_stmt_list (); -} - /* Build a generic statement based on the given type of node and arguments. Similar to `build_nt', except that we set - EXPR_LOCUS to be the current source location. */ + EXPR_LOCATION to be the current source location. */ /* ??? This should be obsolete with the lineno_stmt productions in the grammar. */ @@ -190,7 +169,7 @@ build_stmt (enum tree_code code, ...) ret = make_node (code); TREE_TYPE (ret) = void_type_node; length = TREE_CODE_LENGTH (code); - annotate_with_locus (ret, input_location); + SET_EXPR_LOCATION (ret, input_location); /* Most statements have implicit side effects all on their own, such as control transfer. For those that do, we'll compute @@ -219,41 +198,6 @@ build_stmt (enum tree_code code, ...) return ret; } -/* Create RTL for the local static variable DECL. */ - -void -make_rtl_for_local_static (tree decl) -{ - const char *asmspec = NULL; - - /* If we inlined this variable, we could see it's declaration - again. */ - if (TREE_ASM_WRITTEN (decl)) - return; - - /* If the DECL_ASSEMBLER_NAME is not the same as the DECL_NAME, then - either we already created RTL for this DECL (and since it was a - local variable, its DECL_ASSEMBLER_NAME got hacked up to prevent - clashes with other local statics with the same name by a previous - call to make_decl_rtl), or the user explicitly requested a - particular assembly name for this variable, using the GNU - extension for this purpose: - - int i asm ("j"); - - There's no way to know which case we're in, here. But, it turns - out we're safe. If there's already RTL, then - rest_of_decl_compilation ignores the ASMSPEC parameter, so we - may as well not pass it in. If there isn't RTL, then we didn't - already create RTL, which means that the modification to - DECL_ASSEMBLER_NAME came only via the explicit extension. */ - if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl) - && !DECL_RTL_SET_P (decl)) - asmspec = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - - rest_of_decl_compilation (decl, asmspec, /*top_level=*/0, /*at_end=*/0); -} - /* Let the back-end know about DECL. */ void @@ -265,22 +209,12 @@ emit_local_var (tree decl) if (DECL_HARD_REGISTER (decl)) /* The user specified an assembler name for this variable. Set that up now. */ - rest_of_decl_compilation - (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), - /*top_level=*/0, /*at_end=*/0); + rest_of_decl_compilation (decl, 0, 0); else expand_decl (decl); } } -/* Build the node for a return statement and return it. */ - -tree -build_return_stmt (tree expr) -{ - return (build_stmt (RETURN_STMT, expr)); -} - /* Build a break statement node and return it. */ tree