summaryrefslogtreecommitdiff
path: root/gcc/c-semantics.c
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-07 06:55:51 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-09-07 06:55:51 +0000
commit41fb2c183baec4e1959faca92a3e79916b1c5af8 (patch)
tree26b71c56ba6d8b613dd53a45e0c6e5aa848ee50d /gcc/c-semantics.c
parentb83e87223f3b88c14509fdbf576d2fa737b13e2a (diff)
downloadgcc-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.c107
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);
+ }
}