diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-09-17 07:38:23 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-09-17 07:38:23 +0000 |
commit | e41f0d80e9a4aba0523a95d39a11ac03480a3be2 (patch) | |
tree | 45edb9dcda813de0e477165a8b093d17332bda80 /gcc/c-semantics.c | |
parent | 1fa8fd5c156a1b0313a58c0f0bd2f35e3c47e767 (diff) | |
download | gcc-e41f0d80e9a4aba0523a95d39a11ac03480a3be2.tar.gz |
* splay-tree.c (splay_tree_predecessor): Fix typo in comment.
Convert the C front-end to use function-at-a-time mode.
* c-common.h: Include splay-tree.h.
(C_DECLARED_LABEL_FLAG): New macro.
(struct language_function): Add x_scope_stmt_stack and
x_function_name_declared_p.
(RECHAIN_STMTS): Move definition.
(lang_statment_code_p): Likewise.
(lang_expand_stmt): Likewise.
(lang_expand_decl_stmt): New variable.
(lang_expand_function_end): Likewise.
(current_scope_stmt_stack): New function.
(add_decl_stmt): Likewise.
(add_scope_stmt): Likewise.
(mark_stmt_tree): Likewise.
(struct c_lang_decl): New structure.
(DECL_SAVED_TREE): Define.
(c_mark_lang_decl): New function.
(c_expand_start_cond): Change prototype.
(c_finish_then): New function.
(c_finish_else): Likewise.
(current_function_name_declared): Remove.
(set_current_function_name_declared): Likewise.
(mark_c_language_function): Declare.
(case_compare): Likewise.
(c_add_case_label): Likewise.
(c_expand_expr): Likewise.
(c_safe_from_p): Likewise.
* c-common.c (lang_expand_function_end): New variable.
(struct if_elt): Add if_stmt.
(c_expand_start_cond): Add the if-statement to the statement-tree,
rather than generating RTL.
(c_finish_then): New function.
(c_expand_start_else): Don't generate RTL.
(c_finish_else): New function.
(c_expand_expr_stmt): Don't generate RTL.
(statement_code_p): Add SCOPE_STMT.
(case_compare): New function.
(c_add_case_label): Likewise.
(mark_stmt_tree): Likewise.
(c_mark_lang_decl): Likewise.
(mark_c_language_function): Likewise.
(c_expand_expr): Likewise.
(c_safe_from_p): Likewise.
* c-decl.c (c_stmt_tree): New variable
(c_scope_stmt_stack): Likewise.
(c_function_name_declared_p): Likewise.
(lang_expand_expr_stmt): Remove.
(poplevel): Don't call output_inline_function for nested
functions.
(pushdecl): Don't set DECL_CONTEXT for a local declaration of an
`extern' function.
(redeclaration_error_message): Change means of computing whether
or not a function is nested.
(lookup_label): Don't call label_rtx.
(init_decl_processing): Add more GC roots.
(start_decl): Add DECL_STMTs to the statement-tree, rather than
calling rest_of_decl_compilation.
(finish_decl): Don't call expand_decl.
(store_parm_decls): Begin the statement-tree, but don't generate
RTL.
(finish_function): Tie off the statement-tree. Call c_expand_body
if appropriate.
(c_expand_body): New function.
(push_c_function_context): Save more information.
(pop_c_function_contxt): Likewise.
(copy_lang_decl): Now that we use DECL_LANG_SPECIFIC, copy it.
(lang_mark_tree): Mark it.
(current_stmt_tree): Adjust.
(current_scope_stmt_stack): New function.
(do_case): Remove.
(set_current_name_declared): Likewise.
(c_begin_compound_stmt): Define.
(c_expand_decl_stmt): Likewise.
* c-lang.c: Include rtl.h and expr.h.
(lang_init): Set more language-specific hooks.
* c-lex.c: Include expr.h.
* c-parse.in: Changes throughout to add statements to the
statement-tree, rather than generating RTL after every statement.
* c-semantics.c (lang_expand_decl_stmt): Define.
(add_decl_stmt): New function.
(add_scope_stmt): Likewise.
(finish_stmt_tree): Tweak.
(genrtl_expr_stmt): Likewise.
(genrtl_decl_stmt): Handle local labels, and call
lang_expand_decl_stmt if required.
(genrtl_for_stmt): Fix line-number handling.
(genrtl_case_label): Handle cleanups.
(genrtl_asm_stmt): Don't call combine_strings.
(genrtl_compound_stmt): Simplify.
(expand_stmt): Handle SCOPE_STMTs.
* c-tree.h (struct lang_decl): New structure.
(C_DECLARED_LABEL_FLAG): Remove.
(c_begin_compound_stmt): Declare.
(c_expand_decl_stmt): Likewise.
(c_expand_start_case): Rename to c_start_case.
(c_finish_case): New function.
* c-typeck.c (start_init): Tweak setting of
constructor_incremental.
(c_expand_asm_operands): Tweak error-handling. Add to the
statement-tree.
(c_expand_return): Add to the statement-tree.
(c_expand_start_case): Rename to ...
(c_start_case): ... this.
(struct c_switch): New type.
(switch_stack): New variable.
(do_case): Simplify.
(c_finish_case): New function.
* dependence.c: Include expr.h.
(enum dependence_type): Change spelling of enumerals.
(check_node_dependence): Adjust.
* expr.h (lang_safe_from_p): Declare.
(safe_from_p): Likewise.
* expr.c (lang_safe_from_p): New variable.
(safe_from_p): Give it external linkage. Use lang_safe_from_p.
* stmt.c (expand_expr_stmt): Avoid clobberring of last_expr_type.
* toplev.c (rest_of_decl_compilation): Robustify.
* tree.c (contains_placeholder_p): Likewise.
* Makefile.in: Update dependencies.
* objc/objc-act.h: Adjust calculation of value for dummy_tree_code.
* objc/objc-act.c: Include rtl.h, expr.h, and c-common.h.
(objc_expand_function_end): New function.
(finish_method_def): Use it.
(init_objc): Initialize more language-specific hooks.
* objc/Make-lang.in: Update dependencies.
* cp-tree.h (struct cp_language_function): Remove
x_scope_stmt_stack and name_declared.
(current_scope_stmt_stack): Remove.
(function_name_declared_p): New macro.
(struct lang_decl_flags): Use c_lang_decl as a base class.
(context): Remove.
(struct lang_decl): Replace saved_tree with context.
(DECL_FRIEND_CONTEXT): Adjust accordingly.
(SET_DECL_FRIEND_CONTEXT): Likewise.
(DECL_VIRTUAL_CONTEXT): Likewise.
(DECL_SAVED_TREE): Remove.
(C_DECLARED_LABEL_FLAG): Likewise.
(cplus_expand_expr_stmt): Don't declare.
(add_decl_stmt): Likewise.
(add_scope_stmt): Likewise.
* decl.c (mark_stmt_tree): Remove.
(case_compare): Likewise.
(finish_case_label): Use c_add_case_label.
(init_decl_processing): Set more language-specific hooks.
(build_enumerator): Fix typo in comment.
(cplus_expand_expr_stmt): Remove.
(mark_lang_function): Use mark_c_language_function.
(lang_mark_tree): Use c_mark_lang_decl.
* decl2.c: Change order of inclusion.
* except.c: Likewise.
* expr.c (cplus_expand_expr): Remove handling of STMT_EXPR. Fall
back on c_expand_expr.
* friend.c: Include expr.h.
* init.c: Change order of inclusion.
* Makefile.in: Update dependencies.
* lex.h (free_lang_decl_chain): Remove.
* optimize.c (maybe_clone_body): Use function_name_declared_p.
* pt.c (build_template_decl): Don't copy DECL_VIRTUAL_CONTEXT if
it doesn't exist.
(instantiate_decl): Use function_name_declared_p.
* semantics.c (lang_expand_expr_stmt): Remove.
(set_current_function_name_declared): Likewise.
(current_function_name_declared): Likewise.
(begin_compound_stmt): Use function_name_declared_p.
(add_decl_stmt): Remove.
(setup_vtbl_ptr): Use function_name_declared_p.
(add_scope_stmt): Remove.
(current_scope_stmt_stack): New function.
(cp_expand_stmt): Don't handle SCOPE_STMTs.
(expand_body): Use function_name_declared_p.
* tree.c (cp_statement_code_p): Don't include SCOPE_STMT.
* typeck.c: Change order of includes.
(convert_sequence): Remove.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36464 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 130 |
1 files changed, 110 insertions, 20 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index f1b54c4cfd2..b349bd383e9 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -40,6 +40,13 @@ Boston, MA 02111-1307, USA. */ expanding statements. */ void (*lang_expand_stmt) PARAMS ((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) PARAMS ((tree)); + static tree prune_unused_decls PARAMS ((tree *, int *, void *)); /* Create an empty statement tree rooted at T. */ @@ -71,6 +78,63 @@ add_stmt (t) return t; } +/* Create a declaration statement for the declaration given by the + DECL. */ + +void +add_decl_stmt (decl) + 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); +} + +/* Add a scope-statement to the statement-tree. BEGIN_P indicates + whether this statements opens or closes a scope. PARTIAL_P is true + for a partial scope, i.e, the scope that begins after a label when + an object that needs a cleanup is created. If BEGIN_P is nonzero, + returns a new TREE_LIST representing the top of the SCOPE_STMT + stack. The TREE_PURPOSE is the new SCOPE_STMT. If BEGIN_P is + zero, returns a TREE_LIST whose TREE_VALUE is the new SCOPE_STMT, + and whose TREE_PURPOSE is the matching SCOPE_STMT iwth + SCOPE_BEGIN_P set. */ + +tree +add_scope_stmt (begin_p, partial_p) + int begin_p; + int partial_p; +{ + tree ss; + tree top; + + /* Build the statement. */ + ss = build_stmt (SCOPE_STMT, NULL_TREE); + SCOPE_BEGIN_P (ss) = begin_p; + SCOPE_PARTIAL_P (ss) = partial_p; + + /* Keep the scope stack up to date. */ + if (begin_p) + { + *current_scope_stmt_stack () + = tree_cons (ss, NULL_TREE, *current_scope_stmt_stack ()); + top = *current_scope_stmt_stack (); + } + else + { + top = *current_scope_stmt_stack (); + TREE_VALUE (top) = ss; + *current_scope_stmt_stack () = TREE_CHAIN (top); + } + + /* Add the new statement to the statement-tree. */ + add_stmt (ss); + + return top; +} + /* 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 @@ -145,7 +209,7 @@ finish_stmt_tree (t) /* Remove unused decls from the stmt tree. */ walk_stmt_tree (t, prune_unused_decls, NULL); - if (cfun) + if (cfun && stmt) { /* The line-number recorded in the outermost statement in a function is the line number of the end of the function. */ @@ -305,7 +369,8 @@ genrtl_expr_stmt (expr) if (stmts_are_full_exprs_p ()) expand_start_target_temps (); - lang_expand_expr_stmt (expr); + if (expr != error_mark_node) + expand_expr_stmt (expr); if (stmts_are_full_exprs_p ()) expand_end_target_temps (); @@ -348,6 +413,11 @@ genrtl_decl_stmt (t) else make_rtl_for_local_static (decl); } + else if (TREE_CODE (decl) == LABEL_DECL + && C_DECLARED_LABEL_FLAG (decl)) + declare_nonlocal_label (decl); + else if (lang_expand_decl_stmt) + (*lang_expand_decl_stmt) (t); } /* Generate the RTL for T, which is an IF_STMT. */ @@ -448,30 +518,43 @@ void genrtl_for_stmt (t) tree t; { - tree tmp; tree cond; + const char *saved_filename; + int saved_lineno; + if (NEW_FOR_SCOPE_P (t)) genrtl_do_pushlevel (); expand_stmt (FOR_INIT_STMT (t)); + /* Expand the initialization. */ emit_nop (); emit_line_note (input_filename, lineno); expand_start_loop_continue_elsewhere (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. */ + saved_filename = input_filename; + saved_lineno = lineno; + + /* Expand the condition. */ emit_line_note (input_filename, lineno); if (cond) expand_exit_loop_if_false (0, cond); - genrtl_do_pushlevel (); - tmp = FOR_EXPR (t); + /* 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 (tmp) - genrtl_expr_stmt (tmp); + if (FOR_EXPR (t)) + genrtl_expr_stmt (FOR_EXPR (t)); expand_end_loop (); } @@ -575,6 +658,22 @@ genrtl_case_label (case_label) tree case_label; { tree duplicate; + tree cleanup; + + cleanup = last_cleanup_this_contour (); + if (cleanup) + { + static int explained = 0; + warning_with_decl (TREE_PURPOSE (cleanup), + "destructor needed for `%#D'"); + 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); } @@ -585,16 +684,6 @@ void genrtl_compound_stmt (t) tree t; { - /* If this is the outermost block of the function, declare the - variables __FUNCTION__, __PRETTY_FUNCTION__, and so forth. */ - if (cfun - && !current_function_name_declared () - && !COMPOUND_STMT_NO_SCOPE (t)) - { - set_current_function_name_declared (1); - declare_function_name (); - } - expand_stmt (COMPOUND_BODY (t)); } @@ -609,9 +698,6 @@ genrtl_asm_stmt (cv_qualifier, string, output_operands, tree input_operands; tree clobbers; { - if (TREE_CHAIN (string)) - string = combine_strings (string); - if (cv_qualifier != NULL_TREE && cv_qualifier != ridpointers[(int) RID_VOLATILE]) { @@ -733,6 +819,10 @@ expand_stmt (t) ASM_OUTPUTS (t), ASM_INPUTS (t), ASM_CLOBBERS (t)); break; + case SCOPE_STMT: + genrtl_scope_stmt (t); + break; + default: if (lang_expand_stmt) (*lang_expand_stmt) (t); |