OSDN Git Service

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