diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-09-07 06:55:51 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-09-07 06:55:51 +0000 |
commit | 41fb2c183baec4e1959faca92a3e79916b1c5af8 (patch) | |
tree | 26b71c56ba6d8b613dd53a45e0c6e5aa848ee50d /gcc/c-semantics.c | |
parent | b83e87223f3b88c14509fdbf576d2fa737b13e2a (diff) | |
download | gcc-41fb2c183baec4e1959faca92a3e79916b1c5af8.tar.gz |
* c-common.h (prep_stmt): Declare.
(lang_expand_stmt): Likewise.
* c-decl.c (lang_expand_stmt): Remove.
* c-semantics.c (lang_expand_stmt): Define.
(prep_stmt): New function.
(expand_stmt): Handle common statement types here.
* cp-tree.h (init_cp_semantics): Declare.
(genrtl_try_block): Don't declare.
(genrtl_handler): Likewise.
(genrtl_catch_block): Likewise.
(genrtl_ctor_stmt): Likewise.
(genrtl_subobject): Likewise.
(genrtl_do_poplevel): Likewise.
(genrtl_named_return_value): Likewise.
* lex.c (init_parse): Call init_cp_semantics.
* semantics.c (genrtl_try_block): Give it internal linkage.
(genrtl_handler): Likewise.
(genrtl_catch_block): Likewise.
(genrtl_ctor_stmt): Likewise.
(genrtl_subobject): Likewise.
(genrtl_do_poplevel): Likewise.
(genrtl_named_return_value): Likewise.
(lang_expand_stmt): Rename to ...
(cp_expand_stmt): ... this. Only handle C++-specific nodes.
(init_cp_semantics): Define.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36229 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-semantics.c')
-rw-r--r-- | gcc/c-semantics.c | 107 |
1 files changed, 103 insertions, 4 deletions
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index eea9f9209e5..8a4cf91c6c4 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -36,6 +36,10 @@ Boston, MA 02111-1307, USA. */ #include "output.h" #include "timevar.h" +/* If non-NULL, the address of a language-specific function for + expanding statements. */ +void (*lang_expand_stmt) PARAMS ((tree)); + static tree prune_unused_decls PARAMS ((tree *, int *, void *)); /* Create an empty statement tree rooted at T. */ @@ -643,15 +647,110 @@ genrtl_decl_cleanup (decl, cleanup) expand_decl_cleanup (decl, cleanup); } +/* We're about to expand T, a statement. Set up appropriate context + for the substitution. */ + +void +prep_stmt (t) + tree 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); +} + /* Generate the RTL for the statement T, its substatements, and any other statements at its nesting level. */ -tree +void expand_stmt (t) tree t; { - tree rval; - rval = lang_expand_stmt (t); - return rval; + 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 RETURN_STMT: + genrtl_return_stmt (RETURN_EXPR (t)); + break; + + case EXPR_STMT: + genrtl_expr_stmt (EXPR_STMT_EXPR (t)); + 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 (); + break; + + case CONTINUE_STMT: + genrtl_continue_stmt (); + break; + + case SWITCH_STMT: + genrtl_switch_stmt (t); + break; + + case CASE_LABEL: + genrtl_case_label (CASE_LOW (t), CASE_HIGH (t)); + break; + + case LABEL_STMT: + expand_label (LABEL_STMT_LABEL (t)); + break; + + case GOTO_STMT: + genrtl_goto_stmt (GOTO_DESTINATION (t)); + break; + + case ASM_STMT: + genrtl_asm_stmt (ASM_CV_QUAL (t), ASM_STRING (t), + ASM_OUTPUTS (t), ASM_INPUTS (t), ASM_CLOBBERS (t)); + break; + + default: + if (lang_expand_stmt) + (*lang_expand_stmt) (t); + else + abort (); + break; + } + + /* Restore saved state. */ + 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); + } } |