diff options
Diffstat (limited to 'contrib/gcc/c-iterate.c')
| -rw-r--r-- | contrib/gcc/c-iterate.c | 62 |
1 files changed, 35 insertions, 27 deletions
diff --git a/contrib/gcc/c-iterate.c b/contrib/gcc/c-iterate.c index b35a167a46cd..b8f51d090d63 100644 --- a/contrib/gcc/c-iterate.c +++ b/contrib/gcc/c-iterate.c @@ -1,5 +1,5 @@ /* Build expressions with type checking for C compiler. - Copyright (C) 1987, 1988, 1989, 1992, 1993 Free Software Foundation, Inc. + Copyright (C) 1987, 88, 89, 92, 93, 96, 1997 Free Software Foundation, Inc. This file is part of GNU CC. @@ -24,26 +24,14 @@ Boston, MA 02111-1307, USA. */ both their declarations and the expansion of statements using them. */ #include "config.h" -#include <stdio.h> +#include "system.h" #include "tree.h" #include "c-tree.h" #include "flags.h" #include "obstack.h" #include "rtl.h" - -static void expand_stmt_with_iterators_1 (); -static tree collect_iterators (); -static void iterator_loop_prologue (); -static void iterator_loop_epilogue (); -static void add_ixpansion (); -static void delete_ixpansion(); -static int top_level_ixpansion_p (); -static void istack_sublevel_to_current (); - -/* A special obstack, and a pointer to the start of - all the data in it (so we can free everything easily). */ -static struct obstack ixp_obstack; -static char *ixp_firstobj; +#include "toplev.h" +#include "expr.h" /* KEEPING TRACK OF EXPANSIONS @@ -96,11 +84,26 @@ struct iter_stack_node }; struct iter_stack_node *iter_stack; - struct iter_stack_node sublevel_ixpansions; +/* A special obstack, and a pointer to the start of + all the data in it (so we can free everything easily). */ +static struct obstack ixp_obstack; +static char *ixp_firstobj; + /* During collect_iterators, a list of SAVE_EXPRs already scanned. */ static tree save_exprs; + +static void expand_stmt_with_iterators_1 PROTO((tree, tree)); +static tree collect_iterators PROTO((tree, tree)); +static void iterator_loop_prologue PROTO((tree, rtx *, rtx *)); +static void iterator_loop_epilogue PROTO((tree, rtx *, rtx *)); +static int top_level_ixpansion_p PROTO((void)); +static void isn_append PROTO((struct iter_stack_node *, + struct iter_stack_node *)); +static void istack_sublevel_to_current PROTO((void)); +static void add_ixpansion PROTO((tree, rtx, rtx, rtx, rtx)); +static void delete_ixpansion PROTO((tree)); /* Initialize our obstack once per compilation. */ @@ -254,6 +257,8 @@ collect_iterators (exp, list) break; case RTL_EXPR: return list; + default: + break; } for (i = 0; i < num_args; i++) @@ -283,7 +288,8 @@ iterator_loop_prologue (idecl, start_note, end_note) /* Force the save_expr in DECL_INITIAL to be calculated if it hasn't been calculated yet. */ - expand_expr (DECL_INITIAL (idecl), const0_rtx, VOIDmode, 0); + expand_expr (DECL_INITIAL (idecl), const0_rtx, VOIDmode, + EXPAND_NORMAL); if (DECL_RTL (idecl) == 0) expand_decl (idecl); @@ -294,7 +300,7 @@ iterator_loop_prologue (idecl, start_note, end_note) /* Initialize counter. */ expr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, integer_zero_node); TREE_SIDE_EFFECTS (expr) = 1; - expand_expr (expr, const0_rtx, VOIDmode, 0); + expand_expr (expr, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_start_loop_continue_elsewhere (1); @@ -335,7 +341,7 @@ iterator_loop_epilogue (idecl, start_note, end_note) incr = build_binary_op (PLUS_EXPR, idecl, integer_one_node, 0); incr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, incr); TREE_SIDE_EFFECTS (incr) = 1; - expand_expr (incr, const0_rtx, VOIDmode, 0); + expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL); test = build_binary_op (LT_EXPR, idecl, DECL_INITIAL (idecl), 0); expand_exit_loop_if_false (0, test); expand_end_loop (); @@ -343,7 +349,9 @@ iterator_loop_epilogue (idecl, start_note, end_note) ITERATOR_BOUND_P (idecl) = 0; /* we can reset rtl since there is not chance that this expansion */ /* would be superseded by a higher level one */ - if (top_level_ixpansion_p ()) + /* but don't do this if the decl is static, since we need to share */ + /* the same decl in that case. */ + if (top_level_ixpansion_p () && ! TREE_STATIC (idecl)) DECL_RTL (idecl) = 0; if (end_note) *end_note = emit_note (0, NOTE_INSN_DELETED); @@ -409,7 +417,7 @@ void push_iterator_stack () { struct iter_stack_node *new_top - = (struct iter_stack_node*) + = (struct iter_stack_node *) obstack_alloc (&ixp_obstack, sizeof (struct iter_stack_node)); new_top->first = 0; @@ -442,15 +450,15 @@ add_ixpansion (idecl, pro_start, pro_end, epi_start, epi_end) tree idecl; rtx pro_start, pro_end, epi_start, epi_end; { - struct ixpansion* newix; + struct ixpansion *newix; /* Do nothing if we are not inside "({...})", as in that case this expansion can't need subsequent RTL modification. */ if (iter_stack == 0) return; - newix = (struct ixpansion*) obstack_alloc (&ixp_obstack, - sizeof (struct ixpansion)); + newix = (struct ixpansion *) obstack_alloc (&ixp_obstack, + sizeof (struct ixpansion)); newix->ixdecl = idecl; newix->ixprologue_start = pro_start; newix->ixprologue_end = pro_end; @@ -471,7 +479,7 @@ static void delete_ixpansion (idecl) tree idecl; { - struct ixpansion* previx = 0, *ix; + struct ixpansion *previx = 0, *ix; for (ix = sublevel_ixpansions.first; ix; ix = ix->next) if (ix->ixdecl == idecl) @@ -577,7 +585,7 @@ pixl (head) return head; } -/* Print Iterator Stack*/ +/* Print Iterator Stack. */ void pis () |
