diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-09-07 01:36:11 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-09-07 01:36:11 +0000 |
commit | ae499ccea4f2eee460c8612d920755773cacfe47 (patch) | |
tree | 1ae8ce0d3f4f58cfa7b33b9fac7c1209e34d27a7 /gcc/cp | |
parent | 4f4b88d0832c7279722b5dee73d9ce9f1704452f (diff) | |
download | gcc-ae499ccea4f2eee460c8612d920755773cacfe47.zip gcc-ae499ccea4f2eee460c8612d920755773cacfe47.tar.gz gcc-ae499ccea4f2eee460c8612d920755773cacfe47.tar.bz2 |
Move statement-tree facilities from C++ to C front-end.
* c-common.h (c_tree_index): Add CTI_VOID_ZERO.
(void_zero_node): New macro.
(struct stmt_tree_s): New type.
(stmt_tree): New typedef.
(struct language_function): New type.
(last_tree): New macro.
(last_expr_type): Likewise.
(walk_tree_fn): New typedef.
(current_stmt_tree): New function.
(begin_stmt_tree): Likewise.
(add_stmt): Likewise.
(finish_stmt_tree): Likewise.
(statement_code_p): Likewise.
(lang_statement_code_p): New variable.
(walk_stmt_tree): New function.
(STMT_IS_FULL_EXPR_P): New macro.
* c-common.c (lang_statement_code_p): New variable.
(c_common_nodes_and_builtins): Initialize void_zero_node.
(statement_code_p): New function.
(walk_stmt_tree): Likewise.
* c-decl.c (language_function): Rename to ...
(c_language_function): ... this. Include language_function.
(push_c_function_context): Adjust accordingly.
(pop_c_function_context): Likewise.
(mark_c_function_context): Likewise.
(current_stmt_tree): Define.
* c-semantics.c (begin_stmt_tree): New function.
(add_stmt): Likewise.
(prune_unused_decls): Likewise.
(finish_stmt_tree): Likewise.
Move statement-tree facilities from C++ to C front-end.
* cp-tree.h (cp_tree_index): Remove CPTI_VOID_ZERO.
(void_zero_node): Remove.
(stmt_tree): Likewise.
(scope_chain): Adjust.
(language_function): Rename to cp_language_function.
(cp_function_chain): Adjust.
(current_stmt_tree): Remove.
(last_tree): Likewise.
(last_expr_type): Likewise.
(struct lang_decl): Adjust.
(STMT_IS_FULL_EXPR_P): Remove.
(add_tree): Remove.
(begin_stmt_tree): Likewise.
(finish_stmt_tree): Likewise.
(walk_tree_fn): Likewise.
(walk_stmt_tree): Likewise.
* class.c (finish_struct): Replace use of add_tree with add_stmt.
* decl.c (mark_stmt_tree): Adjust type.
(init_decl_processing): Don't build void_zero_node.
(initialize_local_var): Adjust usage of current_stmt_tree.
(finish_enum): Use add_stmt, not add_tree.
(save_function_data): Adjust use of language_function.
(finish_constructor_body): Use add_stmt, not add_tree.
(finish_destructor_body): Likewise.
(push_cp_function_context): Adjust use of language_function.
(pop_cp_function_context): Likewise.
(mark_lang_function): Likewise.
(mark_cp_function_context): Likewise.
* init.c (build_aggr_init): Adjust use of current_stmt_tree.
(build_vec_init): Likewise.
* semantics.c (SET_LAST_STMT): Remove.
(RECHAIN_STMTS): Don't use it.
(stmts_are_full_exprs_p): Adjust use of current_stmt_tree.
(current_stmt_tree): Define.
(add_tree): Remove.
(finish_goto_stmt): Use add_stmt, not add_tree.
(finish_expr_stmt): Likewise.
(begin_if_stmt): Likewise.
(finish_then_clause): Likewise.
(begin_while_stmt): Likewise.
(begin_do_stmt): Likewise.
(finish_return_stmt): Likewise.
(begin_for_stmt): Likewise.
(finish_break_stmt): Likewise.
(finish_continue_stmt): Likewise.
(begin_switch_stmt): Likewise.
(finish_case_label): Likewise.
(begin_try_block): Likewise.
(begin_function_try_block): Likewise.
(begin_handler): Likewise.
(begin_catch_block): Likewise.
(begin_compound_stmt): Likewise.
(begin_asm_stmt): Likewise.
(finish_asm_stmt): Likewise.
(finish_label_stmt): Likewise.
(add_decl_stmt): Likewise.
(finish_subobject): Likewise.
(finish_decl_cleanup): Likewise.
(finish_named_return_value): Likewise.
(setup_vtbl_ptr): Likewise.
(add_scope_stmt): Likewise.
(finish_stmt_expr): Likewise.
(prune_unused_decls): Remove.
(begin_stmt_tree): Likewise.
(finish_stmt_tree): Likewise.
(prep_stmt): Adjust use of current_stmt_tree.
(lang_expand_stmt): Likewise.
* tree.c (statement_code_p): Remove.
(cp_statement_code_p): New function.
(walk_stmt_tree): Remove.
(init_tree): Set lang_statement_code_p.
From-SVN: r36221
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 75 | ||||
-rw-r--r-- | gcc/cp/class.c | 2 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 60 | ||||
-rw-r--r-- | gcc/cp/decl.c | 52 | ||||
-rw-r--r-- | gcc/cp/init.c | 12 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 203 | ||||
-rw-r--r-- | gcc/cp/tree.c | 95 |
7 files changed, 169 insertions, 330 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4b28703..5f6ea87 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,78 @@ +2000-09-06 Mark Mitchell <mark@codesourcery.com> + + Move statement-tree facilities from C++ to C front-end. + * cp-tree.h (cp_tree_index): Remove CPTI_VOID_ZERO. + (void_zero_node): Remove. + (stmt_tree): Likewise. + (scope_chain): Adjust. + (language_function): Rename to cp_language_function. + (cp_function_chain): Adjust. + (current_stmt_tree): Remove. + (last_tree): Likewise. + (last_expr_type): Likewise. + (struct lang_decl): Adjust. + (STMT_IS_FULL_EXPR_P): Remove. + (add_tree): Remove. + (begin_stmt_tree): Likewise. + (finish_stmt_tree): Likewise. + (walk_tree_fn): Likewise. + (walk_stmt_tree): Likewise. + * class.c (finish_struct): Replace use of add_tree with add_stmt. + * decl.c (mark_stmt_tree): Adjust type. + (init_decl_processing): Don't build void_zero_node. + (initialize_local_var): Adjust usage of current_stmt_tree. + (finish_enum): Use add_stmt, not add_tree. + (save_function_data): Adjust use of language_function. + (finish_constructor_body): Use add_stmt, not add_tree. + (finish_destructor_body): Likewise. + (push_cp_function_context): Adjust use of language_function. + (pop_cp_function_context): Likewise. + (mark_lang_function): Likewise. + (mark_cp_function_context): Likewise. + * init.c (build_aggr_init): Adjust use of current_stmt_tree. + (build_vec_init): Likewise. + * semantics.c (SET_LAST_STMT): Remove. + (RECHAIN_STMTS): Don't use it. + (stmts_are_full_exprs_p): Adjust use of current_stmt_tree. + (current_stmt_tree): Define. + (add_tree): Remove. + (finish_goto_stmt): Use add_stmt, not add_tree. + (finish_expr_stmt): Likewise. + (begin_if_stmt): Likewise. + (finish_then_clause): Likewise. + (begin_while_stmt): Likewise. + (begin_do_stmt): Likewise. + (finish_return_stmt): Likewise. + (begin_for_stmt): Likewise. + (finish_break_stmt): Likewise. + (finish_continue_stmt): Likewise. + (begin_switch_stmt): Likewise. + (finish_case_label): Likewise. + (begin_try_block): Likewise. + (begin_function_try_block): Likewise. + (begin_handler): Likewise. + (begin_catch_block): Likewise. + (begin_compound_stmt): Likewise. + (begin_asm_stmt): Likewise. + (finish_asm_stmt): Likewise. + (finish_label_stmt): Likewise. + (add_decl_stmt): Likewise. + (finish_subobject): Likewise. + (finish_decl_cleanup): Likewise. + (finish_named_return_value): Likewise. + (setup_vtbl_ptr): Likewise. + (add_scope_stmt): Likewise. + (finish_stmt_expr): Likewise. + (prune_unused_decls): Remove. + (begin_stmt_tree): Likewise. + (finish_stmt_tree): Likewise. + (prep_stmt): Adjust use of current_stmt_tree. + (lang_expand_stmt): Likewise. + * tree.c (statement_code_p): Remove. + (cp_statement_code_p): New function. + (walk_stmt_tree): Remove. + (init_tree): Set lang_statement_code_p. + 2000-09-06 Zack Weinberg <zack@wolery.cumb.org> Integrated preprocessor. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 0306df7..6477261 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5265,7 +5265,7 @@ finish_struct (t, attributes) { tree scope = current_scope (); if (scope && TREE_CODE (scope) == FUNCTION_DECL) - add_tree (build_min (TAG_DEFN, t)); + add_stmt (build_min (TAG_DEFN, t)); } return t; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index b32367b..9fb04e5 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -559,7 +559,6 @@ enum cp_tree_index CPTI_JAVA_CHAR_TYPE, CPTI_JAVA_BOOLEAN_TYPE, - CPTI_VOID_ZERO, CPTI_WCHAR_DECL, CPTI_VTABLE_ENTRY_TYPE, CPTI_DELTA_TYPE, @@ -652,7 +651,6 @@ extern tree cp_global_trees[CPTI_MAX]; #define java_char_type_node cp_global_trees[CPTI_JAVA_CHAR_TYPE] #define java_boolean_type_node cp_global_trees[CPTI_JAVA_BOOLEAN_TYPE] -#define void_zero_node cp_global_trees[CPTI_VOID_ZERO] #define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL] #define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE] /* The type used to represent an offset by which to adjust the `this' @@ -784,23 +782,6 @@ extern tree cp_global_trees[CPTI_MAX]; /* Global state. */ -struct stmt_tree { - tree x_last_stmt; - tree x_last_expr_type; -/* Non-zero if we should treat statements as full expressions. In - particular, this variable is no-zero if at the end of a statement - we should destroy any temporaries created during that statement. - Similarly, if, at the end of a block, we should destroy any local - variables in this block. Normally, this variable is non-zero, - since those are the normal semantics of C++. - - However, in order to represent aggregate initialization code as - tree structure, we use statement-expressions. The statements - within the statement expression should not result in cleanups being - run until the entire enclosing statement is complete. */ - int stmts_are_full_exprs_p; -}; - struct saved_scope { tree old_bindings; tree old_namespace; @@ -824,7 +805,7 @@ struct saved_scope { int x_processing_explicit_instantiation; int need_pop_function_context; - struct stmt_tree x_stmt_tree; + struct stmt_tree_s x_stmt_tree; struct binding_level *class_bindings; struct binding_level *bindings; @@ -890,8 +871,10 @@ extern struct saved_scope *scope_chain; /* Global state pertinent to the current function. */ -struct language_function +struct cp_language_function { + struct language_function base; + tree x_ctor_label; tree x_dtor_label; tree x_current_class_ptr; @@ -912,8 +895,6 @@ struct language_function int name_declared; int vtbls_set_up_p; - struct stmt_tree x_stmt_tree; - struct named_label_use_list *x_named_label_uses; struct named_label_list *x_named_labels; struct binding_level *bindings; @@ -923,7 +904,8 @@ struct language_function /* The current C++-specific per-function global variables. */ -#define cp_function_chain (cfun->language) +#define cp_function_chain \ + ((struct cp_language_function *) (cfun->language)) /* In a destructor, the point at which all derived class destroying has been done, just before any base class destroying will be done. */ @@ -944,24 +926,6 @@ struct language_function #define current_class_ref \ (cfun ? cp_function_chain->x_current_class_ref : NULL_TREE) -/* Information about the current statement tree. */ - -#define current_stmt_tree \ - (cfun \ - ? &cp_function_chain->x_stmt_tree \ - : &scope_chain->x_stmt_tree) - -/* When building a statement-tree, this is the last statement added to - the tree. */ - -#define last_tree current_stmt_tree->x_last_stmt - -/* The type of the last expression-statement we have seen. This is - required because the type of a statement-expression is the type of - the last expression statement. */ - -#define last_expr_type current_stmt_tree->x_last_expr_type - /* The TRY_BLOCK for the exception-specifiers for the current function, if any. */ @@ -1927,7 +1891,7 @@ struct lang_decl { tree sorted_fields; struct unparsed_text *pending_inline_info; - struct language_function *saved_language_function; + struct cp_language_function *saved_language_function; } u; union { @@ -2474,9 +2438,6 @@ struct lang_decl #define AGGR_INIT_VIA_CTOR_P(NODE) \ TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE)) -/* Nonzero if this statement should be considered a full-expression. */ -#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE)) - /* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a TEMPLATE_DECL. This macro determines whether or not a given class type is really a template type, as opposed to an instantiation or @@ -4231,7 +4192,6 @@ extern void do_decl_instantiation PARAMS ((tree, tree, tree)); extern void do_type_instantiation PARAMS ((tree, tree, int)); extern tree instantiate_decl PARAMS ((tree, int)); extern tree get_bindings PARAMS ((tree, tree, tree)); -extern void add_tree PARAMS ((tree)); extern void add_maybe_template PARAMS ((tree, tree)); extern void pop_tinst_level PARAMS ((void)); extern int more_specialized_class PARAMS ((tree, tree)); @@ -4409,8 +4369,6 @@ extern void add_decl_stmt PARAMS ((tree)); extern void finish_decl_cleanup PARAMS ((tree, tree)); extern void finish_named_return_value PARAMS ((tree, tree)); extern void expand_body PARAMS ((tree)); -extern void begin_stmt_tree PARAMS ((tree *)); -extern void finish_stmt_tree PARAMS ((tree *)); extern void prep_stmt PARAMS ((tree)); extern tree add_scope_stmt PARAMS ((int, int)); extern void do_pushlevel PARAMS ((void)); @@ -4494,7 +4452,6 @@ extern void debug_binfo PARAMS ((tree)); extern tree build_dummy_object PARAMS ((tree)); extern tree maybe_dummy_object PARAMS ((tree, tree *)); extern int is_dummy_object PARAMS ((tree)); -typedef tree (*walk_tree_fn) PARAMS ((tree *, int *, void *)); extern tree walk_tree PARAMS ((tree *, walk_tree_fn, void *, @@ -4502,9 +4459,6 @@ extern tree walk_tree PARAMS ((tree *, extern tree walk_tree_without_duplicates PARAMS ((tree *, walk_tree_fn, void *)); -extern tree walk_stmt_tree PARAMS ((tree *, - walk_tree_fn, - void *)); extern tree copy_tree_r PARAMS ((tree *, int *, void *)); extern int cp_valid_lang_attribute PARAMS ((tree, tree, tree, tree)); extern tree make_ptrmem_cst PARAMS ((tree, tree)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 03d8c6a..5ca1e55 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -169,8 +169,8 @@ static void mark_binding_level PARAMS ((void *)); static void mark_named_label_lists PARAMS ((void *, void *)); static void mark_cp_function_context PARAMS ((struct function *)); static void mark_saved_scope PARAMS ((void *)); -static void mark_lang_function PARAMS ((struct language_function *)); -static void mark_stmt_tree PARAMS ((struct stmt_tree *)); +static void mark_lang_function PARAMS ((struct cp_language_function *)); +static void mark_stmt_tree PARAMS ((stmt_tree)); static void save_function_data PARAMS ((tree)); static void check_function_type PARAMS ((tree)); static void destroy_local_var PARAMS ((tree)); @@ -200,7 +200,6 @@ tree error_mark_list; C++ extensions tree wchar_decl_node; - tree void_zero_node; tree vtable_entry_type; tree delta_type_node; @@ -2453,7 +2452,7 @@ struct saved_scope *scope_chain; static void mark_stmt_tree (st) - struct stmt_tree *st; + stmt_tree st; { ggc_mark_tree (st->x_last_stmt); ggc_mark_tree (st->x_last_expr_type); @@ -6471,10 +6470,6 @@ init_decl_processing () void_list_node = build_tree_list (NULL_TREE, void_type_node); TREE_PARMLIST (void_list_node) = 1; - /* Used for expressions that do nothing, but are not errors. */ - void_zero_node = build_int_2 (0, 0); - TREE_TYPE (void_zero_node) = void_type_node; - string_type_node = build_pointer_type (char_type_node); const_string_type_node = build_pointer_type (build_qualified_type (char_type_node, @@ -7965,12 +7960,13 @@ initialize_local_var (decl, init, flags) emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); - current_stmt_tree->stmts_are_full_exprs_p = 1; + current_stmt_tree ()->stmts_are_full_exprs_p = 1; if (building_stmt_tree ()) finish_expr_stmt (build_aggr_init (decl, init, flags)); else genrtl_expr_stmt (build_aggr_init (decl, init, flags)); - current_stmt_tree->stmts_are_full_exprs_p = saved_stmts_are_full_exprs_p; + current_stmt_tree ()->stmts_are_full_exprs_p = + saved_stmts_are_full_exprs_p; } /* Set this to 0 so we can tell whether an aggregate which was @@ -13244,7 +13240,7 @@ finish_enum (enumtype) { tree scope = current_scope (); if (scope && TREE_CODE (scope) == FUNCTION_DECL) - add_tree (build_min (TAG_DEFN, enumtype)); + add_stmt (build_min (TAG_DEFN, enumtype)); } else { @@ -14037,7 +14033,7 @@ static void save_function_data (decl) tree decl; { - struct language_function *f; + struct cp_language_function *f; /* Save the language-specific per-function data so that we can get it back when we really expand this function. */ @@ -14045,15 +14041,15 @@ save_function_data (decl) 19990908); /* Make a copy. */ - f = ((struct language_function *) - xmalloc (sizeof (struct language_function))); + f = ((struct cp_language_function *) + xmalloc (sizeof (struct cp_language_function))); bcopy ((char *) cp_function_chain, (char *) f, - sizeof (struct language_function)); + sizeof (struct cp_language_function)); DECL_SAVED_FUNCTION_DATA (decl) = f; /* Clear out the bits we don't need. */ - f->x_stmt_tree.x_last_stmt = NULL_TREE; - f->x_stmt_tree.x_last_expr_type = NULL_TREE; + f->base.x_stmt_tree.x_last_stmt = NULL_TREE; + f->base.x_stmt_tree.x_last_expr_type = NULL_TREE; f->x_result_rtx = NULL_RTX; f->x_named_label_uses = NULL; f->bindings = NULL; @@ -14075,7 +14071,7 @@ finish_constructor_body () { /* Any return from a constructor will end up here. */ if (ctor_label) - add_tree (build_stmt (LABEL_STMT, ctor_label)); + add_stmt (build_stmt (LABEL_STMT, ctor_label)); /* Clear CTOR_LABEL so that finish_return_stmt knows to really generate the return, rather than a goto to CTOR_LABEL. */ @@ -14084,7 +14080,7 @@ finish_constructor_body () constructor to a return of `this'. */ finish_return_stmt (NULL_TREE); /* Mark the end of the constructor. */ - add_tree (build_stmt (CTOR_STMT)); + add_stmt (build_stmt (CTOR_STMT)); } /* At the end of every destructor we generate code to restore virtual @@ -14103,7 +14099,7 @@ finish_destructor_body () compound_stmt = begin_compound_stmt (/*has_no_scope=*/0); /* Any return from a destructor will end up here. */ - add_tree (build_stmt (LABEL_STMT, dtor_label)); + add_stmt (build_stmt (LABEL_STMT, dtor_label)); /* Generate the code to call destructor on base class. If this destructor belongs to a class with virtual functions, then set @@ -14896,10 +14892,10 @@ static void push_cp_function_context (f) struct function *f; { - struct language_function *p - = ((struct language_function *) - xcalloc (1, sizeof (struct language_function))); - f->language = p; + struct cp_language_function *p + = ((struct cp_language_function *) + xcalloc (1, sizeof (struct cp_language_function))); + f->language = (struct language_function *) p; /* It takes an explicit call to expand_body to generate RTL for a function. */ @@ -14907,7 +14903,7 @@ push_cp_function_context (f) /* Whenever we start a new function, we destroy temporaries in the usual way. */ - current_stmt_tree->stmts_are_full_exprs_p = 1; + current_stmt_tree ()->stmts_are_full_exprs_p = 1; } /* Free the language-specific parts of F, now that we've finished @@ -14926,7 +14922,7 @@ pop_cp_function_context (f) static void mark_lang_function (p) - struct language_function *p; + struct cp_language_function *p; { if (!p) return; @@ -14941,7 +14937,7 @@ mark_lang_function (p) ggc_mark_rtx (p->x_result_rtx); mark_named_label_lists (&p->x_named_labels, &p->x_named_label_uses); - mark_stmt_tree (&p->x_stmt_tree); + mark_stmt_tree (&p->base.x_stmt_tree); mark_binding_level (&p->bindings); } @@ -14951,7 +14947,7 @@ static void mark_cp_function_context (f) struct function *f; { - mark_lang_function (f->language); + mark_lang_function ((struct cp_language_function *) f->language); } void diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 68f92b6..f39f37f 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1228,11 +1228,11 @@ build_aggr_init (exp, init, flags) TREE_TYPE (exp) = TYPE_MAIN_VARIANT (type); begin_init_stmts (&stmt_expr, &compound_stmt); destroy_temps = stmts_are_full_exprs_p (); - current_stmt_tree->stmts_are_full_exprs_p = 0; + current_stmt_tree ()->stmts_are_full_exprs_p = 0; expand_aggr_init_1 (TYPE_BINFO (type), exp, exp, init, LOOKUP_NORMAL|flags); stmt_expr = finish_init_stmts (stmt_expr, compound_stmt); - current_stmt_tree->stmts_are_full_exprs_p = destroy_temps; + current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps; TREE_TYPE (exp) = type; TREE_READONLY (exp) = was_const; TREE_THIS_VOLATILE (exp) = was_volatile; @@ -2873,7 +2873,7 @@ build_vec_init (decl, base, maxindex, init, from_array) begin_init_stmts (&stmt_expr, &compound_stmt); destroy_temps = stmts_are_full_exprs_p (); - current_stmt_tree->stmts_are_full_exprs_p = 0; + current_stmt_tree ()->stmts_are_full_exprs_p = 0; rval = get_temp_regvar (ptype, cp_convert (ptype, default_conversion (base))); base = get_temp_regvar (ptype, rval); @@ -3035,9 +3035,9 @@ build_vec_init (decl, base, maxindex, init, from_array) } else { - current_stmt_tree->stmts_are_full_exprs_p = 1; + current_stmt_tree ()->stmts_are_full_exprs_p = 1; finish_expr_stmt (elt_init); - current_stmt_tree->stmts_are_full_exprs_p = 0; + current_stmt_tree ()->stmts_are_full_exprs_p = 0; } finish_expr_stmt (build_modify_expr @@ -3087,7 +3087,7 @@ build_vec_init (decl, base, maxindex, init, from_array) finish_expr_stmt (rval); stmt_expr = finish_init_stmts (stmt_expr, compound_stmt); - current_stmt_tree->stmts_are_full_exprs_p = destroy_temps; + current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps; return stmt_expr; } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8b1efab..0435e2f 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -48,27 +48,20 @@ static tree maybe_convert_cond PARAMS ((tree)); static tree simplify_aggr_init_exprs_r PARAMS ((tree *, int *, void *)); -static tree prune_unused_decls PARAMS ((tree *, int *, void *)); static void deferred_type_access_control PARAMS ((void)); static void emit_associated_thunks PARAMS ((tree)); -/* Record the fact that STMT was the last statement added to the - statement tree. */ - -#define SET_LAST_STMT(stmt) \ - (current_stmt_tree->x_last_stmt = (stmt)) - /* When parsing a template, LAST_TREE contains the last statement parsed. These are chained together through the TREE_CHAIN field, but often need to be re-organized since the parse is performed bottom-up. This macro makes LAST_TREE the indicated SUBSTMT of STMT. */ -#define RECHAIN_STMTS(stmt, substmt) \ - do { \ - substmt = TREE_CHAIN (stmt); \ - TREE_CHAIN (stmt) = NULL_TREE; \ - SET_LAST_STMT (stmt); \ +#define RECHAIN_STMTS(stmt, substmt) \ + do { \ + substmt = TREE_CHAIN (stmt); \ + TREE_CHAIN (stmt) = NULL_TREE; \ + last_tree = stmt; \ } while (0) /* Finish processing the COND, the SUBSTMT condition for STMT. */ @@ -108,7 +101,19 @@ set_current_function_name_declared (i) int stmts_are_full_exprs_p () { - return current_stmt_tree->stmts_are_full_exprs_p; + return current_stmt_tree ()->stmts_are_full_exprs_p; +} + +/* Returns the stmt_tree (if any) to which statements are currently + being added. If there is no active statement-tree, NULL is + returned. */ + +stmt_tree +current_stmt_tree () +{ + return (cfun + ? &cfun->language->x_stmt_tree + : &scope_chain->x_stmt_tree); } /* One if we have already declared __FUNCTION__ (and related @@ -170,20 +175,6 @@ do_pushlevel () } } -/* T is a statement. Add it to the statement-tree. */ - -void -add_tree (t) - tree t; -{ - /* Add T to the statement-tree. */ - TREE_CHAIN (last_tree) = t; - SET_LAST_STMT (t); - /* When we expand a statement-tree, we must know whether or not the - statements are full-expresions. We record that fact here. */ - STMT_IS_FULL_EXPR_P (last_tree) = stmts_are_full_exprs_p (); -} - /* Finish a goto-statement. */ void @@ -207,7 +198,7 @@ finish_goto_stmt (destination) check_goto (destination); - add_tree (build_stmt (GOTO_STMT, destination)); + add_stmt (build_stmt (GOTO_STMT, destination)); } /* COND is the condition-expression for an if, while, etc., @@ -251,7 +242,7 @@ finish_expr_stmt (expr) if (!processing_template_decl) expr = break_out_cleanups (expr); - add_tree (build_stmt (EXPR_STMT, expr)); + add_stmt (build_stmt (EXPR_STMT, expr)); } finish_stmt (); @@ -271,7 +262,7 @@ begin_if_stmt () tree r; do_pushlevel (); r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); return r; } @@ -295,7 +286,7 @@ finish_then_clause (if_stmt) tree if_stmt; { RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt)); - SET_LAST_STMT (if_stmt); + last_tree = if_stmt; return if_stmt; } @@ -346,7 +337,7 @@ begin_while_stmt () { tree r; r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); do_pushlevel (); return r; } @@ -382,7 +373,7 @@ tree begin_do_stmt () { tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); return r; } @@ -440,7 +431,7 @@ finish_return_stmt (expr) return; } } - add_tree (build_stmt (RETURN_STMT, expr)); + add_stmt (build_stmt (RETURN_STMT, expr)); finish_stmt (); } @@ -454,7 +445,7 @@ begin_for_stmt () r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE); NEW_FOR_SCOPE_P (r) = flag_new_for_scope > 0; - add_tree (r); + add_stmt (r); if (NEW_FOR_SCOPE_P (r)) { do_pushlevel (); @@ -521,7 +512,7 @@ finish_for_stmt (for_stmt) void finish_break_stmt () { - add_tree (build_stmt (BREAK_STMT)); + add_stmt (build_stmt (BREAK_STMT)); } /* Finish a continue-statement. */ @@ -529,7 +520,7 @@ finish_break_stmt () void finish_continue_stmt () { - add_tree (build_stmt (CONTINUE_STMT)); + add_stmt (build_stmt (CONTINUE_STMT)); } /* Begin a switch-statement. Returns a new SWITCH_STMT if @@ -540,7 +531,7 @@ begin_switch_stmt () { tree r; r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); do_pushlevel (); return r; } @@ -593,7 +584,7 @@ finish_case_label (low_value, high_value) { /* Add a representation for the case label to the statement tree. */ - add_tree (build_stmt (CASE_LABEL, low_value, high_value)); + add_stmt (build_stmt (CASE_LABEL, low_value, high_value)); /* And warn about crossing initializations, etc. */ if (!processing_template_decl) define_case_label (); @@ -649,7 +640,7 @@ tree begin_try_block () { tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); return r; } @@ -660,7 +651,7 @@ begin_function_try_block () { tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE); FN_TRY_BLOCK_P (r) = 1; - add_tree (r); + add_stmt (r); return r; } @@ -761,7 +752,7 @@ begin_handler () { tree r; r = build_stmt (HANDLER, NULL_TREE, NULL_TREE); - add_tree (r); + add_stmt (r); do_pushlevel (); return r; } @@ -813,7 +804,7 @@ void begin_catch_block (type) tree type; { - add_tree (build (START_CATCH_STMT, type)); + add_stmt (build (START_CATCH_STMT, type)); } /* Finish a handler, which may be given by HANDLER. The BLOCKs are @@ -861,7 +852,7 @@ begin_compound_stmt (has_no_scope) if (last_tree && TREE_CODE (last_tree) == TRY_BLOCK) is_try = 1; - add_tree (r); + add_stmt (r); if (has_no_scope) COMPOUND_STMT_NO_SCOPE (r) = 1; @@ -957,7 +948,7 @@ finish_asm_stmt (cv_qualifier, string, output_operands, r = build_stmt (ASM_STMT, cv_qualifier, string, output_operands, input_operands, clobbers); - add_tree (r); + add_stmt (r); } /* Finish a label with the indicated NAME. */ @@ -967,7 +958,7 @@ finish_label_stmt (name) tree name; { tree decl = define_label (input_filename, lineno, name); - add_tree (build_stmt (LABEL_STMT, decl)); + add_stmt (build_stmt (LABEL_STMT, decl)); } /* Finish a series of declarations for local labels. G++ allows users @@ -993,7 +984,7 @@ add_decl_stmt (decl) /* We need the type to last until instantiation time. */ decl_stmt = build_stmt (DECL_STMT, decl); - add_tree (decl_stmt); + add_stmt (decl_stmt); } /* Generate the RTL for a SUBOBJECT. */ @@ -1014,7 +1005,7 @@ finish_subobject (cleanup) tree cleanup; { tree r = build_stmt (SUBOBJECT, cleanup); - add_tree (r); + add_stmt (r); } /* When DECL goes out of scope, make sure that CLEANUP is executed. */ @@ -1024,7 +1015,7 @@ finish_decl_cleanup (decl, cleanup) tree decl; tree cleanup; { - add_tree (build_stmt (CLEANUP_STMT, decl, cleanup)); + add_stmt (build_stmt (CLEANUP_STMT, decl, cleanup)); } /* Generate the RTL for a RETURN_INIT. */ @@ -1103,10 +1094,10 @@ finish_named_return_value (return_id, init) if (!processing_template_decl) { cp_finish_decl (decl, init, NULL_TREE, 0); - add_tree (build_stmt (RETURN_INIT, NULL_TREE, NULL_TREE)); + add_stmt (build_stmt (RETURN_INIT, NULL_TREE, NULL_TREE)); } else - add_tree (build_stmt (RETURN_INIT, return_id, init)); + add_stmt (build_stmt (RETURN_INIT, return_id, init)); } /* Don't use tree-inlining for functions with named return values. @@ -1192,7 +1183,7 @@ setup_vtbl_ptr (member_init_list, base_init_list) if (DECL_CONSTRUCTOR_P (current_function_decl)) { if (processing_template_decl) - add_tree (build_min_nt + add_stmt (build_min_nt (CTOR_INITIALIZER, member_init_list, base_init_list)); else @@ -1202,7 +1193,7 @@ setup_vtbl_ptr (member_init_list, base_init_list) /* Mark the beginning of the constructor. */ ctor_stmt = build_stmt (CTOR_STMT); CTOR_BEGIN_P (ctor_stmt) = 1; - add_tree (ctor_stmt); + add_stmt (ctor_stmt); /* And actually initialize the base-classes and members. */ emit_base_init (member_init_list, base_init_list); @@ -1299,7 +1290,7 @@ add_scope_stmt (begin_p, partial_p) } /* Add the new statement to the statement-tree. */ - add_tree (ss); + add_stmt (ss); return top; } @@ -1391,7 +1382,7 @@ finish_stmt_expr (rtl_expr) /* Remove the compound statement from the tree structure; it is now saved in the STMT_EXPR. */ - SET_LAST_STMT (rtl_expr); + last_tree = rtl_expr; TREE_CHAIN (last_tree) = NULL_TREE; /* If we created a statement-tree for this statement-expression, @@ -2223,103 +2214,6 @@ finish_typeof (expr) return TREE_TYPE (expr); } -/* Remove declarations of internal variables that are not used from a - stmt tree. To qualify, the variable must have a name and must have - a zero DECL_SOURCE_LINE. We tried to remove all variables for - which TREE_USED was false, but it turns out that there's tons of - variables for which TREE_USED is false but that are still in fact - used. */ - -static tree -prune_unused_decls (tp, walk_subtrees, data) - tree *tp; - int *walk_subtrees ATTRIBUTE_UNUSED; - void *data ATTRIBUTE_UNUSED; -{ - tree t = *tp; - - if (t == NULL_TREE) - { - *walk_subtrees = 0; - return NULL_TREE; - } - - if (TREE_CODE (t) == DECL_STMT) - { - tree d = DECL_STMT_DECL (t); - if (!TREE_USED (d) && DECL_NAME (d) && DECL_SOURCE_LINE (d) == 0) - { - *tp = TREE_CHAIN (t); - /* Recurse on the new value of tp, otherwise we will skip - the next statement. */ - return prune_unused_decls (tp, walk_subtrees, data); - } - } - else if (TREE_CODE (t) == SCOPE_STMT) - { - /* Remove all unused decls from the BLOCK of this SCOPE_STMT. */ - tree block = SCOPE_STMT_BLOCK (t); - - if (block) - { - tree *vp; - - for (vp = &BLOCK_VARS (block); *vp; ) - { - tree v = *vp; - if (! TREE_USED (v) && DECL_NAME (v) && DECL_SOURCE_LINE (v) == 0) - *vp = TREE_CHAIN (v); /* drop */ - else - vp = &TREE_CHAIN (v); /* advance */ - } - /* If there are now no variables, the entire BLOCK can be dropped. - (This causes SCOPE_NULLIFIED_P (t) to be true.) */ - if (BLOCK_VARS (block) == NULL_TREE) - SCOPE_STMT_BLOCK (t) = NULL_TREE; - } - } - return NULL_TREE; -} - -/* Create an empty statement tree rooted at T. */ - -void -begin_stmt_tree (t) - tree *t; -{ - /* We create a trivial EXPR_STMT so that last_tree is never NULL in - what follows. We remove the extraneous statement in - finish_stmt_tree. */ - *t = build_nt (EXPR_STMT, void_zero_node); - SET_LAST_STMT (*t); - last_expr_type = NULL_TREE; -} - -/* Finish the statement tree rooted at T. */ - -void -finish_stmt_tree (t) - tree *t; -{ - tree stmt; - - /* Remove the fake extra statement added in begin_stmt_tree. */ - stmt = TREE_CHAIN (*t); - *t = stmt; - SET_LAST_STMT (NULL_TREE); - - /* Remove unused decls from the stmt tree. */ - walk_stmt_tree (t, prune_unused_decls, NULL); - - if (cfun) - { - /* The line-number recorded in the outermost statement in a function - is the line number of the end of the function. */ - STMT_LINENO (stmt) = lineno; - STMT_LINENO_FOR_FN_P (stmt) = 1; - } -} - /* We're about to expand T, a statement. Set up appropriate context for the substitution. */ @@ -2329,7 +2223,7 @@ prep_stmt (t) { if (!STMT_LINENO_FOR_FN_P (t)) lineno = STMT_LINENO (t); - current_stmt_tree->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t); + current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t); } /* Generate RTL for the statement T, and its substatements, and any @@ -2453,7 +2347,8 @@ lang_expand_stmt (t) } /* Restore saved state. */ - current_stmt_tree->stmts_are_full_exprs_p = saved_stmts_are_full_exprs_p; + current_stmt_tree ()->stmts_are_full_exprs_p = + saved_stmts_are_full_exprs_p; /* Go on to the next statement in this scope. */ t = TREE_CHAIN (t); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 0f88669..396b5c4 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -42,7 +42,6 @@ static cp_lvalue_kind lvalue_p_1 PARAMS ((tree, int)); static tree no_linkage_helper PARAMS ((tree *, int *, void *)); static tree build_srcloc PARAMS ((const char *, int)); static void mark_list_hash PARAMS ((void *)); -static int statement_code_p PARAMS ((enum tree_code)); static tree mark_local_for_remap_r PARAMS ((tree *, int *, void *)); static tree cp_unsave_r PARAMS ((tree *, int *, void *)); static void cp_unsave PARAMS ((tree *)); @@ -50,6 +49,7 @@ static tree build_target_expr PARAMS ((tree, tree)); static tree count_trees_r PARAMS ((tree *, int *, void *)); static tree verify_stmt_tree_r PARAMS ((tree *, int *, void *)); static tree find_tree_r PARAMS ((tree *, int *, void *)); +extern int cp_statement_code_p PARAMS ((enum tree_code)); /* If REF is an lvalue, returns the kind of lvalue that REF is. Otherwise, returns clk_none. If TREAT_CLASS_RVALUES_AS_LVALUES is @@ -1071,33 +1071,18 @@ is_aggr_type_2 (t1, t2) /* Returns non-zero if CODE is the code for a statement. */ -static int -statement_code_p (code) +int +cp_statement_code_p (code) enum tree_code code; { switch (code) { - case EXPR_STMT: - case COMPOUND_STMT: - case DECL_STMT: - case IF_STMT: - case FOR_STMT: - case WHILE_STMT: - case DO_STMT: - case RETURN_STMT: - case BREAK_STMT: - case CONTINUE_STMT: - case SWITCH_STMT: - case GOTO_STMT: - case LABEL_STMT: - case ASM_STMT: case SUBOBJECT: case CLEANUP_STMT: case START_CATCH_STMT: case CTOR_STMT: case SCOPE_STMT: case CTOR_INITIALIZER: - case CASE_LABEL: case RETURN_INIT: case TRY_BLOCK: case HANDLER: @@ -1223,9 +1208,9 @@ copy_template_template_parm (t, newargs) /* Apply FUNC to all the sub-trees of TP in a pre-order traversal. FUNC is called with the DATA and the address of each sub-tree. If FUNC returns a non-NULL value, the traversal is aborted, and the - value returned by FUNC is returned. The FLAGS govern the way in - which nodes are walked. If HTAB is non-NULL it is used to record - the nodes visited, and to avoid visiting a node more than once. */ + value returned by FUNC is returned. If HTAB is non-NULL it is used + to record the nodes visited, and to avoid visiting a node more than + once. */ tree walk_tree (tp, func, data, htab) @@ -1455,73 +1440,6 @@ walk_tree_without_duplicates (tp, func, data) return result; } -/* Like walk_tree, but only examines statement nodes. We don't need a - without_duplicates variant of this one because the statement tree is - a tree, not a graph. */ - -tree -walk_stmt_tree (tp, func, data) - tree *tp; - walk_tree_fn func; - void *data; -{ - enum tree_code code; - int walk_subtrees; - tree result; - int i, len; - -#define WALK_SUBTREE(NODE) \ - do \ - { \ - result = walk_stmt_tree (&(NODE), func, data); \ - if (result) \ - return result; \ - } \ - while (0) - - /* Skip empty subtrees. */ - if (!*tp) - return NULL_TREE; - - /* Skip subtrees below non-statement nodes. */ - if (!statement_code_p (TREE_CODE (*tp))) - return NULL_TREE; - - /* Call the function. */ - walk_subtrees = 1; - result = (*func) (tp, &walk_subtrees, data); - - /* If we found something, return it. */ - if (result) - return result; - - /* Even if we didn't, FUNC may have decided that there was nothing - interesting below this point in the tree. */ - if (!walk_subtrees) - return NULL_TREE; - - /* FUNC may have modified the tree, recheck that we're looking at a - statement node. */ - code = TREE_CODE (*tp); - if (!statement_code_p (code)) - return NULL_TREE; - - /* Walk over all the sub-trees of this operand. Statement nodes never - contain RTL, and we needn't worry about TARGET_EXPRs. */ - len = TREE_CODE_LENGTH (code); - - /* Go through the subtrees. We need to do this in forward order so - that the scope of a FOR_EXPR is handled properly. */ - for (i = 0; i < len; ++i) - WALK_SUBTREE (TREE_OPERAND (*tp, i)); - - /* Finally visit the chain. This can be tail-recursion optimized if - we write it this way. */ - return walk_stmt_tree (&TREE_CHAIN (*tp), func, data); - -#undef WALK_SUBTREE -} - /* Called from count_trees via walk_tree. */ static tree @@ -2477,6 +2395,7 @@ init_tree () { make_lang_type_fn = cp_make_lang_type; lang_unsave = cp_unsave; + lang_statement_code_p = cp_statement_code_p; ggc_add_root (list_hash_table, ARRAY_SIZE (list_hash_table), sizeof (struct list_hash *), |