OSDN Git Service

* Makefile.in (print-rtl.o): Depend on TREE_H.
[pf3gnuchains/gcc-fork.git] / gcc / stmt.c
1 /* Expands front end tree to back end RTL for GNU C-Compiler
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This file handles the generation of rtl code from tree structure
23    above the level of expressions, using subroutines in exp*.c and emit-rtl.c.
24    It also creates the rtl expressions for parameters and auto variables
25    and has full responsibility for allocating stack slots.
26
27    The functions whose names start with `expand_' are called by the
28    parser to generate RTL instructions for various kinds of constructs.
29
30    Some control and binding constructs require calling several such
31    functions at different times.  For example, a simple if-then
32    is expanded by calling `expand_start_cond' (with the condition-expression
33    as argument) before parsing the then-clause and calling `expand_end_cond'
34    after parsing the then-clause.  */
35
36 #include "config.h"
37 #include "system.h"
38
39 #include "rtl.h"
40 #include "tree.h"
41 #include "tm_p.h"
42 #include "flags.h"
43 #include "except.h"
44 #include "function.h"
45 #include "insn-config.h"
46 #include "expr.h"
47 #include "libfuncs.h"
48 #include "hard-reg-set.h"
49 #include "obstack.h"
50 #include "loop.h"
51 #include "recog.h"
52 #include "machmode.h"
53 #include "toplev.h"
54 #include "output.h"
55 #include "ggc.h"
56
57 #define obstack_chunk_alloc xmalloc
58 #define obstack_chunk_free free
59 struct obstack stmt_obstack;
60
61 /* Assume that case vectors are not pc-relative.  */
62 #ifndef CASE_VECTOR_PC_RELATIVE
63 #define CASE_VECTOR_PC_RELATIVE 0
64 #endif
65 \f
66 /* Functions and data structures for expanding case statements.  */
67
68 /* Case label structure, used to hold info on labels within case
69    statements.  We handle "range" labels; for a single-value label
70    as in C, the high and low limits are the same.
71
72    An AVL tree of case nodes is initially created, and later transformed
73    to a list linked via the RIGHT fields in the nodes.  Nodes with
74    higher case values are later in the list.
75
76    Switch statements can be output in one of two forms.  A branch table
77    is used if there are more than a few labels and the labels are dense
78    within the range between the smallest and largest case value.  If a
79    branch table is used, no further manipulations are done with the case
80    node chain.
81
82    The alternative to the use of a branch table is to generate a series
83    of compare and jump insns.  When that is done, we use the LEFT, RIGHT,
84    and PARENT fields to hold a binary tree.  Initially the tree is
85    totally unbalanced, with everything on the right.  We balance the tree
86    with nodes on the left having lower case values than the parent
87    and nodes on the right having higher values.  We then output the tree
88    in order.  */
89
90 struct case_node
91 {
92   struct case_node      *left;  /* Left son in binary tree */
93   struct case_node      *right; /* Right son in binary tree; also node chain */
94   struct case_node      *parent; /* Parent of node in binary tree */
95   tree                  low;    /* Lowest index value for this label */
96   tree                  high;   /* Highest index value for this label */
97   tree                  code_label; /* Label to jump to when node matches */
98   int                   balance;
99 };
100
101 typedef struct case_node case_node;
102 typedef struct case_node *case_node_ptr;
103
104 /* These are used by estimate_case_costs and balance_case_nodes.  */
105
106 /* This must be a signed type, and non-ANSI compilers lack signed char.  */
107 static short cost_table_[129];
108 static int use_cost_table;
109 static int cost_table_initialized;
110
111 /* Special care is needed because we allow -1, but TREE_INT_CST_LOW
112    is unsigned.  */
113 #define COST_TABLE(I)  cost_table_[(unsigned HOST_WIDE_INT)((I) + 1)]
114 \f
115 /* Stack of control and binding constructs we are currently inside.
116
117    These constructs begin when you call `expand_start_WHATEVER'
118    and end when you call `expand_end_WHATEVER'.  This stack records
119    info about how the construct began that tells the end-function
120    what to do.  It also may provide information about the construct
121    to alter the behavior of other constructs within the body.
122    For example, they may affect the behavior of C `break' and `continue'.
123
124    Each construct gets one `struct nesting' object.
125    All of these objects are chained through the `all' field.
126    `nesting_stack' points to the first object (innermost construct).
127    The position of an entry on `nesting_stack' is in its `depth' field.
128
129    Each type of construct has its own individual stack.
130    For example, loops have `loop_stack'.  Each object points to the
131    next object of the same type through the `next' field.
132
133    Some constructs are visible to `break' exit-statements and others
134    are not.  Which constructs are visible depends on the language.
135    Therefore, the data structure allows each construct to be visible
136    or not, according to the args given when the construct is started.
137    The construct is visible if the `exit_label' field is non-null.
138    In that case, the value should be a CODE_LABEL rtx.  */
139
140 struct nesting
141 {
142   struct nesting *all;
143   struct nesting *next;
144   int depth;
145   rtx exit_label;
146   union
147     {
148       /* For conds (if-then and if-then-else statements).  */
149       struct
150         {
151           /* Label for the end of the if construct.
152              There is none if EXITFLAG was not set
153              and no `else' has been seen yet.  */
154           rtx endif_label;
155           /* Label for the end of this alternative.
156              This may be the end of the if or the next else/elseif.  */
157           rtx next_label;
158         } cond;
159       /* For loops.  */
160       struct
161         {
162           /* Label at the top of the loop; place to loop back to.  */
163           rtx start_label;
164           /* Label at the end of the whole construct.  */
165           rtx end_label;
166           /* Label before a jump that branches to the end of the whole
167              construct.  This is where destructors go if any.  */
168           rtx alt_end_label;
169           /* Label for `continue' statement to jump to;
170              this is in front of the stepper of the loop.  */
171           rtx continue_label;
172         } loop;
173       /* For variable binding contours.  */
174       struct
175         {
176           /* Sequence number of this binding contour within the function,
177              in order of entry.  */
178           int block_start_count;
179           /* Nonzero => value to restore stack to on exit.  */
180           rtx stack_level;
181           /* The NOTE that starts this contour.
182              Used by expand_goto to check whether the destination
183              is within each contour or not.  */
184           rtx first_insn;
185           /* Innermost containing binding contour that has a stack level.  */
186           struct nesting *innermost_stack_block;
187           /* List of cleanups to be run on exit from this contour.
188              This is a list of expressions to be evaluated.
189              The TREE_PURPOSE of each link is the ..._DECL node
190              which the cleanup pertains to.  */
191           tree cleanups;
192           /* List of cleanup-lists of blocks containing this block,
193              as they were at the locus where this block appears.
194              There is an element for each containing block,
195              ordered innermost containing block first.
196              The tail of this list can be 0,
197              if all remaining elements would be empty lists.
198              The element's TREE_VALUE is the cleanup-list of that block,
199              which may be null.  */
200           tree outer_cleanups;
201           /* Chain of labels defined inside this binding contour.
202              For contours that have stack levels or cleanups.  */
203           struct label_chain *label_chain;
204           /* Number of function calls seen, as of start of this block.  */
205           int n_function_calls;
206           /* Nonzero if this is associated with a EH region.  */
207           int exception_region;
208           /* The saved target_temp_slot_level from our outer block.
209              We may reset target_temp_slot_level to be the level of
210              this block, if that is done, target_temp_slot_level
211              reverts to the saved target_temp_slot_level at the very
212              end of the block.  */
213           int block_target_temp_slot_level;
214           /* True if we are currently emitting insns in an area of
215              output code that is controlled by a conditional
216              expression.  This is used by the cleanup handling code to
217              generate conditional cleanup actions.  */
218           int conditional_code;
219           /* A place to move the start of the exception region for any
220              of the conditional cleanups, must be at the end or after
221              the start of the last unconditional cleanup, and before any
222              conditional branch points.  */
223           rtx last_unconditional_cleanup;
224           /* When in a conditional context, this is the specific
225              cleanup list associated with last_unconditional_cleanup,
226              where we place the conditionalized cleanups.  */
227           tree *cleanup_ptr;
228         } block;
229       /* For switch (C) or case (Pascal) statements,
230          and also for dummies (see `expand_start_case_dummy').  */
231       struct
232         {
233           /* The insn after which the case dispatch should finally
234              be emitted.  Zero for a dummy.  */
235           rtx start;
236           /* A list of case labels; it is first built as an AVL tree.
237              During expand_end_case, this is converted to a list, and may be
238              rearranged into a nearly balanced binary tree.  */
239           struct case_node *case_list;
240           /* Label to jump to if no case matches.  */
241           tree default_label;
242           /* The expression to be dispatched on.  */
243           tree index_expr;
244           /* Type that INDEX_EXPR should be converted to.  */
245           tree nominal_type;
246           /* Name of this kind of statement, for warnings.  */
247           const char *printname;
248           /* Used to save no_line_numbers till we see the first case label.
249              We set this to -1 when we see the first case label in this
250              case statement.  */
251           int line_number_status;
252         } case_stmt;
253     } data;
254 };
255
256 /* Allocate and return a new `struct nesting'.  */
257
258 #define ALLOC_NESTING() \
259  (struct nesting *) obstack_alloc (&stmt_obstack, sizeof (struct nesting))
260
261 /* Pop the nesting stack element by element until we pop off
262    the element which is at the top of STACK.
263    Update all the other stacks, popping off elements from them
264    as we pop them from nesting_stack.  */
265
266 #define POPSTACK(STACK)                                 \
267 do { struct nesting *target = STACK;                    \
268      struct nesting *this;                              \
269      do { this = nesting_stack;                         \
270           if (loop_stack == this)                       \
271             loop_stack = loop_stack->next;              \
272           if (cond_stack == this)                       \
273             cond_stack = cond_stack->next;              \
274           if (block_stack == this)                      \
275             block_stack = block_stack->next;            \
276           if (stack_block_stack == this)                \
277             stack_block_stack = stack_block_stack->next; \
278           if (case_stack == this)                       \
279             case_stack = case_stack->next;              \
280           nesting_depth = nesting_stack->depth - 1;     \
281           nesting_stack = this->all;                    \
282           obstack_free (&stmt_obstack, this); }         \
283      while (this != target); } while (0)
284 \f
285 /* In some cases it is impossible to generate code for a forward goto
286    until the label definition is seen.  This happens when it may be necessary
287    for the goto to reset the stack pointer: we don't yet know how to do that.
288    So expand_goto puts an entry on this fixup list.
289    Each time a binding contour that resets the stack is exited,
290    we check each fixup.
291    If the target label has now been defined, we can insert the proper code.  */
292
293 struct goto_fixup
294 {
295   /* Points to following fixup.  */
296   struct goto_fixup *next;
297   /* Points to the insn before the jump insn.
298      If more code must be inserted, it goes after this insn.  */
299   rtx before_jump;
300   /* The LABEL_DECL that this jump is jumping to, or 0
301      for break, continue or return.  */
302   tree target;
303   /* The BLOCK for the place where this goto was found.  */
304   tree context;
305   /* The CODE_LABEL rtx that this is jumping to.  */
306   rtx target_rtl;
307   /* Number of binding contours started in current function
308      before the label reference.  */
309   int block_start_count;
310   /* The outermost stack level that should be restored for this jump.
311      Each time a binding contour that resets the stack is exited,
312      if the target label is *not* yet defined, this slot is updated.  */
313   rtx stack_level;
314   /* List of lists of cleanup expressions to be run by this goto.
315      There is one element for each block that this goto is within.
316      The tail of this list can be 0,
317      if all remaining elements would be empty.
318      The TREE_VALUE contains the cleanup list of that block as of the
319      time this goto was seen.
320      The TREE_ADDRESSABLE flag is 1 for a block that has been exited.  */
321   tree cleanup_list_list;
322 };
323
324 /* Within any binding contour that must restore a stack level,
325    all labels are recorded with a chain of these structures.  */
326
327 struct label_chain
328 {
329   /* Points to following fixup.  */
330   struct label_chain *next;
331   tree label;
332 };
333
334 struct stmt_status
335 {
336   /* Chain of all pending binding contours.  */
337   struct nesting *x_block_stack;
338
339   /* If any new stacks are added here, add them to POPSTACKS too.  */
340
341   /* Chain of all pending binding contours that restore stack levels
342      or have cleanups.  */
343   struct nesting *x_stack_block_stack;
344
345   /* Chain of all pending conditional statements.  */
346   struct nesting *x_cond_stack;
347
348   /* Chain of all pending loops.  */
349   struct nesting *x_loop_stack;
350
351   /* Chain of all pending case or switch statements.  */
352   struct nesting *x_case_stack;
353
354   /* Separate chain including all of the above,
355      chained through the `all' field.  */
356   struct nesting *x_nesting_stack;
357
358   /* Number of entries on nesting_stack now.  */
359   int x_nesting_depth;
360
361   /* Number of binding contours started so far in this function.  */
362   int x_block_start_count;
363
364   /* Each time we expand an expression-statement,
365      record the expr's type and its RTL value here.  */
366   tree x_last_expr_type;
367   rtx x_last_expr_value;
368
369   /* Nonzero if within a ({...}) grouping, in which case we must
370      always compute a value for each expr-stmt in case it is the last one.  */
371   int x_expr_stmts_for_value;
372
373   /* Filename and line number of last line-number note,
374      whether we actually emitted it or not.  */
375   const char *x_emit_filename;
376   int x_emit_lineno;
377
378   struct goto_fixup *x_goto_fixup_chain;
379 };
380
381 #define block_stack (cfun->stmt->x_block_stack)
382 #define stack_block_stack (cfun->stmt->x_stack_block_stack)
383 #define cond_stack (cfun->stmt->x_cond_stack)
384 #define loop_stack (cfun->stmt->x_loop_stack)
385 #define case_stack (cfun->stmt->x_case_stack)
386 #define nesting_stack (cfun->stmt->x_nesting_stack)
387 #define nesting_depth (cfun->stmt->x_nesting_depth)
388 #define current_block_start_count (cfun->stmt->x_block_start_count)
389 #define last_expr_type (cfun->stmt->x_last_expr_type)
390 #define last_expr_value (cfun->stmt->x_last_expr_value)
391 #define expr_stmts_for_value (cfun->stmt->x_expr_stmts_for_value)
392 #define emit_filename (cfun->stmt->x_emit_filename)
393 #define emit_lineno (cfun->stmt->x_emit_lineno)
394 #define goto_fixup_chain (cfun->stmt->x_goto_fixup_chain)
395
396 /* Non-zero if we are using EH to handle cleanus.  */
397 static int using_eh_for_cleanups_p = 0;
398
399 static int n_occurrences                PARAMS ((int, const char *));
400 static void expand_goto_internal        PARAMS ((tree, rtx, rtx));
401 static int expand_fixup                 PARAMS ((tree, rtx, rtx));
402 static rtx expand_nl_handler_label      PARAMS ((rtx, rtx));
403 static void expand_nl_goto_receiver     PARAMS ((void));
404 static void expand_nl_goto_receivers    PARAMS ((struct nesting *));
405 static void fixup_gotos                 PARAMS ((struct nesting *, rtx, tree,
406                                                rtx, int));
407 static bool check_operand_nalternatives PARAMS ((tree, tree));
408 static bool check_unique_operand_names  PARAMS ((tree, tree));
409 static tree resolve_operand_names       PARAMS ((tree, tree, tree,
410                                                  const char **));
411 static char *resolve_operand_name_1     PARAMS ((char *, tree, tree));
412 static void expand_null_return_1        PARAMS ((rtx));
413 static void expand_value_return         PARAMS ((rtx));
414 static int tail_recursion_args          PARAMS ((tree, tree));
415 static void expand_cleanups             PARAMS ((tree, tree, int, int));
416 static void check_seenlabel             PARAMS ((void));
417 static void do_jump_if_equal            PARAMS ((rtx, rtx, rtx, int));
418 static int estimate_case_costs          PARAMS ((case_node_ptr));
419 static void group_case_nodes            PARAMS ((case_node_ptr));
420 static void balance_case_nodes          PARAMS ((case_node_ptr *,
421                                                case_node_ptr));
422 static int node_has_low_bound           PARAMS ((case_node_ptr, tree));
423 static int node_has_high_bound          PARAMS ((case_node_ptr, tree));
424 static int node_is_bounded              PARAMS ((case_node_ptr, tree));
425 static void emit_jump_if_reachable      PARAMS ((rtx));
426 static void emit_case_nodes             PARAMS ((rtx, case_node_ptr, rtx, tree));
427 static struct case_node *case_tree2list PARAMS ((case_node *, case_node *));
428 static void mark_cond_nesting           PARAMS ((struct nesting *));
429 static void mark_loop_nesting           PARAMS ((struct nesting *));
430 static void mark_block_nesting          PARAMS ((struct nesting *));
431 static void mark_case_nesting           PARAMS ((struct nesting *));
432 static void mark_case_node              PARAMS ((struct case_node *));
433 static void mark_goto_fixup             PARAMS ((struct goto_fixup *));
434 static void free_case_nodes             PARAMS ((case_node_ptr));
435 \f
436 void
437 using_eh_for_cleanups ()
438 {
439   using_eh_for_cleanups_p = 1;
440 }
441
442 /* Mark N (known to be a cond-nesting) for GC.  */
443
444 static void
445 mark_cond_nesting (n)
446      struct nesting *n;
447 {
448   while (n)
449     {
450       ggc_mark_rtx (n->exit_label);
451       ggc_mark_rtx (n->data.cond.endif_label);
452       ggc_mark_rtx (n->data.cond.next_label);
453
454       n = n->next;
455     }
456 }
457
458 /* Mark N (known to be a loop-nesting) for GC.  */
459
460 static void
461 mark_loop_nesting (n)
462      struct nesting *n;
463 {
464
465   while (n)
466     {
467       ggc_mark_rtx (n->exit_label);
468       ggc_mark_rtx (n->data.loop.start_label);
469       ggc_mark_rtx (n->data.loop.end_label);
470       ggc_mark_rtx (n->data.loop.alt_end_label);
471       ggc_mark_rtx (n->data.loop.continue_label);
472
473       n = n->next;
474     }
475 }
476
477 /* Mark N (known to be a block-nesting) for GC.  */
478
479 static void
480 mark_block_nesting (n)
481      struct nesting *n;
482 {
483   while (n)
484     {
485       struct label_chain *l;
486
487       ggc_mark_rtx (n->exit_label);
488       ggc_mark_rtx (n->data.block.stack_level);
489       ggc_mark_rtx (n->data.block.first_insn);
490       ggc_mark_tree (n->data.block.cleanups);
491       ggc_mark_tree (n->data.block.outer_cleanups);
492
493       for (l = n->data.block.label_chain; l != NULL; l = l->next) 
494         {
495           ggc_mark (l);
496           ggc_mark_tree (l->label);
497         }
498
499       ggc_mark_rtx (n->data.block.last_unconditional_cleanup);
500
501       /* ??? cleanup_ptr never points outside the stack, does it?  */
502
503       n = n->next;
504     }
505 }
506
507 /* Mark N (known to be a case-nesting) for GC.  */
508
509 static void
510 mark_case_nesting (n)
511      struct nesting *n;
512 {
513   while (n)
514     {
515       ggc_mark_rtx (n->exit_label);
516       ggc_mark_rtx (n->data.case_stmt.start);
517
518       ggc_mark_tree (n->data.case_stmt.default_label);
519       ggc_mark_tree (n->data.case_stmt.index_expr);
520       ggc_mark_tree (n->data.case_stmt.nominal_type);
521
522       mark_case_node (n->data.case_stmt.case_list);
523       n = n->next;
524     }
525 }
526
527 /* Mark C for GC.  */
528
529 static void
530 mark_case_node (c)
531      struct case_node *c;
532 {
533   if (c != 0)
534     {
535       ggc_mark_tree (c->low);
536       ggc_mark_tree (c->high);
537       ggc_mark_tree (c->code_label);
538
539       mark_case_node (c->right);
540       mark_case_node (c->left);
541     }
542 }
543
544 /* Mark G for GC.  */
545
546 static void
547 mark_goto_fixup (g)
548      struct goto_fixup *g;
549 {
550   while (g)
551     {
552       ggc_mark (g);
553       ggc_mark_rtx (g->before_jump);
554       ggc_mark_tree (g->target);
555       ggc_mark_tree (g->context);
556       ggc_mark_rtx (g->target_rtl);
557       ggc_mark_rtx (g->stack_level);
558       ggc_mark_tree (g->cleanup_list_list);
559
560       g = g->next;
561     }
562 }
563
564 /* Clear out all parts of the state in F that can safely be discarded
565    after the function has been compiled, to let garbage collection
566    reclaim the memory.  */
567
568 void
569 free_stmt_status (f)
570      struct function *f;
571 {
572   /* We're about to free the function obstack.  If we hold pointers to
573      things allocated there, then we'll try to mark them when we do
574      GC.  So, we clear them out here explicitly.  */
575   if (f->stmt)
576     free (f->stmt);
577   f->stmt = NULL;
578 }
579
580 /* Mark P for GC.  */
581
582 void
583 mark_stmt_status (p)
584      struct stmt_status *p;
585 {
586   if (p == 0)
587     return;
588
589   mark_block_nesting (p->x_block_stack);
590   mark_cond_nesting (p->x_cond_stack);
591   mark_loop_nesting (p->x_loop_stack);
592   mark_case_nesting (p->x_case_stack);
593
594   ggc_mark_tree (p->x_last_expr_type);
595   /* last_epxr_value is only valid if last_expr_type is nonzero.  */
596   if (p->x_last_expr_type)
597     ggc_mark_rtx (p->x_last_expr_value);
598
599   mark_goto_fixup (p->x_goto_fixup_chain);
600 }
601
602 void
603 init_stmt ()
604 {
605   gcc_obstack_init (&stmt_obstack);
606 }
607
608 void
609 init_stmt_for_function ()
610 {
611   cfun->stmt = (struct stmt_status *) xmalloc (sizeof (struct stmt_status));
612
613   /* We are not currently within any block, conditional, loop or case.  */
614   block_stack = 0;
615   stack_block_stack = 0;
616   loop_stack = 0;
617   case_stack = 0;
618   cond_stack = 0;
619   nesting_stack = 0;
620   nesting_depth = 0;
621
622   current_block_start_count = 0;
623
624   /* No gotos have been expanded yet.  */
625   goto_fixup_chain = 0;
626
627   /* We are not processing a ({...}) grouping.  */
628   expr_stmts_for_value = 0;
629   last_expr_type = 0;
630   last_expr_value = NULL_RTX;
631 }
632 \f
633 /* Return nonzero if anything is pushed on the loop, condition, or case
634    stack.  */
635 int
636 in_control_zone_p ()
637 {
638   return cond_stack || loop_stack || case_stack;
639 }
640
641 /* Record the current file and line.  Called from emit_line_note.  */
642 void
643 set_file_and_line_for_stmt (file, line)
644      const char *file;
645      int line;
646 {
647   /* If we're outputting an inline function, and we add a line note,
648      there may be no CFUN->STMT information.  So, there's no need to
649      update it.  */
650   if (cfun->stmt)
651     {
652       emit_filename = file;
653       emit_lineno = line;
654     }
655 }
656
657 /* Emit a no-op instruction.  */
658
659 void
660 emit_nop ()
661 {
662   rtx last_insn;
663
664   last_insn = get_last_insn ();
665   if (!optimize
666       && (GET_CODE (last_insn) == CODE_LABEL
667           || (GET_CODE (last_insn) == NOTE
668               && prev_real_insn (last_insn) == 0)))
669     emit_insn (gen_nop ());
670 }
671 \f
672 /* Return the rtx-label that corresponds to a LABEL_DECL,
673    creating it if necessary.  */
674
675 rtx
676 label_rtx (label)
677      tree label;
678 {
679   if (TREE_CODE (label) != LABEL_DECL)
680     abort ();
681
682   if (!DECL_RTL_SET_P (label))
683     SET_DECL_RTL (label, gen_label_rtx ());
684
685   return DECL_RTL (label);
686 }
687
688
689 /* Add an unconditional jump to LABEL as the next sequential instruction.  */
690
691 void
692 emit_jump (label)
693      rtx label;
694 {
695   do_pending_stack_adjust ();
696   emit_jump_insn (gen_jump (label));
697   emit_barrier ();
698 }
699
700 /* Emit code to jump to the address
701    specified by the pointer expression EXP.  */
702
703 void
704 expand_computed_goto (exp)
705      tree exp;
706 {
707   rtx x = expand_expr (exp, NULL_RTX, VOIDmode, 0);
708
709 #ifdef POINTERS_EXTEND_UNSIGNED
710   x = convert_memory_address (Pmode, x);
711 #endif
712
713   emit_queue ();
714   /* Be sure the function is executable.  */
715   if (current_function_check_memory_usage)
716     emit_library_call (chkr_check_exec_libfunc, LCT_CONST_MAKE_BLOCK,
717                        VOIDmode, 1, x, ptr_mode);
718
719   do_pending_stack_adjust ();
720   emit_indirect_jump (x);
721
722   current_function_has_computed_jump = 1;
723 }
724 \f
725 /* Handle goto statements and the labels that they can go to.  */
726
727 /* Specify the location in the RTL code of a label LABEL,
728    which is a LABEL_DECL tree node.
729
730    This is used for the kind of label that the user can jump to with a
731    goto statement, and for alternatives of a switch or case statement.
732    RTL labels generated for loops and conditionals don't go through here;
733    they are generated directly at the RTL level, by other functions below.
734
735    Note that this has nothing to do with defining label *names*.
736    Languages vary in how they do that and what that even means.  */
737
738 void
739 expand_label (label)
740      tree label;
741 {
742   struct label_chain *p;
743
744   do_pending_stack_adjust ();
745   emit_label (label_rtx (label));
746   if (DECL_NAME (label))
747     LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
748
749   if (stack_block_stack != 0)
750     {
751       p = (struct label_chain *) ggc_alloc (sizeof (struct label_chain));
752       p->next = stack_block_stack->data.block.label_chain;
753       stack_block_stack->data.block.label_chain = p;
754       p->label = label;
755     }
756 }
757
758 /* Declare that LABEL (a LABEL_DECL) may be used for nonlocal gotos
759    from nested functions.  */
760
761 void
762 declare_nonlocal_label (label)
763      tree label;
764 {
765   rtx slot = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
766
767   nonlocal_labels = tree_cons (NULL_TREE, label, nonlocal_labels);
768   LABEL_PRESERVE_P (label_rtx (label)) = 1;
769   if (nonlocal_goto_handler_slots == 0)
770     {
771       emit_stack_save (SAVE_NONLOCAL,
772                        &nonlocal_goto_stack_level,
773                        PREV_INSN (tail_recursion_reentry));
774     }
775   nonlocal_goto_handler_slots
776     = gen_rtx_EXPR_LIST (VOIDmode, slot, nonlocal_goto_handler_slots);
777 }
778
779 /* Generate RTL code for a `goto' statement with target label LABEL.
780    LABEL should be a LABEL_DECL tree node that was or will later be
781    defined with `expand_label'.  */
782
783 void
784 expand_goto (label)
785      tree label;
786 {
787   tree context;
788
789   /* Check for a nonlocal goto to a containing function.  */
790   context = decl_function_context (label);
791   if (context != 0 && context != current_function_decl)
792     {
793       struct function *p = find_function_data (context);
794       rtx label_ref = gen_rtx_LABEL_REF (Pmode, label_rtx (label));
795       rtx handler_slot, static_chain, save_area, insn;
796       tree link;
797
798       /* Find the corresponding handler slot for this label.  */
799       handler_slot = p->x_nonlocal_goto_handler_slots;
800       for (link = p->x_nonlocal_labels; TREE_VALUE (link) != label;
801            link = TREE_CHAIN (link))
802         handler_slot = XEXP (handler_slot, 1);
803       handler_slot = XEXP (handler_slot, 0);
804
805       p->has_nonlocal_label = 1;
806       current_function_has_nonlocal_goto = 1;
807       LABEL_REF_NONLOCAL_P (label_ref) = 1;
808
809       /* Copy the rtl for the slots so that they won't be shared in
810          case the virtual stack vars register gets instantiated differently
811          in the parent than in the child.  */
812
813       static_chain = copy_to_reg (lookup_static_chain (label));
814
815       /* Get addr of containing function's current nonlocal goto handler,
816          which will do any cleanups and then jump to the label.  */
817       handler_slot = copy_to_reg (replace_rtx (copy_rtx (handler_slot),
818                                                virtual_stack_vars_rtx,
819                                                static_chain));
820
821       /* Get addr of containing function's nonlocal save area.  */
822       save_area = p->x_nonlocal_goto_stack_level;
823       if (save_area)
824         save_area = replace_rtx (copy_rtx (save_area),
825                                  virtual_stack_vars_rtx, static_chain);
826
827 #if HAVE_nonlocal_goto
828       if (HAVE_nonlocal_goto)
829         emit_insn (gen_nonlocal_goto (static_chain, handler_slot,
830                                       save_area, label_ref));
831       else
832 #endif
833         {
834           /* Restore frame pointer for containing function.
835              This sets the actual hard register used for the frame pointer
836              to the location of the function's incoming static chain info.
837              The non-local goto handler will then adjust it to contain the
838              proper value and reload the argument pointer, if needed.  */
839           emit_move_insn (hard_frame_pointer_rtx, static_chain);
840           emit_stack_restore (SAVE_NONLOCAL, save_area, NULL_RTX);
841
842           /* USE of hard_frame_pointer_rtx added for consistency;
843              not clear if really needed.  */
844           emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
845           emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
846           emit_indirect_jump (handler_slot);
847         }
848
849       /* Search backwards to the jump insn and mark it as a 
850          non-local goto.  */
851       for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
852         {
853           if (GET_CODE (insn) == JUMP_INSN)
854             {
855               REG_NOTES (insn) = alloc_EXPR_LIST (REG_NON_LOCAL_GOTO,
856                                                   const0_rtx, REG_NOTES (insn));
857               break;
858             }
859           else if (GET_CODE (insn) == CALL_INSN)
860               break;
861         }
862     }
863   else
864     expand_goto_internal (label, label_rtx (label), NULL_RTX);
865 }
866
867 /* Generate RTL code for a `goto' statement with target label BODY.
868    LABEL should be a LABEL_REF.
869    LAST_INSN, if non-0, is the rtx we should consider as the last
870    insn emitted (for the purposes of cleaning up a return).  */
871
872 static void
873 expand_goto_internal (body, label, last_insn)
874      tree body;
875      rtx label;
876      rtx last_insn;
877 {
878   struct nesting *block;
879   rtx stack_level = 0;
880
881   if (GET_CODE (label) != CODE_LABEL)
882     abort ();
883
884   /* If label has already been defined, we can tell now
885      whether and how we must alter the stack level.  */
886
887   if (PREV_INSN (label) != 0)
888     {
889       /* Find the innermost pending block that contains the label.
890          (Check containment by comparing insn-uids.)
891          Then restore the outermost stack level within that block,
892          and do cleanups of all blocks contained in it.  */
893       for (block = block_stack; block; block = block->next)
894         {
895           if (INSN_UID (block->data.block.first_insn) < INSN_UID (label))
896             break;
897           if (block->data.block.stack_level != 0)
898             stack_level = block->data.block.stack_level;
899           /* Execute the cleanups for blocks we are exiting.  */
900           if (block->data.block.cleanups != 0)
901             {
902               expand_cleanups (block->data.block.cleanups, NULL_TREE, 1, 1);
903               do_pending_stack_adjust ();
904             }
905         }
906
907       if (stack_level)
908         {
909           /* Ensure stack adjust isn't done by emit_jump, as this
910              would clobber the stack pointer.  This one should be
911              deleted as dead by flow.  */
912           clear_pending_stack_adjust ();
913           do_pending_stack_adjust ();
914
915           /* Don't do this adjust if it's to the end label and this function
916              is to return with a depressed stack pointer.  */
917           if (label == return_label
918               && (((TREE_CODE (TREE_TYPE (current_function_decl))
919                    == FUNCTION_TYPE)
920                    && (TYPE_RETURNS_STACK_DEPRESSED
921                        (TREE_TYPE (current_function_decl))))))
922             ;
923           else
924             emit_stack_restore (SAVE_BLOCK, stack_level, NULL_RTX);
925         }
926
927       if (body != 0 && DECL_TOO_LATE (body))
928         error ("jump to `%s' invalidly jumps into binding contour",
929                IDENTIFIER_POINTER (DECL_NAME (body)));
930     }
931   /* Label not yet defined: may need to put this goto
932      on the fixup list.  */
933   else if (! expand_fixup (body, label, last_insn))
934     {
935       /* No fixup needed.  Record that the label is the target
936          of at least one goto that has no fixup.  */
937       if (body != 0)
938         TREE_ADDRESSABLE (body) = 1;
939     }
940
941   emit_jump (label);
942 }
943 \f
944 /* Generate if necessary a fixup for a goto
945    whose target label in tree structure (if any) is TREE_LABEL
946    and whose target in rtl is RTL_LABEL.
947
948    If LAST_INSN is nonzero, we pretend that the jump appears
949    after insn LAST_INSN instead of at the current point in the insn stream.
950
951    The fixup will be used later to insert insns just before the goto.
952    Those insns will restore the stack level as appropriate for the
953    target label, and will (in the case of C++) also invoke any object
954    destructors which have to be invoked when we exit the scopes which
955    are exited by the goto.
956
957    Value is nonzero if a fixup is made.  */
958
959 static int
960 expand_fixup (tree_label, rtl_label, last_insn)
961      tree tree_label;
962      rtx rtl_label;
963      rtx last_insn;
964 {
965   struct nesting *block, *end_block;
966
967   /* See if we can recognize which block the label will be output in.
968      This is possible in some very common cases.
969      If we succeed, set END_BLOCK to that block.
970      Otherwise, set it to 0.  */
971
972   if (cond_stack
973       && (rtl_label == cond_stack->data.cond.endif_label
974           || rtl_label == cond_stack->data.cond.next_label))
975     end_block = cond_stack;
976   /* If we are in a loop, recognize certain labels which
977      are likely targets.  This reduces the number of fixups
978      we need to create.  */
979   else if (loop_stack
980       && (rtl_label == loop_stack->data.loop.start_label
981           || rtl_label == loop_stack->data.loop.end_label
982           || rtl_label == loop_stack->data.loop.continue_label))
983     end_block = loop_stack;
984   else
985     end_block = 0;
986
987   /* Now set END_BLOCK to the binding level to which we will return.  */
988
989   if (end_block)
990     {
991       struct nesting *next_block = end_block->all;
992       block = block_stack;
993
994       /* First see if the END_BLOCK is inside the innermost binding level.
995          If so, then no cleanups or stack levels are relevant.  */
996       while (next_block && next_block != block)
997         next_block = next_block->all;
998
999       if (next_block)
1000         return 0;
1001
1002       /* Otherwise, set END_BLOCK to the innermost binding level
1003          which is outside the relevant control-structure nesting.  */
1004       next_block = block_stack->next;
1005       for (block = block_stack; block != end_block; block = block->all)
1006         if (block == next_block)
1007           next_block = next_block->next;
1008       end_block = next_block;
1009     }
1010
1011   /* Does any containing block have a stack level or cleanups?
1012      If not, no fixup is needed, and that is the normal case
1013      (the only case, for standard C).  */
1014   for (block = block_stack; block != end_block; block = block->next)
1015     if (block->data.block.stack_level != 0
1016         || block->data.block.cleanups != 0)
1017       break;
1018
1019   if (block != end_block)
1020     {
1021       /* Ok, a fixup is needed.  Add a fixup to the list of such.  */
1022       struct goto_fixup *fixup
1023         = (struct goto_fixup *) ggc_alloc (sizeof (struct goto_fixup));
1024       /* In case an old stack level is restored, make sure that comes
1025          after any pending stack adjust.  */
1026       /* ?? If the fixup isn't to come at the present position,
1027          doing the stack adjust here isn't useful.  Doing it with our
1028          settings at that location isn't useful either.  Let's hope
1029          someone does it!  */
1030       if (last_insn == 0)
1031         do_pending_stack_adjust ();
1032       fixup->target = tree_label;
1033       fixup->target_rtl = rtl_label;
1034
1035       /* Create a BLOCK node and a corresponding matched set of
1036          NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes at
1037          this point.  The notes will encapsulate any and all fixup
1038          code which we might later insert at this point in the insn
1039          stream.  Also, the BLOCK node will be the parent (i.e. the
1040          `SUPERBLOCK') of any other BLOCK nodes which we might create
1041          later on when we are expanding the fixup code.
1042
1043          Note that optimization passes (including expand_end_loop)
1044          might move the *_BLOCK notes away, so we use a NOTE_INSN_DELETED
1045          as a placeholder.  */
1046
1047       {
1048         rtx original_before_jump
1049           = last_insn ? last_insn : get_last_insn ();
1050         rtx start;
1051         rtx end;
1052         tree block;
1053
1054         block = make_node (BLOCK);
1055         TREE_USED (block) = 1;
1056
1057         if (!cfun->x_whole_function_mode_p)
1058           insert_block (block);
1059         else
1060           {
1061             BLOCK_CHAIN (block)
1062               = BLOCK_CHAIN (DECL_INITIAL (current_function_decl));
1063             BLOCK_CHAIN (DECL_INITIAL (current_function_decl))
1064               = block;
1065           }
1066
1067         start_sequence ();
1068         start = emit_note (NULL, NOTE_INSN_BLOCK_BEG);
1069         if (cfun->x_whole_function_mode_p)
1070           NOTE_BLOCK (start) = block;
1071         fixup->before_jump = emit_note (NULL, NOTE_INSN_DELETED);
1072         end = emit_note (NULL, NOTE_INSN_BLOCK_END);
1073         if (cfun->x_whole_function_mode_p)
1074           NOTE_BLOCK (end) = block;
1075         fixup->context = block;
1076         end_sequence ();
1077         emit_insns_after (start, original_before_jump);
1078       }
1079
1080       fixup->block_start_count = current_block_start_count;
1081       fixup->stack_level = 0;
1082       fixup->cleanup_list_list
1083         = ((block->data.block.outer_cleanups
1084             || block->data.block.cleanups)
1085            ? tree_cons (NULL_TREE, block->data.block.cleanups,
1086                         block->data.block.outer_cleanups)
1087            : 0);
1088       fixup->next = goto_fixup_chain;
1089       goto_fixup_chain = fixup;
1090     }
1091
1092   return block != 0;
1093 }
1094 \f
1095 /* Expand any needed fixups in the outputmost binding level of the
1096    function.  FIRST_INSN is the first insn in the function.  */
1097
1098 void
1099 expand_fixups (first_insn)
1100      rtx first_insn;
1101 {
1102   fixup_gotos (NULL, NULL_RTX, NULL_TREE, first_insn, 0);
1103 }
1104
1105 /* When exiting a binding contour, process all pending gotos requiring fixups.
1106    THISBLOCK is the structure that describes the block being exited.
1107    STACK_LEVEL is the rtx for the stack level to restore exiting this contour.
1108    CLEANUP_LIST is a list of expressions to evaluate on exiting this contour.
1109    FIRST_INSN is the insn that began this contour.
1110
1111    Gotos that jump out of this contour must restore the
1112    stack level and do the cleanups before actually jumping.
1113
1114    DONT_JUMP_IN nonzero means report error there is a jump into this
1115    contour from before the beginning of the contour.
1116    This is also done if STACK_LEVEL is nonzero.  */
1117
1118 static void
1119 fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
1120      struct nesting *thisblock;
1121      rtx stack_level;
1122      tree cleanup_list;
1123      rtx first_insn;
1124      int dont_jump_in;
1125 {
1126   struct goto_fixup *f, *prev;
1127
1128   /* F is the fixup we are considering; PREV is the previous one.  */
1129   /* We run this loop in two passes so that cleanups of exited blocks
1130      are run first, and blocks that are exited are marked so
1131      afterwards.  */
1132
1133   for (prev = 0, f = goto_fixup_chain; f; prev = f, f = f->next)
1134     {
1135       /* Test for a fixup that is inactive because it is already handled.  */
1136       if (f->before_jump == 0)
1137         {
1138           /* Delete inactive fixup from the chain, if that is easy to do.  */
1139           if (prev != 0)
1140             prev->next = f->next;
1141         }
1142       /* Has this fixup's target label been defined?
1143          If so, we can finalize it.  */
1144       else if (PREV_INSN (f->target_rtl) != 0)
1145         {
1146           rtx cleanup_insns;
1147
1148           /* If this fixup jumped into this contour from before the beginning
1149              of this contour, report an error.   This code used to use
1150              the first non-label insn after f->target_rtl, but that's
1151              wrong since such can be added, by things like put_var_into_stack
1152              and have INSN_UIDs that are out of the range of the block.  */
1153           /* ??? Bug: this does not detect jumping in through intermediate
1154              blocks that have stack levels or cleanups.
1155              It detects only a problem with the innermost block
1156              around the label.  */
1157           if (f->target != 0
1158               && (dont_jump_in || stack_level || cleanup_list)
1159               && INSN_UID (first_insn) < INSN_UID (f->target_rtl)
1160               && INSN_UID (first_insn) > INSN_UID (f->before_jump)
1161               && ! DECL_ERROR_ISSUED (f->target))
1162             {
1163               error_with_decl (f->target,
1164                                "label `%s' used before containing binding contour");
1165               /* Prevent multiple errors for one label.  */
1166               DECL_ERROR_ISSUED (f->target) = 1;
1167             }
1168
1169           /* We will expand the cleanups into a sequence of their own and
1170              then later on we will attach this new sequence to the insn
1171              stream just ahead of the actual jump insn.  */
1172
1173           start_sequence ();
1174
1175           /* Temporarily restore the lexical context where we will
1176              logically be inserting the fixup code.  We do this for the
1177              sake of getting the debugging information right.  */
1178
1179           pushlevel (0);
1180           set_block (f->context);
1181
1182           /* Expand the cleanups for blocks this jump exits.  */
1183           if (f->cleanup_list_list)
1184             {
1185               tree lists;
1186               for (lists = f->cleanup_list_list; lists; lists = TREE_CHAIN (lists))
1187                 /* Marked elements correspond to blocks that have been closed.
1188                    Do their cleanups.  */
1189                 if (TREE_ADDRESSABLE (lists)
1190                     && TREE_VALUE (lists) != 0)
1191                   {
1192                     expand_cleanups (TREE_VALUE (lists), NULL_TREE, 1, 1);
1193                     /* Pop any pushes done in the cleanups,
1194                        in case function is about to return.  */
1195                     do_pending_stack_adjust ();
1196                   }
1197             }
1198
1199           /* Restore stack level for the biggest contour that this
1200              jump jumps out of.  */
1201           if (f->stack_level
1202               && ! (f->target_rtl == return_label
1203                     && ((TREE_CODE (TREE_TYPE (current_function_decl))
1204                          == FUNCTION_TYPE)
1205                         && (TYPE_RETURNS_STACK_DEPRESSED
1206                             (TREE_TYPE (current_function_decl))))))
1207             emit_stack_restore (SAVE_BLOCK, f->stack_level, f->before_jump);
1208
1209           /* Finish up the sequence containing the insns which implement the
1210              necessary cleanups, and then attach that whole sequence to the
1211              insn stream just ahead of the actual jump insn.  Attaching it
1212              at that point insures that any cleanups which are in fact
1213              implicit C++ object destructions (which must be executed upon
1214              leaving the block) appear (to the debugger) to be taking place
1215              in an area of the generated code where the object(s) being
1216              destructed are still "in scope".  */
1217
1218           cleanup_insns = get_insns ();
1219           poplevel (1, 0, 0);
1220
1221           end_sequence ();
1222           emit_insns_after (cleanup_insns, f->before_jump);
1223
1224           f->before_jump = 0;
1225         }
1226     }
1227
1228   /* For any still-undefined labels, do the cleanups for this block now.
1229      We must do this now since items in the cleanup list may go out
1230      of scope when the block ends.  */
1231   for (prev = 0, f = goto_fixup_chain; f; prev = f, f = f->next)
1232     if (f->before_jump != 0
1233         && PREV_INSN (f->target_rtl) == 0
1234         /* Label has still not appeared.  If we are exiting a block with
1235            a stack level to restore, that started before the fixup,
1236            mark this stack level as needing restoration
1237            when the fixup is later finalized.  */
1238         && thisblock != 0
1239         /* Note: if THISBLOCK == 0 and we have a label that hasn't appeared, it
1240            means the label is undefined.  That's erroneous, but possible.  */
1241         && (thisblock->data.block.block_start_count
1242             <= f->block_start_count))
1243       {
1244         tree lists = f->cleanup_list_list;
1245         rtx cleanup_insns;
1246
1247         for (; lists; lists = TREE_CHAIN (lists))
1248           /* If the following elt. corresponds to our containing block
1249              then the elt. must be for this block.  */
1250           if (TREE_CHAIN (lists) == thisblock->data.block.outer_cleanups)
1251             {
1252               start_sequence ();
1253               pushlevel (0);
1254               set_block (f->context);
1255               expand_cleanups (TREE_VALUE (lists), NULL_TREE, 1, 1);
1256               do_pending_stack_adjust ();
1257               cleanup_insns = get_insns ();
1258               poplevel (1, 0, 0);
1259               end_sequence ();
1260               if (cleanup_insns != 0)
1261                 f->before_jump
1262                   = emit_insns_after (cleanup_insns, f->before_jump);
1263
1264               f->cleanup_list_list = TREE_CHAIN (lists);
1265             }
1266
1267         if (stack_level)
1268           f->stack_level = stack_level;
1269       }
1270 }
1271 \f
1272 /* Return the number of times character C occurs in string S.  */
1273 static int
1274 n_occurrences (c, s)
1275      int c;
1276      const char *s;
1277 {
1278   int n = 0;
1279   while (*s)
1280     n += (*s++ == c);
1281   return n;
1282 }
1283 \f
1284 /* Generate RTL for an asm statement (explicit assembler code).
1285    BODY is a STRING_CST node containing the assembler code text,
1286    or an ADDR_EXPR containing a STRING_CST.  */
1287
1288 void
1289 expand_asm (body)
1290      tree body;
1291 {
1292   if (current_function_check_memory_usage)
1293     {
1294       error ("`asm' cannot be used in function where memory usage is checked");
1295       return;
1296     }
1297
1298   if (TREE_CODE (body) == ADDR_EXPR)
1299     body = TREE_OPERAND (body, 0);
1300
1301   emit_insn (gen_rtx_ASM_INPUT (VOIDmode,
1302                                 TREE_STRING_POINTER (body)));
1303   last_expr_type = 0;
1304 }
1305
1306 /* Parse the output constraint pointed to by *CONSTRAINT_P.  It is the
1307    OPERAND_NUMth output operand, indexed from zero.  There are NINPUTS
1308    inputs and NOUTPUTS outputs to this extended-asm.  Upon return,
1309    *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
1310    memory operand.  Similarly, *ALLOWS_REG will be TRUE iff the
1311    constraint allows the use of a register operand.  And, *IS_INOUT
1312    will be true if the operand is read-write, i.e., if it is used as
1313    an input as well as an output.  If *CONSTRAINT_P is not in
1314    canonical form, it will be made canonical.  (Note that `+' will be
1315    rpelaced with `=' as part of this process.)
1316
1317    Returns TRUE if all went well; FALSE if an error occurred.  */
1318
1319 bool
1320 parse_output_constraint (constraint_p, 
1321                          operand_num,
1322                          ninputs,
1323                          noutputs,
1324                          allows_mem, 
1325                          allows_reg, 
1326                          is_inout)
1327      const char **constraint_p;
1328      int operand_num;
1329      int ninputs;
1330      int noutputs;
1331      bool *allows_mem;
1332      bool *allows_reg;
1333      bool *is_inout;
1334 {
1335   const char *constraint = *constraint_p;
1336   const char *p;
1337
1338   /* Assume the constraint doesn't allow the use of either a register
1339      or memory.  */
1340   *allows_mem = false;
1341   *allows_reg = false;
1342
1343   /* Allow the `=' or `+' to not be at the beginning of the string,
1344      since it wasn't explicitly documented that way, and there is a
1345      large body of code that puts it last.  Swap the character to
1346      the front, so as not to uglify any place else.  */
1347   p = strchr (constraint, '=');
1348   if (!p)
1349     p = strchr (constraint, '+');
1350
1351   /* If the string doesn't contain an `=', issue an error
1352      message.  */
1353   if (!p)
1354     {
1355       error ("output operand constraint lacks `='");
1356       return false;
1357     }
1358
1359   /* If the constraint begins with `+', then the operand is both read
1360      from and written to.  */
1361   *is_inout = (*p == '+');
1362
1363   /* Canonicalize the output constraint so that it begins with `='.  */
1364   if (p != constraint || is_inout)
1365     {
1366       char *buf;
1367       size_t c_len = strlen (constraint);
1368
1369       if (p != constraint)
1370         warning ("output constraint `%c' for operand %d is not at the beginning",
1371                  *p, operand_num);
1372
1373       /* Make a copy of the constraint.  */
1374       buf = alloca (c_len + 1);
1375       strcpy (buf, constraint);
1376       /* Swap the first character and the `=' or `+'.  */
1377       buf[p - constraint] = buf[0];
1378       /* Make sure the first character is an `='.  (Until we do this,
1379          it might be a `+'.)  */
1380       buf[0] = '=';
1381       /* Replace the constraint with the canonicalized string.  */
1382       *constraint_p = ggc_alloc_string (buf, c_len);
1383       constraint = *constraint_p;
1384     }
1385
1386   /* Loop through the constraint string.  */
1387   for (p = constraint + 1; *p; ++p)
1388     switch (*p)
1389       {
1390       case '+':
1391       case '=':
1392         error ("operand constraint contains '+' or '=' at illegal position.");
1393         return false;
1394         
1395       case '%':
1396         if (operand_num + 1 == ninputs + noutputs)
1397           {
1398             error ("`%%' constraint used with last operand");
1399             return false;
1400           }
1401         break;
1402
1403       case 'V':  case 'm':  case 'o':
1404         *allows_mem = true;
1405         break;
1406
1407       case '?':  case '!':  case '*':  case '&':  case '#':
1408       case 'E':  case 'F':  case 'G':  case 'H':
1409       case 's':  case 'i':  case 'n':
1410       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
1411       case 'N':  case 'O':  case 'P':  case ',':
1412         break;
1413
1414       case '0':  case '1':  case '2':  case '3':  case '4':
1415       case '5':  case '6':  case '7':  case '8':  case '9':
1416       case '[':
1417         error ("matching constraint not valid in output operand");
1418         return false;
1419
1420       case '<':  case '>':
1421         /* ??? Before flow, auto inc/dec insns are not supposed to exist,
1422            excepting those that expand_call created.  So match memory
1423            and hope.  */
1424         *allows_mem = true;
1425         break;
1426
1427       case 'g':  case 'X':
1428         *allows_reg = true;
1429         *allows_mem = true;
1430         break;
1431         
1432       case 'p': case 'r':
1433         *allows_reg = true;
1434         break;
1435
1436       default:
1437         if (!ISALPHA (*p))
1438           break;
1439         if (REG_CLASS_FROM_LETTER (*p) != NO_REGS)
1440           *allows_reg = true;
1441 #ifdef EXTRA_CONSTRAINT
1442         else
1443           {
1444             /* Otherwise we can't assume anything about the nature of
1445                the constraint except that it isn't purely registers.
1446                Treat it like "g" and hope for the best.  */
1447             *allows_reg = true;
1448             *allows_mem = true;
1449           }
1450 #endif
1451         break;
1452       }
1453
1454   return true;
1455 }
1456
1457 /* Generate RTL for an asm statement with arguments.
1458    STRING is the instruction template.
1459    OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
1460    Each output or input has an expression in the TREE_VALUE and
1461    and a tree list in TREE_PURPOSE which in turn contains a constraint
1462    name in TREE_VALUE (or NULL_TREE) and a constraint string 
1463    in TREE_PURPOSE.
1464    CLOBBERS is a list of STRING_CST nodes each naming a hard register
1465    that is clobbered by this insn.
1466
1467    Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
1468    Some elements of OUTPUTS may be replaced with trees representing temporary
1469    values.  The caller should copy those temporary values to the originally
1470    specified lvalues.
1471
1472    VOL nonzero means the insn is volatile; don't optimize it.  */
1473
1474 void
1475 expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
1476      tree string, outputs, inputs, clobbers;
1477      int vol;
1478      const char *filename;
1479      int line;
1480 {
1481   rtvec argvec, constraintvec;
1482   rtx body;
1483   int ninputs = list_length (inputs);
1484   int noutputs = list_length (outputs);
1485   int ninout = 0;
1486   int nclobbers;
1487   tree tail;
1488   int i;
1489   /* Vector of RTX's of evaluated output operands.  */
1490   rtx *output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
1491   int *inout_opnum = (int *) alloca (noutputs * sizeof (int));
1492   rtx *real_output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
1493   enum machine_mode *inout_mode
1494     = (enum machine_mode *) alloca (noutputs * sizeof (enum machine_mode));
1495   const char **constraints
1496     = (const char **) alloca ((noutputs + ninputs) * sizeof (const char *));
1497   /* The insn we have emitted.  */
1498   rtx insn;
1499   int old_generating_concat_p = generating_concat_p;
1500
1501   /* An ASM with no outputs needs to be treated as volatile, for now.  */
1502   if (noutputs == 0)
1503     vol = 1;
1504
1505   if (current_function_check_memory_usage)
1506     {
1507       error ("`asm' cannot be used in function where memory usage is checked");
1508       return;
1509     }
1510
1511   if (! check_operand_nalternatives (outputs, inputs))
1512     return;
1513
1514   if (! check_unique_operand_names (outputs, inputs))
1515     return;
1516
1517   string = resolve_operand_names (string, outputs, inputs, constraints);
1518
1519 #ifdef MD_ASM_CLOBBERS
1520   /* Sometimes we wish to automatically clobber registers across an asm.
1521      Case in point is when the i386 backend moved from cc0 to a hard reg --
1522      maintaining source-level compatability means automatically clobbering
1523      the flags register.  */
1524   MD_ASM_CLOBBERS (clobbers);
1525 #endif
1526
1527   /* Count the number of meaningful clobbered registers, ignoring what
1528      we would ignore later.  */
1529   nclobbers = 0;
1530   for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1531     {
1532       const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1533
1534       i = decode_reg_name (regname);
1535       if (i >= 0 || i == -4)
1536         ++nclobbers;
1537       else if (i == -2)
1538         error ("unknown register name `%s' in `asm'", regname);
1539     }
1540
1541   last_expr_type = 0;
1542
1543   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1544     {
1545       tree val = TREE_VALUE (tail);
1546       tree type = TREE_TYPE (val);
1547       bool is_inout;
1548       bool allows_reg;
1549       bool allows_mem;
1550
1551       /* If there's an erroneous arg, emit no insn.  */
1552       if (type == error_mark_node)
1553         return;
1554
1555       /* Make sure constraint has `=' and does not have `+'.  Also, see
1556          if it allows any register.  Be liberal on the latter test, since
1557          the worst that happens if we get it wrong is we issue an error
1558          message.  */
1559
1560       /* Try to parse the output constraint.  If that fails, there's
1561          no point in going further.  */
1562       if (!parse_output_constraint (&constraints[i],
1563                                     i,
1564                                     ninputs,
1565                                     noutputs,
1566                                     &allows_mem,
1567                                     &allows_reg,
1568                                     &is_inout))
1569         return;
1570
1571       /* If an output operand is not a decl or indirect ref and our constraint
1572          allows a register, make a temporary to act as an intermediate.
1573          Make the asm insn write into that, then our caller will copy it to
1574          the real output operand.  Likewise for promoted variables.  */
1575
1576       generating_concat_p = 0;
1577
1578       real_output_rtx[i] = NULL_RTX;
1579       if ((TREE_CODE (val) == INDIRECT_REF
1580            && allows_mem)
1581           || (DECL_P (val)
1582               && (allows_mem || GET_CODE (DECL_RTL (val)) == REG)
1583               && ! (GET_CODE (DECL_RTL (val)) == REG
1584                     && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
1585           || ! allows_reg
1586           || is_inout)
1587         {
1588           if (! allows_reg)
1589             mark_addressable (TREE_VALUE (tail));
1590
1591           output_rtx[i]
1592             = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode,
1593                            EXPAND_MEMORY_USE_WO);
1594
1595           if (! allows_reg && GET_CODE (output_rtx[i]) != MEM)
1596             error ("output number %d not directly addressable", i);
1597           if ((! allows_mem && GET_CODE (output_rtx[i]) == MEM)
1598               || GET_CODE (output_rtx[i]) == CONCAT)
1599             {
1600               real_output_rtx[i] = protect_from_queue (output_rtx[i], 1);
1601               output_rtx[i] = gen_reg_rtx (GET_MODE (output_rtx[i]));
1602               if (is_inout)
1603                 emit_move_insn (output_rtx[i], real_output_rtx[i]);
1604             }
1605         }
1606       else
1607         {
1608           output_rtx[i] = assign_temp (type, 0, 0, 1);
1609           TREE_VALUE (tail) = make_tree (type, output_rtx[i]);
1610         }
1611
1612       generating_concat_p = old_generating_concat_p;
1613
1614       if (is_inout)
1615         {
1616           inout_mode[ninout] = TYPE_MODE (TREE_TYPE (TREE_VALUE (tail)));
1617           inout_opnum[ninout++] = i;
1618         }
1619     }
1620
1621   ninputs += ninout;
1622   if (ninputs + noutputs > MAX_RECOG_OPERANDS)
1623     {
1624       error ("more than %d operands in `asm'", MAX_RECOG_OPERANDS);
1625       return;
1626     }
1627
1628   /* Make vectors for the expression-rtx, constraint strings,
1629      and named operands.  */
1630
1631   argvec = rtvec_alloc (ninputs);
1632   constraintvec = rtvec_alloc (ninputs);
1633
1634   body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
1635                                 : GET_MODE (output_rtx[0])),
1636                                TREE_STRING_POINTER (string), 
1637                                empty_string, 0, argvec, constraintvec,
1638                                filename, line);
1639
1640   MEM_VOLATILE_P (body) = vol;
1641
1642   /* Eval the inputs and put them into ARGVEC.
1643      Put their constraints into ASM_INPUTs and store in CONSTRAINTS.  */
1644
1645   for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), ++i)
1646     {
1647       int j;
1648       int allows_reg = 0, allows_mem = 0;
1649       const char *constraint, *orig_constraint;
1650       int c_len;
1651       rtx op;
1652
1653       /* If there's an erroneous arg, emit no insn,
1654          because the ASM_INPUT would get VOIDmode
1655          and that could cause a crash in reload.  */
1656       if (TREE_TYPE (TREE_VALUE (tail)) == error_mark_node)
1657         return;
1658
1659       /* ??? Can this happen, and does the error message make any sense? */
1660       if (TREE_PURPOSE (tail) == NULL_TREE)
1661         {
1662           error ("hard register `%s' listed as input operand to `asm'",
1663                  TREE_STRING_POINTER (TREE_VALUE (tail)) );
1664           return;
1665         }
1666
1667       orig_constraint = constraint = constraints[i + noutputs];
1668       c_len = strlen (constraint);
1669
1670       /* Make sure constraint has neither `=', `+', nor '&'.  */
1671
1672       for (j = 0; j < c_len; j++)
1673         switch (constraint[j])
1674           {
1675           case '+':  case '=':  case '&':
1676             if (constraint == orig_constraint)
1677               {
1678                 error ("input operand constraint contains `%c'",
1679                        constraint[j]);
1680                 return;
1681               }
1682             break;
1683
1684           case '%':
1685             if (constraint == orig_constraint
1686                 && i + 1 == ninputs - ninout)
1687               {
1688                 error ("`%%' constraint used with last operand");
1689                 return;
1690               }
1691             break;
1692
1693           case 'V':  case 'm':  case 'o':
1694             allows_mem = 1;
1695             break;
1696
1697           case '<':  case '>':
1698           case '?':  case '!':  case '*':  case '#':
1699           case 'E':  case 'F':  case 'G':  case 'H':
1700           case 's':  case 'i':  case 'n':
1701           case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
1702           case 'N':  case 'O':  case 'P':  case ',':
1703             break;
1704
1705             /* Whether or not a numeric constraint allows a register is
1706                decided by the matching constraint, and so there is no need
1707                to do anything special with them.  We must handle them in
1708                the default case, so that we don't unnecessarily force
1709                operands to memory.  */
1710           case '0':  case '1':  case '2':  case '3':  case '4':
1711           case '5':  case '6':  case '7':  case '8':  case '9':
1712             {
1713               char *end;
1714               unsigned long match;
1715
1716               match = strtoul (constraint + j, &end, 10);
1717               if (match >= (unsigned long) noutputs)
1718                 {
1719                   error ("matching constraint references invalid operand number");
1720                   return;
1721                 }
1722
1723               /* Try and find the real constraint for this dup.  Only do
1724                  this if the matching constraint is the only alternative.  */
1725               if (*end == '\0'
1726                   && (j == 0 || (j == 1 && constraint[0] == '%')))
1727                 {
1728                   constraint = constraints[match];
1729                   c_len = strlen (constraint);
1730                   j = 0;
1731                   break;
1732                 }
1733               else
1734                 j = end - constraint;
1735             }
1736             /* Fall through.  */
1737
1738           case 'p':  case 'r':
1739             allows_reg = 1;
1740             break;
1741
1742           case 'g':  case 'X':
1743             allows_reg = 1;
1744             allows_mem = 1;
1745             break;
1746
1747           default:
1748             if (! ISALPHA (constraint[j]))
1749               {
1750                 error ("invalid punctuation `%c' in constraint",
1751                        constraint[j]);
1752                 return;
1753               }
1754             if (REG_CLASS_FROM_LETTER (constraint[j]) != NO_REGS)
1755               allows_reg = 1;
1756 #ifdef EXTRA_CONSTRAINT
1757             else
1758               {
1759                 /* Otherwise we can't assume anything about the nature of
1760                    the constraint except that it isn't purely registers.
1761                    Treat it like "g" and hope for the best.  */
1762                 allows_reg = 1;
1763                 allows_mem = 1;
1764               }
1765 #endif
1766             break;
1767           }
1768
1769       if (! allows_reg && allows_mem)
1770         mark_addressable (TREE_VALUE (tail));
1771
1772       op = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode, 0);
1773
1774       /* Never pass a CONCAT to an ASM.  */
1775       generating_concat_p = 0;
1776       if (GET_CODE (op) == CONCAT)
1777         op = force_reg (GET_MODE (op), op);
1778
1779       if (asm_operand_ok (op, constraint) <= 0)
1780         {
1781           if (allows_reg)
1782             op = force_reg (TYPE_MODE (TREE_TYPE (TREE_VALUE (tail))), op);
1783           else if (!allows_mem)
1784             warning ("asm operand %d probably doesn't match constraints",
1785                      i + noutputs);
1786           else if (CONSTANT_P (op))
1787             op = force_const_mem (TYPE_MODE (TREE_TYPE (TREE_VALUE (tail))),
1788                                   op);
1789           else if (GET_CODE (op) == REG
1790                    || GET_CODE (op) == SUBREG
1791                    || GET_CODE (op) == ADDRESSOF
1792                    || GET_CODE (op) == CONCAT)
1793             {
1794               tree type = TREE_TYPE (TREE_VALUE (tail));
1795               tree qual_type = build_qualified_type (type,
1796                                                      (TYPE_QUALS (type)
1797                                                       | TYPE_QUAL_CONST));
1798               rtx memloc = assign_temp (qual_type, 1, 1, 1);
1799
1800               emit_move_insn (memloc, op);
1801               op = memloc;
1802             }
1803
1804           else if (GET_CODE (op) == MEM && MEM_VOLATILE_P (op))
1805             /* We won't recognize volatile memory as available a
1806                memory_operand at this point.  Ignore it.  */
1807             ;
1808           else if (queued_subexp_p (op))
1809             ;
1810           else
1811             /* ??? Leave this only until we have experience with what
1812                happens in combine and elsewhere when constraints are
1813                not satisfied.  */
1814             warning ("asm operand %d probably doesn't match constraints",
1815                      i + noutputs);
1816         }
1817       generating_concat_p = old_generating_concat_p;
1818       ASM_OPERANDS_INPUT (body, i) = op;
1819
1820       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
1821         = gen_rtx_ASM_INPUT (TYPE_MODE (TREE_TYPE (TREE_VALUE (tail))),
1822                              orig_constraint);
1823     }
1824
1825   /* Protect all the operands from the queue now that they have all been
1826      evaluated.  */
1827
1828   generating_concat_p = 0;
1829
1830   for (i = 0; i < ninputs - ninout; i++)
1831     ASM_OPERANDS_INPUT (body, i)
1832       = protect_from_queue (ASM_OPERANDS_INPUT (body, i), 0);
1833
1834   for (i = 0; i < noutputs; i++)
1835     output_rtx[i] = protect_from_queue (output_rtx[i], 1);
1836
1837   /* For in-out operands, copy output rtx to input rtx.  */
1838   for (i = 0; i < ninout; i++)
1839     {
1840       int j = inout_opnum[i];
1841       char buffer[16];
1842
1843       ASM_OPERANDS_INPUT (body, ninputs - ninout + i)
1844         = output_rtx[j];
1845
1846       sprintf (buffer, "%d", j);
1847       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, ninputs - ninout + i)
1848         = gen_rtx_ASM_INPUT (inout_mode[i], ggc_alloc_string (buffer, -1));
1849     }
1850
1851   generating_concat_p = old_generating_concat_p;
1852
1853   /* Now, for each output, construct an rtx
1854      (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
1855                                ARGVEC CONSTRAINTS OPNAMES))
1856      If there is more than one, put them inside a PARALLEL.  */
1857
1858   if (noutputs == 1 && nclobbers == 0)
1859     {
1860       ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0];
1861       insn = emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
1862     }
1863
1864   else if (noutputs == 0 && nclobbers == 0)
1865     {
1866       /* No output operands: put in a raw ASM_OPERANDS rtx.  */
1867       insn = emit_insn (body);
1868     }
1869
1870   else
1871     {
1872       rtx obody = body;
1873       int num = noutputs;
1874
1875       if (num == 0)
1876         num = 1;
1877
1878       body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
1879
1880       /* For each output operand, store a SET.  */
1881       for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1882         {
1883           XVECEXP (body, 0, i)
1884             = gen_rtx_SET (VOIDmode,
1885                            output_rtx[i],
1886                            gen_rtx_ASM_OPERANDS
1887                            (GET_MODE (output_rtx[i]),
1888                             TREE_STRING_POINTER (string),
1889                             constraints[i], i, argvec, constraintvec,
1890                             filename, line));
1891
1892           MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1893         }
1894
1895       /* If there are no outputs (but there are some clobbers)
1896          store the bare ASM_OPERANDS into the PARALLEL.  */
1897
1898       if (i == 0)
1899         XVECEXP (body, 0, i++) = obody;
1900
1901       /* Store (clobber REG) for each clobbered register specified.  */
1902
1903       for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1904         {
1905           const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1906           int j = decode_reg_name (regname);
1907
1908           if (j < 0)
1909             {
1910               if (j == -3)      /* `cc', which is not a register */
1911                 continue;
1912
1913               if (j == -4)      /* `memory', don't cache memory across asm */
1914                 {
1915                   XVECEXP (body, 0, i++)
1916                     = gen_rtx_CLOBBER (VOIDmode,
1917                                        gen_rtx_MEM
1918                                        (BLKmode,
1919                                         gen_rtx_SCRATCH (VOIDmode)));
1920                   continue;
1921                 }
1922
1923               /* Ignore unknown register, error already signaled.  */
1924               continue;
1925             }
1926
1927           /* Use QImode since that's guaranteed to clobber just one reg.  */
1928           XVECEXP (body, 0, i++)
1929             = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (QImode, j));
1930         }
1931
1932       insn = emit_insn (body);
1933     }
1934
1935   /* For any outputs that needed reloading into registers, spill them
1936      back to where they belong.  */
1937   for (i = 0; i < noutputs; ++i)
1938     if (real_output_rtx[i])
1939       emit_move_insn (real_output_rtx[i], output_rtx[i]);
1940
1941   free_temp_slots ();
1942 }
1943
1944 /* A subroutine of expand_asm_operands.  Check that all operands have
1945    the same number of alternatives.  Return true if so.  */
1946
1947 static bool
1948 check_operand_nalternatives (outputs, inputs)
1949      tree outputs, inputs;
1950 {
1951   if (outputs || inputs)
1952     {
1953       tree tmp = TREE_PURPOSE (outputs ? outputs : inputs);
1954       int nalternatives
1955         = n_occurrences (',', TREE_STRING_POINTER (TREE_VALUE (tmp)));
1956       tree next = inputs;
1957
1958       if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
1959         {
1960           error ("too many alternatives in `asm'");
1961           return false;
1962         }
1963
1964       tmp = outputs;
1965       while (tmp)
1966         {
1967           const char *constraint
1968             = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tmp)));
1969
1970           if (n_occurrences (',', constraint) != nalternatives)
1971             {
1972               error ("operand constraints for `asm' differ in number of alternatives");
1973               return false;
1974             }
1975
1976           if (TREE_CHAIN (tmp))
1977             tmp = TREE_CHAIN (tmp);
1978           else
1979             tmp = next, next = 0;
1980         }
1981     }
1982
1983   return true;
1984 }
1985
1986 /* A subroutine of expand_asm_operands.  Check that all operand names
1987    are unique.  Return true if so.  We rely on the fact that these names
1988    are identifiers, and so have been canonicalized by get_identifier,
1989    so all we need are pointer comparisons.  */
1990
1991 static bool
1992 check_unique_operand_names (outputs, inputs)
1993      tree outputs, inputs;
1994 {
1995   tree i, j;
1996
1997   for (i = outputs; i ; i = TREE_CHAIN (i))
1998     {
1999       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
2000       if (! i_name)
2001         continue;
2002
2003       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
2004         if (i_name == TREE_PURPOSE (TREE_PURPOSE (j)))
2005           goto failure;
2006     }
2007
2008   for (i = inputs; i ; i = TREE_CHAIN (i))
2009     {
2010       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
2011       if (! i_name)
2012         continue;
2013
2014       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
2015         if (i_name == TREE_PURPOSE (TREE_PURPOSE (j)))
2016           goto failure;
2017       for (j = outputs; j ; j = TREE_CHAIN (j))
2018         if (i_name == TREE_PURPOSE (TREE_PURPOSE (j)))
2019           goto failure;
2020     }
2021
2022   return true;
2023
2024  failure:
2025   error ("duplicate asm operand name '%s'",
2026          IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
2027   return false;
2028 }
2029
2030 /* A subroutine of expand_asm_operands.  Resolve the names of the operands
2031    in *POUTPUTS and *PINPUTS to numbers, and replace the name expansions in
2032    STRING and in the constraints to those numbers.  */
2033
2034 static tree
2035 resolve_operand_names (string, outputs, inputs, pconstraints)
2036      tree string;
2037      tree outputs, inputs;
2038      const char **pconstraints;
2039 {
2040   char *buffer = xstrdup (TREE_STRING_POINTER (string));
2041   char *p;
2042   tree t;
2043
2044   /* Assume that we will not need extra space to perform the substitution.
2045      This because we get to remove '[' and ']', which means we cannot have
2046      a problem until we have more than 999 operands.  */
2047
2048   p = buffer;
2049   while ((p = strchr (p, '%')) != NULL)
2050     {
2051       if (*++p != '[')
2052         continue;
2053       p = resolve_operand_name_1 (p, outputs, inputs);
2054     }
2055
2056   string = build_string (strlen (buffer), buffer);
2057   free (buffer);
2058
2059   /* Collect output constraints here because it's convenient.
2060      There should be no named operands here; this is verified
2061      in expand_asm_operand.  */
2062   for (t = outputs; t ; t = TREE_CHAIN (t), pconstraints++)
2063     *pconstraints = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
2064
2065   /* Substitute [<name>] in input constraint strings.  */
2066   for (t = inputs; t ; t = TREE_CHAIN (t), pconstraints++)
2067     {
2068       const char *c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
2069       if (strchr (c, '[') == NULL)
2070         *pconstraints = c;
2071       else
2072         {
2073           p = buffer = xstrdup (c);
2074           while ((p = strchr (p, '[')) != NULL)
2075             p = resolve_operand_name_1 (p, outputs, inputs);
2076
2077           *pconstraints = ggc_alloc_string (buffer, -1);
2078           free (buffer);
2079         }
2080     }
2081
2082   return string;
2083 }
2084
2085 /* A subroutine of resolve_operand_names.  P points to the '[' for a
2086    potential named operand of the form [<name>].  In place, replace
2087    the name and brackets with a number.  Return a pointer to the 
2088    balance of the string after substitution.  */
2089
2090 static char *
2091 resolve_operand_name_1 (p, outputs, inputs)
2092      char *p;
2093      tree outputs, inputs;
2094 {
2095   char *q;
2096   int op;
2097   tree t;
2098   size_t len;
2099
2100   /* Collect the operand name.  */
2101   q = strchr (p, ']');
2102   if (!q)
2103     {
2104       error ("missing close brace for named operand");
2105       return strchr (p, '\0');
2106     }
2107   len = q - p - 1;
2108
2109   /* Resolve the name to a number.  */
2110   for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
2111     {
2112       const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t)));
2113       if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
2114         goto found;
2115     }
2116   for (t = inputs; t ; t = TREE_CHAIN (t), op++)
2117     {
2118       const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t)));
2119       if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
2120         goto found;
2121     }
2122
2123   *q = '\0';
2124   error ("undefined named operand '%s'", p + 1);
2125   op = 0;
2126  found:
2127
2128   /* Replace the name with the number.  Unfortunately, not all libraries
2129      get the return value of sprintf correct, so search for the end of the
2130      generated string by hand.  */
2131   sprintf (p, "%d", op);
2132   p = strchr (p, '\0');
2133
2134   /* Verify the no extra buffer space assumption.  */
2135   if (p > q)
2136     abort ();
2137
2138   /* Shift the rest of the buffer down to fill the gap.  */
2139   memmove (p, q + 1, strlen (q + 1) + 1);
2140
2141   return p;
2142 }
2143 \f
2144 /* Generate RTL to evaluate the expression EXP
2145    and remember it in case this is the VALUE in a ({... VALUE; }) constr.  */
2146
2147 void
2148 expand_expr_stmt (exp)
2149      tree exp;
2150 {
2151   /* If -W, warn about statements with no side effects,
2152      except for an explicit cast to void (e.g. for assert()), and
2153      except inside a ({...}) where they may be useful.  */
2154   if (expr_stmts_for_value == 0 && exp != error_mark_node)
2155     {
2156       if (! TREE_SIDE_EFFECTS (exp))
2157         {
2158           if ((extra_warnings || warn_unused_value)
2159               && !(TREE_CODE (exp) == CONVERT_EXPR
2160                    && VOID_TYPE_P (TREE_TYPE (exp))))
2161             warning_with_file_and_line (emit_filename, emit_lineno,
2162                                         "statement with no effect");
2163         }
2164       else if (warn_unused_value)
2165         warn_if_unused_value (exp);
2166     }
2167
2168   /* If EXP is of function type and we are expanding statements for
2169      value, convert it to pointer-to-function.  */
2170   if (expr_stmts_for_value && TREE_CODE (TREE_TYPE (exp)) == FUNCTION_TYPE)
2171     exp = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
2172
2173   /* The call to `expand_expr' could cause last_expr_type and
2174      last_expr_value to get reset.  Therefore, we set last_expr_value
2175      and last_expr_type *after* calling expand_expr.  */
2176   last_expr_value = expand_expr (exp,
2177                                  (expr_stmts_for_value
2178                                   ? NULL_RTX : const0_rtx),
2179                                  VOIDmode, 0);
2180   last_expr_type = TREE_TYPE (exp);
2181
2182   /* If all we do is reference a volatile value in memory,
2183      copy it to a register to be sure it is actually touched.  */
2184   if (last_expr_value != 0 && GET_CODE (last_expr_value) == MEM
2185       && TREE_THIS_VOLATILE (exp))
2186     {
2187       if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode)
2188         ;
2189       else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
2190         copy_to_reg (last_expr_value);
2191       else
2192         {
2193           rtx lab = gen_label_rtx ();
2194
2195           /* Compare the value with itself to reference it.  */
2196           emit_cmp_and_jump_insns (last_expr_value, last_expr_value, EQ,
2197                                    expand_expr (TYPE_SIZE (last_expr_type),
2198                                                 NULL_RTX, VOIDmode, 0),
2199                                    BLKmode, 0,
2200                                    TYPE_ALIGN (last_expr_type) / BITS_PER_UNIT,
2201                                    lab);
2202           emit_label (lab);
2203         }
2204     }
2205
2206   /* If this expression is part of a ({...}) and is in memory, we may have
2207      to preserve temporaries.  */
2208   preserve_temp_slots (last_expr_value);
2209
2210   /* Free any temporaries used to evaluate this expression.  Any temporary
2211      used as a result of this expression will already have been preserved
2212      above.  */
2213   free_temp_slots ();
2214
2215   emit_queue ();
2216 }
2217
2218 /* Warn if EXP contains any computations whose results are not used.
2219    Return 1 if a warning is printed; 0 otherwise.  */
2220
2221 int
2222 warn_if_unused_value (exp)
2223      tree exp;
2224 {
2225   if (TREE_USED (exp))
2226     return 0;
2227
2228   /* Don't warn about void constructs.  This includes casting to void,
2229      void function calls, and statement expressions with a final cast
2230      to void.  */
2231   if (VOID_TYPE_P (TREE_TYPE (exp)))
2232     return 0;
2233
2234   /* If this is an expression with side effects, don't warn.  */
2235   if (TREE_SIDE_EFFECTS (exp))
2236     return 0;
2237
2238   switch (TREE_CODE (exp))
2239     {
2240     case PREINCREMENT_EXPR:
2241     case POSTINCREMENT_EXPR:
2242     case PREDECREMENT_EXPR:
2243     case POSTDECREMENT_EXPR:
2244     case MODIFY_EXPR:
2245     case INIT_EXPR:
2246     case TARGET_EXPR:
2247     case CALL_EXPR:
2248     case METHOD_CALL_EXPR:
2249     case RTL_EXPR:
2250     case TRY_CATCH_EXPR:
2251     case WITH_CLEANUP_EXPR:
2252     case EXIT_EXPR:
2253       return 0;
2254
2255     case BIND_EXPR:
2256       /* For a binding, warn if no side effect within it.  */
2257       return warn_if_unused_value (TREE_OPERAND (exp, 1));
2258
2259     case SAVE_EXPR:
2260       return warn_if_unused_value (TREE_OPERAND (exp, 1));
2261
2262     case TRUTH_ORIF_EXPR:
2263     case TRUTH_ANDIF_EXPR:
2264       /* In && or ||, warn if 2nd operand has no side effect.  */
2265       return warn_if_unused_value (TREE_OPERAND (exp, 1));
2266
2267     case COMPOUND_EXPR:
2268       if (TREE_NO_UNUSED_WARNING (exp))
2269         return 0;
2270       if (warn_if_unused_value (TREE_OPERAND (exp, 0)))
2271         return 1;
2272       /* Let people do `(foo (), 0)' without a warning.  */
2273       if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
2274         return 0;
2275       return warn_if_unused_value (TREE_OPERAND (exp, 1));
2276
2277     case NOP_EXPR:
2278     case CONVERT_EXPR:
2279     case NON_LVALUE_EXPR:
2280       /* Don't warn about conversions not explicit in the user's program.  */
2281       if (TREE_NO_UNUSED_WARNING (exp))
2282         return 0;
2283       /* Assignment to a cast usually results in a cast of a modify.
2284          Don't complain about that.  There can be an arbitrary number of
2285          casts before the modify, so we must loop until we find the first
2286          non-cast expression and then test to see if that is a modify.  */
2287       {
2288         tree tem = TREE_OPERAND (exp, 0);
2289
2290         while (TREE_CODE (tem) == CONVERT_EXPR || TREE_CODE (tem) == NOP_EXPR)
2291           tem = TREE_OPERAND (tem, 0);
2292
2293         if (TREE_CODE (tem) == MODIFY_EXPR || TREE_CODE (tem) == INIT_EXPR
2294             || TREE_CODE (tem) == CALL_EXPR)
2295           return 0;
2296       }
2297       goto warn;
2298
2299     case INDIRECT_REF:
2300       /* Don't warn about automatic dereferencing of references, since
2301          the user cannot control it.  */
2302       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
2303         return warn_if_unused_value (TREE_OPERAND (exp, 0));
2304       /* Fall through.  */
2305
2306     default:
2307       /* Referencing a volatile value is a side effect, so don't warn.  */
2308       if ((DECL_P (exp)
2309            || TREE_CODE_CLASS (TREE_CODE (exp)) == 'r')
2310           && TREE_THIS_VOLATILE (exp))
2311         return 0;
2312
2313       /* If this is an expression which has no operands, there is no value
2314          to be unused.  There are no such language-independent codes,
2315          but front ends may define such.  */
2316       if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'e'
2317           && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
2318         return 0;
2319
2320     warn:
2321       warning_with_file_and_line (emit_filename, emit_lineno,
2322                                   "value computed is not used");
2323       return 1;
2324     }
2325 }
2326
2327 /* Clear out the memory of the last expression evaluated.  */
2328
2329 void
2330 clear_last_expr ()
2331 {
2332   last_expr_type = 0;
2333 }
2334
2335 /* Begin a statement which will return a value.
2336    Return the RTL_EXPR for this statement expr.
2337    The caller must save that value and pass it to expand_end_stmt_expr.  */
2338
2339 tree
2340 expand_start_stmt_expr ()
2341 {
2342   tree t;
2343
2344   /* Make the RTL_EXPR node temporary, not momentary,
2345      so that rtl_expr_chain doesn't become garbage.  */
2346   t = make_node (RTL_EXPR);
2347   do_pending_stack_adjust ();
2348   start_sequence_for_rtl_expr (t);
2349   NO_DEFER_POP;
2350   expr_stmts_for_value++;
2351   return t;
2352 }
2353
2354 /* Restore the previous state at the end of a statement that returns a value.
2355    Returns a tree node representing the statement's value and the
2356    insns to compute the value.
2357
2358    The nodes of that expression have been freed by now, so we cannot use them.
2359    But we don't want to do that anyway; the expression has already been
2360    evaluated and now we just want to use the value.  So generate a RTL_EXPR
2361    with the proper type and RTL value.
2362
2363    If the last substatement was not an expression,
2364    return something with type `void'.  */
2365
2366 tree
2367 expand_end_stmt_expr (t)
2368      tree t;
2369 {
2370   OK_DEFER_POP;
2371
2372   if (last_expr_type == 0)
2373     {
2374       last_expr_type = void_type_node;
2375       last_expr_value = const0_rtx;
2376     }
2377   else if (last_expr_value == 0)
2378     /* There are some cases where this can happen, such as when the
2379        statement is void type.  */
2380     last_expr_value = const0_rtx;
2381   else if (GET_CODE (last_expr_value) != REG && ! CONSTANT_P (last_expr_value))
2382     /* Remove any possible QUEUED.  */
2383     last_expr_value = protect_from_queue (last_expr_value, 0);
2384
2385   emit_queue ();
2386
2387   TREE_TYPE (t) = last_expr_type;
2388   RTL_EXPR_RTL (t) = last_expr_value;
2389   RTL_EXPR_SEQUENCE (t) = get_insns ();
2390
2391   rtl_expr_chain = tree_cons (NULL_TREE, t, rtl_expr_chain);
2392
2393   end_sequence ();
2394
2395   /* Don't consider deleting this expr or containing exprs at tree level.  */
2396   TREE_SIDE_EFFECTS (t) = 1;
2397   /* Propagate volatility of the actual RTL expr.  */
2398   TREE_THIS_VOLATILE (t) = volatile_refs_p (last_expr_value);
2399
2400   last_expr_type = 0;
2401   expr_stmts_for_value--;
2402
2403   return t;
2404 }
2405 \f
2406 /* Generate RTL for the start of an if-then.  COND is the expression
2407    whose truth should be tested.
2408
2409    If EXITFLAG is nonzero, this conditional is visible to
2410    `exit_something'.  */
2411
2412 void
2413 expand_start_cond (cond, exitflag)
2414      tree cond;
2415      int exitflag;
2416 {
2417   struct nesting *thiscond = ALLOC_NESTING ();
2418
2419   /* Make an entry on cond_stack for the cond we are entering.  */
2420
2421   thiscond->next = cond_stack;
2422   thiscond->all = nesting_stack;
2423   thiscond->depth = ++nesting_depth;
2424   thiscond->data.cond.next_label = gen_label_rtx ();
2425   /* Before we encounter an `else', we don't need a separate exit label
2426      unless there are supposed to be exit statements
2427      to exit this conditional.  */
2428   thiscond->exit_label = exitflag ? gen_label_rtx () : 0;
2429   thiscond->data.cond.endif_label = thiscond->exit_label;
2430   cond_stack = thiscond;
2431   nesting_stack = thiscond;
2432
2433   do_jump (cond, thiscond->data.cond.next_label, NULL_RTX);
2434 }
2435
2436 /* Generate RTL between then-clause and the elseif-clause
2437    of an if-then-elseif-....  */
2438
2439 void
2440 expand_start_elseif (cond)
2441      tree cond;
2442 {
2443   if (cond_stack->data.cond.endif_label == 0)
2444     cond_stack->data.cond.endif_label = gen_label_rtx ();
2445   emit_jump (cond_stack->data.cond.endif_label);
2446   emit_label (cond_stack->data.cond.next_label);
2447   cond_stack->data.cond.next_label = gen_label_rtx ();
2448   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
2449 }
2450
2451 /* Generate RTL between the then-clause and the else-clause
2452    of an if-then-else.  */
2453
2454 void
2455 expand_start_else ()
2456 {
2457   if (cond_stack->data.cond.endif_label == 0)
2458     cond_stack->data.cond.endif_label = gen_label_rtx ();
2459
2460   emit_jump (cond_stack->data.cond.endif_label);
2461   emit_label (cond_stack->data.cond.next_label);
2462   cond_stack->data.cond.next_label = 0;  /* No more _else or _elseif calls.  */
2463 }
2464
2465 /* After calling expand_start_else, turn this "else" into an "else if"
2466    by providing another condition.  */
2467
2468 void
2469 expand_elseif (cond)
2470      tree cond;
2471 {
2472   cond_stack->data.cond.next_label = gen_label_rtx ();
2473   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
2474 }
2475
2476 /* Generate RTL for the end of an if-then.
2477    Pop the record for it off of cond_stack.  */
2478
2479 void
2480 expand_end_cond ()
2481 {
2482   struct nesting *thiscond = cond_stack;
2483
2484   do_pending_stack_adjust ();
2485   if (thiscond->data.cond.next_label)
2486     emit_label (thiscond->data.cond.next_label);
2487   if (thiscond->data.cond.endif_label)
2488     emit_label (thiscond->data.cond.endif_label);
2489
2490   POPSTACK (cond_stack);
2491   last_expr_type = 0;
2492 }
2493 \f
2494 /* Generate RTL for the start of a loop.  EXIT_FLAG is nonzero if this
2495    loop should be exited by `exit_something'.  This is a loop for which
2496    `expand_continue' will jump to the top of the loop.
2497
2498    Make an entry on loop_stack to record the labels associated with
2499    this loop.  */
2500
2501 struct nesting *
2502 expand_start_loop (exit_flag)
2503      int exit_flag;
2504 {
2505   struct nesting *thisloop = ALLOC_NESTING ();
2506
2507   /* Make an entry on loop_stack for the loop we are entering.  */
2508
2509   thisloop->next = loop_stack;
2510   thisloop->all = nesting_stack;
2511   thisloop->depth = ++nesting_depth;
2512   thisloop->data.loop.start_label = gen_label_rtx ();
2513   thisloop->data.loop.end_label = gen_label_rtx ();
2514   thisloop->data.loop.alt_end_label = 0;
2515   thisloop->data.loop.continue_label = thisloop->data.loop.start_label;
2516   thisloop->exit_label = exit_flag ? thisloop->data.loop.end_label : 0;
2517   loop_stack = thisloop;
2518   nesting_stack = thisloop;
2519
2520   do_pending_stack_adjust ();
2521   emit_queue ();
2522   emit_note (NULL, NOTE_INSN_LOOP_BEG);
2523   emit_label (thisloop->data.loop.start_label);
2524
2525   return thisloop;
2526 }
2527
2528 /* Like expand_start_loop but for a loop where the continuation point
2529    (for expand_continue_loop) will be specified explicitly.  */
2530
2531 struct nesting *
2532 expand_start_loop_continue_elsewhere (exit_flag)
2533      int exit_flag;
2534 {
2535   struct nesting *thisloop = expand_start_loop (exit_flag);
2536   loop_stack->data.loop.continue_label = gen_label_rtx ();
2537   return thisloop;
2538 }
2539
2540 /* Begin a null, aka do { } while (0) "loop".  But since the contents
2541    of said loop can still contain a break, we must frob the loop nest.  */
2542
2543 struct nesting *
2544 expand_start_null_loop ()
2545 {
2546   struct nesting *thisloop = ALLOC_NESTING ();
2547
2548   /* Make an entry on loop_stack for the loop we are entering.  */
2549
2550   thisloop->next = loop_stack;
2551   thisloop->all = nesting_stack;
2552   thisloop->depth = ++nesting_depth;
2553   thisloop->data.loop.start_label = emit_note (NULL, NOTE_INSN_DELETED);
2554   thisloop->data.loop.end_label = gen_label_rtx ();
2555   thisloop->data.loop.alt_end_label = NULL_RTX;
2556   thisloop->data.loop.continue_label = thisloop->data.loop.end_label;
2557   thisloop->exit_label = thisloop->data.loop.end_label;
2558   loop_stack = thisloop;
2559   nesting_stack = thisloop;
2560
2561   return thisloop;
2562 }
2563
2564 /* Specify the continuation point for a loop started with
2565    expand_start_loop_continue_elsewhere.
2566    Use this at the point in the code to which a continue statement
2567    should jump.  */
2568
2569 void
2570 expand_loop_continue_here ()
2571 {
2572   do_pending_stack_adjust ();
2573   emit_note (NULL, NOTE_INSN_LOOP_CONT);
2574   emit_label (loop_stack->data.loop.continue_label);
2575 }
2576
2577 /* Finish a loop.  Generate a jump back to the top and the loop-exit label.
2578    Pop the block off of loop_stack.  */
2579
2580 void
2581 expand_end_loop ()
2582 {
2583   rtx start_label = loop_stack->data.loop.start_label;
2584   rtx insn = get_last_insn ();
2585   int needs_end_jump = 1;
2586
2587   /* Mark the continue-point at the top of the loop if none elsewhere.  */
2588   if (start_label == loop_stack->data.loop.continue_label)
2589     emit_note_before (NOTE_INSN_LOOP_CONT, start_label);
2590
2591   do_pending_stack_adjust ();
2592
2593   /* If optimizing, perhaps reorder the loop.
2594      First, try to use a condjump near the end.
2595      expand_exit_loop_if_false ends loops with unconditional jumps,
2596      like this:
2597
2598      if (test) goto label;
2599      optional: cleanup
2600      goto loop_stack->data.loop.end_label
2601      barrier
2602      label:
2603
2604      If we find such a pattern, we can end the loop earlier.  */
2605
2606   if (optimize
2607       && GET_CODE (insn) == CODE_LABEL
2608       && LABEL_NAME (insn) == NULL
2609       && GET_CODE (PREV_INSN (insn)) == BARRIER)
2610     {
2611       rtx label = insn;
2612       rtx jump = PREV_INSN (PREV_INSN (label));
2613
2614       if (GET_CODE (jump) == JUMP_INSN
2615           && GET_CODE (PATTERN (jump)) == SET
2616           && SET_DEST (PATTERN (jump)) == pc_rtx
2617           && GET_CODE (SET_SRC (PATTERN (jump))) == LABEL_REF
2618           && (XEXP (SET_SRC (PATTERN (jump)), 0)
2619               == loop_stack->data.loop.end_label))
2620         {
2621           rtx prev;
2622
2623           /* The test might be complex and reference LABEL multiple times,
2624              like the loop in loop_iterations to set vtop.  To handle this,
2625              we move LABEL.  */
2626           insn = PREV_INSN (label);
2627           reorder_insns (label, label, start_label);
2628
2629           for (prev = PREV_INSN (jump);; prev = PREV_INSN (prev))
2630             {
2631               /* We ignore line number notes, but if we see any other note,
2632                  in particular NOTE_INSN_BLOCK_*, NOTE_INSN_EH_REGION_*,
2633                  NOTE_INSN_LOOP_*, we disable this optimization.  */
2634               if (GET_CODE (prev) == NOTE)
2635                 {
2636                   if (NOTE_LINE_NUMBER (prev) < 0)
2637                     break;
2638                   continue;
2639                 }
2640               if (GET_CODE (prev) == CODE_LABEL)
2641                 break;
2642               if (GET_CODE (prev) == JUMP_INSN)
2643                 {
2644                   if (GET_CODE (PATTERN (prev)) == SET
2645                       && SET_DEST (PATTERN (prev)) == pc_rtx
2646                       && GET_CODE (SET_SRC (PATTERN (prev))) == IF_THEN_ELSE
2647                       && (GET_CODE (XEXP (SET_SRC (PATTERN (prev)), 1))
2648                           == LABEL_REF)
2649                       && XEXP (XEXP (SET_SRC (PATTERN (prev)), 1), 0) == label)
2650                     {
2651                       XEXP (XEXP (SET_SRC (PATTERN (prev)), 1), 0)
2652                         = start_label;
2653                       emit_note_after (NOTE_INSN_LOOP_END, prev);
2654                       needs_end_jump = 0;
2655                     }
2656                   break;
2657                 }
2658            }
2659         }
2660     }
2661
2662      /* If the loop starts with a loop exit, roll that to the end where
2663      it will optimize together with the jump back.
2664
2665      We look for the conditional branch to the exit, except that once
2666      we find such a branch, we don't look past 30 instructions.
2667
2668      In more detail, if the loop presently looks like this (in pseudo-C):
2669
2670          start_label:
2671          if (test) goto end_label;
2672          body;
2673          goto start_label;
2674          end_label:
2675
2676      transform it to look like:
2677
2678          goto start_label;
2679          newstart_label:
2680          body;
2681          start_label:
2682          if (test) goto end_label;
2683          goto newstart_label;
2684          end_label:
2685
2686      Here, the `test' may actually consist of some reasonably complex
2687      code, terminating in a test.  */
2688
2689   if (optimize
2690       && needs_end_jump
2691       &&
2692       ! (GET_CODE (insn) == JUMP_INSN
2693          && GET_CODE (PATTERN (insn)) == SET
2694          && SET_DEST (PATTERN (insn)) == pc_rtx
2695          && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE))
2696     {
2697       int eh_regions = 0;
2698       int num_insns = 0;
2699       rtx last_test_insn = NULL_RTX;
2700
2701       /* Scan insns from the top of the loop looking for a qualified
2702          conditional exit.  */
2703       for (insn = NEXT_INSN (loop_stack->data.loop.start_label); insn;
2704            insn = NEXT_INSN (insn))
2705         {
2706           if (GET_CODE (insn) == NOTE)
2707             {
2708               if (optimize < 2
2709                   && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
2710                       || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END))
2711                 /* The code that actually moves the exit test will
2712                    carefully leave BLOCK notes in their original
2713                    location.  That means, however, that we can't debug
2714                    the exit test itself.  So, we refuse to move code
2715                    containing BLOCK notes at low optimization levels.  */
2716                 break;
2717
2718               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_BEG)
2719                 ++eh_regions;
2720               else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END)
2721                 {
2722                   --eh_regions;
2723                   if (eh_regions < 0)
2724                     /* We've come to the end of an EH region, but
2725                        never saw the beginning of that region.  That
2726                        means that an EH region begins before the top
2727                        of the loop, and ends in the middle of it.  The
2728                        existence of such a situation violates a basic
2729                        assumption in this code, since that would imply
2730                        that even when EH_REGIONS is zero, we might
2731                        move code out of an exception region.  */
2732                     abort ();
2733                 }
2734
2735               /* We must not walk into a nested loop.  */
2736               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
2737                 break;
2738
2739               /* We already know this INSN is a NOTE, so there's no
2740                  point in looking at it to see if it's a JUMP.  */
2741               continue;
2742             }
2743
2744           if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == INSN)
2745             num_insns++;
2746
2747           if (last_test_insn && num_insns > 30)
2748             break;
2749
2750           if (eh_regions > 0)
2751             /* We don't want to move a partial EH region.  Consider:
2752
2753                   while ( ( { try {
2754                                 if (cond ()) 0;
2755                                 else {
2756                                   bar();
2757                                   1;
2758                                 }
2759                               } catch (...) {
2760                                 1;
2761                               } )) {
2762                      body;
2763                   }
2764
2765                 This isn't legal C++, but here's what it's supposed to
2766                 mean: if cond() is true, stop looping.  Otherwise,
2767                 call bar, and keep looping.  In addition, if cond
2768                 throws an exception, catch it and keep looping. Such
2769                 constructs are certainy legal in LISP.
2770
2771                 We should not move the `if (cond()) 0' test since then
2772                 the EH-region for the try-block would be broken up.
2773                 (In this case we would the EH_BEG note for the `try'
2774                 and `if cond()' but not the call to bar() or the
2775                 EH_END note.)
2776
2777                 So we don't look for tests within an EH region.  */
2778             continue;
2779
2780           if (GET_CODE (insn) == JUMP_INSN
2781               && GET_CODE (PATTERN (insn)) == SET
2782               && SET_DEST (PATTERN (insn)) == pc_rtx)
2783             {
2784               /* This is indeed a jump.  */
2785               rtx dest1 = NULL_RTX;
2786               rtx dest2 = NULL_RTX;
2787               rtx potential_last_test;
2788               if (GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE)
2789                 {
2790                   /* A conditional jump.  */
2791                   dest1 = XEXP (SET_SRC (PATTERN (insn)), 1);
2792                   dest2 = XEXP (SET_SRC (PATTERN (insn)), 2);
2793                   potential_last_test = insn;
2794                 }
2795               else
2796                 {
2797                   /* An unconditional jump.  */
2798                   dest1 = SET_SRC (PATTERN (insn));
2799                   /* Include the BARRIER after the JUMP.  */
2800                   potential_last_test = NEXT_INSN (insn);
2801                 }
2802
2803               do {
2804                 if (dest1 && GET_CODE (dest1) == LABEL_REF
2805                     && ((XEXP (dest1, 0)
2806                          == loop_stack->data.loop.alt_end_label)
2807                         || (XEXP (dest1, 0)
2808                             == loop_stack->data.loop.end_label)))
2809                   {
2810                     last_test_insn = potential_last_test;
2811                     break;
2812                   }
2813
2814                 /* If this was a conditional jump, there may be
2815                    another label at which we should look.  */
2816                 dest1 = dest2;
2817                 dest2 = NULL_RTX;
2818               } while (dest1);
2819             }
2820         }
2821
2822       if (last_test_insn != 0 && last_test_insn != get_last_insn ())
2823         {
2824           /* We found one.  Move everything from there up
2825              to the end of the loop, and add a jump into the loop
2826              to jump to there.  */
2827           rtx newstart_label = gen_label_rtx ();
2828           rtx start_move = start_label;
2829           rtx next_insn;
2830
2831           /* If the start label is preceded by a NOTE_INSN_LOOP_CONT note,
2832              then we want to move this note also.  */
2833           if (GET_CODE (PREV_INSN (start_move)) == NOTE
2834               && (NOTE_LINE_NUMBER (PREV_INSN (start_move))
2835                   == NOTE_INSN_LOOP_CONT))
2836             start_move = PREV_INSN (start_move);
2837
2838           emit_label_after (newstart_label, PREV_INSN (start_move));
2839
2840           /* Actually move the insns.  Start at the beginning, and
2841              keep copying insns until we've copied the
2842              last_test_insn.  */
2843           for (insn = start_move; insn; insn = next_insn)
2844             {
2845               /* Figure out which insn comes after this one.  We have
2846                  to do this before we move INSN.  */
2847               if (insn == last_test_insn)
2848                 /* We've moved all the insns.  */
2849                 next_insn = NULL_RTX;
2850               else
2851                 next_insn = NEXT_INSN (insn);
2852
2853               if (GET_CODE (insn) == NOTE
2854                   && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
2855                       || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END))
2856                 /* We don't want to move NOTE_INSN_BLOCK_BEGs or
2857                    NOTE_INSN_BLOCK_ENDs because the correct generation
2858                    of debugging information depends on these appearing
2859                    in the same order in the RTL and in the tree
2860                    structure, where they are represented as BLOCKs.
2861                    So, we don't move block notes.  Of course, moving
2862                    the code inside the block is likely to make it
2863                    impossible to debug the instructions in the exit
2864                    test, but such is the price of optimization.  */
2865                 continue;
2866
2867               /* Move the INSN.  */
2868               reorder_insns (insn, insn, get_last_insn ());
2869             }
2870
2871           emit_jump_insn_after (gen_jump (start_label),
2872                                 PREV_INSN (newstart_label));
2873           emit_barrier_after (PREV_INSN (newstart_label));
2874           start_label = newstart_label;
2875         }
2876     }
2877
2878   if (needs_end_jump)
2879     {
2880       emit_jump (start_label);
2881       emit_note (NULL, NOTE_INSN_LOOP_END);
2882     }
2883   emit_label (loop_stack->data.loop.end_label);
2884
2885   POPSTACK (loop_stack);
2886
2887   last_expr_type = 0;
2888 }
2889
2890 /* Finish a null loop, aka do { } while (0).  */
2891
2892 void
2893 expand_end_null_loop ()
2894 {
2895   do_pending_stack_adjust ();
2896   emit_label (loop_stack->data.loop.end_label);
2897
2898   POPSTACK (loop_stack);
2899
2900   last_expr_type = 0;
2901 }
2902
2903 /* Generate a jump to the current loop's continue-point.
2904    This is usually the top of the loop, but may be specified
2905    explicitly elsewhere.  If not currently inside a loop,
2906    return 0 and do nothing; caller will print an error message.  */
2907
2908 int
2909 expand_continue_loop (whichloop)
2910      struct nesting *whichloop;
2911 {
2912   last_expr_type = 0;
2913   if (whichloop == 0)
2914     whichloop = loop_stack;
2915   if (whichloop == 0)
2916     return 0;
2917   expand_goto_internal (NULL_TREE, whichloop->data.loop.continue_label,
2918                         NULL_RTX);
2919   return 1;
2920 }
2921
2922 /* Generate a jump to exit the current loop.  If not currently inside a loop,
2923    return 0 and do nothing; caller will print an error message.  */
2924
2925 int
2926 expand_exit_loop (whichloop)
2927      struct nesting *whichloop;
2928 {
2929   last_expr_type = 0;
2930   if (whichloop == 0)
2931     whichloop = loop_stack;
2932   if (whichloop == 0)
2933     return 0;
2934   expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label, NULL_RTX);
2935   return 1;
2936 }
2937
2938 /* Generate a conditional jump to exit the current loop if COND
2939    evaluates to zero.  If not currently inside a loop,
2940    return 0 and do nothing; caller will print an error message.  */
2941
2942 int
2943 expand_exit_loop_if_false (whichloop, cond)
2944      struct nesting *whichloop;
2945      tree cond;
2946 {
2947   rtx label = gen_label_rtx ();
2948   rtx last_insn;
2949   last_expr_type = 0;
2950
2951   if (whichloop == 0)
2952     whichloop = loop_stack;
2953   if (whichloop == 0)
2954     return 0;
2955   /* In order to handle fixups, we actually create a conditional jump
2956      around an unconditional branch to exit the loop.  If fixups are
2957      necessary, they go before the unconditional branch.  */
2958
2959   do_jump (cond, NULL_RTX, label);
2960   last_insn = get_last_insn ();
2961   if (GET_CODE (last_insn) == CODE_LABEL)
2962     whichloop->data.loop.alt_end_label = last_insn;
2963   expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label,
2964                         NULL_RTX);
2965   emit_label (label);
2966
2967   return 1;
2968 }
2969
2970 /* Return nonzero if the loop nest is empty.  Else return zero.  */
2971
2972 int
2973 stmt_loop_nest_empty ()
2974 {
2975   /* cfun->stmt can be NULL if we are building a call to get the
2976      EH context for a setjmp/longjmp EH target and the current
2977      function was a deferred inline function.  */
2978   return (cfun->stmt == NULL || loop_stack == NULL);
2979 }
2980
2981 /* Return non-zero if we should preserve sub-expressions as separate
2982    pseudos.  We never do so if we aren't optimizing.  We always do so
2983    if -fexpensive-optimizations.
2984
2985    Otherwise, we only do so if we are in the "early" part of a loop.  I.e.,
2986    the loop may still be a small one.  */
2987
2988 int
2989 preserve_subexpressions_p ()
2990 {
2991   rtx insn;
2992
2993   if (flag_expensive_optimizations)
2994     return 1;
2995
2996   if (optimize == 0 || cfun == 0 || cfun->stmt == 0 || loop_stack == 0)
2997     return 0;
2998
2999   insn = get_last_insn_anywhere ();
3000
3001   return (insn
3002           && (INSN_UID (insn) - INSN_UID (loop_stack->data.loop.start_label)
3003               < n_non_fixed_regs * 3));
3004
3005 }
3006
3007 /* Generate a jump to exit the current loop, conditional, binding contour
3008    or case statement.  Not all such constructs are visible to this function,
3009    only those started with EXIT_FLAG nonzero.  Individual languages use
3010    the EXIT_FLAG parameter to control which kinds of constructs you can
3011    exit this way.
3012
3013    If not currently inside anything that can be exited,
3014    return 0 and do nothing; caller will print an error message.  */
3015
3016 int
3017 expand_exit_something ()
3018 {
3019   struct nesting *n;
3020   last_expr_type = 0;
3021   for (n = nesting_stack; n; n = n->all)
3022     if (n->exit_label != 0)
3023       {
3024         expand_goto_internal (NULL_TREE, n->exit_label, NULL_RTX);
3025         return 1;
3026       }
3027
3028   return 0;
3029 }
3030 \f
3031 /* Generate RTL to return from the current function, with no value.
3032    (That is, we do not do anything about returning any value.)  */
3033
3034 void
3035 expand_null_return ()
3036 {
3037   rtx last_insn = get_last_insn ();
3038
3039   /* If this function was declared to return a value, but we
3040      didn't, clobber the return registers so that they are not
3041      propogated live to the rest of the function.  */
3042   clobber_return_register ();
3043
3044   expand_null_return_1 (last_insn);
3045 }
3046
3047 /* Generate RTL to return from the current function, with value VAL.  */
3048
3049 static void
3050 expand_value_return (val)
3051      rtx val;
3052 {
3053   rtx last_insn = get_last_insn ();
3054   rtx return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
3055
3056   /* Copy the value to the return location
3057      unless it's already there.  */
3058
3059   if (return_reg != val)
3060     {
3061       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
3062 #ifdef PROMOTE_FUNCTION_RETURN
3063       int unsignedp = TREE_UNSIGNED (type);
3064       enum machine_mode old_mode
3065         = DECL_MODE (DECL_RESULT (current_function_decl));
3066       enum machine_mode mode
3067         = promote_mode (type, old_mode, &unsignedp, 1);
3068
3069       if (mode != old_mode)
3070         val = convert_modes (mode, old_mode, val, unsignedp);
3071 #endif
3072       if (GET_CODE (return_reg) == PARALLEL)
3073         emit_group_load (return_reg, val, int_size_in_bytes (type),
3074                          TYPE_ALIGN (type));
3075       else
3076         emit_move_insn (return_reg, val);
3077     }
3078
3079   expand_null_return_1 (last_insn);
3080 }
3081
3082 /* Output a return with no value.  If LAST_INSN is nonzero,
3083    pretend that the return takes place after LAST_INSN.  */
3084
3085 static void
3086 expand_null_return_1 (last_insn)
3087      rtx last_insn;
3088 {
3089   rtx end_label = cleanup_label ? cleanup_label : return_label;
3090
3091   clear_pending_stack_adjust ();
3092   do_pending_stack_adjust ();
3093   last_expr_type = 0;
3094
3095   if (end_label == 0)
3096      end_label = return_label = gen_label_rtx ();
3097   expand_goto_internal (NULL_TREE, end_label, last_insn);
3098 }
3099 \f
3100 /* Generate RTL to evaluate the expression RETVAL and return it
3101    from the current function.  */
3102
3103 void
3104 expand_return (retval)
3105      tree retval;
3106 {
3107   /* If there are any cleanups to be performed, then they will
3108      be inserted following LAST_INSN.  It is desirable
3109      that the last_insn, for such purposes, should be the
3110      last insn before computing the return value.  Otherwise, cleanups
3111      which call functions can clobber the return value.  */
3112   /* ??? rms: I think that is erroneous, because in C++ it would
3113      run destructors on variables that might be used in the subsequent
3114      computation of the return value.  */
3115   rtx last_insn = 0;
3116   rtx result_rtl;
3117   rtx val = 0;
3118   tree retval_rhs;
3119
3120   /* If function wants no value, give it none.  */
3121   if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
3122     {
3123       expand_expr (retval, NULL_RTX, VOIDmode, 0);
3124       emit_queue ();
3125       expand_null_return ();
3126       return;
3127     }
3128
3129   if (retval == error_mark_node)
3130     {
3131       /* Treat this like a return of no value from a function that
3132          returns a value.  */
3133       expand_null_return ();
3134       return; 
3135     }
3136   else if (TREE_CODE (retval) == RESULT_DECL)
3137     retval_rhs = retval;
3138   else if ((TREE_CODE (retval) == MODIFY_EXPR || TREE_CODE (retval) == INIT_EXPR)
3139            && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
3140     retval_rhs = TREE_OPERAND (retval, 1);
3141   else if (VOID_TYPE_P (TREE_TYPE (retval)))
3142     /* Recognize tail-recursive call to void function.  */
3143     retval_rhs = retval;
3144   else
3145     retval_rhs = NULL_TREE;
3146
3147   last_insn = get_last_insn ();
3148
3149   /* Distribute return down conditional expr if either of the sides
3150      may involve tail recursion (see test below).  This enhances the number
3151      of tail recursions we see.  Don't do this always since it can produce
3152      sub-optimal code in some cases and we distribute assignments into
3153      conditional expressions when it would help.  */
3154
3155   if (optimize && retval_rhs != 0
3156       && frame_offset == 0
3157       && TREE_CODE (retval_rhs) == COND_EXPR
3158       && (TREE_CODE (TREE_OPERAND (retval_rhs, 1)) == CALL_EXPR
3159           || TREE_CODE (TREE_OPERAND (retval_rhs, 2)) == CALL_EXPR))
3160     {
3161       rtx label = gen_label_rtx ();
3162       tree expr;
3163
3164       do_jump (TREE_OPERAND (retval_rhs, 0), label, NULL_RTX);
3165       start_cleanup_deferral ();
3166       expr = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (current_function_decl)),
3167                     DECL_RESULT (current_function_decl),
3168                     TREE_OPERAND (retval_rhs, 1));
3169       TREE_SIDE_EFFECTS (expr) = 1;
3170       expand_return (expr);
3171       emit_label (label);
3172
3173       expr = build (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (current_function_decl)),
3174                     DECL_RESULT (current_function_decl),
3175                     TREE_OPERAND (retval_rhs, 2));
3176       TREE_SIDE_EFFECTS (expr) = 1;
3177       expand_return (expr);
3178       end_cleanup_deferral ();
3179       return;
3180     }
3181
3182   result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
3183
3184   /* If the result is an aggregate that is being returned in one (or more)
3185      registers, load the registers here.  The compiler currently can't handle
3186      copying a BLKmode value into registers.  We could put this code in a
3187      more general area (for use by everyone instead of just function
3188      call/return), but until this feature is generally usable it is kept here
3189      (and in expand_call).  The value must go into a pseudo in case there
3190      are cleanups that will clobber the real return register.  */
3191
3192   if (retval_rhs != 0
3193       && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
3194       && GET_CODE (result_rtl) == REG)
3195     {
3196       int i;
3197       unsigned HOST_WIDE_INT bitpos, xbitpos;
3198       unsigned HOST_WIDE_INT big_endian_correction = 0;
3199       unsigned HOST_WIDE_INT bytes
3200         = int_size_in_bytes (TREE_TYPE (retval_rhs));
3201       int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3202       unsigned int bitsize
3203         = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)), BITS_PER_WORD);
3204       rtx *result_pseudos = (rtx *) alloca (sizeof (rtx) * n_regs);
3205       rtx result_reg, src = NULL_RTX, dst = NULL_RTX;
3206       rtx result_val = expand_expr (retval_rhs, NULL_RTX, VOIDmode, 0);
3207       enum machine_mode tmpmode, result_reg_mode;
3208
3209       if (bytes == 0)
3210         {
3211           expand_null_return ();
3212           return;
3213         }
3214
3215       /* Structures whose size is not a multiple of a word are aligned
3216          to the least significant byte (to the right).  On a BYTES_BIG_ENDIAN
3217          machine, this means we must skip the empty high order bytes when
3218          calculating the bit offset.  */
3219       if (BYTES_BIG_ENDIAN && bytes % UNITS_PER_WORD)
3220         big_endian_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
3221                                                   * BITS_PER_UNIT));
3222
3223       /* Copy the structure BITSIZE bits at a time.  */
3224       for (bitpos = 0, xbitpos = big_endian_correction;
3225            bitpos < bytes * BITS_PER_UNIT;
3226            bitpos += bitsize, xbitpos += bitsize)
3227         {
3228           /* We need a new destination pseudo each time xbitpos is
3229              on a word boundary and when xbitpos == big_endian_correction
3230              (the first time through).  */
3231           if (xbitpos % BITS_PER_WORD == 0
3232               || xbitpos == big_endian_correction)
3233             {
3234               /* Generate an appropriate register.  */
3235               dst = gen_reg_rtx (word_mode);
3236               result_pseudos[xbitpos / BITS_PER_WORD] = dst;
3237
3238               /* Clobber the destination before we move anything into it.  */
3239               emit_insn (gen_rtx_CLOBBER (VOIDmode, dst));
3240             }
3241
3242           /* We need a new source operand each time bitpos is on a word
3243              boundary.  */
3244           if (bitpos % BITS_PER_WORD == 0)
3245             src = operand_subword_force (result_val,
3246                                          bitpos / BITS_PER_WORD,
3247                                          BLKmode);
3248
3249           /* Use bitpos for the source extraction (left justified) and
3250              xbitpos for the destination store (right justified).  */
3251           store_bit_field (dst, bitsize, xbitpos % BITS_PER_WORD, word_mode,
3252                            extract_bit_field (src, bitsize,
3253                                               bitpos % BITS_PER_WORD, 1,
3254                                               NULL_RTX, word_mode, word_mode,
3255                                               bitsize, BITS_PER_WORD),
3256                            bitsize, BITS_PER_WORD);
3257         }
3258
3259       /* Find the smallest integer mode large enough to hold the
3260          entire structure and use that mode instead of BLKmode
3261          on the USE insn for the return register.  */
3262       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
3263            tmpmode != VOIDmode;
3264            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
3265         /* Have we found a large enough mode?  */
3266         if (GET_MODE_SIZE (tmpmode) >= bytes)
3267           break;
3268
3269       /* No suitable mode found.  */
3270       if (tmpmode == VOIDmode)
3271         abort ();
3272
3273       PUT_MODE (result_rtl, tmpmode);
3274
3275       if (GET_MODE_SIZE (tmpmode) < GET_MODE_SIZE (word_mode))
3276         result_reg_mode = word_mode;
3277       else
3278         result_reg_mode = tmpmode;
3279       result_reg = gen_reg_rtx (result_reg_mode);
3280
3281       emit_queue ();
3282       for (i = 0; i < n_regs; i++)
3283         emit_move_insn (operand_subword (result_reg, i, 0, result_reg_mode),
3284                         result_pseudos[i]);
3285
3286       if (tmpmode != result_reg_mode)
3287         result_reg = gen_lowpart (tmpmode, result_reg);
3288
3289       expand_value_return (result_reg);
3290     }
3291   else if (retval_rhs != 0
3292            && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
3293            && (GET_CODE (result_rtl) == REG
3294                || (GET_CODE (result_rtl) == PARALLEL)))
3295     {
3296       /* Calculate the return value into a temporary (usually a pseudo
3297          reg).  */
3298       tree ot = TREE_TYPE (DECL_RESULT (current_function_decl));
3299       tree nt = build_qualified_type (ot, TYPE_QUALS (ot) | TYPE_QUAL_CONST);
3300
3301       val = assign_temp (nt, 0, 0, 1);
3302       val = expand_expr (retval_rhs, val, GET_MODE (val), 0);
3303       val = force_not_mem (val);
3304       emit_queue ();
3305       /* Return the calculated value, doing cleanups first.  */
3306       expand_value_return (val);
3307     }
3308   else
3309     {
3310       /* No cleanups or no hard reg used;
3311          calculate value into hard return reg.  */
3312       expand_expr (retval, const0_rtx, VOIDmode, 0);
3313       emit_queue ();
3314       expand_value_return (result_rtl);
3315     }
3316 }
3317
3318 /* Return 1 if the end of the generated RTX is not a barrier.
3319    This means code already compiled can drop through.  */
3320
3321 int
3322 drop_through_at_end_p ()
3323 {
3324   rtx insn = get_last_insn ();
3325   while (insn && GET_CODE (insn) == NOTE)
3326     insn = PREV_INSN (insn);
3327   return insn && GET_CODE (insn) != BARRIER;
3328 }
3329 \f
3330 /* Attempt to optimize a potential tail recursion call into a goto.
3331    ARGUMENTS are the arguments to a CALL_EXPR; LAST_INSN indicates
3332    where to place the jump to the tail recursion label.
3333
3334    Return TRUE if the call was optimized into a goto.  */
3335
3336 int
3337 optimize_tail_recursion (arguments, last_insn)
3338      tree arguments;
3339      rtx last_insn;
3340 {
3341   /* Finish checking validity, and if valid emit code to set the
3342      argument variables for the new call.  */
3343   if (tail_recursion_args (arguments, DECL_ARGUMENTS (current_function_decl)))
3344     {
3345       if (tail_recursion_label == 0)
3346         {
3347           tail_recursion_label = gen_label_rtx ();
3348           emit_label_after (tail_recursion_label,
3349                             tail_recursion_reentry);
3350         }
3351       emit_queue ();
3352       expand_goto_internal (NULL_TREE, tail_recursion_label, last_insn);
3353       emit_barrier ();
3354       return 1;
3355     }
3356   return 0;
3357 }
3358
3359 /* Emit code to alter this function's formal parms for a tail-recursive call.
3360    ACTUALS is a list of actual parameter expressions (chain of TREE_LISTs).
3361    FORMALS is the chain of decls of formals.
3362    Return 1 if this can be done;
3363    otherwise return 0 and do not emit any code.  */
3364
3365 static int
3366 tail_recursion_args (actuals, formals)
3367      tree actuals, formals;
3368 {
3369   tree a = actuals, f = formals;
3370   int i;
3371   rtx *argvec;
3372
3373   /* Check that number and types of actuals are compatible
3374      with the formals.  This is not always true in valid C code.
3375      Also check that no formal needs to be addressable
3376      and that all formals are scalars.  */
3377
3378   /* Also count the args.  */
3379
3380   for (a = actuals, f = formals, i = 0; a && f; a = TREE_CHAIN (a), f = TREE_CHAIN (f), i++)
3381     {
3382       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (a)))
3383           != TYPE_MAIN_VARIANT (TREE_TYPE (f)))
3384         return 0;
3385       if (GET_CODE (DECL_RTL (f)) != REG || DECL_MODE (f) == BLKmode)
3386         return 0;
3387     }
3388   if (a != 0 || f != 0)
3389     return 0;
3390
3391   /* Compute all the actuals.  */
3392
3393   argvec = (rtx *) alloca (i * sizeof (rtx));
3394
3395   for (a = actuals, i = 0; a; a = TREE_CHAIN (a), i++)
3396     argvec[i] = expand_expr (TREE_VALUE (a), NULL_RTX, VOIDmode, 0);
3397
3398   /* Find which actual values refer to current values of previous formals.
3399      Copy each of them now, before any formal is changed.  */
3400
3401   for (a = actuals, i = 0; a; a = TREE_CHAIN (a), i++)
3402     {
3403       int copy = 0;
3404       int j;
3405       for (f = formals, j = 0; j < i; f = TREE_CHAIN (f), j++)
3406         if (reg_mentioned_p (DECL_RTL (f), argvec[i]))
3407           {
3408             copy = 1;
3409             break;
3410           }
3411       if (copy)
3412         argvec[i] = copy_to_reg (argvec[i]);
3413     }
3414
3415   /* Store the values of the actuals into the formals.  */
3416
3417   for (f = formals, a = actuals, i = 0; f;
3418        f = TREE_CHAIN (f), a = TREE_CHAIN (a), i++)
3419     {
3420       if (GET_MODE (DECL_RTL (f)) == GET_MODE (argvec[i]))
3421         emit_move_insn (DECL_RTL (f), argvec[i]);
3422       else
3423         convert_move (DECL_RTL (f), argvec[i],
3424                       TREE_UNSIGNED (TREE_TYPE (TREE_VALUE (a))));
3425     }
3426
3427   free_temp_slots ();
3428   return 1;
3429 }
3430 \f
3431 /* Generate the RTL code for entering a binding contour.
3432    The variables are declared one by one, by calls to `expand_decl'.
3433
3434    FLAGS is a bitwise or of the following flags:
3435
3436      1 - Nonzero if this construct should be visible to
3437          `exit_something'.
3438
3439      2 - Nonzero if this contour does not require a
3440          NOTE_INSN_BLOCK_BEG note.  Virtually all calls from
3441          language-independent code should set this flag because they
3442          will not create corresponding BLOCK nodes.  (There should be
3443          a one-to-one correspondence between NOTE_INSN_BLOCK_BEG notes
3444          and BLOCKs.)  If this flag is set, MARK_ENDS should be zero
3445          when expand_end_bindings is called.
3446
3447     If we are creating a NOTE_INSN_BLOCK_BEG note, a BLOCK may
3448     optionally be supplied.  If so, it becomes the NOTE_BLOCK for the
3449     note.  */
3450
3451 void
3452 expand_start_bindings_and_block (flags, block)
3453      int flags;
3454      tree block;
3455 {
3456   struct nesting *thisblock = ALLOC_NESTING ();
3457   rtx note;
3458   int exit_flag = ((flags & 1) != 0);
3459   int block_flag = ((flags & 2) == 0);
3460
3461   /* If a BLOCK is supplied, then the caller should be requesting a
3462      NOTE_INSN_BLOCK_BEG note.  */
3463   if (!block_flag && block)
3464     abort ();
3465
3466   /* Create a note to mark the beginning of the block.  */
3467   if (block_flag)
3468     {
3469       note = emit_note (NULL, NOTE_INSN_BLOCK_BEG);
3470       NOTE_BLOCK (note) = block;
3471     }
3472   else
3473     note = emit_note (NULL, NOTE_INSN_DELETED);
3474
3475   /* Make an entry on block_stack for the block we are entering.  */
3476
3477   thisblock->next = block_stack;
3478   thisblock->all = nesting_stack;
3479   thisblock->depth = ++nesting_depth;
3480   thisblock->data.block.stack_level = 0;
3481   thisblock->data.block.cleanups = 0;
3482   thisblock->data.block.n_function_calls = 0;
3483   thisblock->data.block.exception_region = 0;
3484   thisblock->data.block.block_target_temp_slot_level = target_temp_slot_level;
3485
3486   thisblock->data.block.conditional_code = 0;
3487   thisblock->data.block.last_unconditional_cleanup = note;
3488   /* When we insert instructions after the last unconditional cleanup,
3489      we don't adjust last_insn.  That means that a later add_insn will
3490      clobber the instructions we've just added.  The easiest way to
3491      fix this is to just insert another instruction here, so that the
3492      instructions inserted after the last unconditional cleanup are
3493      never the last instruction.  */
3494   emit_note (NULL, NOTE_INSN_DELETED);
3495   thisblock->data.block.cleanup_ptr = &thisblock->data.block.cleanups;
3496
3497   if (block_stack
3498       && !(block_stack->data.block.cleanups == NULL_TREE
3499            && block_stack->data.block.outer_cleanups == NULL_TREE))
3500     thisblock->data.block.outer_cleanups
3501       = tree_cons (NULL_TREE, block_stack->data.block.cleanups,
3502                    block_stack->data.block.outer_cleanups);
3503   else
3504     thisblock->data.block.outer_cleanups = 0;
3505   thisblock->data.block.label_chain = 0;
3506   thisblock->data.block.innermost_stack_block = stack_block_stack;
3507   thisblock->data.block.first_insn = note;
3508   thisblock->data.block.block_start_count = ++current_block_start_count;
3509   thisblock->exit_label = exit_flag ? gen_label_rtx () : 0;
3510   block_stack = thisblock;
3511   nesting_stack = thisblock;
3512
3513   /* Make a new level for allocating stack slots.  */
3514   push_temp_slots ();
3515 }
3516
3517 /* Specify the scope of temporaries created by TARGET_EXPRs.  Similar
3518    to CLEANUP_POINT_EXPR, but handles cases when a series of calls to
3519    expand_expr are made.  After we end the region, we know that all
3520    space for all temporaries that were created by TARGET_EXPRs will be
3521    destroyed and their space freed for reuse.  */
3522
3523 void
3524 expand_start_target_temps ()
3525 {
3526   /* This is so that even if the result is preserved, the space
3527      allocated will be freed, as we know that it is no longer in use.  */
3528   push_temp_slots ();
3529
3530   /* Start a new binding layer that will keep track of all cleanup
3531      actions to be performed.  */
3532   expand_start_bindings (2);
3533
3534   target_temp_slot_level = temp_slot_level;
3535 }
3536
3537 void
3538 expand_end_target_temps ()
3539 {
3540   expand_end_bindings (NULL_TREE, 0, 0);
3541
3542   /* This is so that even if the result is preserved, the space
3543      allocated will be freed, as we know that it is no longer in use.  */
3544   pop_temp_slots ();
3545 }
3546
3547 /* Given a pointer to a BLOCK node return non-zero if (and only if) the node
3548    in question represents the outermost pair of curly braces (i.e. the "body
3549    block") of a function or method.
3550
3551    For any BLOCK node representing a "body block" of a function or method, the
3552    BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
3553    represents the outermost (function) scope for the function or method (i.e.
3554    the one which includes the formal parameters).  The BLOCK_SUPERCONTEXT of
3555    *that* node in turn will point to the relevant FUNCTION_DECL node.  */
3556
3557 int
3558 is_body_block (stmt)
3559      tree stmt;
3560 {
3561   if (TREE_CODE (stmt) == BLOCK)
3562     {
3563       tree parent = BLOCK_SUPERCONTEXT (stmt);
3564
3565       if (parent && TREE_CODE (parent) == BLOCK)
3566         {
3567           tree grandparent = BLOCK_SUPERCONTEXT (parent);
3568
3569           if (grandparent && TREE_CODE (grandparent) == FUNCTION_DECL)
3570             return 1;
3571         }
3572     }
3573
3574   return 0;
3575 }
3576
3577 /* True if we are currently emitting insns in an area of output code
3578    that is controlled by a conditional expression.  This is used by
3579    the cleanup handling code to generate conditional cleanup actions.  */
3580
3581 int
3582 conditional_context ()
3583 {
3584   return block_stack && block_stack->data.block.conditional_code;
3585 }
3586
3587 /* Return an opaque pointer to the current nesting level, so frontend code
3588    can check its own sanity.  */
3589
3590 struct nesting *
3591 current_nesting_level ()
3592 {
3593   return cfun ? block_stack : 0;
3594 }
3595
3596 /* Emit a handler label for a nonlocal goto handler.
3597    Also emit code to store the handler label in SLOT before BEFORE_INSN.  */
3598
3599 static rtx
3600 expand_nl_handler_label (slot, before_insn)
3601      rtx slot, before_insn;
3602 {
3603   rtx insns;
3604   rtx handler_label = gen_label_rtx ();
3605
3606   /* Don't let cleanup_cfg delete the handler.  */
3607   LABEL_PRESERVE_P (handler_label) = 1;
3608
3609   start_sequence ();
3610   emit_move_insn (slot, gen_rtx_LABEL_REF (Pmode, handler_label));
3611   insns = get_insns ();
3612   end_sequence ();
3613   emit_insns_before (insns, before_insn);
3614
3615   emit_label (handler_label);
3616
3617   return handler_label;
3618 }
3619
3620 /* Emit code to restore vital registers at the beginning of a nonlocal goto
3621    handler.  */
3622 static void
3623 expand_nl_goto_receiver ()
3624 {
3625 #ifdef HAVE_nonlocal_goto
3626   if (! HAVE_nonlocal_goto)
3627 #endif
3628     /* First adjust our frame pointer to its actual value.  It was
3629        previously set to the start of the virtual area corresponding to
3630        the stacked variables when we branched here and now needs to be
3631        adjusted to the actual hardware fp value.
3632
3633        Assignments are to virtual registers are converted by
3634        instantiate_virtual_regs into the corresponding assignment
3635        to the underlying register (fp in this case) that makes
3636        the original assignment true.
3637        So the following insn will actually be
3638        decrementing fp by STARTING_FRAME_OFFSET.  */
3639     emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
3640
3641 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
3642   if (fixed_regs[ARG_POINTER_REGNUM])
3643     {
3644 #ifdef ELIMINABLE_REGS
3645       /* If the argument pointer can be eliminated in favor of the
3646          frame pointer, we don't need to restore it.  We assume here
3647          that if such an elimination is present, it can always be used.
3648          This is the case on all known machines; if we don't make this
3649          assumption, we do unnecessary saving on many machines.  */
3650       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
3651       size_t i;
3652
3653       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
3654         if (elim_regs[i].from == ARG_POINTER_REGNUM
3655             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
3656           break;
3657
3658       if (i == ARRAY_SIZE (elim_regs))
3659 #endif
3660         {
3661           /* Now restore our arg pointer from the address at which it
3662              was saved in our stack frame.  */
3663           emit_move_insn (virtual_incoming_args_rtx,
3664                           copy_to_reg (get_arg_pointer_save_area (cfun)));
3665         }
3666     }
3667 #endif
3668
3669 #ifdef HAVE_nonlocal_goto_receiver
3670   if (HAVE_nonlocal_goto_receiver)
3671     emit_insn (gen_nonlocal_goto_receiver ());
3672 #endif
3673 }
3674
3675 /* Make handlers for nonlocal gotos taking place in the function calls in
3676    block THISBLOCK.  */
3677
3678 static void
3679 expand_nl_goto_receivers (thisblock)
3680      struct nesting *thisblock;
3681 {
3682   tree link;
3683   rtx afterward = gen_label_rtx ();
3684   rtx insns, slot;
3685   rtx label_list;
3686   int any_invalid;
3687
3688   /* Record the handler address in the stack slot for that purpose,
3689      during this block, saving and restoring the outer value.  */
3690   if (thisblock->next != 0)
3691     for (slot = nonlocal_goto_handler_slots; slot; slot = XEXP (slot, 1))
3692       {
3693         rtx save_receiver = gen_reg_rtx (Pmode);
3694         emit_move_insn (XEXP (slot, 0), save_receiver);
3695
3696         start_sequence ();
3697         emit_move_insn (save_receiver, XEXP (slot, 0));
3698         insns = get_insns ();
3699         end_sequence ();
3700         emit_insns_before (insns, thisblock->data.block.first_insn);
3701       }
3702
3703   /* Jump around the handlers; they run only when specially invoked.  */
3704   emit_jump (afterward);
3705
3706   /* Make a separate handler for each label.  */
3707   link = nonlocal_labels;
3708   slot = nonlocal_goto_handler_slots;
3709   label_list = NULL_RTX;
3710   for (; link; link = TREE_CHAIN (link), slot = XEXP (slot, 1))
3711     /* Skip any labels we shouldn't be able to jump to from here,
3712        we generate one special handler for all of them below which just calls
3713        abort.  */
3714     if (! DECL_TOO_LATE (TREE_VALUE (link)))
3715       {
3716         rtx lab;
3717         lab = expand_nl_handler_label (XEXP (slot, 0),
3718                                        thisblock->data.block.first_insn);
3719         label_list = gen_rtx_EXPR_LIST (VOIDmode, lab, label_list);
3720
3721         expand_nl_goto_receiver ();
3722
3723         /* Jump to the "real" nonlocal label.  */
3724         expand_goto (TREE_VALUE (link));
3725       }
3726
3727   /* A second pass over all nonlocal labels; this time we handle those
3728      we should not be able to jump to at this point.  */
3729   link = nonlocal_labels;
3730   slot = nonlocal_goto_handler_slots;
3731   any_invalid = 0;
3732   for (; link; link = TREE_CHAIN (link), slot = XEXP (slot, 1))
3733     if (DECL_TOO_LATE (TREE_VALUE (link)))
3734       {
3735         rtx lab;
3736         lab = expand_nl_handler_label (XEXP (slot, 0),
3737                                        thisblock->data.block.first_insn);
3738         label_list = gen_rtx_EXPR_LIST (VOIDmode, lab, label_list);
3739         any_invalid = 1;
3740       }
3741
3742   if (any_invalid)
3743     {
3744       expand_nl_goto_receiver ();
3745       emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "abort"), 0,
3746                          VOIDmode, 0);
3747       emit_barrier ();
3748     }
3749
3750   nonlocal_goto_handler_labels = label_list;
3751   emit_label (afterward);
3752 }
3753
3754 /* Warn about any unused VARS (which may contain nodes other than
3755    VAR_DECLs, but such nodes are ignored).  The nodes are connected
3756    via the TREE_CHAIN field.  */
3757
3758 void
3759 warn_about_unused_variables (vars)
3760      tree vars;
3761 {
3762   tree decl;
3763
3764   if (warn_unused_variable)
3765     for (decl = vars; decl; decl = TREE_CHAIN (decl))
3766       if (TREE_CODE (decl) == VAR_DECL
3767           && ! TREE_USED (decl)
3768           && ! DECL_IN_SYSTEM_HEADER (decl)
3769           && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl))
3770         warning_with_decl (decl, "unused variable `%s'");
3771 }
3772
3773 /* Generate RTL code to terminate a binding contour.
3774
3775    VARS is the chain of VAR_DECL nodes for the variables bound in this
3776    contour.  There may actually be other nodes in this chain, but any
3777    nodes other than VAR_DECLS are ignored.
3778
3779    MARK_ENDS is nonzero if we should put a note at the beginning
3780    and end of this binding contour.
3781
3782    DONT_JUMP_IN is nonzero if it is not valid to jump into this contour.
3783    (That is true automatically if the contour has a saved stack level.)  */
3784
3785 void
3786 expand_end_bindings (vars, mark_ends, dont_jump_in)
3787      tree vars;
3788      int mark_ends;
3789      int dont_jump_in;
3790 {
3791   struct nesting *thisblock = block_stack;
3792
3793   /* If any of the variables in this scope were not used, warn the
3794      user.  */
3795   warn_about_unused_variables (vars);
3796
3797   if (thisblock->exit_label)
3798     {
3799       do_pending_stack_adjust ();
3800       emit_label (thisblock->exit_label);
3801     }
3802
3803   /* If necessary, make handlers for nonlocal gotos taking
3804      place in the function calls in this block.  */
3805   if (function_call_count != thisblock->data.block.n_function_calls
3806       && nonlocal_labels
3807       /* Make handler for outermost block
3808          if there were any nonlocal gotos to this function.  */
3809       && (thisblock->next == 0 ? current_function_has_nonlocal_label
3810           /* Make handler for inner block if it has something
3811              special to do when you jump out of it.  */
3812           : (thisblock->data.block.cleanups != 0
3813              || thisblock->data.block.stack_level != 0)))
3814     expand_nl_goto_receivers (thisblock);
3815
3816   /* Don't allow jumping into a block that has a stack level.
3817      Cleanups are allowed, though.  */
3818   if (dont_jump_in
3819       || thisblock->data.block.stack_level != 0)
3820     {
3821       struct label_chain *chain;
3822
3823       /* Any labels in this block are no longer valid to go to.
3824          Mark them to cause an error message.  */
3825       for (chain = thisblock->data.block.label_chain; chain; chain = chain->next)
3826         {
3827           DECL_TOO_LATE (chain->label) = 1;
3828           /* If any goto without a fixup came to this label,
3829              that must be an error, because gotos without fixups
3830              come from outside all saved stack-levels.  */
3831           if (TREE_ADDRESSABLE (chain->label))
3832             error_with_decl (chain->label,
3833                              "label `%s' used before containing binding contour");
3834         }
3835     }
3836
3837   /* Restore stack level in effect before the block
3838      (only if variable-size objects allocated).  */
3839   /* Perform any cleanups associated with the block.  */
3840
3841   if (thisblock->data.block.stack_level != 0
3842       || thisblock->data.block.cleanups != 0)
3843     {
3844       int reachable;
3845       rtx insn;
3846
3847       /* Don't let cleanups affect ({...}) constructs.  */
3848       int old_expr_stmts_for_value = expr_stmts_for_value;
3849       rtx old_last_expr_value = last_expr_value;
3850       tree old_last_expr_type = last_expr_type;
3851       expr_stmts_for_value = 0;
3852
3853       /* Only clean up here if this point can actually be reached.  */
3854       insn = get_last_insn ();
3855       if (GET_CODE (insn) == NOTE)
3856         insn = prev_nonnote_insn (insn);
3857       reachable = (! insn || GET_CODE (insn) != BARRIER);
3858
3859       /* Do the cleanups.  */
3860       expand_cleanups (thisblock->data.block.cleanups, NULL_TREE, 0, reachable);
3861       if (reachable)
3862         do_pending_stack_adjust ();
3863
3864       expr_stmts_for_value = old_expr_stmts_for_value;
3865       last_expr_value = old_last_expr_value;
3866       last_expr_type = old_last_expr_type;
3867
3868       /* Restore the stack level.  */
3869
3870       if (reachable && thisblock->data.block.stack_level != 0)
3871         {
3872           emit_stack_restore (thisblock->next ? SAVE_BLOCK : SAVE_FUNCTION,
3873                               thisblock->data.block.stack_level, NULL_RTX);
3874           if (nonlocal_goto_handler_slots != 0)
3875             emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level,
3876                              NULL_RTX);
3877         }
3878
3879       /* Any gotos out of this block must also do these things.
3880          Also report any gotos with fixups that came to labels in this
3881          level.  */
3882       fixup_gotos (thisblock,
3883                    thisblock->data.block.stack_level,
3884                    thisblock->data.block.cleanups,
3885                    thisblock->data.block.first_insn,
3886                    dont_jump_in);
3887     }
3888
3889   /* Mark the beginning and end of the scope if requested.
3890      We do this now, after running cleanups on the variables
3891      just going out of scope, so they are in scope for their cleanups.  */
3892
3893   if (mark_ends)
3894     {
3895       rtx note = emit_note (NULL, NOTE_INSN_BLOCK_END);
3896       NOTE_BLOCK (note) = NOTE_BLOCK (thisblock->data.block.first_insn);
3897     }
3898   else
3899     /* Get rid of the beginning-mark if we don't make an end-mark.  */
3900     NOTE_LINE_NUMBER (thisblock->data.block.first_insn) = NOTE_INSN_DELETED;
3901
3902   /* Restore the temporary level of TARGET_EXPRs.  */
3903   target_temp_slot_level = thisblock->data.block.block_target_temp_slot_level;
3904
3905   /* Restore block_stack level for containing block.  */
3906
3907   stack_block_stack = thisblock->data.block.innermost_stack_block;
3908   POPSTACK (block_stack);
3909
3910   /* Pop the stack slot nesting and free any slots at this level.  */
3911   pop_temp_slots ();
3912 }
3913 \f
3914 /* Generate code to save the stack pointer at the start of the current block
3915    and set up to restore it on exit.  */
3916
3917 void
3918 save_stack_pointer ()
3919 {
3920   struct nesting *thisblock = block_stack;
3921
3922   if (thisblock->data.block.stack_level == 0)
3923     {
3924       emit_stack_save (thisblock->next ? SAVE_BLOCK : SAVE_FUNCTION,
3925                        &thisblock->data.block.stack_level,
3926                        thisblock->data.block.first_insn);
3927       stack_block_stack = thisblock;
3928     }
3929 }
3930 \f
3931 /* Generate RTL for the automatic variable declaration DECL.
3932    (Other kinds of declarations are simply ignored if seen here.)  */
3933
3934 void
3935 expand_decl (decl)
3936      tree decl;
3937 {
3938   struct nesting *thisblock;
3939   tree type;
3940
3941   type = TREE_TYPE (decl);
3942
3943   /* For a CONST_DECL, set mode, alignment, and sizes from those of the
3944      type in case this node is used in a reference.  */
3945   if (TREE_CODE (decl) == CONST_DECL)
3946     {
3947       DECL_MODE (decl) = TYPE_MODE (type);
3948       DECL_ALIGN (decl) = TYPE_ALIGN (type);
3949       DECL_SIZE (decl) = TYPE_SIZE (type);
3950       DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
3951       return;
3952     }
3953
3954   /* Otherwise, only automatic variables need any expansion done.  Static and
3955      external variables, and external functions, will be handled by
3956      `assemble_variable' (called from finish_decl).  TYPE_DECL requires
3957      nothing.  PARM_DECLs are handled in `assign_parms'.  */
3958   if (TREE_CODE (decl) != VAR_DECL)
3959     return;
3960
3961   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
3962     return;
3963
3964   thisblock = block_stack;
3965
3966   /* Create the RTL representation for the variable.  */
3967
3968   if (type == error_mark_node)
3969     SET_DECL_RTL (decl, gen_rtx_MEM (BLKmode, const0_rtx));
3970
3971   else if (DECL_SIZE (decl) == 0)
3972     /* Variable with incomplete type.  */
3973     {
3974       rtx x;
3975       if (DECL_INITIAL (decl) == 0)
3976         /* Error message was already done; now avoid a crash.  */
3977         x = gen_rtx_MEM (BLKmode, const0_rtx);
3978       else
3979         /* An initializer is going to decide the size of this array.
3980            Until we know the size, represent its address with a reg.  */
3981         x = gen_rtx_MEM (BLKmode, gen_reg_rtx (Pmode));
3982
3983       set_mem_attributes (x, decl, 1);
3984       SET_DECL_RTL (decl, x);
3985     }
3986   else if (DECL_MODE (decl) != BLKmode
3987            /* If -ffloat-store, don't put explicit float vars
3988               into regs.  */
3989            && !(flag_float_store
3990                 && TREE_CODE (type) == REAL_TYPE)
3991            && ! TREE_THIS_VOLATILE (decl)
3992            && (DECL_REGISTER (decl) || optimize)
3993            /* if -fcheck-memory-usage, check all variables.  */
3994            && ! current_function_check_memory_usage)
3995     {
3996       /* Automatic variable that can go in a register.  */
3997       int unsignedp = TREE_UNSIGNED (type);
3998       enum machine_mode reg_mode
3999         = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
4000
4001       SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
4002       mark_user_reg (DECL_RTL (decl));
4003
4004       if (POINTER_TYPE_P (type))
4005         mark_reg_pointer (DECL_RTL (decl),
4006                           TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
4007
4008       maybe_set_unchanging (DECL_RTL (decl), decl);
4009
4010       /* If something wants our address, try to use ADDRESSOF.  */
4011       if (TREE_ADDRESSABLE (decl))
4012         put_var_into_stack (decl);
4013     }
4014
4015   else if (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
4016            && ! (flag_stack_check && ! STACK_CHECK_BUILTIN
4017                  && 0 < compare_tree_int (DECL_SIZE_UNIT (decl),
4018                                           STACK_CHECK_MAX_VAR_SIZE)))
4019     {
4020       /* Variable of fixed size that goes on the stack.  */
4021       rtx oldaddr = 0;
4022       rtx addr;
4023
4024       /* If we previously made RTL for this decl, it must be an array
4025          whose size was determined by the initializer.
4026          The old address was a register; set that register now
4027          to the proper address.  */
4028       if (DECL_RTL_SET_P (decl))
4029         {
4030           if (GET_CODE (DECL_RTL (decl)) != MEM
4031               || GET_CODE (XEXP (DECL_RTL (decl), 0)) != REG)
4032             abort ();
4033           oldaddr = XEXP (DECL_RTL (decl), 0);
4034         }
4035
4036       SET_DECL_RTL (decl,
4037                     assign_temp (TREE_TYPE (decl), 1, 1, 1));
4038
4039       /* Set alignment we actually gave this decl.  */
4040       DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
4041                            : GET_MODE_BITSIZE (DECL_MODE (decl)));
4042       DECL_USER_ALIGN (decl) = 0;
4043
4044       if (oldaddr)
4045         {
4046           addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
4047           if (addr != oldaddr)
4048             emit_move_insn (oldaddr, addr);
4049         }
4050     }
4051   else
4052     /* Dynamic-size object: must push space on the stack.  */
4053     {
4054       rtx address, size, x;
4055
4056       /* Record the stack pointer on entry to block, if have
4057          not already done so.  */
4058       do_pending_stack_adjust ();
4059       save_stack_pointer ();
4060
4061       /* In function-at-a-time mode, variable_size doesn't expand this,
4062          so do it now.  */
4063       if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
4064         expand_expr (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
4065                      const0_rtx, VOIDmode, 0);
4066
4067       /* Compute the variable's size, in bytes.  */
4068       size = expand_expr (DECL_SIZE_UNIT (decl), NULL_RTX, VOIDmode, 0);
4069       free_temp_slots ();
4070
4071       /* Allocate space on the stack for the variable.  Note that
4072          DECL_ALIGN says how the variable is to be aligned and we
4073          cannot use it to conclude anything about the alignment of
4074          the size.  */
4075       address = allocate_dynamic_stack_space (size, NULL_RTX,
4076                                               TYPE_ALIGN (TREE_TYPE (decl)));
4077
4078       /* Reference the variable indirect through that rtx.  */
4079       x = gen_rtx_MEM (DECL_MODE (decl), address);
4080       set_mem_attributes (x, decl, 1);
4081       SET_DECL_RTL (decl, x);
4082
4083
4084       /* Indicate the alignment we actually gave this variable.  */
4085 #ifdef STACK_BOUNDARY
4086       DECL_ALIGN (decl) = STACK_BOUNDARY;
4087 #else
4088       DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
4089 #endif
4090       DECL_USER_ALIGN (decl) = 0;
4091     }
4092 }
4093 \f
4094 /* Emit code to perform the initialization of a declaration DECL.  */
4095
4096 void
4097 expand_decl_init (decl)
4098      tree decl;
4099 {
4100   int was_used = TREE_USED (decl);
4101
4102   /* If this is a CONST_DECL, we don't have to generate any code, but
4103      if DECL_INITIAL is a constant, call expand_expr to force TREE_CST_RTL
4104      to be set while in the obstack containing the constant.  If we don't
4105      do this, we can lose if we have functions nested three deep and the middle
4106      function makes a CONST_DECL whose DECL_INITIAL is a STRING_CST while
4107      the innermost function is the first to expand that STRING_CST.  */
4108   if (TREE_CODE (decl) == CONST_DECL)
4109     {
4110       if (DECL_INITIAL (decl) && TREE_CONSTANT (DECL_INITIAL (decl)))
4111         expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode,
4112                      EXPAND_INITIALIZER);
4113       return;
4114     }
4115
4116   if (TREE_STATIC (decl))
4117     return;
4118
4119   /* Compute and store the initial value now.  */
4120
4121   if (DECL_INITIAL (decl) == error_mark_node)
4122     {
4123       enum tree_code code = TREE_CODE (TREE_TYPE (decl));
4124
4125       if (code == INTEGER_TYPE || code == REAL_TYPE || code == ENUMERAL_TYPE
4126           || code == POINTER_TYPE || code == REFERENCE_TYPE)
4127         expand_assignment (decl, convert (TREE_TYPE (decl), integer_zero_node),
4128                            0, 0);
4129       emit_queue ();
4130     }
4131   else if (DECL_INITIAL (decl) && TREE_CODE (DECL_INITIAL (decl)) != TREE_LIST)
4132     {
4133       emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4134       expand_assignment (decl, DECL_INITIAL (decl), 0, 0);
4135       emit_queue ();
4136     }
4137
4138   /* Don't let the initialization count as "using" the variable.  */
4139   TREE_USED (decl) = was_used;
4140
4141   /* Free any temporaries we made while initializing the decl.  */
4142   preserve_temp_slots (NULL_RTX);
4143   free_temp_slots ();
4144 }
4145
4146 /* CLEANUP is an expression to be executed at exit from this binding contour;
4147    for example, in C++, it might call the destructor for this variable.
4148
4149    We wrap CLEANUP in an UNSAVE_EXPR node, so that we can expand the
4150    CLEANUP multiple times, and have the correct semantics.  This
4151    happens in exception handling, for gotos, returns, breaks that
4152    leave the current scope.
4153
4154    If CLEANUP is nonzero and DECL is zero, we record a cleanup
4155    that is not associated with any particular variable.  */
4156
4157 int
4158 expand_decl_cleanup (decl, cleanup)
4159      tree decl, cleanup;
4160 {
4161   struct nesting *thisblock;
4162
4163   /* Error if we are not in any block.  */
4164   if (cfun == 0 || block_stack == 0)
4165     return 0;
4166
4167   thisblock = block_stack;
4168
4169   /* Record the cleanup if there is one.  */
4170
4171   if (cleanup != 0)
4172     {
4173       tree t;
4174       rtx seq;
4175       tree *cleanups = &thisblock->data.block.cleanups;
4176       int cond_context = conditional_context ();
4177
4178       if (cond_context)
4179         {
4180           rtx flag = gen_reg_rtx (word_mode);
4181           rtx set_flag_0;
4182           tree cond;
4183
4184           start_sequence ();
4185           emit_move_insn (flag, const0_rtx);
4186           set_flag_0 = get_insns ();
4187           end_sequence ();
4188
4189           thisblock->data.block.last_unconditional_cleanup
4190             = emit_insns_after (set_flag_0,
4191                                 thisblock->data.block.last_unconditional_cleanup);
4192
4193           emit_move_insn (flag, const1_rtx);
4194
4195           cond = build_decl (VAR_DECL, NULL_TREE, type_for_mode (word_mode, 1));
4196           SET_DECL_RTL (cond, flag);
4197
4198           /* Conditionalize the cleanup.  */
4199           cleanup = build (COND_EXPR, void_type_node,
4200                            truthvalue_conversion (cond),
4201                            cleanup, integer_zero_node);
4202           cleanup = fold (cleanup);
4203
4204           cleanups = thisblock->data.block.cleanup_ptr;
4205         }
4206
4207       cleanup = unsave_expr (cleanup);
4208
4209       t = *cleanups = tree_cons (decl, cleanup, *cleanups);
4210
4211       if (! cond_context)
4212         /* If this block has a cleanup, it belongs in stack_block_stack.  */
4213         stack_block_stack = thisblock;
4214
4215       if (cond_context)
4216         {
4217           start_sequence ();
4218         }
4219
4220       if (! using_eh_for_cleanups_p)
4221         TREE_ADDRESSABLE (t) = 1;
4222       else
4223         expand_eh_region_start ();
4224
4225       if (cond_context)
4226         {
4227           seq = get_insns ();
4228           end_sequence ();
4229           if (seq)
4230             thisblock->data.block.last_unconditional_cleanup
4231               = emit_insns_after (seq,
4232                                   thisblock->data.block.last_unconditional_cleanup);
4233         }
4234       else
4235         {
4236           thisblock->data.block.last_unconditional_cleanup
4237             = get_last_insn ();
4238           /* When we insert instructions after the last unconditional cleanup,
4239              we don't adjust last_insn.  That means that a later add_insn will
4240              clobber the instructions we've just added.  The easiest way to
4241              fix this is to just insert another instruction here, so that the
4242              instructions inserted after the last unconditional cleanup are
4243              never the last instruction.  */
4244           emit_note (NULL, NOTE_INSN_DELETED);
4245           thisblock->data.block.cleanup_ptr = &thisblock->data.block.cleanups;
4246         }
4247     }
4248   return 1;
4249 }
4250 \f
4251 /* DECL is an anonymous union.  CLEANUP is a cleanup for DECL.
4252    DECL_ELTS is the list of elements that belong to DECL's type.
4253    In each, the TREE_VALUE is a VAR_DECL, and the TREE_PURPOSE a cleanup.  */
4254
4255 void
4256 expand_anon_union_decl (decl, cleanup, decl_elts)
4257      tree decl, cleanup, decl_elts;
4258 {
4259   struct nesting *thisblock = cfun == 0 ? 0 : block_stack;
4260   rtx x;
4261   tree t;
4262
4263   /* If any of the elements are addressable, so is the entire union.  */
4264   for (t = decl_elts; t; t = TREE_CHAIN (t))
4265     if (TREE_ADDRESSABLE (TREE_VALUE (t)))
4266       {
4267         TREE_ADDRESSABLE (decl) = 1;
4268         break;
4269       }
4270
4271   expand_decl (decl);
4272   expand_decl_cleanup (decl, cleanup);
4273   x = DECL_RTL (decl);
4274
4275   /* Go through the elements, assigning RTL to each.  */
4276   for (t = decl_elts; t; t = TREE_CHAIN (t))
4277     {
4278       tree decl_elt = TREE_VALUE (t);
4279       tree cleanup_elt = TREE_PURPOSE (t);
4280       enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt));
4281
4282       /* Propagate the union's alignment to the elements.  */
4283       DECL_ALIGN (decl_elt) = DECL_ALIGN (decl);
4284       DECL_USER_ALIGN (decl_elt) = DECL_USER_ALIGN (decl);
4285
4286       /* If the element has BLKmode and the union doesn't, the union is
4287          aligned such that the element doesn't need to have BLKmode, so
4288          change the element's mode to the appropriate one for its size.  */
4289       if (mode == BLKmode && DECL_MODE (decl) != BLKmode)
4290         DECL_MODE (decl_elt) = mode
4291           = mode_for_size_tree (DECL_SIZE (decl_elt), MODE_INT, 1);
4292
4293       /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we
4294          instead create a new MEM rtx with the proper mode.  */
4295       if (GET_CODE (x) == MEM)
4296         {
4297           if (mode == GET_MODE (x))
4298             SET_DECL_RTL (decl_elt, x);
4299           else
4300             SET_DECL_RTL (decl_elt, adjust_address_nv (x, mode, 0));
4301         }
4302       else if (GET_CODE (x) == REG)
4303         {
4304           if (mode == GET_MODE (x))
4305             SET_DECL_RTL (decl_elt, x);
4306           else
4307             SET_DECL_RTL (decl_elt, gen_lowpart_SUBREG (mode, x));
4308         }
4309       else
4310         abort ();
4311
4312       /* Record the cleanup if there is one.  */
4313
4314       if (cleanup != 0)
4315         thisblock->data.block.cleanups
4316           = tree_cons (decl_elt, cleanup_elt,
4317                        thisblock->data.block.cleanups);
4318     }
4319 }
4320 \f
4321 /* Expand a list of cleanups LIST.
4322    Elements may be expressions or may be nested lists.
4323
4324    If DONT_DO is nonnull, then any list-element
4325    whose TREE_PURPOSE matches DONT_DO is omitted.
4326    This is sometimes used to avoid a cleanup associated with
4327    a value that is being returned out of the scope.
4328
4329    If IN_FIXUP is non-zero, we are generating this cleanup for a fixup
4330    goto and handle protection regions specially in that case.
4331
4332    If REACHABLE, we emit code, otherwise just inform the exception handling
4333    code about this finalization.  */
4334
4335 static void
4336 expand_cleanups (list, dont_do, in_fixup, reachable)
4337      tree list;
4338      tree dont_do;
4339      int in_fixup;
4340      int reachable;
4341 {
4342   tree tail;
4343   for (tail = list; tail; tail = TREE_CHAIN (tail))
4344     if (dont_do == 0 || TREE_PURPOSE (tail) != dont_do)
4345       {
4346         if (TREE_CODE (TREE_VALUE (tail)) == TREE_LIST)
4347           expand_cleanups (TREE_VALUE (tail), dont_do, in_fixup, reachable);
4348         else
4349           {
4350             if (! in_fixup && using_eh_for_cleanups_p)
4351               expand_eh_region_end_cleanup (TREE_VALUE (tail));
4352
4353             if (reachable)
4354               {
4355                 /* Cleanups may be run multiple times.  For example,
4356                    when exiting a binding contour, we expand the
4357                    cleanups associated with that contour.  When a goto
4358                    within that binding contour has a target outside that
4359                    contour, it will expand all cleanups from its scope to
4360                    the target.  Though the cleanups are expanded multiple
4361                    times, the control paths are non-overlapping so the
4362                    cleanups will not be executed twice.  */
4363
4364                 /* We may need to protect from outer cleanups.  */
4365                 if (in_fixup && using_eh_for_cleanups_p)
4366                   {
4367                     expand_eh_region_start ();
4368
4369                     expand_expr (TREE_VALUE (tail), const0_rtx, VOIDmode, 0);
4370
4371                     expand_eh_region_end_fixup (TREE_VALUE (tail));
4372                   }
4373                 else
4374                   expand_expr (TREE_VALUE (tail), const0_rtx, VOIDmode, 0);
4375
4376                 free_temp_slots ();
4377               }
4378           }
4379       }
4380 }
4381
4382 /* Mark when the context we are emitting RTL for as a conditional
4383    context, so that any cleanup actions we register with
4384    expand_decl_init will be properly conditionalized when those
4385    cleanup actions are later performed.  Must be called before any
4386    expression (tree) is expanded that is within a conditional context.  */
4387
4388 void
4389 start_cleanup_deferral ()
4390 {
4391   /* block_stack can be NULL if we are inside the parameter list.  It is
4392      OK to do nothing, because cleanups aren't possible here.  */
4393   if (block_stack)
4394     ++block_stack->data.block.conditional_code;
4395 }
4396
4397 /* Mark the end of a conditional region of code.  Because cleanup
4398    deferrals may be nested, we may still be in a conditional region
4399    after we end the currently deferred cleanups, only after we end all
4400    deferred cleanups, are we back in unconditional code.  */
4401
4402 void
4403 end_cleanup_deferral ()
4404 {
4405   /* block_stack can be NULL if we are inside the parameter list.  It is
4406      OK to do nothing, because cleanups aren't possible here.  */
4407   if (block_stack)
4408     --block_stack->data.block.conditional_code;
4409 }
4410
4411 /* Move all cleanups from the current block_stack
4412    to the containing block_stack, where they are assumed to
4413    have been created.  If anything can cause a temporary to
4414    be created, but not expanded for more than one level of
4415    block_stacks, then this code will have to change.  */
4416
4417 void
4418 move_cleanups_up ()
4419 {
4420   struct nesting *block = block_stack;
4421   struct nesting *outer = block->next;
4422
4423   outer->data.block.cleanups
4424     = chainon (block->data.block.cleanups,
4425                outer->data.block.cleanups);
4426   block->data.block.cleanups = 0;
4427 }
4428
4429 tree
4430 last_cleanup_this_contour ()
4431 {
4432   if (block_stack == 0)
4433     return 0;
4434
4435   return block_stack->data.block.cleanups;
4436 }
4437
4438 /* Return 1 if there are any pending cleanups at this point.
4439    If THIS_CONTOUR is nonzero, check the current contour as well.
4440    Otherwise, look only at the contours that enclose this one.  */
4441
4442 int
4443 any_pending_cleanups (this_contour)
4444      int this_contour;
4445 {
4446   struct nesting *block;
4447
4448   if (cfun == NULL || cfun->stmt == NULL || block_stack == 0)
4449     return 0;
4450
4451   if (this_contour && block_stack->data.block.cleanups != NULL)
4452     return 1;
4453   if (block_stack->data.block.cleanups == 0
4454       && block_stack->data.block.outer_cleanups == 0)
4455     return 0;
4456
4457   for (block = block_stack->next; block; block = block->next)
4458     if (block->data.block.cleanups != 0)
4459       return 1;
4460
4461   return 0;
4462 }
4463 \f
4464 /* Enter a case (Pascal) or switch (C) statement.
4465    Push a block onto case_stack and nesting_stack
4466    to accumulate the case-labels that are seen
4467    and to record the labels generated for the statement.
4468
4469    EXIT_FLAG is nonzero if `exit_something' should exit this case stmt.
4470    Otherwise, this construct is transparent for `exit_something'.
4471
4472    EXPR is the index-expression to be dispatched on.
4473    TYPE is its nominal type.  We could simply convert EXPR to this type,
4474    but instead we take short cuts.  */
4475
4476 void
4477 expand_start_case (exit_flag, expr, type, printname)
4478      int exit_flag;
4479      tree expr;
4480      tree type;
4481      const char *printname;
4482 {
4483   struct nesting *thiscase = ALLOC_NESTING ();
4484
4485   /* Make an entry on case_stack for the case we are entering.  */
4486
4487   thiscase->next = case_stack;
4488   thiscase->all = nesting_stack;
4489   thiscase->depth = ++nesting_depth;
4490   thiscase->exit_label = exit_flag ? gen_label_rtx () : 0;
4491   thiscase->data.case_stmt.case_list = 0;
4492   thiscase->data.case_stmt.index_expr = expr;
4493   thiscase->data.case_stmt.nominal_type = type;
4494   thiscase->data.case_stmt.default_label = 0;
4495   thiscase->data.case_stmt.printname = printname;
4496   thiscase->data.case_stmt.line_number_status = force_line_numbers ();
4497   case_stack = thiscase;
4498   nesting_stack = thiscase;
4499
4500   do_pending_stack_adjust ();
4501
4502   /* Make sure case_stmt.start points to something that won't
4503      need any transformation before expand_end_case.  */
4504   if (GET_CODE (get_last_insn ()) != NOTE)
4505     emit_note (NULL, NOTE_INSN_DELETED);
4506
4507   thiscase->data.case_stmt.start = get_last_insn ();
4508
4509   start_cleanup_deferral ();
4510 }
4511
4512 /* Start a "dummy case statement" within which case labels are invalid
4513    and are not connected to any larger real case statement.
4514    This can be used if you don't want to let a case statement jump
4515    into the middle of certain kinds of constructs.  */
4516
4517 void
4518 expand_start_case_dummy ()
4519 {
4520   struct nesting *thiscase = ALLOC_NESTING ();
4521
4522   /* Make an entry on case_stack for the dummy.  */
4523
4524   thiscase->next = case_stack;
4525   thiscase->all = nesting_stack;
4526   thiscase->depth = ++nesting_depth;
4527   thiscase->exit_label = 0;
4528   thiscase->data.case_stmt.case_list = 0;
4529   thiscase->data.case_stmt.start = 0;
4530   thiscase->data.case_stmt.nominal_type = 0;
4531   thiscase->data.case_stmt.default_label = 0;
4532   case_stack = thiscase;
4533   nesting_stack = thiscase;
4534   start_cleanup_deferral ();
4535 }
4536
4537 /* End a dummy case statement.  */
4538
4539 void
4540 expand_end_case_dummy ()
4541 {
4542   end_cleanup_deferral ();
4543   POPSTACK (case_stack);
4544 }
4545
4546 /* Return the data type of the index-expression
4547    of the innermost case statement, or null if none.  */
4548
4549 tree
4550 case_index_expr_type ()
4551 {
4552   if (case_stack)
4553     return TREE_TYPE (case_stack->data.case_stmt.index_expr);
4554   return 0;
4555 }
4556 \f
4557 static void
4558 check_seenlabel ()
4559 {
4560   /* If this is the first label, warn if any insns have been emitted.  */
4561   if (case_stack->data.case_stmt.line_number_status >= 0)
4562     {
4563       rtx insn;
4564
4565       restore_line_number_status
4566         (case_stack->data.case_stmt.line_number_status);
4567       case_stack->data.case_stmt.line_number_status = -1;
4568
4569       for (insn = case_stack->data.case_stmt.start;
4570            insn;
4571            insn = NEXT_INSN (insn))
4572         {
4573           if (GET_CODE (insn) == CODE_LABEL)
4574             break;
4575           if (GET_CODE (insn) != NOTE
4576               && (GET_CODE (insn) != INSN || GET_CODE (PATTERN (insn)) != USE))
4577             {
4578               do
4579                 insn = PREV_INSN (insn);
4580               while (insn && (GET_CODE (insn) != NOTE || NOTE_LINE_NUMBER (insn) < 0));
4581
4582               /* If insn is zero, then there must have been a syntax error.  */
4583               if (insn)
4584                 warning_with_file_and_line (NOTE_SOURCE_FILE (insn),
4585                                             NOTE_LINE_NUMBER (insn),
4586                                             "unreachable code at beginning of %s",
4587                                             case_stack->data.case_stmt.printname);
4588               break;
4589             }
4590         }
4591     }
4592 }
4593
4594 /* Accumulate one case or default label inside a case or switch statement.
4595    VALUE is the value of the case (a null pointer, for a default label).
4596    The function CONVERTER, when applied to arguments T and V,
4597    converts the value V to the type T.
4598
4599    If not currently inside a case or switch statement, return 1 and do
4600    nothing.  The caller will print a language-specific error message.
4601    If VALUE is a duplicate or overlaps, return 2 and do nothing
4602    except store the (first) duplicate node in *DUPLICATE.
4603    If VALUE is out of range, return 3 and do nothing.
4604    If we are jumping into the scope of a cleanup or var-sized array, return 5.
4605    Return 0 on success.
4606
4607    Extended to handle range statements.  */
4608
4609 int
4610 pushcase (value, converter, label, duplicate)
4611      tree value;
4612      tree (*converter) PARAMS ((tree, tree));
4613      tree label;
4614      tree *duplicate;
4615 {
4616   tree index_type;
4617   tree nominal_type;
4618
4619   /* Fail if not inside a real case statement.  */
4620   if (! (case_stack && case_stack->data.case_stmt.start))
4621     return 1;
4622
4623   if (stack_block_stack
4624       && stack_block_stack->depth > case_stack->depth)
4625     return 5;
4626
4627   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
4628   nominal_type = case_stack->data.case_stmt.nominal_type;
4629
4630   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
4631   if (index_type == error_mark_node)
4632     return 0;
4633
4634   /* Convert VALUE to the type in which the comparisons are nominally done.  */
4635   if (value != 0)
4636     value = (*converter) (nominal_type, value);
4637
4638   check_seenlabel ();
4639
4640   /* Fail if this value is out of range for the actual type of the index
4641      (which may be narrower than NOMINAL_TYPE).  */
4642   if (value != 0
4643       && (TREE_CONSTANT_OVERFLOW (value)
4644           || ! int_fits_type_p (value, index_type)))
4645     return 3;
4646
4647   return add_case_node (value, value, label, duplicate);
4648 }
4649
4650 /* Like pushcase but this case applies to all values between VALUE1 and
4651    VALUE2 (inclusive).  If VALUE1 is NULL, the range starts at the lowest
4652    value of the index type and ends at VALUE2.  If VALUE2 is NULL, the range
4653    starts at VALUE1 and ends at the highest value of the index type.
4654    If both are NULL, this case applies to all values.
4655
4656    The return value is the same as that of pushcase but there is one
4657    additional error code: 4 means the specified range was empty.  */
4658
4659 int
4660 pushcase_range (value1, value2, converter, label, duplicate)
4661      tree value1, value2;
4662      tree (*converter) PARAMS ((tree, tree));
4663      tree label;
4664      tree *duplicate;
4665 {
4666   tree index_type;
4667   tree nominal_type;
4668
4669   /* Fail if not inside a real case statement.  */
4670   if (! (case_stack && case_stack->data.case_stmt.start))
4671     return 1;
4672
4673   if (stack_block_stack
4674       && stack_block_stack->depth > case_stack->depth)
4675     return 5;
4676
4677   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
4678   nominal_type = case_stack->data.case_stmt.nominal_type;
4679
4680   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
4681   if (index_type == error_mark_node)
4682     return 0;
4683
4684   check_seenlabel ();
4685
4686   /* Convert VALUEs to type in which the comparisons are nominally done
4687      and replace any unspecified value with the corresponding bound.  */
4688   if (value1 == 0)
4689     value1 = TYPE_MIN_VALUE (index_type);
4690   if (value2 == 0)
4691     value2 = TYPE_MAX_VALUE (index_type);
4692
4693   /* Fail if the range is empty.  Do this before any conversion since
4694      we want to allow out-of-range empty ranges.  */
4695   if (value2 != 0 && tree_int_cst_lt (value2, value1))
4696     return 4;
4697
4698   /* If the max was unbounded, use the max of the nominal_type we are
4699      converting to.  Do this after the < check above to suppress false
4700      positives.  */
4701   if (value2 == 0)
4702     value2 = TYPE_MAX_VALUE (nominal_type);
4703
4704   value1 = (*converter) (nominal_type, value1);
4705   value2 = (*converter) (nominal_type, value2);
4706
4707   /* Fail if these values are out of range.  */
4708   if (TREE_CONSTANT_OVERFLOW (value1)
4709       || ! int_fits_type_p (value1, index_type))
4710     return 3;
4711
4712   if (TREE_CONSTANT_OVERFLOW (value2)
4713       || ! int_fits_type_p (value2, index_type))
4714     return 3;
4715
4716   return add_case_node (value1, value2, label, duplicate);
4717 }
4718
4719 /* Do the actual insertion of a case label for pushcase and pushcase_range
4720    into case_stack->data.case_stmt.case_list.  Use an AVL tree to avoid
4721    slowdown for large switch statements.  */
4722
4723 int
4724 add_case_node (low, high, label, duplicate)
4725      tree low, high;
4726      tree label;
4727      tree *duplicate;
4728 {
4729   struct case_node *p, **q, *r;
4730
4731   /* If there's no HIGH value, then this is not a case range; it's
4732      just a simple case label.  But that's just a degenerate case
4733      range.  */
4734   if (!high)
4735     high = low;
4736
4737   /* Handle default labels specially.  */
4738   if (!high && !low)
4739     {
4740       if (case_stack->data.case_stmt.default_label != 0)
4741         {
4742           *duplicate = case_stack->data.case_stmt.default_label;
4743           return 2;
4744         }
4745       case_stack->data.case_stmt.default_label = label;
4746       expand_label (label);
4747       return 0;
4748     }
4749
4750   q = &case_stack->data.case_stmt.case_list;
4751   p = *q;
4752
4753   while ((r = *q))
4754     {
4755       p = r;
4756
4757       /* Keep going past elements distinctly greater than HIGH.  */
4758       if (tree_int_cst_lt (high, p->low))
4759         q = &p->left;
4760
4761       /* or distinctly less than LOW.  */
4762       else if (tree_int_cst_lt (p->high, low))
4763         q = &p->right;
4764
4765       else
4766         {
4767           /* We have an overlap; this is an error.  */
4768           *duplicate = p->code_label;
4769           return 2;
4770         }
4771     }
4772
4773   /* Add this label to the chain, and succeed.  */
4774
4775   r = (struct case_node *) xmalloc (sizeof (struct case_node));
4776   r->low = low;
4777
4778   /* If the bounds are equal, turn this into the one-value case.  */
4779   if (tree_int_cst_equal (low, high))
4780     r->high = r->low;
4781   else
4782     r->high = high;
4783
4784   r->code_label = label;
4785   expand_label (label);
4786
4787   *q = r;
4788   r->parent = p;
4789   r->left = 0;
4790   r->right = 0;
4791   r->balance = 0;
4792
4793   while (p)
4794     {
4795       struct case_node *s;
4796
4797       if (r == p->left)
4798         {
4799           int b;
4800
4801           if (! (b = p->balance))
4802             /* Growth propagation from left side.  */
4803             p->balance = -1;
4804           else if (b < 0)
4805             {
4806               if (r->balance < 0)
4807                 {
4808                   /* R-Rotation */
4809                   if ((p->left = s = r->right))
4810                     s->parent = p;
4811
4812                   r->right = p;
4813                   p->balance = 0;
4814                   r->balance = 0;
4815                   s = p->parent;
4816                   p->parent = r;
4817
4818                   if ((r->parent = s))
4819                     {
4820                       if (s->left == p)
4821                         s->left = r;
4822                       else
4823                         s->right = r;
4824                     }
4825                   else
4826                     case_stack->data.case_stmt.case_list = r;
4827                 }
4828               else
4829                 /* r->balance == +1 */
4830                 {
4831                   /* LR-Rotation */
4832
4833                   int b2;
4834                   struct case_node *t = r->right;
4835
4836                   if ((p->left = s = t->right))
4837                     s->parent = p;
4838
4839                   t->right = p;
4840                   if ((r->right = s = t->left))
4841                     s->parent = r;
4842
4843                   t->left = r;
4844                   b = t->balance;
4845                   b2 = b < 0;
4846                   p->balance = b2;
4847                   b2 = -b2 - b;
4848                   r->balance = b2;
4849                   t->balance = 0;
4850                   s = p->parent;
4851                   p->parent = t;
4852                   r->parent = t;
4853
4854                   if ((t->parent = s))
4855                     {
4856                       if (s->left == p)
4857                         s->left = t;
4858                       else
4859                         s->right = t;
4860                     }
4861                   else
4862                     case_stack->data.case_stmt.case_list = t;
4863                 }
4864               break;
4865             }
4866
4867           else
4868             {
4869               /* p->balance == +1; growth of left side balances the node.  */
4870               p->balance = 0;
4871               break;
4872             }
4873         }
4874       else
4875         /* r == p->right */
4876         {
4877           int b;
4878
4879           if (! (b = p->balance))
4880             /* Growth propagation from right side.  */
4881             p->balance++;
4882           else if (b > 0)
4883             {
4884               if (r->balance > 0)
4885                 {
4886                   /* L-Rotation */
4887
4888                   if ((p->right = s = r->left))
4889                     s->parent = p;
4890
4891                   r->left = p;
4892                   p->balance = 0;
4893                   r->balance = 0;
4894                   s = p->parent;
4895                   p->parent = r;
4896                   if ((r->parent = s))
4897                     {
4898                       if (s->left == p)
4899                         s->left = r;
4900                       else
4901                         s->right = r;
4902                     }
4903
4904                   else
4905                     case_stack->data.case_stmt.case_list = r;
4906                 }
4907
4908               else
4909                 /* r->balance == -1 */
4910                 {
4911                   /* RL-Rotation */
4912                   int b2;
4913                   struct case_node *t = r->left;
4914
4915                   if ((p->right = s = t->left))
4916                     s->parent = p;
4917
4918                   t->left = p;
4919
4920                   if ((r->left = s = t->right))
4921                     s->parent = r;
4922
4923                   t->right = r;
4924                   b = t->balance;
4925                   b2 = b < 0;
4926                   r->balance = b2;
4927                   b2 = -b2 - b;
4928                   p->balance = b2;
4929                   t->balance = 0;
4930                   s = p->parent;
4931                   p->parent = t;
4932                   r->parent = t;
4933
4934                   if ((t->parent = s))
4935                     {
4936                       if (s->left == p)
4937                         s->left = t;
4938                       else
4939                         s->right = t;
4940                     }
4941
4942                   else
4943                     case_stack->data.case_stmt.case_list = t;
4944                 }
4945               break;
4946             }
4947           else
4948             {
4949               /* p->balance == -1; growth of right side balances the node.  */
4950               p->balance = 0;
4951               break;
4952             }
4953         }
4954
4955       r = p;
4956       p = p->parent;
4957     }
4958
4959   return 0;
4960 }
4961 \f
4962 /* Returns the number of possible values of TYPE.
4963    Returns -1 if the number is unknown, variable, or if the number does not
4964    fit in a HOST_WIDE_INT.
4965    Sets *SPARENESS to 2 if TYPE is an ENUMERAL_TYPE whose values
4966    do not increase monotonically (there may be duplicates);
4967    to 1 if the values increase monotonically, but not always by 1;
4968    otherwise sets it to 0.  */
4969
4970 HOST_WIDE_INT
4971 all_cases_count (type, spareness)
4972      tree type;
4973      int *spareness;
4974 {
4975   tree t;
4976   HOST_WIDE_INT count, minval, lastval;
4977
4978   *spareness = 0;
4979
4980   switch (TREE_CODE (type))
4981     {
4982     case BOOLEAN_TYPE:
4983       count = 2;
4984       break;
4985
4986     case CHAR_TYPE:
4987       count = 1 << BITS_PER_UNIT;
4988       break;
4989
4990     default:
4991     case INTEGER_TYPE:
4992       if (TYPE_MAX_VALUE (type) != 0
4993           && 0 != (t = fold (build (MINUS_EXPR, type, TYPE_MAX_VALUE (type),
4994                                     TYPE_MIN_VALUE (type))))
4995           && 0 != (t = fold (build (PLUS_EXPR, type, t,
4996                                     convert (type, integer_zero_node))))
4997           && host_integerp (t, 1))
4998         count = tree_low_cst (t, 1);
4999       else
5000         return -1;
5001       break;
5002
5003     case ENUMERAL_TYPE:
5004       /* Don't waste time with enumeral types with huge values.  */
5005       if (! host_integerp (TYPE_MIN_VALUE (type), 0)
5006           || TYPE_MAX_VALUE (type) == 0
5007           || ! host_integerp (TYPE_MAX_VALUE (type), 0))
5008         return -1;
5009
5010       lastval = minval = tree_low_cst (TYPE_MIN_VALUE (type), 0);
5011       count = 0;
5012
5013       for (t = TYPE_VALUES (type); t != NULL_TREE; t = TREE_CHAIN (t))
5014         {
5015           HOST_WIDE_INT thisval = tree_low_cst (TREE_VALUE (t), 0);
5016
5017           if (*spareness == 2 || thisval < lastval)
5018             *spareness = 2;
5019           else if (thisval != minval + count)
5020             *spareness = 1;
5021
5022           count++;
5023         }
5024     }
5025
5026   return count;
5027 }
5028
5029 #define BITARRAY_TEST(ARRAY, INDEX) \
5030   ((ARRAY)[(unsigned) (INDEX) / HOST_BITS_PER_CHAR]\
5031                           & (1 << ((unsigned) (INDEX) % HOST_BITS_PER_CHAR)))
5032 #define BITARRAY_SET(ARRAY, INDEX) \
5033   ((ARRAY)[(unsigned) (INDEX) / HOST_BITS_PER_CHAR]\
5034                           |= 1 << ((unsigned) (INDEX) % HOST_BITS_PER_CHAR))
5035
5036 /* Set the elements of the bitstring CASES_SEEN (which has length COUNT),
5037    with the case values we have seen, assuming the case expression
5038    has the given TYPE.
5039    SPARSENESS is as determined by all_cases_count.
5040
5041    The time needed is proportional to COUNT, unless
5042    SPARSENESS is 2, in which case quadratic time is needed.  */
5043
5044 void
5045 mark_seen_cases (type, cases_seen, count, sparseness)
5046      tree type;
5047      unsigned char *cases_seen;
5048      HOST_WIDE_INT count;
5049      int sparseness;
5050 {
5051   tree next_node_to_try = NULL_TREE;
5052   HOST_WIDE_INT next_node_offset = 0;
5053
5054   struct case_node *n, *root = case_stack->data.case_stmt.case_list;
5055   tree val = make_node (INTEGER_CST);
5056
5057   TREE_TYPE (val) = type;
5058   if (! root)
5059     /* Do nothing.  */
5060     ;
5061   else if (sparseness == 2)
5062     {
5063       tree t;
5064       unsigned HOST_WIDE_INT xlo;
5065
5066       /* This less efficient loop is only needed to handle
5067          duplicate case values (multiple enum constants
5068          with the same value).  */
5069       TREE_TYPE (val) = TREE_TYPE (root->low);
5070       for (t = TYPE_VALUES (type), xlo = 0; t != NULL_TREE;
5071            t = TREE_CHAIN (t), xlo++)
5072         {
5073           TREE_INT_CST_LOW (val) = TREE_INT_CST_LOW (TREE_VALUE (t));
5074           TREE_INT_CST_HIGH (val) = TREE_INT_CST_HIGH (TREE_VALUE (t));
5075           n = root;
5076           do
5077             {
5078               /* Keep going past elements distinctly greater than VAL.  */
5079               if (tree_int_cst_lt (val, n->low))
5080                 n = n->left;
5081
5082               /* or distinctly less than VAL.  */
5083               else if (tree_int_cst_lt (n->high, val))
5084                 n = n->right;
5085
5086               else
5087                 {
5088                   /* We have found a matching range.  */
5089                   BITARRAY_SET (cases_seen, xlo);
5090                   break;
5091                 }
5092             }
5093           while (n);
5094         }
5095     }
5096   else
5097     {
5098       if (root->left)
5099         case_stack->data.case_stmt.case_list = root = case_tree2list (root, 0);
5100
5101       for (n = root; n; n = n->right)
5102         {
5103           TREE_INT_CST_LOW (val) = TREE_INT_CST_LOW (n->low);
5104           TREE_INT_CST_HIGH (val) = TREE_INT_CST_HIGH (n->low);
5105           while (! tree_int_cst_lt (n->high, val))
5106             {
5107               /* Calculate (into xlo) the "offset" of the integer (val).
5108                  The element with lowest value has offset 0, the next smallest
5109                  element has offset 1, etc.  */
5110
5111               unsigned HOST_WIDE_INT xlo;
5112               HOST_WIDE_INT xhi;
5113               tree t;
5114
5115               if (sparseness && TYPE_VALUES (type) != NULL_TREE)
5116                 {
5117                   /* The TYPE_VALUES will be in increasing order, so
5118                      starting searching where we last ended.  */
5119                   t = next_node_to_try;
5120                   xlo = next_node_offset;
5121                   xhi = 0;
5122                   for (;;)
5123                     {
5124                       if (t == NULL_TREE)
5125                         {
5126                           t = TYPE_VALUES (type);
5127                           xlo = 0;
5128                         }
5129                       if (tree_int_cst_equal (val, TREE_VALUE (t)))
5130                         {
5131                           next_node_to_try = TREE_CHAIN (t);
5132                           next_node_offset = xlo + 1;
5133                           break;
5134                         }
5135                       xlo++;
5136                       t = TREE_CHAIN (t);
5137                       if (t == next_node_to_try)
5138                         {
5139                           xlo = -1;
5140                           break;
5141                         }
5142                     }
5143                 }
5144               else
5145                 {
5146                   t = TYPE_MIN_VALUE (type);
5147                   if (t)
5148                     neg_double (TREE_INT_CST_LOW (t), TREE_INT_CST_HIGH (t),
5149                                 &xlo, &xhi);
5150                   else
5151                     xlo = xhi = 0;
5152                   add_double (xlo, xhi,
5153                               TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val),
5154                               &xlo, &xhi);
5155                 }
5156
5157               if (xhi == 0 && xlo < (unsigned HOST_WIDE_INT) count)
5158                 BITARRAY_SET (cases_seen, xlo);
5159
5160               add_double (TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val),
5161                           1, 0,
5162                           &TREE_INT_CST_LOW (val), &TREE_INT_CST_HIGH (val));
5163             }
5164         }
5165     }
5166 }
5167
5168 /* Called when the index of a switch statement is an enumerated type
5169    and there is no default label.
5170
5171    Checks that all enumeration literals are covered by the case
5172    expressions of a switch.  Also, warn if there are any extra
5173    switch cases that are *not* elements of the enumerated type.
5174
5175    If all enumeration literals were covered by the case expressions,
5176    turn one of the expressions into the default expression since it should
5177    not be possible to fall through such a switch.  */
5178
5179 void
5180 check_for_full_enumeration_handling (type)
5181      tree type;
5182 {
5183   struct case_node *n;
5184   tree chain;
5185
5186   /* True iff the selector type is a numbered set mode.  */
5187   int sparseness = 0;
5188
5189   /* The number of possible selector values.  */
5190   HOST_WIDE_INT size;
5191
5192   /* For each possible selector value. a one iff it has been matched
5193      by a case value alternative.  */
5194   unsigned char *cases_seen;
5195
5196   /* The allocated size of cases_seen, in chars.  */
5197   HOST_WIDE_INT bytes_needed;
5198
5199   if (! warn_switch)
5200     return;
5201
5202   size = all_cases_count (type, &sparseness);
5203   bytes_needed = (size + HOST_BITS_PER_CHAR) / HOST_BITS_PER_CHAR;
5204
5205   if (size > 0 && size < 600000
5206       /* We deliberately use calloc here, not cmalloc, so that we can suppress
5207          this optimization if we don't have enough memory rather than
5208          aborting, as xmalloc would do.  */
5209       && (cases_seen =
5210           (unsigned char *) really_call_calloc (bytes_needed, 1)) != NULL)
5211     {
5212       HOST_WIDE_INT i;
5213       tree v = TYPE_VALUES (type);
5214
5215       /* The time complexity of this code is normally O(N), where
5216          N being the number of members in the enumerated type.
5217          However, if type is a ENUMERAL_TYPE whose values do not
5218          increase monotonically, O(N*log(N)) time may be needed.  */
5219
5220       mark_seen_cases (type, cases_seen, size, sparseness);
5221
5222       for (i = 0; v != NULL_TREE && i < size; i++, v = TREE_CHAIN (v))
5223         if (BITARRAY_TEST (cases_seen, i) == 0)
5224           warning ("enumeration value `%s' not handled in switch",
5225                    IDENTIFIER_POINTER (TREE_PURPOSE (v)));
5226
5227       free (cases_seen);
5228     }
5229
5230   /* Now we go the other way around; we warn if there are case
5231      expressions that don't correspond to enumerators.  This can
5232      occur since C and C++ don't enforce type-checking of
5233      assignments to enumeration variables.  */
5234
5235   if (case_stack->data.case_stmt.case_list
5236       && case_stack->data.case_stmt.case_list->left)
5237     case_stack->data.case_stmt.case_list
5238       = case_tree2list (case_stack->data.case_stmt.case_list, 0);
5239   if (warn_switch)
5240     for (n = case_stack->data.case_stmt.case_list; n; n = n->right)
5241       {
5242         for (chain = TYPE_VALUES (type);
5243              chain && !tree_int_cst_equal (n->low, TREE_VALUE (chain));
5244              chain = TREE_CHAIN (chain))
5245           ;
5246
5247         if (!chain)
5248           {
5249             if (TYPE_NAME (type) == 0)
5250               warning ("case value `%ld' not in enumerated type",
5251                        (long) TREE_INT_CST_LOW (n->low));
5252             else
5253               warning ("case value `%ld' not in enumerated type `%s'",
5254                        (long) TREE_INT_CST_LOW (n->low),
5255                        IDENTIFIER_POINTER ((TREE_CODE (TYPE_NAME (type))
5256                                             == IDENTIFIER_NODE)
5257                                            ? TYPE_NAME (type)
5258                                            : DECL_NAME (TYPE_NAME (type))));
5259           }
5260         if (!tree_int_cst_equal (n->low, n->high))
5261           {
5262             for (chain = TYPE_VALUES (type);
5263                  chain && !tree_int_cst_equal (n->high, TREE_VALUE (chain));
5264                  chain = TREE_CHAIN (chain))
5265               ;
5266
5267             if (!chain)
5268               {
5269                 if (TYPE_NAME (type) == 0)
5270                   warning ("case value `%ld' not in enumerated type",
5271                            (long) TREE_INT_CST_LOW (n->high));
5272                 else
5273                   warning ("case value `%ld' not in enumerated type `%s'",
5274                            (long) TREE_INT_CST_LOW (n->high),
5275                            IDENTIFIER_POINTER ((TREE_CODE (TYPE_NAME (type))
5276                                                 == IDENTIFIER_NODE)
5277                                                ? TYPE_NAME (type)
5278                                                : DECL_NAME (TYPE_NAME (type))));
5279               }
5280           }
5281       }
5282 }
5283
5284 /* Free CN, and its children.  */
5285
5286 static void 
5287 free_case_nodes (cn)
5288      case_node_ptr cn;
5289 {
5290   if (cn) 
5291     {
5292       free_case_nodes (cn->left);
5293       free_case_nodes (cn->right);
5294       free (cn);
5295     }
5296 }
5297
5298 \f
5299
5300 /* Terminate a case (Pascal) or switch (C) statement
5301    in which ORIG_INDEX is the expression to be tested.
5302    Generate the code to test it and jump to the right place.  */
5303
5304 void
5305 expand_end_case (orig_index)
5306      tree orig_index;
5307 {
5308   tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE, orig_minval;
5309   rtx default_label = 0;
5310   struct case_node *n;
5311   unsigned int count;
5312   rtx index;
5313   rtx table_label;
5314   int ncases;
5315   rtx *labelvec;
5316   int i;
5317   rtx before_case, end;
5318   struct nesting *thiscase = case_stack;
5319   tree index_expr, index_type;
5320   int unsignedp;
5321
5322   /* Don't crash due to previous errors.  */
5323   if (thiscase == NULL)
5324     return;
5325
5326   table_label = gen_label_rtx ();
5327   index_expr = thiscase->data.case_stmt.index_expr;
5328   index_type = TREE_TYPE (index_expr);
5329   unsignedp = TREE_UNSIGNED (index_type);
5330
5331   do_pending_stack_adjust ();
5332
5333   /* This might get an spurious warning in the presence of a syntax error;
5334      it could be fixed by moving the call to check_seenlabel after the
5335      check for error_mark_node, and copying the code of check_seenlabel that
5336      deals with case_stack->data.case_stmt.line_number_status /
5337      restore_line_number_status in front of the call to end_cleanup_deferral;
5338      However, this might miss some useful warnings in the presence of
5339      non-syntax errors.  */
5340   check_seenlabel ();
5341
5342   /* An ERROR_MARK occurs for various reasons including invalid data type.  */
5343   if (index_type != error_mark_node)
5344     {
5345       /* If switch expression was an enumerated type, check that all
5346          enumeration literals are covered by the cases.
5347          No sense trying this if there's a default case, however.  */
5348
5349       if (!thiscase->data.case_stmt.default_label
5350           && TREE_CODE (TREE_TYPE (orig_index)) == ENUMERAL_TYPE
5351           && TREE_CODE (index_expr) != INTEGER_CST)
5352         check_for_full_enumeration_handling (TREE_TYPE (orig_index));
5353
5354       /* If we don't have a default-label, create one here,
5355          after the body of the switch.  */
5356       if (thiscase->data.case_stmt.default_label == 0)
5357         {
5358           thiscase->data.case_stmt.default_label
5359             = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
5360           expand_label (thiscase->data.case_stmt.default_label);
5361         }
5362       default_label = label_rtx (thiscase->data.case_stmt.default_label);
5363
5364       before_case = get_last_insn ();
5365
5366       if (thiscase->data.case_stmt.case_list
5367           && thiscase->data.case_stmt.case_list->left)
5368         thiscase->data.case_stmt.case_list
5369           = case_tree2list (thiscase->data.case_stmt.case_list, 0);
5370
5371       /* Simplify the case-list before we count it.  */
5372       group_case_nodes (thiscase->data.case_stmt.case_list);
5373
5374       /* Get upper and lower bounds of case values.
5375          Also convert all the case values to the index expr's data type.  */
5376
5377       count = 0;
5378       for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
5379         {
5380           /* Check low and high label values are integers.  */
5381           if (TREE_CODE (n->low) != INTEGER_CST)
5382             abort ();
5383           if (TREE_CODE (n->high) != INTEGER_CST)
5384             abort ();
5385
5386           n->low = convert (index_type, n->low);
5387           n->high = convert (index_type, n->high);
5388
5389           /* Count the elements and track the largest and smallest
5390              of them (treating them as signed even if they are not).  */
5391           if (count++ == 0)
5392             {
5393               minval = n->low;
5394               maxval = n->high;
5395             }
5396           else
5397             {
5398               if (INT_CST_LT (n->low, minval))
5399                 minval = n->low;
5400               if (INT_CST_LT (maxval, n->high))
5401                 maxval = n->high;
5402             }
5403           /* A range counts double, since it requires two compares.  */
5404           if (! tree_int_cst_equal (n->low, n->high))
5405             count++;
5406         }
5407
5408       orig_minval = minval;
5409
5410       /* Compute span of values.  */
5411       if (count != 0)
5412         range = fold (build (MINUS_EXPR, index_type, maxval, minval));
5413
5414       end_cleanup_deferral ();
5415
5416       if (count == 0)
5417         {
5418           expand_expr (index_expr, const0_rtx, VOIDmode, 0);
5419           emit_queue ();
5420           emit_jump (default_label);
5421         }
5422
5423       /* If range of values is much bigger than number of values,
5424          make a sequence of conditional branches instead of a dispatch.
5425          If the switch-index is a constant, do it this way
5426          because we can optimize it.  */
5427
5428       else if (count < case_values_threshold ()
5429                || compare_tree_int (range, 10 * count) > 0
5430                /* RANGE may be signed, and really large ranges will show up
5431                   as negative numbers.  */
5432                || compare_tree_int (range, 0) < 0
5433 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
5434                || flag_pic
5435 #endif
5436                || TREE_CODE (index_expr) == INTEGER_CST
5437                || (TREE_CODE (index_expr) == COMPOUND_EXPR
5438                    && TREE_CODE (TREE_OPERAND (index_expr, 1)) == INTEGER_CST))
5439         {
5440           index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
5441
5442           /* If the index is a short or char that we do not have
5443              an insn to handle comparisons directly, convert it to
5444              a full integer now, rather than letting each comparison
5445              generate the conversion.  */
5446
5447           if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
5448               && ! have_insn_for (COMPARE, GET_MODE (index)))
5449             {
5450               enum machine_mode wider_mode;
5451               for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
5452                    wider_mode = GET_MODE_WIDER_MODE (wider_mode))
5453                 if (have_insn_for (COMPARE, wider_mode))
5454                   {
5455                     index = convert_to_mode (wider_mode, index, unsignedp);
5456                     break;
5457                   }
5458             }
5459
5460           emit_queue ();
5461           do_pending_stack_adjust ();
5462
5463           index = protect_from_queue (index, 0);
5464           if (GET_CODE (index) == MEM)
5465             index = copy_to_reg (index);
5466           if (GET_CODE (index) == CONST_INT
5467               || TREE_CODE (index_expr) == INTEGER_CST)
5468             {
5469               /* Make a tree node with the proper constant value
5470                  if we don't already have one.  */
5471               if (TREE_CODE (index_expr) != INTEGER_CST)
5472                 {
5473                   index_expr
5474                     = build_int_2 (INTVAL (index),
5475                                    unsignedp || INTVAL (index) >= 0 ? 0 : -1);
5476                   index_expr = convert (index_type, index_expr);
5477                 }
5478
5479               /* For constant index expressions we need only
5480                  issue an unconditional branch to the appropriate
5481                  target code.  The job of removing any unreachable
5482                  code is left to the optimisation phase if the
5483                  "-O" option is specified.  */
5484               for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
5485                 if (! tree_int_cst_lt (index_expr, n->low)
5486                     && ! tree_int_cst_lt (n->high, index_expr))
5487                   break;
5488
5489               if (n)
5490                 emit_jump (label_rtx (n->code_label));
5491               else
5492                 emit_jump (default_label);
5493             }
5494           else
5495             {
5496               /* If the index expression is not constant we generate
5497                  a binary decision tree to select the appropriate
5498                  target code.  This is done as follows:
5499
5500                  The list of cases is rearranged into a binary tree,
5501                  nearly optimal assuming equal probability for each case.
5502
5503                  The tree is transformed into RTL, eliminating
5504                  redundant test conditions at the same time.
5505
5506                  If program flow could reach the end of the
5507                  decision tree an unconditional jump to the
5508                  default code is emitted.  */
5509
5510               use_cost_table
5511                 = (TREE_CODE (TREE_TYPE (orig_index)) != ENUMERAL_TYPE
5512                    && estimate_case_costs (thiscase->data.case_stmt.case_list));
5513               balance_case_nodes (&thiscase->data.case_stmt.case_list, NULL);
5514               emit_case_nodes (index, thiscase->data.case_stmt.case_list,
5515                                default_label, index_type);
5516               emit_jump_if_reachable (default_label);
5517             }
5518         }
5519       else
5520         {
5521           if (! try_casesi (index_type, index_expr, minval, range,
5522                             table_label, default_label))
5523             {
5524               index_type = thiscase->data.case_stmt.nominal_type;
5525               if (! try_tablejump (index_type, index_expr, minval, range,
5526                                    table_label, default_label))
5527                 abort ();
5528             }
5529           
5530           /* Get table of labels to jump to, in order of case index.  */
5531
5532           ncases = TREE_INT_CST_LOW (range) + 1;
5533           labelvec = (rtx *) alloca (ncases * sizeof (rtx));
5534           memset ((char *) labelvec, 0, ncases * sizeof (rtx));
5535
5536           for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
5537             {
5538               HOST_WIDE_INT i
5539                 = TREE_INT_CST_LOW (n->low) - TREE_INT_CST_LOW (orig_minval);
5540
5541               while (1)
5542                 {
5543                   labelvec[i]
5544                     = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
5545                   if (i + TREE_INT_CST_LOW (orig_minval)
5546                       == TREE_INT_CST_LOW (n->high))
5547                     break;
5548                   i++;
5549                 }
5550             }
5551
5552           /* Fill in the gaps with the default.  */
5553           for (i = 0; i < ncases; i++)
5554             if (labelvec[i] == 0)
5555               labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
5556
5557           /* Output the table */
5558           emit_label (table_label);
5559
5560           if (CASE_VECTOR_PC_RELATIVE || flag_pic)
5561             emit_jump_insn (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
5562                                                    gen_rtx_LABEL_REF (Pmode, table_label),
5563                                                    gen_rtvec_v (ncases, labelvec),
5564                                                    const0_rtx, const0_rtx));
5565           else
5566             emit_jump_insn (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
5567                                               gen_rtvec_v (ncases, labelvec)));
5568
5569           /* If the case insn drops through the table,
5570              after the table we must jump to the default-label.
5571              Otherwise record no drop-through after the table.  */
5572 #ifdef CASE_DROPS_THROUGH
5573           emit_jump (default_label);
5574 #else
5575           emit_barrier ();
5576 #endif
5577         }
5578
5579       before_case = NEXT_INSN (before_case);
5580       end = get_last_insn ();
5581       squeeze_notes (&before_case, &end);
5582       reorder_insns (before_case, end,
5583                      thiscase->data.case_stmt.start);
5584     }
5585   else
5586     end_cleanup_deferral ();
5587
5588   if (thiscase->exit_label)
5589     emit_label (thiscase->exit_label);
5590
5591   free_case_nodes (case_stack->data.case_stmt.case_list);
5592   POPSTACK (case_stack);
5593
5594   free_temp_slots ();
5595 }
5596
5597 /* Convert the tree NODE into a list linked by the right field, with the left
5598    field zeroed.  RIGHT is used for recursion; it is a list to be placed
5599    rightmost in the resulting list.  */
5600
5601 static struct case_node *
5602 case_tree2list (node, right)
5603      struct case_node *node, *right;
5604 {
5605   struct case_node *left;
5606
5607   if (node->right)
5608     right = case_tree2list (node->right, right);
5609
5610   node->right = right;
5611   if ((left = node->left))
5612     {
5613       node->left = 0;
5614       return case_tree2list (left, node);
5615     }
5616
5617   return node;
5618 }
5619
5620 /* Generate code to jump to LABEL if OP1 and OP2 are equal.  */
5621
5622 static void
5623 do_jump_if_equal (op1, op2, label, unsignedp)
5624      rtx op1, op2, label;
5625      int unsignedp;
5626 {
5627   if (GET_CODE (op1) == CONST_INT
5628       && GET_CODE (op2) == CONST_INT)
5629     {
5630       if (INTVAL (op1) == INTVAL (op2))
5631         emit_jump (label);
5632     }
5633   else
5634     {
5635       enum machine_mode mode = GET_MODE (op1);
5636       if (mode == VOIDmode)
5637         mode = GET_MODE (op2);
5638       emit_cmp_and_jump_insns (op1, op2, EQ, NULL_RTX, mode, unsignedp,
5639                                0, label);
5640     }
5641 }
5642 \f
5643 /* Not all case values are encountered equally.  This function
5644    uses a heuristic to weight case labels, in cases where that
5645    looks like a reasonable thing to do.
5646
5647    Right now, all we try to guess is text, and we establish the
5648    following weights:
5649
5650         chars above space:      16
5651         digits:                 16
5652         default:                12
5653         space, punct:           8
5654         tab:                    4
5655         newline:                2
5656         other "\" chars:        1
5657         remaining chars:        0
5658
5659    If we find any cases in the switch that are not either -1 or in the range
5660    of valid ASCII characters, or are control characters other than those
5661    commonly used with "\", don't treat this switch scanning text.
5662
5663    Return 1 if these nodes are suitable for cost estimation, otherwise
5664    return 0.  */
5665
5666 static int
5667 estimate_case_costs (node)
5668      case_node_ptr node;
5669 {
5670   tree min_ascii = integer_minus_one_node;
5671   tree max_ascii = convert (TREE_TYPE (node->high), build_int_2 (127, 0));
5672   case_node_ptr n;
5673   int i;
5674
5675   /* If we haven't already made the cost table, make it now.  Note that the
5676      lower bound of the table is -1, not zero.  */
5677
5678   if (! cost_table_initialized)
5679     {
5680       cost_table_initialized = 1;
5681
5682       for (i = 0; i < 128; i++)
5683         {
5684           if (ISALNUM (i))
5685             COST_TABLE (i) = 16;
5686           else if (ISPUNCT (i))
5687             COST_TABLE (i) = 8;
5688           else if (ISCNTRL (i))
5689             COST_TABLE (i) = -1;
5690         }
5691
5692       COST_TABLE (' ') = 8;
5693       COST_TABLE ('\t') = 4;
5694       COST_TABLE ('\0') = 4;
5695       COST_TABLE ('\n') = 2;
5696       COST_TABLE ('\f') = 1;
5697       COST_TABLE ('\v') = 1;
5698       COST_TABLE ('\b') = 1;
5699     }
5700
5701   /* See if all the case expressions look like text.  It is text if the
5702      constant is >= -1 and the highest constant is <= 127.  Do all comparisons
5703      as signed arithmetic since we don't want to ever access cost_table with a
5704      value less than -1.  Also check that none of the constants in a range
5705      are strange control characters.  */
5706
5707   for (n = node; n; n = n->right)
5708     {
5709       if ((INT_CST_LT (n->low, min_ascii)) || INT_CST_LT (max_ascii, n->high))
5710         return 0;
5711
5712       for (i = (HOST_WIDE_INT) TREE_INT_CST_LOW (n->low);
5713            i <= (HOST_WIDE_INT) TREE_INT_CST_LOW (n->high); i++)
5714         if (COST_TABLE (i) < 0)
5715           return 0;
5716     }
5717
5718   /* All interesting values are within the range of interesting
5719      ASCII characters.  */
5720   return 1;
5721 }
5722
5723 /* Scan an ordered list of case nodes
5724    combining those with consecutive values or ranges.
5725
5726    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
5727
5728 static void
5729 group_case_nodes (head)
5730      case_node_ptr head;
5731 {
5732   case_node_ptr node = head;
5733
5734   while (node)
5735     {
5736       rtx lb = next_real_insn (label_rtx (node->code_label));
5737       rtx lb2;
5738       case_node_ptr np = node;
5739
5740       /* Try to group the successors of NODE with NODE.  */
5741       while (((np = np->right) != 0)
5742              /* Do they jump to the same place?  */
5743              && ((lb2 = next_real_insn (label_rtx (np->code_label))) == lb
5744                  || (lb != 0 && lb2 != 0
5745                      && simplejump_p (lb)
5746                      && simplejump_p (lb2)
5747                      && rtx_equal_p (SET_SRC (PATTERN (lb)),
5748                                      SET_SRC (PATTERN (lb2)))))
5749              /* Are their ranges consecutive?  */
5750              && tree_int_cst_equal (np->low,
5751                                     fold (build (PLUS_EXPR,
5752                                                  TREE_TYPE (node->high),
5753                                                  node->high,
5754                                                  integer_one_node)))
5755              /* An overflow is not consecutive.  */
5756              && tree_int_cst_lt (node->high,
5757                                  fold (build (PLUS_EXPR,
5758                                               TREE_TYPE (node->high),
5759                                               node->high,
5760                                               integer_one_node))))
5761         {
5762           node->high = np->high;
5763         }
5764       /* NP is the first node after NODE which can't be grouped with it.
5765          Delete the nodes in between, and move on to that node.  */
5766       node->right = np;
5767       node = np;
5768     }
5769 }
5770
5771 /* Take an ordered list of case nodes
5772    and transform them into a near optimal binary tree,
5773    on the assumption that any target code selection value is as
5774    likely as any other.
5775
5776    The transformation is performed by splitting the ordered
5777    list into two equal sections plus a pivot.  The parts are
5778    then attached to the pivot as left and right branches.  Each
5779    branch is then transformed recursively.  */
5780
5781 static void
5782 balance_case_nodes (head, parent)
5783      case_node_ptr *head;
5784      case_node_ptr parent;
5785 {
5786   case_node_ptr np;
5787
5788   np = *head;
5789   if (np)
5790     {
5791       int cost = 0;
5792       int i = 0;
5793       int ranges = 0;
5794       case_node_ptr *npp;
5795       case_node_ptr left;
5796
5797       /* Count the number of entries on branch.  Also count the ranges.  */
5798
5799       while (np)
5800         {
5801           if (!tree_int_cst_equal (np->low, np->high))
5802             {
5803               ranges++;
5804               if (use_cost_table)
5805                 cost += COST_TABLE (TREE_INT_CST_LOW (np->high));
5806             }
5807
5808           if (use_cost_table)
5809             cost += COST_TABLE (TREE_INT_CST_LOW (np->low));
5810
5811           i++;
5812           np = np->right;
5813         }
5814
5815       if (i > 2)
5816         {
5817           /* Split this list if it is long enough for that to help.  */
5818           npp = head;
5819           left = *npp;
5820           if (use_cost_table)
5821             {
5822               /* Find the place in the list that bisects the list's total cost,
5823                  Here I gets half the total cost.  */
5824               int n_moved = 0;
5825               i = (cost + 1) / 2;
5826               while (1)
5827                 {
5828                   /* Skip nodes while their cost does not reach that amount.  */
5829                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
5830                     i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->high));
5831                   i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->low));
5832                   if (i <= 0)
5833                     break;
5834                   npp = &(*npp)->right;
5835                   n_moved += 1;
5836                 }
5837               if (n_moved == 0)
5838                 {
5839                   /* Leave this branch lopsided, but optimize left-hand
5840                      side and fill in `parent' fields for right-hand side.  */
5841                   np = *head;
5842                   np->parent = parent;
5843                   balance_case_nodes (&np->left, np);
5844                   for (; np->right; np = np->right)
5845                     np->right->parent = np;
5846                   return;
5847                 }
5848             }
5849           /* If there are just three nodes, split at the middle one.  */
5850           else if (i == 3)
5851             npp = &(*npp)->right;
5852           else
5853             {
5854               /* Find the place in the list that bisects the list's total cost,
5855                  where ranges count as 2.
5856                  Here I gets half the total cost.  */
5857               i = (i + ranges + 1) / 2;
5858               while (1)
5859                 {
5860                   /* Skip nodes while their cost does not reach that amount.  */
5861                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
5862                     i--;
5863                   i--;
5864                   if (i <= 0)
5865                     break;
5866                   npp = &(*npp)->right;
5867                 }
5868             }
5869           *head = np = *npp;
5870           *npp = 0;
5871           np->parent = parent;
5872           np->left = left;
5873
5874           /* Optimize each of the two split parts.  */
5875           balance_case_nodes (&np->left, np);
5876           balance_case_nodes (&np->right, np);
5877         }
5878       else
5879         {
5880           /* Else leave this branch as one level,
5881              but fill in `parent' fields.  */
5882           np = *head;
5883           np->parent = parent;
5884           for (; np->right; np = np->right)
5885             np->right->parent = np;
5886         }
5887     }
5888 }
5889 \f
5890 /* Search the parent sections of the case node tree
5891    to see if a test for the lower bound of NODE would be redundant.
5892    INDEX_TYPE is the type of the index expression.
5893
5894    The instructions to generate the case decision tree are
5895    output in the same order as nodes are processed so it is
5896    known that if a parent node checks the range of the current
5897    node minus one that the current node is bounded at its lower
5898    span.  Thus the test would be redundant.  */
5899
5900 static int
5901 node_has_low_bound (node, index_type)
5902      case_node_ptr node;
5903      tree index_type;
5904 {
5905   tree low_minus_one;
5906   case_node_ptr pnode;
5907
5908   /* If the lower bound of this node is the lowest value in the index type,
5909      we need not test it.  */
5910
5911   if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
5912     return 1;
5913
5914   /* If this node has a left branch, the value at the left must be less
5915      than that at this node, so it cannot be bounded at the bottom and
5916      we need not bother testing any further.  */
5917
5918   if (node->left)
5919     return 0;
5920
5921   low_minus_one = fold (build (MINUS_EXPR, TREE_TYPE (node->low),
5922                                node->low, integer_one_node));
5923
5924   /* If the subtraction above overflowed, we can't verify anything.
5925      Otherwise, look for a parent that tests our value - 1.  */
5926
5927   if (! tree_int_cst_lt (low_minus_one, node->low))
5928     return 0;
5929
5930   for (pnode = node->parent; pnode; pnode = pnode->parent)
5931     if (tree_int_cst_equal (low_minus_one, pnode->high))
5932       return 1;
5933
5934   return 0;
5935 }
5936
5937 /* Search the parent sections of the case node tree
5938    to see if a test for the upper bound of NODE would be redundant.
5939    INDEX_TYPE is the type of the index expression.
5940
5941    The instructions to generate the case decision tree are
5942    output in the same order as nodes are processed so it is
5943    known that if a parent node checks the range of the current
5944    node plus one that the current node is bounded at its upper
5945    span.  Thus the test would be redundant.  */
5946
5947 static int
5948 node_has_high_bound (node, index_type)
5949      case_node_ptr node;
5950      tree index_type;
5951 {
5952   tree high_plus_one;
5953   case_node_ptr pnode;
5954
5955   /* If there is no upper bound, obviously no test is needed.  */
5956
5957   if (TYPE_MAX_VALUE (index_type) == NULL)
5958     return 1;
5959
5960   /* If the upper bound of this node is the highest value in the type
5961      of the index expression, we need not test against it.  */
5962
5963   if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
5964     return 1;
5965
5966   /* If this node has a right branch, the value at the right must be greater
5967      than that at this node, so it cannot be bounded at the top and
5968      we need not bother testing any further.  */
5969
5970   if (node->right)
5971     return 0;
5972
5973   high_plus_one = fold (build (PLUS_EXPR, TREE_TYPE (node->high),
5974                                node->high, integer_one_node));
5975
5976   /* If the addition above overflowed, we can't verify anything.
5977      Otherwise, look for a parent that tests our value + 1.  */
5978
5979   if (! tree_int_cst_lt (node->high, high_plus_one))
5980     return 0;
5981
5982   for (pnode = node->parent; pnode; pnode = pnode->parent)
5983     if (tree_int_cst_equal (high_plus_one, pnode->low))
5984       return 1;
5985
5986   return 0;
5987 }
5988
5989 /* Search the parent sections of the
5990    case node tree to see if both tests for the upper and lower
5991    bounds of NODE would be redundant.  */
5992
5993 static int
5994 node_is_bounded (node, index_type)
5995      case_node_ptr node;
5996      tree index_type;
5997 {
5998   return (node_has_low_bound (node, index_type)
5999           && node_has_high_bound (node, index_type));
6000 }
6001
6002 /*  Emit an unconditional jump to LABEL unless it would be dead code.  */
6003
6004 static void
6005 emit_jump_if_reachable (label)
6006      rtx label;
6007 {
6008   if (GET_CODE (get_last_insn ()) != BARRIER)
6009     emit_jump (label);
6010 }
6011 \f
6012 /* Emit step-by-step code to select a case for the value of INDEX.
6013    The thus generated decision tree follows the form of the
6014    case-node binary tree NODE, whose nodes represent test conditions.
6015    INDEX_TYPE is the type of the index of the switch.
6016
6017    Care is taken to prune redundant tests from the decision tree
6018    by detecting any boundary conditions already checked by
6019    emitted rtx.  (See node_has_high_bound, node_has_low_bound
6020    and node_is_bounded, above.)
6021
6022    Where the test conditions can be shown to be redundant we emit
6023    an unconditional jump to the target code.  As a further
6024    optimization, the subordinates of a tree node are examined to
6025    check for bounded nodes.  In this case conditional and/or
6026    unconditional jumps as a result of the boundary check for the
6027    current node are arranged to target the subordinates associated
6028    code for out of bound conditions on the current node.
6029
6030    We can assume that when control reaches the code generated here,
6031    the index value has already been compared with the parents
6032    of this node, and determined to be on the same side of each parent
6033    as this node is.  Thus, if this node tests for the value 51,
6034    and a parent tested for 52, we don't need to consider
6035    the possibility of a value greater than 51.  If another parent
6036    tests for the value 50, then this node need not test anything.  */
6037
6038 static void
6039 emit_case_nodes (index, node, default_label, index_type)
6040      rtx index;
6041      case_node_ptr node;
6042      rtx default_label;
6043      tree index_type;
6044 {
6045   /* If INDEX has an unsigned type, we must make unsigned branches.  */
6046   int unsignedp = TREE_UNSIGNED (index_type);
6047   enum machine_mode mode = GET_MODE (index);
6048   enum machine_mode imode = TYPE_MODE (index_type);
6049
6050   /* See if our parents have already tested everything for us.
6051      If they have, emit an unconditional jump for this node.  */
6052   if (node_is_bounded (node, index_type))
6053     emit_jump (label_rtx (node->code_label));
6054
6055   else if (tree_int_cst_equal (node->low, node->high))
6056     {
6057       /* Node is single valued.  First see if the index expression matches
6058          this node and then check our children, if any.  */
6059
6060       do_jump_if_equal (index,
6061                         convert_modes (mode, imode,
6062                                        expand_expr (node->low, NULL_RTX,
6063                                                     VOIDmode, 0),
6064                                        unsignedp),
6065                         label_rtx (node->code_label), unsignedp);
6066
6067       if (node->right != 0 && node->left != 0)
6068         {
6069           /* This node has children on both sides.
6070              Dispatch to one side or the other
6071              by comparing the index value with this node's value.
6072              If one subtree is bounded, check that one first,
6073              so we can avoid real branches in the tree.  */
6074
6075           if (node_is_bounded (node->right, index_type))
6076             {
6077               emit_cmp_and_jump_insns (index,
6078                                        convert_modes
6079                                        (mode, imode,
6080                                         expand_expr (node->high, NULL_RTX,
6081                                                      VOIDmode, 0),
6082                                         unsignedp),
6083                                        GT, NULL_RTX, mode, unsignedp, 0,
6084                                        label_rtx (node->right->code_label));
6085               emit_case_nodes (index, node->left, default_label, index_type);
6086             }
6087
6088           else if (node_is_bounded (node->left, index_type))
6089             {
6090               emit_cmp_and_jump_insns (index,
6091                                        convert_modes
6092                                        (mode, imode,
6093                                         expand_expr (node->high, NULL_RTX,
6094                                                      VOIDmode, 0),
6095                                         unsignedp),
6096                                        LT, NULL_RTX, mode, unsignedp, 0,
6097                                        label_rtx (node->left->code_label));
6098               emit_case_nodes (index, node->right, default_label, index_type);
6099             }
6100
6101           else
6102             {
6103               /* Neither node is bounded.  First distinguish the two sides;
6104                  then emit the code for one side at a time.  */
6105
6106               tree test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
6107
6108               /* See if the value is on the right.  */
6109               emit_cmp_and_jump_insns (index,
6110                                        convert_modes
6111                                        (mode, imode,
6112                                         expand_expr (node->high, NULL_RTX,
6113                                                      VOIDmode, 0),
6114                                         unsignedp),
6115                                        GT, NULL_RTX, mode, unsignedp, 0,
6116                                        label_rtx (test_label));
6117
6118               /* Value must be on the left.
6119                  Handle the left-hand subtree.  */
6120               emit_case_nodes (index, node->left, default_label, index_type);
6121               /* If left-hand subtree does nothing,
6122                  go to default.  */
6123               emit_jump_if_reachable (default_label);
6124
6125               /* Code branches here for the right-hand subtree.  */
6126               expand_label (test_label);
6127               emit_case_nodes (index, node->right, default_label, index_type);
6128             }
6129         }
6130
6131       else if (node->right != 0 && node->left == 0)
6132         {
6133           /* Here we have a right child but no left so we issue conditional
6134              branch to default and process the right child.
6135
6136              Omit the conditional branch to default if we it avoid only one
6137              right child; it costs too much space to save so little time.  */
6138
6139           if (node->right->right || node->right->left
6140               || !tree_int_cst_equal (node->right->low, node->right->high))
6141             {
6142               if (!node_has_low_bound (node, index_type))
6143                 {
6144                   emit_cmp_and_jump_insns (index,
6145                                            convert_modes
6146                                            (mode, imode,
6147                                             expand_expr (node->high, NULL_RTX,
6148                                                          VOIDmode, 0),
6149                                             unsignedp),
6150                                            LT, NULL_RTX, mode, unsignedp, 0,
6151                                            default_label);
6152                 }
6153
6154               emit_case_nodes (index, node->right, default_label, index_type);
6155             }
6156           else
6157             /* We cannot process node->right normally
6158                since we haven't ruled out the numbers less than
6159                this node's value.  So handle node->right explicitly.  */
6160             do_jump_if_equal (index,
6161                               convert_modes
6162                               (mode, imode,
6163                                expand_expr (node->right->low, NULL_RTX,
6164                                             VOIDmode, 0),
6165                                unsignedp),
6166                               label_rtx (node->right->code_label), unsignedp);
6167         }
6168
6169       else if (node->right == 0 && node->left != 0)
6170         {
6171           /* Just one subtree, on the left.  */
6172           if (node->left->left || node->left->right
6173               || !tree_int_cst_equal (node->left->low, node->left->high))
6174             {
6175               if (!node_has_high_bound (node, index_type))
6176                 {
6177                   emit_cmp_and_jump_insns (index,
6178                                            convert_modes
6179                                            (mode, imode,
6180                                             expand_expr (node->high, NULL_RTX,
6181                                                          VOIDmode, 0),
6182                                             unsignedp),
6183                                            GT, NULL_RTX, mode, unsignedp, 0,
6184                                            default_label);
6185                 }
6186
6187               emit_case_nodes (index, node->left, default_label, index_type);
6188             }
6189           else
6190             /* We cannot process node->left normally
6191                since we haven't ruled out the numbers less than
6192                this node's value.  So handle node->left explicitly.  */
6193             do_jump_if_equal (index,
6194                               convert_modes
6195                               (mode, imode,
6196                                expand_expr (node->left->low, NULL_RTX,
6197                                             VOIDmode, 0),
6198                                unsignedp),
6199                               label_rtx (node->left->code_label), unsignedp);
6200         }
6201     }
6202   else
6203     {
6204       /* Node is a range.  These cases are very similar to those for a single
6205          value, except that we do not start by testing whether this node
6206          is the one to branch to.  */
6207
6208       if (node->right != 0 && node->left != 0)
6209         {
6210           /* Node has subtrees on both sides.
6211              If the right-hand subtree is bounded,
6212              test for it first, since we can go straight there.
6213              Otherwise, we need to make a branch in the control structure,
6214              then handle the two subtrees.  */
6215           tree test_label = 0;
6216
6217           if (node_is_bounded (node->right, index_type))
6218             /* Right hand node is fully bounded so we can eliminate any
6219                testing and branch directly to the target code.  */
6220             emit_cmp_and_jump_insns (index,
6221                                      convert_modes
6222                                      (mode, imode,
6223                                       expand_expr (node->high, NULL_RTX,
6224                                                    VOIDmode, 0),
6225                                       unsignedp),
6226                                      GT, NULL_RTX, mode, unsignedp, 0,
6227                                      label_rtx (node->right->code_label));
6228           else
6229             {
6230               /* Right hand node requires testing.
6231                  Branch to a label where we will handle it later.  */
6232
6233               test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
6234               emit_cmp_and_jump_insns (index,
6235                                        convert_modes
6236                                        (mode, imode,
6237                                         expand_expr (node->high, NULL_RTX,
6238                                                      VOIDmode, 0),
6239                                         unsignedp),
6240                                        GT, NULL_RTX, mode, unsignedp, 0,
6241                                        label_rtx (test_label));
6242             }
6243
6244           /* Value belongs to this node or to the left-hand subtree.  */
6245
6246           emit_cmp_and_jump_insns (index,
6247                                    convert_modes
6248                                    (mode, imode,
6249                                     expand_expr (node->low, NULL_RTX,
6250                                                  VOIDmode, 0),
6251                                     unsignedp),
6252                                    GE, NULL_RTX, mode, unsignedp, 0,
6253                                    label_rtx (node->code_label));
6254
6255           /* Handle the left-hand subtree.  */
6256           emit_case_nodes (index, node->left, default_label, index_type);
6257
6258           /* If right node had to be handled later, do that now.  */
6259
6260           if (test_label)
6261             {
6262               /* If the left-hand subtree fell through,
6263                  don't let it fall into the right-hand subtree.  */
6264               emit_jump_if_reachable (default_label);
6265
6266               expand_label (test_label);
6267               emit_case_nodes (index, node->right, default_label, index_type);
6268             }
6269         }
6270
6271       else if (node->right != 0 && node->left == 0)
6272         {
6273           /* Deal with values to the left of this node,
6274              if they are possible.  */
6275           if (!node_has_low_bound (node, index_type))
6276             {
6277               emit_cmp_and_jump_insns (index,
6278                                        convert_modes
6279                                        (mode, imode,
6280                                         expand_expr (node->low, NULL_RTX,
6281                                                      VOIDmode, 0),
6282                                         unsignedp),
6283                                        LT, NULL_RTX, mode, unsignedp, 0,
6284                                        default_label);
6285             }
6286
6287           /* Value belongs to this node or to the right-hand subtree.  */
6288
6289           emit_cmp_and_jump_insns (index,
6290                                    convert_modes
6291                                    (mode, imode,
6292                                     expand_expr (node->high, NULL_RTX,
6293                                                  VOIDmode, 0),
6294                                     unsignedp),
6295                                    LE, NULL_RTX, mode, unsignedp, 0,
6296                                    label_rtx (node->code_label));
6297
6298           emit_case_nodes (index, node->right, default_label, index_type);
6299         }
6300
6301       else if (node->right == 0 && node->left != 0)
6302         {
6303           /* Deal with values to the right of this node,
6304              if they are possible.  */
6305           if (!node_has_high_bound (node, index_type))
6306             {
6307               emit_cmp_and_jump_insns (index,
6308                                        convert_modes
6309                                        (mode, imode,
6310                                         expand_expr (node->high, NULL_RTX,
6311                                                      VOIDmode, 0),
6312                                         unsignedp),
6313                                        GT, NULL_RTX, mode, unsignedp, 0,
6314                                        default_label);
6315             }
6316
6317           /* Value belongs to this node or to the left-hand subtree.  */
6318
6319           emit_cmp_and_jump_insns (index,
6320                                    convert_modes
6321                                    (mode, imode,
6322                                     expand_expr (node->low, NULL_RTX,
6323                                                  VOIDmode, 0),
6324                                     unsignedp),
6325                                    GE, NULL_RTX, mode, unsignedp, 0,
6326                                    label_rtx (node->code_label));
6327
6328           emit_case_nodes (index, node->left, default_label, index_type);
6329         }
6330
6331       else
6332         {
6333           /* Node has no children so we check low and high bounds to remove
6334              redundant tests.  Only one of the bounds can exist,
6335              since otherwise this node is bounded--a case tested already.  */
6336           int high_bound = node_has_high_bound (node, index_type);
6337           int low_bound = node_has_low_bound (node, index_type);
6338
6339           if (!high_bound && low_bound)
6340             {
6341               emit_cmp_and_jump_insns (index,
6342                                        convert_modes
6343                                        (mode, imode,
6344                                         expand_expr (node->high, NULL_RTX,
6345                                                      VOIDmode, 0),
6346                                         unsignedp),
6347                                        GT, NULL_RTX, mode, unsignedp, 0,
6348                                        default_label);
6349             }
6350
6351           else if (!low_bound && high_bound)
6352             {
6353               emit_cmp_and_jump_insns (index,
6354                                        convert_modes
6355                                        (mode, imode,
6356                                         expand_expr (node->low, NULL_RTX,
6357                                                      VOIDmode, 0),
6358                                         unsignedp),
6359                                        LT, NULL_RTX, mode, unsignedp, 0,
6360                                        default_label);
6361             }
6362           else if (!low_bound && !high_bound)
6363             {
6364               /* Widen LOW and HIGH to the same width as INDEX.  */
6365               tree type = type_for_mode (mode, unsignedp);
6366               tree low = build1 (CONVERT_EXPR, type, node->low);
6367               tree high = build1 (CONVERT_EXPR, type, node->high);
6368               rtx low_rtx, new_index, new_bound;
6369
6370               /* Instead of doing two branches, emit one unsigned branch for
6371                  (index-low) > (high-low).  */
6372               low_rtx = expand_expr (low, NULL_RTX, mode, 0);
6373               new_index = expand_simple_binop (mode, MINUS, index, low_rtx,
6374                                                NULL_RTX, unsignedp,
6375                                                OPTAB_WIDEN);
6376               new_bound = expand_expr (fold (build (MINUS_EXPR, type,
6377                                                     high, low)),
6378                                        NULL_RTX, mode, 0);
6379                                 
6380               emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX,
6381                                        mode, 1, 0, default_label);
6382             }
6383
6384           emit_jump (label_rtx (node->code_label));
6385         }
6386     }
6387 }