summaryrefslogtreecommitdiff
path: root/contrib/gcc/c-iterate.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/c-iterate.c')
-rw-r--r--contrib/gcc/c-iterate.c62
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 ()