1 /* Build expressions with type checking for C compiler.
2 Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* This file is part of the C front end.
22 It is responsible for implementing iterators,
23 both their declarations and the expansion of statements using them. */
33 static void expand_stmt_with_iterators_1 ();
34 static tree collect_iterators();
35 static void iterator_loop_prologue ();
36 static void iterator_loop_epilogue ();
37 static void add_ixpansion ();
38 static void delete_ixpansion();
39 static int top_level_ixpansion_p ();
40 static void istack_sublevel_to_current ();
42 /* A special obstack, and a pointer to the start of
43 all the data in it (so we can free everything easily). */
44 static struct obstack ixp_obstack;
45 static char *ixp_firstobj;
48 KEEPING TRACK OF EXPANSIONS
50 In order to clean out expansions corresponding to statements inside
51 "{(...)}" constructs we have to keep track of all expansions. The
52 cleanup is needed when an automatic, or implicit, expansion on
53 iterator, say X, happens to a statement which contains a {(...)}
54 form with a statement already expanded on X. In this case we have
55 to go back and cleanup the inner expansion. This can be further
56 complicated by the fact that {(...)} can be nested.
58 To make this cleanup possible, we keep lists of all expansions, and
59 to make it work for nested constructs, we keep a stack. The list at
60 the top of the stack (ITER_STACK.CURRENT_LEVEL) corresponds to the
61 currently parsed level. All expansions of the levels below the
62 current one are kept in one list whose head is pointed to by
63 ITER_STACK.SUBLEVEL_FIRST (SUBLEVEL_LAST is there for making merges
64 easy). The process works as follows:
66 -- On "({" a new node is added to the stack by PUSH_ITERATOR_STACK.
67 The sublevel list is not changed at this point.
69 -- On "})" the list for the current level is appended to the sublevel
72 -- On ";" sublevel lists are appended to the current level lists.
73 The reason is this: if they have not been superseded by the
74 expansion at the current level, they still might be
75 superseded later by the expansion on the higher level.
76 The levels do not have to distinguish levels below, so we
77 can merge the lists together. */
81 tree ixdecl; /* Iterator decl */
82 rtx ixprologue_start; /* First insn of epilogue. NULL means */
83 /* explicit (FOR) expansion*/
87 struct ixpansion *next; /* Next in the list */
90 struct iter_stack_node
92 struct ixpansion *first; /* Head of list of ixpansions */
93 struct ixpansion *last; /* Last node in list of ixpansions */
94 struct iter_stack_node *next; /* Next level iterator stack node */
97 struct iter_stack_node *iter_stack;
99 struct iter_stack_node sublevel_ixpansions;
101 /* Initialize our obstack once per compilation. */
106 gcc_obstack_init (&ixp_obstack);
107 ixp_firstobj = (char *) obstack_alloc (&ixp_obstack, 0);
110 /* Handle the start of an explicit `for' loop for iterator IDECL. */
113 iterator_for_loop_start (idecl)
116 ITERATOR_BOUND_P (idecl) = 1;
117 add_ixpansion (idecl, 0, 0, 0, 0);
118 iterator_loop_prologue (idecl, 0, 0);
121 /* Handle the end of an explicit `for' loop for iterator IDECL. */
124 iterator_for_loop_end (idecl)
127 iterator_loop_epilogue (idecl, 0, 0);
128 ITERATOR_BOUND_P (idecl) = 0;
134 Iterators are implemented as integer decls with a special flag set
135 (rms's idea). This makes eliminates the need for special type
136 checking. The flag is accesed using the ITERATOR_P macro. Each
137 iterator's limit is saved as a decl with a special name. The decl is
138 initialized with the limit value -- this way we get all the necessary
139 semantical processing for free by calling finish decl. We might still
140 eliminate that decl later -- it takes up time and space and, more
141 importantly, produces strange error messages when something is wrong
142 with the initializing expresison. */
145 build_iterator_decl (id, limit)
148 tree type = integer_type_node, lim_decl;
150 tree start_node, limit_node, step_node;
155 limit_node = save_expr (limit);
156 SAVE_EXPR_CONTEXT (limit_node) = current_function_decl;
160 lim_decl = build_limit_decl (id, limit_node);
161 push_obstacks_nochange ();
162 decl = build_decl (VAR_DECL, id, type);
163 ITERATOR_P (decl) = 1;
164 ITERATOR_LIMIT (decl) = lim_decl;
165 finish_decl (pushdecl (decl), 0, 0);
170 ITERATOR RTL EXPANSIONS
172 Expanding simple statements with iterators is straightforward:
173 collect the list of all free iterators in the statement, and
174 generate a loop for each of them.
176 An iterator is "free" if it has not been "bound" by a FOR
177 operator. The DECL_RTL of the iterator is the loop counter. */
179 /* Expand a statement STMT, possibly containing iterator usage, into RTL. */
182 iterator_expand (stmt)
185 tree iter_list = collect_iterators (stmt, NULL_TREE);
186 expand_stmt_with_iterators_1 (stmt, iter_list);
187 istack_sublevel_to_current ();
192 expand_stmt_with_iterators_1 (stmt, iter_list)
193 tree stmt, iter_list;
196 expand_expr_stmt (stmt);
199 tree current_iterator = TREE_VALUE (iter_list);
200 tree iter_list_tail = TREE_CHAIN (iter_list);
201 rtx p_start, p_end, e_start, e_end;
203 iterator_loop_prologue (current_iterator, &p_start, &p_end);
204 expand_stmt_with_iterators_1 (stmt, iter_list_tail);
205 iterator_loop_epilogue (current_iterator, &e_start, &e_end);
207 /** Delete all inner expansions based on current_iterator **/
208 /** before adding the outer one. **/
210 delete_ixpansion (current_iterator);
211 add_ixpansion (current_iterator, p_start, p_end, e_start, e_end);
216 /* Return a list containing all the free (i.e. not bound by a
217 containing `for' statement) iterators mentioned in EXP, plus those
218 in LIST. Do not add duplicate entries to the list. */
221 collect_iterators (exp, list)
224 if (exp == 0) return list;
226 switch (TREE_CODE (exp))
229 if (! ITERATOR_P (exp) || ITERATOR_BOUND_P (exp))
231 if (value_member (exp, list))
233 return tree_cons (NULL_TREE, exp, list);
238 for (tail = exp; tail; tail = TREE_CHAIN (tail))
239 list = collect_iterators (TREE_VALUE (tail), list);
243 /* we do not automatically iterate blocks -- one must */
244 /* use the FOR construct to do that */
250 switch (TREE_CODE_CLASS (code))
258 int num_args = tree_code_length[code];
261 for (i = 0; i < num_args; i++)
262 list = collect_iterators (TREE_OPERAND (exp, i), list);
269 /* Emit rtl for the start of a loop for iterator IDECL.
271 If necessary, create loop counter rtx and store it as DECL_RTL of IDECL.
273 The prologue normally starts and ends with notes, which are returned
274 by this function in *START_NOTE and *END_NODE.
275 If START_NOTE and END_NODE are 0, we don't make those notes. */
278 iterator_loop_prologue (idecl, start_note, end_note)
280 rtx *start_note, *end_note;
282 /* Force the save_expr in DECL_INITIAL to be calculated
283 if it hasn't been calculated yet. */
284 expand_expr (DECL_INITIAL (idecl), 0, VOIDmode, 0);
286 if (DECL_RTL (idecl) == 0)
290 *start_note = emit_note (0, NOTE_INSN_DELETED);
291 /* Initialize counter. */
292 expand_expr (build_modify_expr (idecl, NOP_EXPR, integer_zero_node),
295 expand_start_loop_continue_elsewhere (1);
297 ITERATOR_BOUND_P (idecl) = 1;
300 *end_note = emit_note (0, NOTE_INSN_DELETED);
303 /* Similar to the previous function, but for the end of the loop.
305 DECL_RTL is zeroed unless we are inside "({...})". The reason for that is
308 When we create two (or more) loops based on the same IDECL, and
309 both inside the same "({...})" construct, we must be prepared to
310 delete both of the loops and create a single one on the level
311 above, i.e. enclosing the "({...})". The new loop has to use the
312 same counter rtl because the references to the iterator decl
313 (IDECL) have already been expanded as references to the counter
316 It is incorrect to use the same counter reg in different functions,
317 and it is desirable to use different counters in disjoint loops
318 when we know there's no need to combine them (because then they can
319 get allocated separately). */
322 iterator_loop_epilogue (idecl, start_note, end_note)
324 rtx *start_note, *end_note;
329 *start_note = emit_note (0, NOTE_INSN_DELETED);
330 expand_loop_continue_here ();
331 incr = build_binary_op (PLUS_EXPR, idecl, integer_one_node, 0);
332 expand_expr (build_modify_expr (idecl, NOP_EXPR, incr));
333 test = build_binary_op (LT_EXPR, idecl, DECL_INITIAL (idecl), 0);
334 expand_exit_loop_if_false (0, test);
337 ITERATOR_BOUND_P (idecl) = 0;
338 /* we can reset rtl since there is not chance that this expansion */
339 /* would be superceded by a higher level one */
340 if (top_level_ixpansion_p ())
341 DECL_RTL (idecl) = 0;
343 *end_note = emit_note (0, NOTE_INSN_DELETED);
346 /* Return true if we are not currently inside a "({...})" construct. */
349 top_level_ixpansion_p ()
351 return iter_stack == 0;
354 /* Given two chains of iter_stack_nodes,
355 append the nodes in X into Y. */
359 struct iter_stack_node *x, *y;
371 y->last->next = x->first;
378 #define ISN_ZERO(X) (X).first=(X).last=0
380 /* Move the ixpansions in sublevel_ixpansions into the current
381 node on the iter_stack, or discard them if the iter_stack is empty.
382 We do this at the end of a statement. */
385 istack_sublevel_to_current ()
387 /* At the top level we can throw away sublevel's expansions **/
388 /* because there is nobody above us to ask for a cleanup **/
390 /** Merging with empty sublevel list is a no-op **/
391 if (sublevel_ixpansions.last)
392 isn_append (&sublevel_ixpansions, iter_stack);
395 obstack_free (&ixp_obstack, ixp_firstobj);
397 ISN_ZERO (sublevel_ixpansions);
400 /* Push a new node on the iter_stack, when we enter a ({...}). */
403 push_iterator_stack ()
405 struct iter_stack_node *new_top
406 = (struct iter_stack_node*)
407 obstack_alloc (&ixp_obstack, sizeof (struct iter_stack_node));
411 new_top->next = iter_stack;
412 iter_stack = new_top;
415 /* Pop iter_stack, moving the ixpansions in the node being popped
416 into sublevel_ixpansions. */
419 pop_iterator_stack ()
424 isn_append (iter_stack, &sublevel_ixpansions);
425 /** Pop current level node: */
426 iter_stack = iter_stack->next;
430 /* Record an iterator expansion ("ixpansion") for IDECL.
431 The remaining paramters are the notes in the loop entry
435 add_ixpansion (idecl, pro_start, pro_end, epi_start, epi_end)
437 rtx pro_start, pro_end, epi_start, epi_end;
439 struct ixpansion* newix;
441 /* Do nothing if we are not inside "({...})",
442 as in that case this expansion can't need subsequent RTL modification. */
446 newix = (struct ixpansion*) obstack_alloc (&ixp_obstack,
447 sizeof (struct ixpansion));
448 newix->ixdecl = idecl;
449 newix->ixprologue_start = pro_start;
450 newix->ixprologue_end = pro_end;
451 newix->ixepilogue_start = epi_start;
452 newix->ixepilogue_end = epi_end;
454 newix->next = iter_stack->first;
455 iter_stack->first = newix;
456 if (iter_stack->last == 0)
457 iter_stack->last = newix;
460 /* Delete the RTL for all ixpansions for iterator IDECL
461 in our sublevels. We do this when we make a larger
462 containing expansion for IDECL. */
465 delete_ixpansion (idecl)
468 struct ixpansion* previx = 0, *ix;
470 for (ix = sublevel_ixpansions.first; ix; ix = ix->next)
471 if (ix->ixdecl == idecl)
473 /** zero means that this is a mark for FOR -- **/
474 /** we do not delete anything, just issue an error. **/
476 if (ix->ixprologue_start == 0)
477 error_with_decl (idecl,
478 "`for (%s)' appears within implicit iteration")
482 /* We delete all insns, including notes because leaving loop */
483 /* notes and barriers produced by iterator expansion would */
484 /* be misleading to other phases */
486 for (insn = NEXT_INSN (ix->ixprologue_start);
487 insn != ix->ixprologue_end;
488 insn = NEXT_INSN (insn))
490 for (insn = NEXT_INSN (ix->ixepilogue_start);
491 insn != ix->ixepilogue_end;
492 insn = NEXT_INSN (insn))
496 /* Delete this ixpansion from sublevel_ixpansions. */
498 previx->next = ix->next;
500 sublevel_ixpansions.first = ix->next;
501 if (sublevel_ixpansions.last == ix)
502 sublevel_ixpansions.last = previx;
508 #ifdef DEBUG_ITERATORS
510 /* The functions below are for use from source level debugger.
511 They print short forms of iterator lists and the iterator stack. */
513 /* Print the name of the iterator D. */
521 if (TREE_CODE (d) == VAR_DECL)
523 tree tname = DECL_NAME (d);
524 char *dname = IDENTIFIER_POINTER (tname);
525 fprintf (stderr, dname);
528 fprintf (stderr, "<<Not a Decl!!!>>");
531 fprintf (stderr, "<<NULL!!>>");
534 /* Print Iterator List -- names only */
541 for (current = head; current; current = next)
543 tree node = TREE_VALUE (current);
545 next = TREE_CHAIN (current);
546 if (next) fprintf (stderr, ",");
548 fprintf (stderr, "\n");
551 /* Print IXpansion List */
555 struct ixpansion *head;
557 struct ixpansion *current, *next;
558 fprintf (stderr, "> ");
560 fprintf (stderr, "(empty)");
562 for (current=head; current; current = next)
564 tree node = current->ixdecl;
566 next = current->next;
568 fprintf (stderr, ",");
570 fprintf (stderr, "\n");
574 /* Print Iterator Stack*/
579 struct iter_stack_node *stack_node;
581 fprintf (stderr, "--SubLevel: ");
582 pixl (sublevel_ixpansions.first);
583 fprintf (stderr, "--Stack:--\n");
584 for (stack_node = iter_stack;
586 stack_node = stack_node->next)
587 pixl (stack_node->first);
590 #endif /* DEBUG_ITERATORS */