X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-semantics.c;h=567a440706b2a1738853bc6e45db442242803caf;hb=a7cc94aa453a5b092723df12f2d5abe2fb7c9bbd;hp=ee04417ad08bb55fc6db08f54725747d634cefc2;hpb=c857cd60b89c8c9cb6f064ab3d1de1eaae22db1d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index ee04417ad08..567a440706b 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -1,7 +1,8 @@ /* 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, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Written by Benjamin Chelf (chelf@codesourcery.com). This file is part of GCC. @@ -58,29 +59,6 @@ push_stmt_list (void) return t; } -/* Similarly, except that T may have already been pushed/popped, and - thus may already contain statement(s). Arrage for new statements - to be appended. */ - -tree -re_push_stmt_list (tree t) -{ - if (t) - { - if (TREE_CODE (t) != STATEMENT_LIST) - { - tree u = alloc_stmt_list (); - append_to_statement_list_force (t, &u); - t = u; - } - } - else - t = alloc_stmt_list (); - TREE_CHAIN (t) = cur_stmt_list; - cur_stmt_list = t; - return t; -} - /* Finish the statement tree rooted at T. */ tree @@ -128,16 +106,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); @@ -147,7 +130,7 @@ add_stmt (tree t) /* 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. */ @@ -164,7 +147,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 @@ -182,7 +165,7 @@ build_stmt (enum tree_code code, ...) for (i = 0; i < length; i++) { tree t = va_arg (p, tree); - if (t && IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))) + if (t && !TYPE_P (t)) side_effects |= TREE_SIDE_EFFECTS (t); TREE_OPERAND (ret, i) = t; } @@ -193,41 +176,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 @@ -239,30 +187,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 a break statement node and return it. */ - -tree -build_break_stmt (void) -{ - return (build_stmt (BREAK_STMT)); -} - -/* Build a continue statement node and return it. */ - -tree -build_continue_stmt (void) -{ - return (build_stmt (CONTINUE_STMT)); -} - /* Create a CASE_LABEL_EXPR tree node and return it. */ tree