]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/c-iterate.c
Oops, missed ChangeLog in last checkin...
[thirdparty/gcc.git] / gcc / c-iterate.c
1 /* Build expressions with type checking for C compiler.
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996
3 1997, 1998, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 /* This file is part of the C front end.
24 It is responsible for implementing iterators,
25 both their declarations and the expansion of statements using them. */
26
27 #include "config.h"
28 #include "system.h"
29 #include "tree.h"
30 #include "c-tree.h"
31 #include "flags.h"
32 #include "obstack.h"
33 #include "rtl.h"
34 #include "toplev.h"
35 #include "expr.h"
36 \f
37 /*
38 KEEPING TRACK OF EXPANSIONS
39
40 In order to clean out expansions corresponding to statements inside
41 "{(...)}" constructs we have to keep track of all expansions. The
42 cleanup is needed when an automatic, or implicit, expansion on
43 iterator, say X, happens to a statement which contains a {(...)}
44 form with a statement already expanded on X. In this case we have
45 to go back and cleanup the inner expansion. This can be further
46 complicated by the fact that {(...)} can be nested.
47
48 To make this cleanup possible, we keep lists of all expansions, and
49 to make it work for nested constructs, we keep a stack. The list at
50 the top of the stack (ITER_STACK.CURRENT_LEVEL) corresponds to the
51 currently parsed level. All expansions of the levels below the
52 current one are kept in one list whose head is pointed to by
53 ITER_STACK.SUBLEVEL_FIRST (SUBLEVEL_LAST is there for making merges
54 easy). The process works as follows:
55
56 -- On "({" a new node is added to the stack by PUSH_ITERATOR_STACK.
57 The sublevel list is not changed at this point.
58
59 -- On "})" the list for the current level is appended to the sublevel
60 list.
61
62 -- On ";" sublevel lists are appended to the current level lists.
63 The reason is this: if they have not been superseded by the
64 expansion at the current level, they still might be
65 superseded later by the expansion on the higher level.
66 The levels do not have to distinguish levels below, so we
67 can merge the lists together. */
68
69 struct ixpansion
70 {
71 tree ixdecl; /* Iterator decl */
72 rtx ixprologue_start; /* First insn of epilogue. NULL means */
73 /* explicit (FOR) expansion*/
74 rtx ixprologue_end;
75 rtx ixepilogue_start;
76 rtx ixepilogue_end;
77 struct ixpansion *next; /* Next in the list */
78 };
79
80 struct iter_stack_node
81 {
82 struct ixpansion *first; /* Head of list of ixpansions */
83 struct ixpansion *last; /* Last node in list of ixpansions */
84 struct iter_stack_node *next; /* Next level iterator stack node */
85 };
86
87 struct iter_stack_node *iter_stack;
88 struct iter_stack_node sublevel_ixpansions;
89
90 /* A special obstack, and a pointer to the start of
91 all the data in it (so we can free everything easily). */
92 static struct obstack ixp_obstack;
93 static char *ixp_firstobj;
94
95 /* During collect_iterators, a list of SAVE_EXPRs already scanned. */
96 static tree save_exprs;
97
98 static void expand_stmt_with_iterators_1 PARAMS ((tree, tree));
99 static tree collect_iterators PARAMS ((tree, tree));
100 static void iterator_loop_prologue PARAMS ((tree, rtx *, rtx *));
101 static void iterator_loop_epilogue PARAMS ((tree, rtx *, rtx *));
102 static int top_level_ixpansion_p PARAMS ((void));
103 static void isn_append PARAMS ((struct iter_stack_node *,
104 struct iter_stack_node *));
105 static void istack_sublevel_to_current PARAMS ((void));
106 static void add_ixpansion PARAMS ((tree, rtx, rtx, rtx, rtx));
107 static void delete_ixpansion PARAMS ((tree));
108 \f
109 /* Initialize our obstack once per compilation. */
110
111 void
112 init_iterators ()
113 {
114 gcc_obstack_init (&ixp_obstack);
115 ixp_firstobj = (char *) obstack_alloc (&ixp_obstack, 0);
116 }
117
118 /* Handle the start of an explicit `for' loop for iterator IDECL. */
119
120 void
121 iterator_for_loop_start (idecl)
122 tree idecl;
123 {
124 ITERATOR_BOUND_P (idecl) = 1;
125 add_ixpansion (idecl, 0, 0, 0, 0);
126 iterator_loop_prologue (idecl, 0, 0);
127 }
128
129 /* Handle the end of an explicit `for' loop for iterator IDECL. */
130
131 void
132 iterator_for_loop_end (idecl)
133 tree idecl;
134 {
135 iterator_loop_epilogue (idecl, 0, 0);
136 ITERATOR_BOUND_P (idecl) = 0;
137 }
138 \f
139 /*
140 ITERATOR RTL EXPANSIONS
141
142 Expanding simple statements with iterators is straightforward:
143 collect the list of all free iterators in the statement, and
144 generate a loop for each of them.
145
146 An iterator is "free" if it has not been "bound" by a FOR
147 operator. The DECL_RTL of the iterator is the loop counter. */
148
149 /* Expand a statement STMT, possibly containing iterator usage, into RTL. */
150
151 void
152 iterator_expand (stmt)
153 tree stmt;
154 {
155 tree iter_list;
156 save_exprs = NULL_TREE;
157 iter_list = collect_iterators (stmt, NULL_TREE);
158 expand_stmt_with_iterators_1 (stmt, iter_list);
159 istack_sublevel_to_current ();
160 }
161
162
163 static void
164 expand_stmt_with_iterators_1 (stmt, iter_list)
165 tree stmt, iter_list;
166 {
167 if (iter_list == 0)
168 expand_expr_stmt (stmt);
169 else
170 {
171 tree current_iterator = TREE_VALUE (iter_list);
172 tree iter_list_tail = TREE_CHAIN (iter_list);
173 rtx p_start, p_end, e_start, e_end;
174
175 iterator_loop_prologue (current_iterator, &p_start, &p_end);
176 expand_stmt_with_iterators_1 (stmt, iter_list_tail);
177 iterator_loop_epilogue (current_iterator, &e_start, &e_end);
178
179 /** Delete all inner expansions based on current_iterator **/
180 /** before adding the outer one. **/
181
182 delete_ixpansion (current_iterator);
183 add_ixpansion (current_iterator, p_start, p_end, e_start, e_end);
184 }
185 }
186
187
188 /* Return a list containing all the free (i.e. not bound by a
189 containing `for' statement) iterators mentioned in EXP, plus those
190 in LIST. Do not add duplicate entries to the list. */
191
192 static tree
193 collect_iterators (exp, list)
194 tree exp, list;
195 {
196 if (exp == 0) return list;
197
198 switch (TREE_CODE (exp))
199 {
200 case VAR_DECL:
201 if (! ITERATOR_P (exp) || ITERATOR_BOUND_P (exp))
202 return list;
203 if (value_member (exp, list))
204 return list;
205 return tree_cons (NULL_TREE, exp, list);
206
207 case TREE_LIST:
208 {
209 tree tail;
210 for (tail = exp; tail; tail = TREE_CHAIN (tail))
211 list = collect_iterators (TREE_VALUE (tail), list);
212 return list;
213 }
214
215 case SAVE_EXPR:
216 /* In each scan, scan a given save_expr only once. */
217 if (value_member (exp, save_exprs))
218 return list;
219
220 save_exprs = tree_cons (NULL_TREE, exp, save_exprs);
221 return collect_iterators (TREE_OPERAND (exp, 0), list);
222
223 /* we do not automatically iterate blocks -- one must */
224 /* use the FOR construct to do that */
225
226 case BLOCK:
227 return list;
228
229 default:
230 switch (TREE_CODE_CLASS (TREE_CODE (exp)))
231 {
232 case '1':
233 return collect_iterators (TREE_OPERAND (exp, 0), list);
234
235 case '2':
236 case '<':
237 return collect_iterators (TREE_OPERAND (exp, 0),
238 collect_iterators (TREE_OPERAND (exp, 1),
239 list));
240
241 case 'e':
242 case 'r':
243 {
244 int num_args = tree_code_length[(int) TREE_CODE (exp)];
245 int i;
246
247 /* Some tree codes have RTL, not trees, as operands. */
248 switch (TREE_CODE (exp))
249 {
250 case CALL_EXPR:
251 num_args = 2;
252 break;
253 case METHOD_CALL_EXPR:
254 num_args = 3;
255 break;
256 case WITH_CLEANUP_EXPR:
257 num_args = 1;
258 break;
259 case RTL_EXPR:
260 return list;
261 default:
262 break;
263 }
264
265 for (i = 0; i < num_args; i++)
266 list = collect_iterators (TREE_OPERAND (exp, i), list);
267 return list;
268 }
269 default:
270 return list;
271 }
272 }
273 }
274 \f
275 /* Emit rtl for the start of a loop for iterator IDECL.
276
277 If necessary, create loop counter rtx and store it as DECL_RTL of IDECL.
278
279 The prologue normally starts and ends with notes, which are returned
280 by this function in *START_NOTE and *END_NODE.
281 If START_NOTE and END_NODE are 0, we don't make those notes. */
282
283 static void
284 iterator_loop_prologue (idecl, start_note, end_note)
285 tree idecl;
286 rtx *start_note, *end_note;
287 {
288 tree expr;
289
290 /* Force the save_expr in DECL_INITIAL to be calculated
291 if it hasn't been calculated yet. */
292 expand_expr (DECL_INITIAL (idecl), const0_rtx, VOIDmode,
293 EXPAND_NORMAL);
294
295 if (DECL_RTL (idecl) == 0)
296 expand_decl (idecl);
297
298 if (start_note)
299 *start_note = emit_note (0, NOTE_INSN_DELETED);
300
301 /* Initialize counter. */
302 expr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, integer_zero_node);
303 TREE_SIDE_EFFECTS (expr) = 1;
304 expand_expr (expr, const0_rtx, VOIDmode, EXPAND_NORMAL);
305
306 expand_start_loop_continue_elsewhere (1);
307
308 ITERATOR_BOUND_P (idecl) = 1;
309
310 if (end_note)
311 *end_note = emit_note (0, NOTE_INSN_DELETED);
312 }
313
314 /* Similar to the previous function, but for the end of the loop.
315
316 DECL_RTL is zeroed unless we are inside "({...})". The reason for that is
317 described below.
318
319 When we create two (or more) loops based on the same IDECL, and
320 both inside the same "({...})" construct, we must be prepared to
321 delete both of the loops and create a single one on the level
322 above, i.e. enclosing the "({...})". The new loop has to use the
323 same counter rtl because the references to the iterator decl
324 (IDECL) have already been expanded as references to the counter
325 rtl.
326
327 It is incorrect to use the same counter reg in different functions,
328 and it is desirable to use different counters in disjoint loops
329 when we know there's no need to combine them (because then they can
330 get allocated separately). */
331
332 static void
333 iterator_loop_epilogue (idecl, start_note, end_note)
334 tree idecl;
335 rtx *start_note, *end_note;
336 {
337 tree test, incr;
338
339 if (start_note)
340 *start_note = emit_note (0, NOTE_INSN_DELETED);
341 expand_loop_continue_here ();
342 incr = build_binary_op (PLUS_EXPR, idecl, integer_one_node, 0);
343 incr = build (MODIFY_EXPR, TREE_TYPE (idecl), idecl, incr);
344 TREE_SIDE_EFFECTS (incr) = 1;
345 expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL);
346 test = build_binary_op (LT_EXPR, idecl, DECL_INITIAL (idecl), 0);
347 expand_exit_loop_if_false (0, test);
348 expand_end_loop ();
349
350 ITERATOR_BOUND_P (idecl) = 0;
351 /* we can reset rtl since there is not chance that this expansion */
352 /* would be superseded by a higher level one */
353 /* but don't do this if the decl is static, since we need to share */
354 /* the same decl in that case. */
355 if (top_level_ixpansion_p () && ! TREE_STATIC (idecl))
356 DECL_RTL (idecl) = 0;
357 if (end_note)
358 *end_note = emit_note (0, NOTE_INSN_DELETED);
359 }
360 \f
361 /* Return true if we are not currently inside a "({...})" construct. */
362
363 static int
364 top_level_ixpansion_p ()
365 {
366 return iter_stack == 0;
367 }
368
369 /* Given two chains of iter_stack_nodes,
370 append the nodes in X into Y. */
371
372 static void
373 isn_append (x, y)
374 struct iter_stack_node *x, *y;
375 {
376 if (x->first == 0)
377 return;
378
379 if (y->first == 0)
380 {
381 y->first = x->first;
382 y->last = x->last;
383 }
384 else
385 {
386 y->last->next = x->first;
387 y->last = x->last;
388 }
389 }
390
391 /** Make X empty **/
392
393 #define ISN_ZERO(X) (X).first=(X).last=0
394 \f
395 /* Move the ixpansions in sublevel_ixpansions into the current
396 node on the iter_stack, or discard them if the iter_stack is empty.
397 We do this at the end of a statement. */
398
399 static void
400 istack_sublevel_to_current ()
401 {
402 /* At the top level we can throw away sublevel's expansions **/
403 /* because there is nobody above us to ask for a cleanup **/
404 if (iter_stack != 0)
405 /** Merging with empty sublevel list is a no-op **/
406 if (sublevel_ixpansions.last)
407 isn_append (&sublevel_ixpansions, iter_stack);
408
409 if (iter_stack == 0)
410 obstack_free (&ixp_obstack, ixp_firstobj);
411
412 ISN_ZERO (sublevel_ixpansions);
413 }
414
415 /* Push a new node on the iter_stack, when we enter a ({...}). */
416
417 void
418 push_iterator_stack ()
419 {
420 struct iter_stack_node *new_top
421 = (struct iter_stack_node *)
422 obstack_alloc (&ixp_obstack, sizeof (struct iter_stack_node));
423
424 new_top->first = 0;
425 new_top->last = 0;
426 new_top->next = iter_stack;
427 iter_stack = new_top;
428 }
429
430 /* Pop iter_stack, moving the ixpansions in the node being popped
431 into sublevel_ixpansions. */
432
433 void
434 pop_iterator_stack ()
435 {
436 if (iter_stack == 0)
437 abort ();
438
439 isn_append (iter_stack, &sublevel_ixpansions);
440 /** Pop current level node: */
441 iter_stack = iter_stack->next;
442 }
443 \f
444
445 /* Record an iterator expansion ("ixpansion") for IDECL.
446 The remaining parameters are the notes in the loop entry
447 and exit rtl. */
448
449 static void
450 add_ixpansion (idecl, pro_start, pro_end, epi_start, epi_end)
451 tree idecl;
452 rtx pro_start, pro_end, epi_start, epi_end;
453 {
454 struct ixpansion *newix;
455
456 /* Do nothing if we are not inside "({...})",
457 as in that case this expansion can't need subsequent RTL modification. */
458 if (iter_stack == 0)
459 return;
460
461 newix = (struct ixpansion *) obstack_alloc (&ixp_obstack,
462 sizeof (struct ixpansion));
463 newix->ixdecl = idecl;
464 newix->ixprologue_start = pro_start;
465 newix->ixprologue_end = pro_end;
466 newix->ixepilogue_start = epi_start;
467 newix->ixepilogue_end = epi_end;
468
469 newix->next = iter_stack->first;
470 iter_stack->first = newix;
471 if (iter_stack->last == 0)
472 iter_stack->last = newix;
473 }
474
475 /* Delete the RTL for all ixpansions for iterator IDECL
476 in our sublevels. We do this when we make a larger
477 containing expansion for IDECL. */
478
479 static void
480 delete_ixpansion (idecl)
481 tree idecl;
482 {
483 struct ixpansion *previx = 0, *ix;
484
485 for (ix = sublevel_ixpansions.first; ix; ix = ix->next)
486 if (ix->ixdecl == idecl)
487 {
488 /** zero means that this is a mark for FOR -- **/
489 /** we do not delete anything, just issue an error. **/
490
491 if (ix->ixprologue_start == 0)
492 error_with_decl (idecl,
493 "`for (%s)' appears within implicit iteration");
494 else
495 {
496 rtx insn;
497 /* We delete all insns, including notes because leaving loop */
498 /* notes and barriers produced by iterator expansion would */
499 /* be misleading to other phases */
500
501 for (insn = NEXT_INSN (ix->ixprologue_start);
502 insn != ix->ixprologue_end;
503 insn = NEXT_INSN (insn))
504 delete_insn (insn);
505 for (insn = NEXT_INSN (ix->ixepilogue_start);
506 insn != ix->ixepilogue_end;
507 insn = NEXT_INSN (insn))
508 delete_insn (insn);
509 }
510
511 /* Delete this ixpansion from sublevel_ixpansions. */
512 if (previx)
513 previx->next = ix->next;
514 else
515 sublevel_ixpansions.first = ix->next;
516 if (sublevel_ixpansions.last == ix)
517 sublevel_ixpansions.last = previx;
518 }
519 else
520 previx = ix;
521 }
522 \f
523 #ifdef DEBUG_ITERATORS
524
525 /* The functions below are for use from source level debugger.
526 They print short forms of iterator lists and the iterator stack. */
527
528 /* Print the name of the iterator D. */
529
530 void
531 prdecl (d)
532 tree d;
533 {
534 if (d)
535 {
536 if (TREE_CODE (d) == VAR_DECL)
537 {
538 tree tname = DECL_NAME (d);
539 char *dname = IDENTIFIER_POINTER (tname);
540 fprintf (stderr, dname);
541 }
542 else
543 fprintf (stderr, "<<?>>");
544 }
545 else
546 fprintf (stderr, "<<0>>");
547 }
548
549 /* Print Iterator List -- names only */
550
551 tree
552 pil (head)
553 tree head;
554 {
555 tree current, next;
556 for (current = head; current; current = next)
557 {
558 tree node = TREE_VALUE (current);
559 prdecl (node);
560 next = TREE_CHAIN (current);
561 if (next) fprintf (stderr, ",");
562 }
563 fprintf (stderr, "\n");
564 }
565
566 /* Print IXpansion List */
567
568 struct ixpansion *
569 pixl (head)
570 struct ixpansion *head;
571 {
572 struct ixpansion *current, *next;
573 fprintf (stderr, "> ");
574 if (head == 0)
575 fprintf (stderr, "(empty)");
576
577 for (current=head; current; current = next)
578 {
579 tree node = current->ixdecl;
580 prdecl (node);
581 next = current->next;
582 if (next)
583 fprintf (stderr, ",");
584 }
585 fprintf (stderr, "\n");
586 return head;
587 }
588
589 /* Print Iterator Stack. */
590
591 void
592 pis ()
593 {
594 struct iter_stack_node *stack_node;
595
596 fprintf (stderr, "--SubLevel: ");
597 pixl (sublevel_ixpansions.first);
598 fprintf (stderr, "--Stack:--\n");
599 for (stack_node = iter_stack;
600 stack_node;
601 stack_node = stack_node->next)
602 pixl (stack_node->first);
603 }
604
605 #endif /* DEBUG_ITERATORS */