OSDN Git Service

2005-05-24 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / function.c
1 /* Expands front end tree to back end RTL for GCC.
2    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 /* This file handles the generation of rtl code from tree structure
24    at the level of the function as a whole.
25    It creates the rtl expressions for parameters and auto variables
26    and has full responsibility for allocating stack slots.
27
28    `expand_function_start' is called at the beginning of a function,
29    before the function body is parsed, and `expand_function_end' is
30    called after parsing the body.
31
32    Call `assign_stack_local' to allocate a stack slot for a local variable.
33    This is usually done during the RTL generation for the function body,
34    but it can also be done in the reload pass when a pseudo-register does
35    not get a hard register.  */
36
37 #include "config.h"
38 #include "system.h"
39 #include "coretypes.h"
40 #include "tm.h"
41 #include "rtl.h"
42 #include "tree.h"
43 #include "flags.h"
44 #include "except.h"
45 #include "function.h"
46 #include "expr.h"
47 #include "optabs.h"
48 #include "libfuncs.h"
49 #include "regs.h"
50 #include "hard-reg-set.h"
51 #include "insn-config.h"
52 #include "recog.h"
53 #include "output.h"
54 #include "basic-block.h"
55 #include "toplev.h"
56 #include "hashtab.h"
57 #include "ggc.h"
58 #include "tm_p.h"
59 #include "integrate.h"
60 #include "langhooks.h"
61 #include "target.h"
62 #include "cfglayout.h"
63 #include "tree-gimple.h"
64
65 #ifndef LOCAL_ALIGNMENT
66 #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
67 #endif
68
69 #ifndef STACK_ALIGNMENT_NEEDED
70 #define STACK_ALIGNMENT_NEEDED 1
71 #endif
72
73 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
74
75 /* Some systems use __main in a way incompatible with its use in gcc, in these
76    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
77    give the same symbol without quotes for an alternative entry point.  You
78    must define both, or neither.  */
79 #ifndef NAME__MAIN
80 #define NAME__MAIN "__main"
81 #endif
82
83 /* Round a value to the lowest integer less than it that is a multiple of
84    the required alignment.  Avoid using division in case the value is
85    negative.  Assume the alignment is a power of two.  */
86 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
87
88 /* Similar, but round to the next highest integer that meets the
89    alignment.  */
90 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
91
92 /* Nonzero if function being compiled doesn't contain any calls
93    (ignoring the prologue and epilogue).  This is set prior to
94    local register allocation and is valid for the remaining
95    compiler passes.  */
96 int current_function_is_leaf;
97
98 /* Nonzero if function being compiled doesn't modify the stack pointer
99    (ignoring the prologue and epilogue).  This is only valid after
100    life_analysis has run.  */
101 int current_function_sp_is_unchanging;
102
103 /* Nonzero if the function being compiled is a leaf function which only
104    uses leaf registers.  This is valid after reload (specifically after
105    sched2) and is useful only if the port defines LEAF_REGISTERS.  */
106 int current_function_uses_only_leaf_regs;
107
108 /* Nonzero once virtual register instantiation has been done.
109    assign_stack_local uses frame_pointer_rtx when this is nonzero.
110    calls.c:emit_library_call_value_1 uses it to set up
111    post-instantiation libcalls.  */
112 int virtuals_instantiated;
113
114 /* Assign unique numbers to labels generated for profiling, debugging, etc.  */
115 static GTY(()) int funcdef_no;
116
117 /* These variables hold pointers to functions to create and destroy
118    target specific, per-function data structures.  */
119 struct machine_function * (*init_machine_status) (void);
120
121 /* The currently compiled function.  */
122 struct function *cfun = 0;
123
124 /* These arrays record the INSN_UIDs of the prologue and epilogue insns.  */
125 static GTY(()) varray_type prologue;
126 static GTY(()) varray_type epilogue;
127
128 /* Array of INSN_UIDs to hold the INSN_UIDs for each sibcall epilogue
129    in this function.  */
130 static GTY(()) varray_type sibcall_epilogue;
131 \f
132 /* In order to evaluate some expressions, such as function calls returning
133    structures in memory, we need to temporarily allocate stack locations.
134    We record each allocated temporary in the following structure.
135
136    Associated with each temporary slot is a nesting level.  When we pop up
137    one level, all temporaries associated with the previous level are freed.
138    Normally, all temporaries are freed after the execution of the statement
139    in which they were created.  However, if we are inside a ({...}) grouping,
140    the result may be in a temporary and hence must be preserved.  If the
141    result could be in a temporary, we preserve it if we can determine which
142    one it is in.  If we cannot determine which temporary may contain the
143    result, all temporaries are preserved.  A temporary is preserved by
144    pretending it was allocated at the previous nesting level.
145
146    Automatic variables are also assigned temporary slots, at the nesting
147    level where they are defined.  They are marked a "kept" so that
148    free_temp_slots will not free them.  */
149
150 struct temp_slot GTY(())
151 {
152   /* Points to next temporary slot.  */
153   struct temp_slot *next;
154   /* Points to previous temporary slot.  */
155   struct temp_slot *prev;
156
157   /* The rtx to used to reference the slot.  */
158   rtx slot;
159   /* The rtx used to represent the address if not the address of the
160      slot above.  May be an EXPR_LIST if multiple addresses exist.  */
161   rtx address;
162   /* The alignment (in bits) of the slot.  */
163   unsigned int align;
164   /* The size, in units, of the slot.  */
165   HOST_WIDE_INT size;
166   /* The type of the object in the slot, or zero if it doesn't correspond
167      to a type.  We use this to determine whether a slot can be reused.
168      It can be reused if objects of the type of the new slot will always
169      conflict with objects of the type of the old slot.  */
170   tree type;
171   /* Nonzero if this temporary is currently in use.  */
172   char in_use;
173   /* Nonzero if this temporary has its address taken.  */
174   char addr_taken;
175   /* Nesting level at which this slot is being used.  */
176   int level;
177   /* Nonzero if this should survive a call to free_temp_slots.  */
178   int keep;
179   /* The offset of the slot from the frame_pointer, including extra space
180      for alignment.  This info is for combine_temp_slots.  */
181   HOST_WIDE_INT base_offset;
182   /* The size of the slot, including extra space for alignment.  This
183      info is for combine_temp_slots.  */
184   HOST_WIDE_INT full_size;
185 };
186 \f
187 /* Forward declarations.  */
188
189 static rtx assign_stack_local_1 (enum machine_mode, HOST_WIDE_INT, int,
190                                  struct function *);
191 static struct temp_slot *find_temp_slot_from_address (rtx);
192 static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
193 static void pad_below (struct args_size *, enum machine_mode, tree);
194 static void reorder_blocks_1 (rtx, tree, VEC(tree,heap) **);
195 static void reorder_fix_fragments (tree);
196 static int all_blocks (tree, tree *);
197 static tree *get_block_vector (tree, int *);
198 extern tree debug_find_var_in_block_tree (tree, tree);
199 /* We always define `record_insns' even if it's not used so that we
200    can always export `prologue_epilogue_contains'.  */
201 static void record_insns (rtx, varray_type *) ATTRIBUTE_UNUSED;
202 static int contains (rtx, varray_type);
203 #ifdef HAVE_return
204 static void emit_return_into_block (basic_block, rtx);
205 #endif
206 #if defined(HAVE_epilogue) && defined(INCOMING_RETURN_ADDR_RTX)
207 static rtx keep_stack_depressed (rtx);
208 #endif
209 static void prepare_function_start (tree);
210 static void do_clobber_return_reg (rtx, void *);
211 static void do_use_return_reg (rtx, void *);
212 static void set_insn_locators (rtx, int) ATTRIBUTE_UNUSED;
213 \f
214 /* Pointer to chain of `struct function' for containing functions.  */
215 struct function *outer_function_chain;
216
217 /* Given a function decl for a containing function,
218    return the `struct function' for it.  */
219
220 struct function *
221 find_function_data (tree decl)
222 {
223   struct function *p;
224
225   for (p = outer_function_chain; p; p = p->outer)
226     if (p->decl == decl)
227       return p;
228
229   gcc_unreachable ();
230 }
231
232 /* Save the current context for compilation of a nested function.
233    This is called from language-specific code.  The caller should use
234    the enter_nested langhook to save any language-specific state,
235    since this function knows only about language-independent
236    variables.  */
237
238 void
239 push_function_context_to (tree context ATTRIBUTE_UNUSED)
240 {
241   struct function *p;
242
243   if (cfun == 0)
244     init_dummy_function_start ();
245   p = cfun;
246
247   p->outer = outer_function_chain;
248   outer_function_chain = p;
249
250   lang_hooks.function.enter_nested (p);
251
252   cfun = 0;
253 }
254
255 void
256 push_function_context (void)
257 {
258   push_function_context_to (current_function_decl);
259 }
260
261 /* Restore the last saved context, at the end of a nested function.
262    This function is called from language-specific code.  */
263
264 void
265 pop_function_context_from (tree context ATTRIBUTE_UNUSED)
266 {
267   struct function *p = outer_function_chain;
268
269   cfun = p;
270   outer_function_chain = p->outer;
271
272   current_function_decl = p->decl;
273
274   lang_hooks.function.leave_nested (p);
275
276   /* Reset variables that have known state during rtx generation.  */
277   virtuals_instantiated = 0;
278   generating_concat_p = 1;
279 }
280
281 void
282 pop_function_context (void)
283 {
284   pop_function_context_from (current_function_decl);
285 }
286
287 /* Clear out all parts of the state in F that can safely be discarded
288    after the function has been parsed, but not compiled, to let
289    garbage collection reclaim the memory.  */
290
291 void
292 free_after_parsing (struct function *f)
293 {
294   /* f->expr->forced_labels is used by code generation.  */
295   /* f->emit->regno_reg_rtx is used by code generation.  */
296   /* f->varasm is used by code generation.  */
297   /* f->eh->eh_return_stub_label is used by code generation.  */
298
299   lang_hooks.function.final (f);
300 }
301
302 /* Clear out all parts of the state in F that can safely be discarded
303    after the function has been compiled, to let garbage collection
304    reclaim the memory.  */
305
306 void
307 free_after_compilation (struct function *f)
308 {
309   f->eh = NULL;
310   f->expr = NULL;
311   f->emit = NULL;
312   f->varasm = NULL;
313   f->machine = NULL;
314   f->cfg = NULL;
315
316   f->x_avail_temp_slots = NULL;
317   f->x_used_temp_slots = NULL;
318   f->arg_offset_rtx = NULL;
319   f->return_rtx = NULL;
320   f->internal_arg_pointer = NULL;
321   f->x_nonlocal_goto_handler_labels = NULL;
322   f->x_return_label = NULL;
323   f->x_naked_return_label = NULL;
324   f->x_stack_slot_list = NULL;
325   f->x_tail_recursion_reentry = NULL;
326   f->x_arg_pointer_save_area = NULL;
327   f->x_parm_birth_insn = NULL;
328   f->original_arg_vector = NULL;
329   f->original_decl_initial = NULL;
330   f->epilogue_delay_list = NULL;
331 }
332 \f
333 /* Allocate fixed slots in the stack frame of the current function.  */
334
335 /* Return size needed for stack frame based on slots so far allocated in
336    function F.
337    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
338    the caller may have to do that.  */
339
340 static HOST_WIDE_INT
341 get_func_frame_size (struct function *f)
342 {
343 #ifdef FRAME_GROWS_DOWNWARD
344   return -f->x_frame_offset;
345 #else
346   return f->x_frame_offset;
347 #endif
348 }
349
350 /* Return size needed for stack frame based on slots so far allocated.
351    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
352    the caller may have to do that.  */
353 HOST_WIDE_INT
354 get_frame_size (void)
355 {
356   return get_func_frame_size (cfun);
357 }
358
359 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
360    with machine mode MODE.
361
362    ALIGN controls the amount of alignment for the address of the slot:
363    0 means according to MODE,
364    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
365    -2 means use BITS_PER_UNIT,
366    positive specifies alignment boundary in bits.
367
368    We do not round to stack_boundary here.
369
370    FUNCTION specifies the function to allocate in.  */
371
372 static rtx
373 assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
374                       struct function *function)
375 {
376   rtx x, addr;
377   int bigend_correction = 0;
378   unsigned int alignment;
379   int frame_off, frame_alignment, frame_phase;
380
381   if (align == 0)
382     {
383       tree type;
384
385       if (mode == BLKmode)
386         alignment = BIGGEST_ALIGNMENT;
387       else
388         alignment = GET_MODE_ALIGNMENT (mode);
389
390       /* Allow the target to (possibly) increase the alignment of this
391          stack slot.  */
392       type = lang_hooks.types.type_for_mode (mode, 0);
393       if (type)
394         alignment = LOCAL_ALIGNMENT (type, alignment);
395
396       alignment /= BITS_PER_UNIT;
397     }
398   else if (align == -1)
399     {
400       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
401       size = CEIL_ROUND (size, alignment);
402     }
403   else if (align == -2)
404     alignment = 1; /* BITS_PER_UNIT / BITS_PER_UNIT */
405   else
406     alignment = align / BITS_PER_UNIT;
407
408 #ifdef FRAME_GROWS_DOWNWARD
409   function->x_frame_offset -= size;
410 #endif
411
412   /* Ignore alignment we can't do with expected alignment of the boundary.  */
413   if (alignment * BITS_PER_UNIT > PREFERRED_STACK_BOUNDARY)
414     alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
415
416   if (function->stack_alignment_needed < alignment * BITS_PER_UNIT)
417     function->stack_alignment_needed = alignment * BITS_PER_UNIT;
418
419   /* Calculate how many bytes the start of local variables is off from
420      stack alignment.  */
421   frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
422   frame_off = STARTING_FRAME_OFFSET % frame_alignment;
423   frame_phase = frame_off ? frame_alignment - frame_off : 0;
424
425   /* Round the frame offset to the specified alignment.  The default is
426      to always honor requests to align the stack but a port may choose to
427      do its own stack alignment by defining STACK_ALIGNMENT_NEEDED.  */
428   if (STACK_ALIGNMENT_NEEDED
429       || mode != BLKmode
430       || size != 0)
431     {
432       /*  We must be careful here, since FRAME_OFFSET might be negative and
433           division with a negative dividend isn't as well defined as we might
434           like.  So we instead assume that ALIGNMENT is a power of two and
435           use logical operations which are unambiguous.  */
436 #ifdef FRAME_GROWS_DOWNWARD
437       function->x_frame_offset
438         = (FLOOR_ROUND (function->x_frame_offset - frame_phase,
439                         (unsigned HOST_WIDE_INT) alignment)
440            + frame_phase);
441 #else
442       function->x_frame_offset
443         = (CEIL_ROUND (function->x_frame_offset - frame_phase,
444                        (unsigned HOST_WIDE_INT) alignment)
445            + frame_phase);
446 #endif
447     }
448
449   /* On a big-endian machine, if we are allocating more space than we will use,
450      use the least significant bytes of those that are allocated.  */
451   if (BYTES_BIG_ENDIAN && mode != BLKmode)
452     bigend_correction = size - GET_MODE_SIZE (mode);
453
454   /* If we have already instantiated virtual registers, return the actual
455      address relative to the frame pointer.  */
456   if (function == cfun && virtuals_instantiated)
457     addr = plus_constant (frame_pointer_rtx,
458                           trunc_int_for_mode
459                           (frame_offset + bigend_correction
460                            + STARTING_FRAME_OFFSET, Pmode));
461   else
462     addr = plus_constant (virtual_stack_vars_rtx,
463                           trunc_int_for_mode
464                           (function->x_frame_offset + bigend_correction,
465                            Pmode));
466
467 #ifndef FRAME_GROWS_DOWNWARD
468   function->x_frame_offset += size;
469 #endif
470
471   x = gen_rtx_MEM (mode, addr);
472
473   function->x_stack_slot_list
474     = gen_rtx_EXPR_LIST (VOIDmode, x, function->x_stack_slot_list);
475
476   return x;
477 }
478
479 /* Wrapper around assign_stack_local_1;  assign a local stack slot for the
480    current function.  */
481
482 rtx
483 assign_stack_local (enum machine_mode mode, HOST_WIDE_INT size, int align)
484 {
485   return assign_stack_local_1 (mode, size, align, cfun);
486 }
487
488 \f
489 /* Removes temporary slot TEMP from LIST.  */
490
491 static void
492 cut_slot_from_list (struct temp_slot *temp, struct temp_slot **list)
493 {
494   if (temp->next)
495     temp->next->prev = temp->prev;
496   if (temp->prev)
497     temp->prev->next = temp->next;
498   else
499     *list = temp->next;
500
501   temp->prev = temp->next = NULL;
502 }
503
504 /* Inserts temporary slot TEMP to LIST.  */
505
506 static void
507 insert_slot_to_list (struct temp_slot *temp, struct temp_slot **list)
508 {
509   temp->next = *list;
510   if (*list)
511     (*list)->prev = temp;
512   temp->prev = NULL;
513   *list = temp;
514 }
515
516 /* Returns the list of used temp slots at LEVEL.  */
517
518 static struct temp_slot **
519 temp_slots_at_level (int level)
520 {
521
522   if (!used_temp_slots)
523     VARRAY_GENERIC_PTR_INIT (used_temp_slots, 3, "used_temp_slots");
524
525   while (level >= (int) VARRAY_ACTIVE_SIZE (used_temp_slots))
526     VARRAY_PUSH_GENERIC_PTR (used_temp_slots, NULL);
527
528   return (struct temp_slot **) &VARRAY_GENERIC_PTR (used_temp_slots, level);
529 }
530
531 /* Returns the maximal temporary slot level.  */
532
533 static int
534 max_slot_level (void)
535 {
536   if (!used_temp_slots)
537     return -1;
538
539   return VARRAY_ACTIVE_SIZE (used_temp_slots) - 1;
540 }
541
542 /* Moves temporary slot TEMP to LEVEL.  */
543
544 static void
545 move_slot_to_level (struct temp_slot *temp, int level)
546 {
547   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
548   insert_slot_to_list (temp, temp_slots_at_level (level));
549   temp->level = level;
550 }
551
552 /* Make temporary slot TEMP available.  */
553
554 static void
555 make_slot_available (struct temp_slot *temp)
556 {
557   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
558   insert_slot_to_list (temp, &avail_temp_slots);
559   temp->in_use = 0;
560   temp->level = -1;
561 }
562 \f
563 /* Allocate a temporary stack slot and record it for possible later
564    reuse.
565
566    MODE is the machine mode to be given to the returned rtx.
567
568    SIZE is the size in units of the space required.  We do no rounding here
569    since assign_stack_local will do any required rounding.
570
571    KEEP is 1 if this slot is to be retained after a call to
572    free_temp_slots.  Automatic variables for a block are allocated
573    with this flag.  KEEP values of 2 or 3 were needed respectively
574    for variables whose lifetime is controlled by CLEANUP_POINT_EXPRs
575    or for SAVE_EXPRs, but they are now unused.
576
577    TYPE is the type that will be used for the stack slot.  */
578
579 rtx
580 assign_stack_temp_for_type (enum machine_mode mode, HOST_WIDE_INT size,
581                             int keep, tree type)
582 {
583   unsigned int align;
584   struct temp_slot *p, *best_p = 0, *selected = NULL, **pp;
585   rtx slot;
586
587   /* If SIZE is -1 it means that somebody tried to allocate a temporary
588      of a variable size.  */
589   gcc_assert (size != -1);
590
591   /* These are now unused.  */
592   gcc_assert (keep <= 1);
593
594   if (mode == BLKmode)
595     align = BIGGEST_ALIGNMENT;
596   else
597     align = GET_MODE_ALIGNMENT (mode);
598
599   if (! type)
600     type = lang_hooks.types.type_for_mode (mode, 0);
601
602   if (type)
603     align = LOCAL_ALIGNMENT (type, align);
604
605   /* Try to find an available, already-allocated temporary of the proper
606      mode which meets the size and alignment requirements.  Choose the
607      smallest one with the closest alignment.  */
608   for (p = avail_temp_slots; p; p = p->next)
609     {
610       if (p->align >= align && p->size >= size && GET_MODE (p->slot) == mode
611           && objects_must_conflict_p (p->type, type)
612           && (best_p == 0 || best_p->size > p->size
613               || (best_p->size == p->size && best_p->align > p->align)))
614         {
615           if (p->align == align && p->size == size)
616             {
617               selected = p;
618               cut_slot_from_list (selected, &avail_temp_slots);
619               best_p = 0;
620               break;
621             }
622           best_p = p;
623         }
624     }
625
626   /* Make our best, if any, the one to use.  */
627   if (best_p)
628     {
629       selected = best_p;
630       cut_slot_from_list (selected, &avail_temp_slots);
631
632       /* If there are enough aligned bytes left over, make them into a new
633          temp_slot so that the extra bytes don't get wasted.  Do this only
634          for BLKmode slots, so that we can be sure of the alignment.  */
635       if (GET_MODE (best_p->slot) == BLKmode)
636         {
637           int alignment = best_p->align / BITS_PER_UNIT;
638           HOST_WIDE_INT rounded_size = CEIL_ROUND (size, alignment);
639
640           if (best_p->size - rounded_size >= alignment)
641             {
642               p = ggc_alloc (sizeof (struct temp_slot));
643               p->in_use = p->addr_taken = 0;
644               p->size = best_p->size - rounded_size;
645               p->base_offset = best_p->base_offset + rounded_size;
646               p->full_size = best_p->full_size - rounded_size;
647               p->slot = gen_rtx_MEM (BLKmode,
648                                      plus_constant (XEXP (best_p->slot, 0),
649                                                     rounded_size));
650               p->align = best_p->align;
651               p->address = 0;
652               p->type = best_p->type;
653               insert_slot_to_list (p, &avail_temp_slots);
654
655               stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, p->slot,
656                                                    stack_slot_list);
657
658               best_p->size = rounded_size;
659               best_p->full_size = rounded_size;
660             }
661         }
662     }
663
664   /* If we still didn't find one, make a new temporary.  */
665   if (selected == 0)
666     {
667       HOST_WIDE_INT frame_offset_old = frame_offset;
668
669       p = ggc_alloc (sizeof (struct temp_slot));
670
671       /* We are passing an explicit alignment request to assign_stack_local.
672          One side effect of that is assign_stack_local will not round SIZE
673          to ensure the frame offset remains suitably aligned.
674
675          So for requests which depended on the rounding of SIZE, we go ahead
676          and round it now.  We also make sure ALIGNMENT is at least
677          BIGGEST_ALIGNMENT.  */
678       gcc_assert (mode != BLKmode || align == BIGGEST_ALIGNMENT);
679       p->slot = assign_stack_local (mode,
680                                     (mode == BLKmode
681                                      ? CEIL_ROUND (size, (int) align / BITS_PER_UNIT)
682                                      : size),
683                                     align);
684
685       p->align = align;
686
687       /* The following slot size computation is necessary because we don't
688          know the actual size of the temporary slot until assign_stack_local
689          has performed all the frame alignment and size rounding for the
690          requested temporary.  Note that extra space added for alignment
691          can be either above or below this stack slot depending on which
692          way the frame grows.  We include the extra space if and only if it
693          is above this slot.  */
694 #ifdef FRAME_GROWS_DOWNWARD
695       p->size = frame_offset_old - frame_offset;
696 #else
697       p->size = size;
698 #endif
699
700       /* Now define the fields used by combine_temp_slots.  */
701 #ifdef FRAME_GROWS_DOWNWARD
702       p->base_offset = frame_offset;
703       p->full_size = frame_offset_old - frame_offset;
704 #else
705       p->base_offset = frame_offset_old;
706       p->full_size = frame_offset - frame_offset_old;
707 #endif
708       p->address = 0;
709
710       selected = p;
711     }
712
713   p = selected;
714   p->in_use = 1;
715   p->addr_taken = 0;
716   p->type = type;
717   p->level = temp_slot_level;
718   p->keep = keep;
719
720   pp = temp_slots_at_level (p->level);
721   insert_slot_to_list (p, pp);
722
723   /* Create a new MEM rtx to avoid clobbering MEM flags of old slots.  */
724   slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
725   stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
726
727   /* If we know the alias set for the memory that will be used, use
728      it.  If there's no TYPE, then we don't know anything about the
729      alias set for the memory.  */
730   set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
731   set_mem_align (slot, align);
732
733   /* If a type is specified, set the relevant flags.  */
734   if (type != 0)
735     {
736       MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
737       MEM_SET_IN_STRUCT_P (slot, AGGREGATE_TYPE_P (type));
738     }
739
740   return slot;
741 }
742
743 /* Allocate a temporary stack slot and record it for possible later
744    reuse.  First three arguments are same as in preceding function.  */
745
746 rtx
747 assign_stack_temp (enum machine_mode mode, HOST_WIDE_INT size, int keep)
748 {
749   return assign_stack_temp_for_type (mode, size, keep, NULL_TREE);
750 }
751 \f
752 /* Assign a temporary.
753    If TYPE_OR_DECL is a decl, then we are doing it on behalf of the decl
754    and so that should be used in error messages.  In either case, we
755    allocate of the given type.
756    KEEP is as for assign_stack_temp.
757    MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
758    it is 0 if a register is OK.
759    DONT_PROMOTE is 1 if we should not promote values in register
760    to wider modes.  */
761
762 rtx
763 assign_temp (tree type_or_decl, int keep, int memory_required,
764              int dont_promote ATTRIBUTE_UNUSED)
765 {
766   tree type, decl;
767   enum machine_mode mode;
768 #ifdef PROMOTE_MODE
769   int unsignedp;
770 #endif
771
772   if (DECL_P (type_or_decl))
773     decl = type_or_decl, type = TREE_TYPE (decl);
774   else
775     decl = NULL, type = type_or_decl;
776
777   mode = TYPE_MODE (type);
778 #ifdef PROMOTE_MODE
779   unsignedp = TYPE_UNSIGNED (type);
780 #endif
781
782   if (mode == BLKmode || memory_required)
783     {
784       HOST_WIDE_INT size = int_size_in_bytes (type);
785       tree size_tree;
786       rtx tmp;
787
788       /* Zero sized arrays are GNU C extension.  Set size to 1 to avoid
789          problems with allocating the stack space.  */
790       if (size == 0)
791         size = 1;
792
793       /* Unfortunately, we don't yet know how to allocate variable-sized
794          temporaries.  However, sometimes we have a fixed upper limit on
795          the size (which is stored in TYPE_ARRAY_MAX_SIZE) and can use that
796          instead.  This is the case for Chill variable-sized strings.  */
797       if (size == -1 && TREE_CODE (type) == ARRAY_TYPE
798           && TYPE_ARRAY_MAX_SIZE (type) != NULL_TREE
799           && host_integerp (TYPE_ARRAY_MAX_SIZE (type), 1))
800         size = tree_low_cst (TYPE_ARRAY_MAX_SIZE (type), 1);
801
802       /* If we still haven't been able to get a size, see if the language
803          can compute a maximum size.  */
804       if (size == -1
805           && (size_tree = lang_hooks.types.max_size (type)) != 0
806           && host_integerp (size_tree, 1))
807         size = tree_low_cst (size_tree, 1);
808
809       /* The size of the temporary may be too large to fit into an integer.  */
810       /* ??? Not sure this should happen except for user silliness, so limit
811          this to things that aren't compiler-generated temporaries.  The
812          rest of the time we'll die in assign_stack_temp_for_type.  */
813       if (decl && size == -1
814           && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST)
815         {
816           error ("%Jsize of variable %qD is too large", decl, decl);
817           size = 1;
818         }
819
820       tmp = assign_stack_temp_for_type (mode, size, keep, type);
821       return tmp;
822     }
823
824 #ifdef PROMOTE_MODE
825   if (! dont_promote)
826     mode = promote_mode (type, mode, &unsignedp, 0);
827 #endif
828
829   return gen_reg_rtx (mode);
830 }
831 \f
832 /* Combine temporary stack slots which are adjacent on the stack.
833
834    This allows for better use of already allocated stack space.  This is only
835    done for BLKmode slots because we can be sure that we won't have alignment
836    problems in this case.  */
837
838 static void
839 combine_temp_slots (void)
840 {
841   struct temp_slot *p, *q, *next, *next_q;
842   int num_slots;
843
844   /* We can't combine slots, because the information about which slot
845      is in which alias set will be lost.  */
846   if (flag_strict_aliasing)
847     return;
848
849   /* If there are a lot of temp slots, don't do anything unless
850      high levels of optimization.  */
851   if (! flag_expensive_optimizations)
852     for (p = avail_temp_slots, num_slots = 0; p; p = p->next, num_slots++)
853       if (num_slots > 100 || (num_slots > 10 && optimize == 0))
854         return;
855
856   for (p = avail_temp_slots; p; p = next)
857     {
858       int delete_p = 0;
859
860       next = p->next;
861
862       if (GET_MODE (p->slot) != BLKmode)
863         continue;
864
865       for (q = p->next; q; q = next_q)
866         {
867           int delete_q = 0;
868
869           next_q = q->next;
870
871           if (GET_MODE (q->slot) != BLKmode)
872             continue;
873
874           if (p->base_offset + p->full_size == q->base_offset)
875             {
876               /* Q comes after P; combine Q into P.  */
877               p->size += q->size;
878               p->full_size += q->full_size;
879               delete_q = 1;
880             }
881           else if (q->base_offset + q->full_size == p->base_offset)
882             {
883               /* P comes after Q; combine P into Q.  */
884               q->size += p->size;
885               q->full_size += p->full_size;
886               delete_p = 1;
887               break;
888             }
889           if (delete_q)
890             cut_slot_from_list (q, &avail_temp_slots);
891         }
892
893       /* Either delete P or advance past it.  */
894       if (delete_p)
895         cut_slot_from_list (p, &avail_temp_slots);
896     }
897 }
898 \f
899 /* Find the temp slot corresponding to the object at address X.  */
900
901 static struct temp_slot *
902 find_temp_slot_from_address (rtx x)
903 {
904   struct temp_slot *p;
905   rtx next;
906   int i;
907
908   for (i = max_slot_level (); i >= 0; i--)
909     for (p = *temp_slots_at_level (i); p; p = p->next)
910       {
911         if (XEXP (p->slot, 0) == x
912             || p->address == x
913             || (GET_CODE (x) == PLUS
914                 && XEXP (x, 0) == virtual_stack_vars_rtx
915                 && GET_CODE (XEXP (x, 1)) == CONST_INT
916                 && INTVAL (XEXP (x, 1)) >= p->base_offset
917                 && INTVAL (XEXP (x, 1)) < p->base_offset + p->full_size))
918           return p;
919
920         else if (p->address != 0 && GET_CODE (p->address) == EXPR_LIST)
921           for (next = p->address; next; next = XEXP (next, 1))
922             if (XEXP (next, 0) == x)
923               return p;
924       }
925
926   /* If we have a sum involving a register, see if it points to a temp
927      slot.  */
928   if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
929       && (p = find_temp_slot_from_address (XEXP (x, 0))) != 0)
930     return p;
931   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 1))
932            && (p = find_temp_slot_from_address (XEXP (x, 1))) != 0)
933     return p;
934
935   return 0;
936 }
937
938 /* Indicate that NEW is an alternate way of referring to the temp slot
939    that previously was known by OLD.  */
940
941 void
942 update_temp_slot_address (rtx old, rtx new)
943 {
944   struct temp_slot *p;
945
946   if (rtx_equal_p (old, new))
947     return;
948
949   p = find_temp_slot_from_address (old);
950
951   /* If we didn't find one, see if both OLD is a PLUS.  If so, and NEW
952      is a register, see if one operand of the PLUS is a temporary
953      location.  If so, NEW points into it.  Otherwise, if both OLD and
954      NEW are a PLUS and if there is a register in common between them.
955      If so, try a recursive call on those values.  */
956   if (p == 0)
957     {
958       if (GET_CODE (old) != PLUS)
959         return;
960
961       if (REG_P (new))
962         {
963           update_temp_slot_address (XEXP (old, 0), new);
964           update_temp_slot_address (XEXP (old, 1), new);
965           return;
966         }
967       else if (GET_CODE (new) != PLUS)
968         return;
969
970       if (rtx_equal_p (XEXP (old, 0), XEXP (new, 0)))
971         update_temp_slot_address (XEXP (old, 1), XEXP (new, 1));
972       else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 0)))
973         update_temp_slot_address (XEXP (old, 0), XEXP (new, 1));
974       else if (rtx_equal_p (XEXP (old, 0), XEXP (new, 1)))
975         update_temp_slot_address (XEXP (old, 1), XEXP (new, 0));
976       else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 1)))
977         update_temp_slot_address (XEXP (old, 0), XEXP (new, 0));
978
979       return;
980     }
981
982   /* Otherwise add an alias for the temp's address.  */
983   else if (p->address == 0)
984     p->address = new;
985   else
986     {
987       if (GET_CODE (p->address) != EXPR_LIST)
988         p->address = gen_rtx_EXPR_LIST (VOIDmode, p->address, NULL_RTX);
989
990       p->address = gen_rtx_EXPR_LIST (VOIDmode, new, p->address);
991     }
992 }
993
994 /* If X could be a reference to a temporary slot, mark the fact that its
995    address was taken.  */
996
997 void
998 mark_temp_addr_taken (rtx x)
999 {
1000   struct temp_slot *p;
1001
1002   if (x == 0)
1003     return;
1004
1005   /* If X is not in memory or is at a constant address, it cannot be in
1006      a temporary slot.  */
1007   if (!MEM_P (x) || CONSTANT_P (XEXP (x, 0)))
1008     return;
1009
1010   p = find_temp_slot_from_address (XEXP (x, 0));
1011   if (p != 0)
1012     p->addr_taken = 1;
1013 }
1014
1015 /* If X could be a reference to a temporary slot, mark that slot as
1016    belonging to the to one level higher than the current level.  If X
1017    matched one of our slots, just mark that one.  Otherwise, we can't
1018    easily predict which it is, so upgrade all of them.  Kept slots
1019    need not be touched.
1020
1021    This is called when an ({...}) construct occurs and a statement
1022    returns a value in memory.  */
1023
1024 void
1025 preserve_temp_slots (rtx x)
1026 {
1027   struct temp_slot *p = 0, *next;
1028
1029   /* If there is no result, we still might have some objects whose address
1030      were taken, so we need to make sure they stay around.  */
1031   if (x == 0)
1032     {
1033       for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1034         {
1035           next = p->next;
1036
1037           if (p->addr_taken)
1038             move_slot_to_level (p, temp_slot_level - 1);
1039         }
1040
1041       return;
1042     }
1043
1044   /* If X is a register that is being used as a pointer, see if we have
1045      a temporary slot we know it points to.  To be consistent with
1046      the code below, we really should preserve all non-kept slots
1047      if we can't find a match, but that seems to be much too costly.  */
1048   if (REG_P (x) && REG_POINTER (x))
1049     p = find_temp_slot_from_address (x);
1050
1051   /* If X is not in memory or is at a constant address, it cannot be in
1052      a temporary slot, but it can contain something whose address was
1053      taken.  */
1054   if (p == 0 && (!MEM_P (x) || CONSTANT_P (XEXP (x, 0))))
1055     {
1056       for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1057         {
1058           next = p->next;
1059
1060           if (p->addr_taken)
1061             move_slot_to_level (p, temp_slot_level - 1);
1062         }
1063
1064       return;
1065     }
1066
1067   /* First see if we can find a match.  */
1068   if (p == 0)
1069     p = find_temp_slot_from_address (XEXP (x, 0));
1070
1071   if (p != 0)
1072     {
1073       /* Move everything at our level whose address was taken to our new
1074          level in case we used its address.  */
1075       struct temp_slot *q;
1076
1077       if (p->level == temp_slot_level)
1078         {
1079           for (q = *temp_slots_at_level (temp_slot_level); q; q = next)
1080             {
1081               next = q->next;
1082
1083               if (p != q && q->addr_taken)
1084                 move_slot_to_level (q, temp_slot_level - 1);
1085             }
1086
1087           move_slot_to_level (p, temp_slot_level - 1);
1088           p->addr_taken = 0;
1089         }
1090       return;
1091     }
1092
1093   /* Otherwise, preserve all non-kept slots at this level.  */
1094   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1095     {
1096       next = p->next;
1097
1098       if (!p->keep)
1099         move_slot_to_level (p, temp_slot_level - 1);
1100     }
1101 }
1102
1103 /* Free all temporaries used so far.  This is normally called at the
1104    end of generating code for a statement.  */
1105
1106 void
1107 free_temp_slots (void)
1108 {
1109   struct temp_slot *p, *next;
1110
1111   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1112     {
1113       next = p->next;
1114
1115       if (!p->keep)
1116         make_slot_available (p);
1117     }
1118
1119   combine_temp_slots ();
1120 }
1121
1122 /* Push deeper into the nesting level for stack temporaries.  */
1123
1124 void
1125 push_temp_slots (void)
1126 {
1127   temp_slot_level++;
1128 }
1129
1130 /* Pop a temporary nesting level.  All slots in use in the current level
1131    are freed.  */
1132
1133 void
1134 pop_temp_slots (void)
1135 {
1136   struct temp_slot *p, *next;
1137
1138   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1139     {
1140       next = p->next;
1141       make_slot_available (p);
1142     }
1143
1144   combine_temp_slots ();
1145
1146   temp_slot_level--;
1147 }
1148
1149 /* Initialize temporary slots.  */
1150
1151 void
1152 init_temp_slots (void)
1153 {
1154   /* We have not allocated any temporaries yet.  */
1155   avail_temp_slots = 0;
1156   used_temp_slots = 0;
1157   temp_slot_level = 0;
1158 }
1159 \f
1160 /* These routines are responsible for converting virtual register references
1161    to the actual hard register references once RTL generation is complete.
1162
1163    The following four variables are used for communication between the
1164    routines.  They contain the offsets of the virtual registers from their
1165    respective hard registers.  */
1166
1167 static int in_arg_offset;
1168 static int var_offset;
1169 static int dynamic_offset;
1170 static int out_arg_offset;
1171 static int cfa_offset;
1172
1173 /* In most machines, the stack pointer register is equivalent to the bottom
1174    of the stack.  */
1175
1176 #ifndef STACK_POINTER_OFFSET
1177 #define STACK_POINTER_OFFSET    0
1178 #endif
1179
1180 /* If not defined, pick an appropriate default for the offset of dynamically
1181    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1182    REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
1183
1184 #ifndef STACK_DYNAMIC_OFFSET
1185
1186 /* The bottom of the stack points to the actual arguments.  If
1187    REG_PARM_STACK_SPACE is defined, this includes the space for the register
1188    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
1189    stack space for register parameters is not pushed by the caller, but
1190    rather part of the fixed stack areas and hence not included in
1191    `current_function_outgoing_args_size'.  Nevertheless, we must allow
1192    for it when allocating stack dynamic objects.  */
1193
1194 #if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
1195 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1196 ((ACCUMULATE_OUTGOING_ARGS                                                    \
1197   ? (current_function_outgoing_args_size + REG_PARM_STACK_SPACE (FNDECL)) : 0)\
1198  + (STACK_POINTER_OFFSET))                                                    \
1199
1200 #else
1201 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1202 ((ACCUMULATE_OUTGOING_ARGS ? current_function_outgoing_args_size : 0)         \
1203  + (STACK_POINTER_OFFSET))
1204 #endif
1205 #endif
1206
1207 /* On most machines, the CFA coincides with the first incoming parm.  */
1208
1209 #ifndef ARG_POINTER_CFA_OFFSET
1210 #define ARG_POINTER_CFA_OFFSET(FNDECL) FIRST_PARM_OFFSET (FNDECL)
1211 #endif
1212
1213 \f
1214 /* Given a piece of RTX and a pointer to a HOST_WIDE_INT, if the RTX
1215    is a virtual register, return the equivalent hard register and set the
1216    offset indirectly through the pointer.  Otherwise, return 0.  */
1217
1218 static rtx
1219 instantiate_new_reg (rtx x, HOST_WIDE_INT *poffset)
1220 {
1221   rtx new;
1222   HOST_WIDE_INT offset;
1223
1224   if (x == virtual_incoming_args_rtx)
1225     new = arg_pointer_rtx, offset = in_arg_offset;
1226   else if (x == virtual_stack_vars_rtx)
1227     new = frame_pointer_rtx, offset = var_offset;
1228   else if (x == virtual_stack_dynamic_rtx)
1229     new = stack_pointer_rtx, offset = dynamic_offset;
1230   else if (x == virtual_outgoing_args_rtx)
1231     new = stack_pointer_rtx, offset = out_arg_offset;
1232   else if (x == virtual_cfa_rtx)
1233     new = arg_pointer_rtx, offset = cfa_offset;
1234   else
1235     return NULL_RTX;
1236
1237   *poffset = offset;
1238   return new;
1239 }
1240
1241 /* A subroutine of instantiate_virtual_regs, called via for_each_rtx.
1242    Instantiate any virtual registers present inside of *LOC.  The expression
1243    is simplified, as much as possible, but is not to be considered "valid"
1244    in any sense implied by the target.  If any change is made, set CHANGED
1245    to true.  */
1246
1247 static int
1248 instantiate_virtual_regs_in_rtx (rtx *loc, void *data)
1249 {
1250   HOST_WIDE_INT offset;
1251   bool *changed = (bool *) data;
1252   rtx x, new;
1253
1254   x = *loc;
1255   if (x == 0)
1256     return 0;
1257
1258   switch (GET_CODE (x))
1259     {
1260     case REG:
1261       new = instantiate_new_reg (x, &offset);
1262       if (new)
1263         {
1264           *loc = plus_constant (new, offset);
1265           if (changed)
1266             *changed = true;
1267         }
1268       return -1;
1269
1270     case PLUS:
1271       new = instantiate_new_reg (XEXP (x, 0), &offset);
1272       if (new)
1273         {
1274           new = plus_constant (new, offset);
1275           *loc = simplify_gen_binary (PLUS, GET_MODE (x), new, XEXP (x, 1));
1276           if (changed)
1277             *changed = true;
1278           return -1;
1279         }
1280
1281       /* FIXME -- from old code */
1282           /* If we have (plus (subreg (virtual-reg)) (const_int)), we know
1283              we can commute the PLUS and SUBREG because pointers into the
1284              frame are well-behaved.  */
1285       break;
1286
1287     default:
1288       break;
1289     }
1290
1291   return 0;
1292 }
1293
1294 /* A subroutine of instantiate_virtual_regs_in_insn.  Return true if X
1295    matches the predicate for insn CODE operand OPERAND.  */
1296
1297 static int
1298 safe_insn_predicate (int code, int operand, rtx x)
1299 {
1300   const struct insn_operand_data *op_data;
1301
1302   if (code < 0)
1303     return true;
1304
1305   op_data = &insn_data[code].operand[operand];
1306   if (op_data->predicate == NULL)
1307     return true;
1308
1309   return op_data->predicate (x, op_data->mode);
1310 }
1311
1312 /* A subroutine of instantiate_virtual_regs.  Instantiate any virtual
1313    registers present inside of insn.  The result will be a valid insn.  */
1314
1315 static void
1316 instantiate_virtual_regs_in_insn (rtx insn)
1317 {
1318   HOST_WIDE_INT offset;
1319   int insn_code, i;
1320   bool any_change = false;
1321   rtx set, new, x, seq;
1322
1323   /* There are some special cases to be handled first.  */
1324   set = single_set (insn);
1325   if (set)
1326     {
1327       /* We're allowed to assign to a virtual register.  This is interpreted
1328          to mean that the underlying register gets assigned the inverse
1329          transformation.  This is used, for example, in the handling of
1330          non-local gotos.  */
1331       new = instantiate_new_reg (SET_DEST (set), &offset);
1332       if (new)
1333         {
1334           start_sequence ();
1335
1336           for_each_rtx (&SET_SRC (set), instantiate_virtual_regs_in_rtx, NULL);
1337           x = simplify_gen_binary (PLUS, GET_MODE (new), SET_SRC (set),
1338                                    GEN_INT (-offset));
1339           x = force_operand (x, new);
1340           if (x != new)
1341             emit_move_insn (new, x);
1342
1343           seq = get_insns ();
1344           end_sequence ();
1345
1346           emit_insn_before (seq, insn);
1347           delete_insn (insn);
1348           return;
1349         }
1350
1351       /* Handle a straight copy from a virtual register by generating a
1352          new add insn.  The difference between this and falling through
1353          to the generic case is avoiding a new pseudo and eliminating a
1354          move insn in the initial rtl stream.  */
1355       new = instantiate_new_reg (SET_SRC (set), &offset);
1356       if (new && offset != 0
1357           && REG_P (SET_DEST (set))
1358           && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1359         {
1360           start_sequence ();
1361
1362           x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS,
1363                                    new, GEN_INT (offset), SET_DEST (set),
1364                                    1, OPTAB_LIB_WIDEN);
1365           if (x != SET_DEST (set))
1366             emit_move_insn (SET_DEST (set), x);
1367
1368           seq = get_insns ();
1369           end_sequence ();
1370
1371           emit_insn_before (seq, insn);
1372           delete_insn (insn);
1373           return;
1374         }
1375
1376       extract_insn (insn);
1377       insn_code = INSN_CODE (insn);
1378
1379       /* Handle a plus involving a virtual register by determining if the
1380          operands remain valid if they're modified in place.  */
1381       if (GET_CODE (SET_SRC (set)) == PLUS
1382           && recog_data.n_operands >= 3
1383           && recog_data.operand_loc[1] == &XEXP (SET_SRC (set), 0)
1384           && recog_data.operand_loc[2] == &XEXP (SET_SRC (set), 1)
1385           && GET_CODE (recog_data.operand[2]) == CONST_INT
1386           && (new = instantiate_new_reg (recog_data.operand[1], &offset)))
1387         {
1388           offset += INTVAL (recog_data.operand[2]);
1389
1390           /* If the sum is zero, then replace with a plain move.  */
1391           if (offset == 0
1392               && REG_P (SET_DEST (set))
1393               && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1394             {
1395               start_sequence ();
1396               emit_move_insn (SET_DEST (set), new);
1397               seq = get_insns ();
1398               end_sequence ();
1399
1400               emit_insn_before (seq, insn);
1401               delete_insn (insn);
1402               return;
1403             }
1404
1405           x = gen_int_mode (offset, recog_data.operand_mode[2]);
1406
1407           /* Using validate_change and apply_change_group here leaves
1408              recog_data in an invalid state.  Since we know exactly what
1409              we want to check, do those two by hand.  */
1410           if (safe_insn_predicate (insn_code, 1, new)
1411               && safe_insn_predicate (insn_code, 2, x))
1412             {
1413               *recog_data.operand_loc[1] = recog_data.operand[1] = new;
1414               *recog_data.operand_loc[2] = recog_data.operand[2] = x;
1415               any_change = true;
1416
1417               /* Fall through into the regular operand fixup loop in
1418                  order to take care of operands other than 1 and 2.  */
1419             }
1420         }
1421     }
1422   else
1423     {
1424       extract_insn (insn);
1425       insn_code = INSN_CODE (insn);
1426     }
1427
1428   /* In the general case, we expect virtual registers to appear only in
1429      operands, and then only as either bare registers or inside memories.  */
1430   for (i = 0; i < recog_data.n_operands; ++i)
1431     {
1432       x = recog_data.operand[i];
1433       switch (GET_CODE (x))
1434         {
1435         case MEM:
1436           {
1437             rtx addr = XEXP (x, 0);
1438             bool changed = false;
1439
1440             for_each_rtx (&addr, instantiate_virtual_regs_in_rtx, &changed);
1441             if (!changed)
1442               continue;
1443
1444             start_sequence ();
1445             x = replace_equiv_address (x, addr);
1446             seq = get_insns ();
1447             end_sequence ();
1448             if (seq)
1449               emit_insn_before (seq, insn);
1450           }
1451           break;
1452
1453         case REG:
1454           new = instantiate_new_reg (x, &offset);
1455           if (new == NULL)
1456             continue;
1457           if (offset == 0)
1458             x = new;
1459           else
1460             {
1461               start_sequence ();
1462
1463               /* Careful, special mode predicates may have stuff in
1464                  insn_data[insn_code].operand[i].mode that isn't useful
1465                  to us for computing a new value.  */
1466               /* ??? Recognize address_operand and/or "p" constraints
1467                  to see if (plus new offset) is a valid before we put
1468                  this through expand_simple_binop.  */
1469               x = expand_simple_binop (GET_MODE (x), PLUS, new,
1470                                        GEN_INT (offset), NULL_RTX,
1471                                        1, OPTAB_LIB_WIDEN);
1472               seq = get_insns ();
1473               end_sequence ();
1474               emit_insn_before (seq, insn);
1475             }
1476           break;
1477
1478         case SUBREG:
1479           new = instantiate_new_reg (SUBREG_REG (x), &offset);
1480           if (new == NULL)
1481             continue;
1482           if (offset != 0)
1483             {
1484               start_sequence ();
1485               new = expand_simple_binop (GET_MODE (new), PLUS, new,
1486                                          GEN_INT (offset), NULL_RTX,
1487                                          1, OPTAB_LIB_WIDEN);
1488               seq = get_insns ();
1489               end_sequence ();
1490               emit_insn_before (seq, insn);
1491             }
1492           x = simplify_gen_subreg (recog_data.operand_mode[i], new,
1493                                    GET_MODE (new), SUBREG_BYTE (x));
1494           break;
1495
1496         default:
1497           continue;
1498         }
1499
1500       /* At this point, X contains the new value for the operand.
1501          Validate the new value vs the insn predicate.  Note that
1502          asm insns will have insn_code -1 here.  */
1503       if (!safe_insn_predicate (insn_code, i, x))
1504         x = force_reg (insn_data[insn_code].operand[i].mode, x);
1505
1506       *recog_data.operand_loc[i] = recog_data.operand[i] = x;
1507       any_change = true;
1508     }
1509
1510   if (any_change)
1511     {
1512       /* Propagate operand changes into the duplicates.  */
1513       for (i = 0; i < recog_data.n_dups; ++i)
1514         *recog_data.dup_loc[i]
1515           = recog_data.operand[(unsigned)recog_data.dup_num[i]];
1516
1517       /* Force re-recognition of the instruction for validation.  */
1518       INSN_CODE (insn) = -1;
1519     }
1520
1521   if (asm_noperands (PATTERN (insn)) >= 0)
1522     {
1523       if (!check_asm_operands (PATTERN (insn)))
1524         {
1525           error_for_asm (insn, "impossible constraint in %<asm%>");
1526           delete_insn (insn);
1527         }
1528     }
1529   else
1530     {
1531       if (recog_memoized (insn) < 0)
1532         fatal_insn_not_found (insn);
1533     }
1534 }
1535
1536 /* Subroutine of instantiate_decls.  Given RTL representing a decl,
1537    do any instantiation required.  */
1538
1539 static void
1540 instantiate_decl (rtx x)
1541 {
1542   rtx addr;
1543
1544   if (x == 0)
1545     return;
1546
1547   /* If this is a CONCAT, recurse for the pieces.  */
1548   if (GET_CODE (x) == CONCAT)
1549     {
1550       instantiate_decl (XEXP (x, 0));
1551       instantiate_decl (XEXP (x, 1));
1552       return;
1553     }
1554
1555   /* If this is not a MEM, no need to do anything.  Similarly if the
1556      address is a constant or a register that is not a virtual register.  */
1557   if (!MEM_P (x))
1558     return;
1559
1560   addr = XEXP (x, 0);
1561   if (CONSTANT_P (addr)
1562       || (REG_P (addr)
1563           && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
1564               || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
1565     return;
1566
1567   for_each_rtx (&XEXP (x, 0), instantiate_virtual_regs_in_rtx, NULL);
1568 }
1569
1570 /* Subroutine of instantiate_decls: Process all decls in the given
1571    BLOCK node and all its subblocks.  */
1572
1573 static void
1574 instantiate_decls_1 (tree let)
1575 {
1576   tree t;
1577
1578   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
1579     if (DECL_RTL_SET_P (t))
1580       instantiate_decl (DECL_RTL (t));
1581
1582   /* Process all subblocks.  */
1583   for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
1584     instantiate_decls_1 (t);
1585 }
1586
1587 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1588    all virtual registers in their DECL_RTL's.  */
1589
1590 static void
1591 instantiate_decls (tree fndecl)
1592 {
1593   tree decl;
1594
1595   /* Process all parameters of the function.  */
1596   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
1597     {
1598       instantiate_decl (DECL_RTL (decl));
1599       instantiate_decl (DECL_INCOMING_RTL (decl));
1600     }
1601
1602   /* Now process all variables defined in the function or its subblocks.  */
1603   instantiate_decls_1 (DECL_INITIAL (fndecl));
1604 }
1605
1606 /* Pass through the INSNS of function FNDECL and convert virtual register
1607    references to hard register references.  */
1608
1609 void
1610 instantiate_virtual_regs (void)
1611 {
1612   rtx insn;
1613
1614   /* Compute the offsets to use for this function.  */
1615   in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
1616   var_offset = STARTING_FRAME_OFFSET;
1617   dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
1618   out_arg_offset = STACK_POINTER_OFFSET;
1619   cfa_offset = ARG_POINTER_CFA_OFFSET (current_function_decl);
1620
1621   /* Initialize recognition, indicating that volatile is OK.  */
1622   init_recog ();
1623
1624   /* Scan through all the insns, instantiating every virtual register still
1625      present.  */
1626   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1627     if (INSN_P (insn))
1628       {
1629         /* These patterns in the instruction stream can never be recognized.
1630            Fortunately, they shouldn't contain virtual registers either.  */
1631         if (GET_CODE (PATTERN (insn)) == USE
1632             || GET_CODE (PATTERN (insn)) == CLOBBER
1633             || GET_CODE (PATTERN (insn)) == ADDR_VEC
1634             || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
1635             || GET_CODE (PATTERN (insn)) == ASM_INPUT)
1636           continue;
1637
1638         instantiate_virtual_regs_in_insn (insn);
1639
1640         if (INSN_DELETED_P (insn))
1641           continue;
1642
1643         for_each_rtx (&REG_NOTES (insn), instantiate_virtual_regs_in_rtx, NULL);
1644
1645         /* Instantiate any virtual registers in CALL_INSN_FUNCTION_USAGE.  */
1646         if (GET_CODE (insn) == CALL_INSN)
1647           for_each_rtx (&CALL_INSN_FUNCTION_USAGE (insn),
1648                         instantiate_virtual_regs_in_rtx, NULL);
1649       }
1650
1651   /* Instantiate the virtual registers in the DECLs for debugging purposes.  */
1652   instantiate_decls (current_function_decl);
1653
1654   /* Indicate that, from now on, assign_stack_local should use
1655      frame_pointer_rtx.  */
1656   virtuals_instantiated = 1;
1657 }
1658 \f
1659 /* Return 1 if EXP is an aggregate type (or a value with aggregate type).
1660    This means a type for which function calls must pass an address to the
1661    function or get an address back from the function.
1662    EXP may be a type node or an expression (whose type is tested).  */
1663
1664 int
1665 aggregate_value_p (tree exp, tree fntype)
1666 {
1667   int i, regno, nregs;
1668   rtx reg;
1669
1670   tree type = (TYPE_P (exp)) ? exp : TREE_TYPE (exp);
1671
1672   if (fntype)
1673     switch (TREE_CODE (fntype))
1674       {
1675       case CALL_EXPR:
1676         fntype = get_callee_fndecl (fntype);
1677         fntype = fntype ? TREE_TYPE (fntype) : 0;
1678         break;
1679       case FUNCTION_DECL:
1680         fntype = TREE_TYPE (fntype);
1681         break;
1682       case FUNCTION_TYPE:
1683       case METHOD_TYPE:
1684         break;
1685       case IDENTIFIER_NODE:
1686         fntype = 0;
1687         break;
1688       default:
1689         /* We don't expect other rtl types here.  */
1690         gcc_unreachable ();
1691       }
1692
1693   if (TREE_CODE (type) == VOID_TYPE)
1694     return 0;
1695   /* If the front end has decided that this needs to be passed by
1696      reference, do so.  */
1697   if ((TREE_CODE (exp) == PARM_DECL || TREE_CODE (exp) == RESULT_DECL)
1698       && DECL_BY_REFERENCE (exp))
1699     return 1;
1700   if (targetm.calls.return_in_memory (type, fntype))
1701     return 1;
1702   /* Types that are TREE_ADDRESSABLE must be constructed in memory,
1703      and thus can't be returned in registers.  */
1704   if (TREE_ADDRESSABLE (type))
1705     return 1;
1706   if (flag_pcc_struct_return && AGGREGATE_TYPE_P (type))
1707     return 1;
1708   /* Make sure we have suitable call-clobbered regs to return
1709      the value in; if not, we must return it in memory.  */
1710   reg = hard_function_value (type, 0, 0);
1711
1712   /* If we have something other than a REG (e.g. a PARALLEL), then assume
1713      it is OK.  */
1714   if (!REG_P (reg))
1715     return 0;
1716
1717   regno = REGNO (reg);
1718   nregs = hard_regno_nregs[regno][TYPE_MODE (type)];
1719   for (i = 0; i < nregs; i++)
1720     if (! call_used_regs[regno + i])
1721       return 1;
1722   return 0;
1723 }
1724 \f
1725 /* Return true if we should assign DECL a pseudo register; false if it
1726    should live on the local stack.  */
1727
1728 bool
1729 use_register_for_decl (tree decl)
1730 {
1731   /* Honor volatile.  */
1732   if (TREE_SIDE_EFFECTS (decl))
1733     return false;
1734
1735   /* Honor addressability.  */
1736   if (TREE_ADDRESSABLE (decl))
1737     return false;
1738
1739   /* Only register-like things go in registers.  */
1740   if (DECL_MODE (decl) == BLKmode)
1741     return false;
1742
1743   /* If -ffloat-store specified, don't put explicit float variables
1744      into registers.  */
1745   /* ??? This should be checked after DECL_ARTIFICIAL, but tree-ssa
1746      propagates values across these stores, and it probably shouldn't.  */
1747   if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)))
1748     return false;
1749
1750   /* If we're not interested in tracking debugging information for
1751      this decl, then we can certainly put it in a register.  */
1752   if (DECL_IGNORED_P (decl))
1753     return true;
1754
1755   return (optimize || DECL_REGISTER (decl));
1756 }
1757
1758 /* Return true if TYPE should be passed by invisible reference.  */
1759
1760 bool
1761 pass_by_reference (CUMULATIVE_ARGS *ca, enum machine_mode mode,
1762                    tree type, bool named_arg)
1763 {
1764   if (type)
1765     {
1766       /* If this type contains non-trivial constructors, then it is
1767          forbidden for the middle-end to create any new copies.  */
1768       if (TREE_ADDRESSABLE (type))
1769         return true;
1770
1771       /* GCC post 3.4 passes *all* variable sized types by reference.  */
1772       if (!TYPE_SIZE (type) || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1773         return true;
1774     }
1775
1776   return targetm.calls.pass_by_reference (ca, mode, type, named_arg);
1777 }
1778
1779 /* Return true if TYPE, which is passed by reference, should be callee
1780    copied instead of caller copied.  */
1781
1782 bool
1783 reference_callee_copied (CUMULATIVE_ARGS *ca, enum machine_mode mode,
1784                          tree type, bool named_arg)
1785 {
1786   if (type && TREE_ADDRESSABLE (type))
1787     return false;
1788   return targetm.calls.callee_copies (ca, mode, type, named_arg);
1789 }
1790
1791 /* Structures to communicate between the subroutines of assign_parms.
1792    The first holds data persistent across all parameters, the second
1793    is cleared out for each parameter.  */
1794
1795 struct assign_parm_data_all
1796 {
1797   CUMULATIVE_ARGS args_so_far;
1798   struct args_size stack_args_size;
1799   tree function_result_decl;
1800   tree orig_fnargs;
1801   rtx conversion_insns;
1802   HOST_WIDE_INT pretend_args_size;
1803   HOST_WIDE_INT extra_pretend_bytes;
1804   int reg_parm_stack_space;
1805 };
1806
1807 struct assign_parm_data_one
1808 {
1809   tree nominal_type;
1810   tree passed_type;
1811   rtx entry_parm;
1812   rtx stack_parm;
1813   enum machine_mode nominal_mode;
1814   enum machine_mode passed_mode;
1815   enum machine_mode promoted_mode;
1816   struct locate_and_pad_arg_data locate;
1817   int partial;
1818   BOOL_BITFIELD named_arg : 1;
1819   BOOL_BITFIELD passed_pointer : 1;
1820   BOOL_BITFIELD on_stack : 1;
1821   BOOL_BITFIELD loaded_in_reg : 1;
1822 };
1823
1824 /* A subroutine of assign_parms.  Initialize ALL.  */
1825
1826 static void
1827 assign_parms_initialize_all (struct assign_parm_data_all *all)
1828 {
1829   tree fntype;
1830
1831   memset (all, 0, sizeof (*all));
1832
1833   fntype = TREE_TYPE (current_function_decl);
1834
1835 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
1836   INIT_CUMULATIVE_INCOMING_ARGS (all->args_so_far, fntype, NULL_RTX);
1837 #else
1838   INIT_CUMULATIVE_ARGS (all->args_so_far, fntype, NULL_RTX,
1839                         current_function_decl, -1);
1840 #endif
1841
1842 #ifdef REG_PARM_STACK_SPACE
1843   all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl);
1844 #endif
1845 }
1846
1847 /* If ARGS contains entries with complex types, split the entry into two
1848    entries of the component type.  Return a new list of substitutions are
1849    needed, else the old list.  */
1850
1851 static tree
1852 split_complex_args (tree args)
1853 {
1854   tree p;
1855
1856   /* Before allocating memory, check for the common case of no complex.  */
1857   for (p = args; p; p = TREE_CHAIN (p))
1858     {
1859       tree type = TREE_TYPE (p);
1860       if (TREE_CODE (type) == COMPLEX_TYPE
1861           && targetm.calls.split_complex_arg (type))
1862         goto found;
1863     }
1864   return args;
1865
1866  found:
1867   args = copy_list (args);
1868
1869   for (p = args; p; p = TREE_CHAIN (p))
1870     {
1871       tree type = TREE_TYPE (p);
1872       if (TREE_CODE (type) == COMPLEX_TYPE
1873           && targetm.calls.split_complex_arg (type))
1874         {
1875           tree decl;
1876           tree subtype = TREE_TYPE (type);
1877           bool addressable = TREE_ADDRESSABLE (p);
1878
1879           /* Rewrite the PARM_DECL's type with its component.  */
1880           TREE_TYPE (p) = subtype;
1881           DECL_ARG_TYPE (p) = TREE_TYPE (DECL_ARG_TYPE (p));
1882           DECL_MODE (p) = VOIDmode;
1883           DECL_SIZE (p) = NULL;
1884           DECL_SIZE_UNIT (p) = NULL;
1885           /* If this arg must go in memory, put it in a pseudo here.
1886              We can't allow it to go in memory as per normal parms,
1887              because the usual place might not have the imag part
1888              adjacent to the real part.  */
1889           DECL_ARTIFICIAL (p) = addressable;
1890           DECL_IGNORED_P (p) = addressable;
1891           TREE_ADDRESSABLE (p) = 0;
1892           layout_decl (p, 0);
1893
1894           /* Build a second synthetic decl.  */
1895           decl = build_decl (PARM_DECL, NULL_TREE, subtype);
1896           DECL_ARG_TYPE (decl) = DECL_ARG_TYPE (p);
1897           DECL_ARTIFICIAL (decl) = addressable;
1898           DECL_IGNORED_P (decl) = addressable;
1899           layout_decl (decl, 0);
1900
1901           /* Splice it in; skip the new decl.  */
1902           TREE_CHAIN (decl) = TREE_CHAIN (p);
1903           TREE_CHAIN (p) = decl;
1904           p = decl;
1905         }
1906     }
1907
1908   return args;
1909 }
1910
1911 /* A subroutine of assign_parms.  Adjust the parameter list to incorporate
1912    the hidden struct return argument, and (abi willing) complex args.
1913    Return the new parameter list.  */
1914
1915 static tree
1916 assign_parms_augmented_arg_list (struct assign_parm_data_all *all)
1917 {
1918   tree fndecl = current_function_decl;
1919   tree fntype = TREE_TYPE (fndecl);
1920   tree fnargs = DECL_ARGUMENTS (fndecl);
1921
1922   /* If struct value address is treated as the first argument, make it so.  */
1923   if (aggregate_value_p (DECL_RESULT (fndecl), fndecl)
1924       && ! current_function_returns_pcc_struct
1925       && targetm.calls.struct_value_rtx (TREE_TYPE (fndecl), 1) == 0)
1926     {
1927       tree type = build_pointer_type (TREE_TYPE (fntype));
1928       tree decl;
1929
1930       decl = build_decl (PARM_DECL, NULL_TREE, type);
1931       DECL_ARG_TYPE (decl) = type;
1932       DECL_ARTIFICIAL (decl) = 1;
1933       DECL_IGNORED_P (decl) = 1;
1934
1935       TREE_CHAIN (decl) = fnargs;
1936       fnargs = decl;
1937       all->function_result_decl = decl;
1938     }
1939
1940   all->orig_fnargs = fnargs;
1941
1942   /* If the target wants to split complex arguments into scalars, do so.  */
1943   if (targetm.calls.split_complex_arg)
1944     fnargs = split_complex_args (fnargs);
1945
1946   return fnargs;
1947 }
1948
1949 /* A subroutine of assign_parms.  Examine PARM and pull out type and mode
1950    data for the parameter.  Incorporate ABI specifics such as pass-by-
1951    reference and type promotion.  */
1952
1953 static void
1954 assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
1955                              struct assign_parm_data_one *data)
1956 {
1957   tree nominal_type, passed_type;
1958   enum machine_mode nominal_mode, passed_mode, promoted_mode;
1959
1960   memset (data, 0, sizeof (*data));
1961
1962   /* NAMED_ARG is a mis-nomer.  We really mean 'non-varadic'. */
1963   if (!current_function_stdarg)
1964     data->named_arg = 1;  /* No varadic parms.  */
1965   else if (TREE_CHAIN (parm))
1966     data->named_arg = 1;  /* Not the last non-varadic parm. */
1967   else if (targetm.calls.strict_argument_naming (&all->args_so_far))
1968     data->named_arg = 1;  /* Only varadic ones are unnamed.  */
1969   else
1970     data->named_arg = 0;  /* Treat as varadic.  */
1971
1972   nominal_type = TREE_TYPE (parm);
1973   passed_type = DECL_ARG_TYPE (parm);
1974
1975   /* Look out for errors propagating this far.  Also, if the parameter's
1976      type is void then its value doesn't matter.  */
1977   if (TREE_TYPE (parm) == error_mark_node
1978       /* This can happen after weird syntax errors
1979          or if an enum type is defined among the parms.  */
1980       || TREE_CODE (parm) != PARM_DECL
1981       || passed_type == NULL
1982       || VOID_TYPE_P (nominal_type))
1983     {
1984       nominal_type = passed_type = void_type_node;
1985       nominal_mode = passed_mode = promoted_mode = VOIDmode;
1986       goto egress;
1987     }
1988
1989   /* Find mode of arg as it is passed, and mode of arg as it should be
1990      during execution of this function.  */
1991   passed_mode = TYPE_MODE (passed_type);
1992   nominal_mode = TYPE_MODE (nominal_type);
1993
1994   /* If the parm is to be passed as a transparent union, use the type of
1995      the first field for the tests below.  We have already verified that
1996      the modes are the same.  */
1997   if (DECL_TRANSPARENT_UNION (parm)
1998       || (TREE_CODE (passed_type) == UNION_TYPE
1999           && TYPE_TRANSPARENT_UNION (passed_type)))
2000     passed_type = TREE_TYPE (TYPE_FIELDS (passed_type));
2001
2002   /* See if this arg was passed by invisible reference.  */
2003   if (pass_by_reference (&all->args_so_far, passed_mode,
2004                          passed_type, data->named_arg))
2005     {
2006       passed_type = nominal_type = build_pointer_type (passed_type);
2007       data->passed_pointer = true;
2008       passed_mode = nominal_mode = Pmode;
2009     }
2010
2011   /* Find mode as it is passed by the ABI.  */
2012   promoted_mode = passed_mode;
2013   if (targetm.calls.promote_function_args (TREE_TYPE (current_function_decl)))
2014     {
2015       int unsignedp = TYPE_UNSIGNED (passed_type);
2016       promoted_mode = promote_mode (passed_type, promoted_mode,
2017                                     &unsignedp, 1);
2018     }
2019
2020  egress:
2021   data->nominal_type = nominal_type;
2022   data->passed_type = passed_type;
2023   data->nominal_mode = nominal_mode;
2024   data->passed_mode = passed_mode;
2025   data->promoted_mode = promoted_mode;
2026 }
2027
2028 /* A subroutine of assign_parms.  Invoke setup_incoming_varargs.  */
2029
2030 static void
2031 assign_parms_setup_varargs (struct assign_parm_data_all *all,
2032                             struct assign_parm_data_one *data, bool no_rtl)
2033 {
2034   int varargs_pretend_bytes = 0;
2035
2036   targetm.calls.setup_incoming_varargs (&all->args_so_far,
2037                                         data->promoted_mode,
2038                                         data->passed_type,
2039                                         &varargs_pretend_bytes, no_rtl);
2040
2041   /* If the back-end has requested extra stack space, record how much is
2042      needed.  Do not change pretend_args_size otherwise since it may be
2043      nonzero from an earlier partial argument.  */
2044   if (varargs_pretend_bytes > 0)
2045     all->pretend_args_size = varargs_pretend_bytes;
2046 }
2047
2048 /* A subroutine of assign_parms.  Set DATA->ENTRY_PARM corresponding to
2049    the incoming location of the current parameter.  */
2050
2051 static void
2052 assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
2053                             struct assign_parm_data_one *data)
2054 {
2055   HOST_WIDE_INT pretend_bytes = 0;
2056   rtx entry_parm;
2057   bool in_regs;
2058
2059   if (data->promoted_mode == VOIDmode)
2060     {
2061       data->entry_parm = data->stack_parm = const0_rtx;
2062       return;
2063     }
2064
2065 #ifdef FUNCTION_INCOMING_ARG
2066   entry_parm = FUNCTION_INCOMING_ARG (all->args_so_far, data->promoted_mode,
2067                                       data->passed_type, data->named_arg);
2068 #else
2069   entry_parm = FUNCTION_ARG (all->args_so_far, data->promoted_mode,
2070                              data->passed_type, data->named_arg);
2071 #endif
2072
2073   if (entry_parm == 0)
2074     data->promoted_mode = data->passed_mode;
2075
2076   /* Determine parm's home in the stack, in case it arrives in the stack
2077      or we should pretend it did.  Compute the stack position and rtx where
2078      the argument arrives and its size.
2079
2080      There is one complexity here:  If this was a parameter that would
2081      have been passed in registers, but wasn't only because it is
2082      __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2083      it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2084      In this case, we call FUNCTION_ARG with NAMED set to 1 instead of 0
2085      as it was the previous time.  */
2086   in_regs = entry_parm != 0;
2087 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2088   in_regs = true;
2089 #endif
2090   if (!in_regs && !data->named_arg)
2091     {
2092       if (targetm.calls.pretend_outgoing_varargs_named (&all->args_so_far))
2093         {
2094           rtx tem;
2095 #ifdef FUNCTION_INCOMING_ARG
2096           tem = FUNCTION_INCOMING_ARG (all->args_so_far, data->promoted_mode,
2097                                        data->passed_type, true);
2098 #else
2099           tem = FUNCTION_ARG (all->args_so_far, data->promoted_mode,
2100                               data->passed_type, true);
2101 #endif
2102           in_regs = tem != NULL;
2103         }
2104     }
2105
2106   /* If this parameter was passed both in registers and in the stack, use
2107      the copy on the stack.  */
2108   if (targetm.calls.must_pass_in_stack (data->promoted_mode,
2109                                         data->passed_type))
2110     entry_parm = 0;
2111
2112   if (entry_parm)
2113     {
2114       int partial;
2115
2116       partial = targetm.calls.arg_partial_bytes (&all->args_so_far,
2117                                                  data->promoted_mode,
2118                                                  data->passed_type,
2119                                                  data->named_arg);
2120       data->partial = partial;
2121
2122       /* The caller might already have allocated stack space for the
2123          register parameters.  */
2124       if (partial != 0 && all->reg_parm_stack_space == 0)
2125         {
2126           /* Part of this argument is passed in registers and part
2127              is passed on the stack.  Ask the prologue code to extend
2128              the stack part so that we can recreate the full value.
2129
2130              PRETEND_BYTES is the size of the registers we need to store.
2131              CURRENT_FUNCTION_PRETEND_ARGS_SIZE is the amount of extra
2132              stack space that the prologue should allocate.
2133
2134              Internally, gcc assumes that the argument pointer is aligned
2135              to STACK_BOUNDARY bits.  This is used both for alignment
2136              optimizations (see init_emit) and to locate arguments that are
2137              aligned to more than PARM_BOUNDARY bits.  We must preserve this
2138              invariant by rounding CURRENT_FUNCTION_PRETEND_ARGS_SIZE up to
2139              a stack boundary.  */
2140
2141           /* We assume at most one partial arg, and it must be the first
2142              argument on the stack.  */
2143           gcc_assert (!all->extra_pretend_bytes && !all->pretend_args_size);
2144
2145           pretend_bytes = partial;
2146           all->pretend_args_size = CEIL_ROUND (pretend_bytes, STACK_BYTES);
2147
2148           /* We want to align relative to the actual stack pointer, so
2149              don't include this in the stack size until later.  */
2150           all->extra_pretend_bytes = all->pretend_args_size;
2151         }
2152     }
2153
2154   locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs,
2155                        entry_parm ? data->partial : 0, current_function_decl,
2156                        &all->stack_args_size, &data->locate);
2157
2158   /* Adjust offsets to include the pretend args.  */
2159   pretend_bytes = all->extra_pretend_bytes - pretend_bytes;
2160   data->locate.slot_offset.constant += pretend_bytes;
2161   data->locate.offset.constant += pretend_bytes;
2162
2163   data->entry_parm = entry_parm;
2164 }
2165
2166 /* A subroutine of assign_parms.  If there is actually space on the stack
2167    for this parm, count it in stack_args_size and return true.  */
2168
2169 static bool
2170 assign_parm_is_stack_parm (struct assign_parm_data_all *all,
2171                            struct assign_parm_data_one *data)
2172 {
2173   /* Trivially true if we've no incoming register.  */
2174   if (data->entry_parm == NULL)
2175     ;
2176   /* Also true if we're partially in registers and partially not,
2177      since we've arranged to drop the entire argument on the stack.  */
2178   else if (data->partial != 0)
2179     ;
2180   /* Also true if the target says that it's passed in both registers
2181      and on the stack.  */
2182   else if (GET_CODE (data->entry_parm) == PARALLEL
2183            && XEXP (XVECEXP (data->entry_parm, 0, 0), 0) == NULL_RTX)
2184     ;
2185   /* Also true if the target says that there's stack allocated for
2186      all register parameters.  */
2187   else if (all->reg_parm_stack_space > 0)
2188     ;
2189   /* Otherwise, no, this parameter has no ABI defined stack slot.  */
2190   else
2191     return false;
2192
2193   all->stack_args_size.constant += data->locate.size.constant;
2194   if (data->locate.size.var)
2195     ADD_PARM_SIZE (all->stack_args_size, data->locate.size.var);
2196
2197   return true;
2198 }
2199
2200 /* A subroutine of assign_parms.  Given that this parameter is allocated
2201    stack space by the ABI, find it.  */
2202
2203 static void
2204 assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
2205 {
2206   rtx offset_rtx, stack_parm;
2207   unsigned int align, boundary;
2208
2209   /* If we're passing this arg using a reg, make its stack home the
2210      aligned stack slot.  */
2211   if (data->entry_parm)
2212     offset_rtx = ARGS_SIZE_RTX (data->locate.slot_offset);
2213   else
2214     offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
2215
2216   stack_parm = current_function_internal_arg_pointer;
2217   if (offset_rtx != const0_rtx)
2218     stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
2219   stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
2220
2221   set_mem_attributes (stack_parm, parm, 1);
2222
2223   boundary = data->locate.boundary;
2224   align = BITS_PER_UNIT;
2225
2226   /* If we're padding upward, we know that the alignment of the slot
2227      is FUNCTION_ARG_BOUNDARY.  If we're using slot_offset, we're
2228      intentionally forcing upward padding.  Otherwise we have to come
2229      up with a guess at the alignment based on OFFSET_RTX.  */
2230   if (data->locate.where_pad != downward || data->entry_parm)
2231     align = boundary;
2232   else if (GET_CODE (offset_rtx) == CONST_INT)
2233     {
2234       align = INTVAL (offset_rtx) * BITS_PER_UNIT | boundary;
2235       align = align & -align;
2236     }
2237   set_mem_align (stack_parm, align);
2238
2239   if (data->entry_parm)
2240     set_reg_attrs_for_parm (data->entry_parm, stack_parm);
2241
2242   data->stack_parm = stack_parm;
2243 }
2244
2245 /* A subroutine of assign_parms.  Adjust DATA->ENTRY_RTL such that it's
2246    always valid and contiguous.  */
2247
2248 static void
2249 assign_parm_adjust_entry_rtl (struct assign_parm_data_one *data)
2250 {
2251   rtx entry_parm = data->entry_parm;
2252   rtx stack_parm = data->stack_parm;
2253
2254   /* If this parm was passed part in regs and part in memory, pretend it
2255      arrived entirely in memory by pushing the register-part onto the stack.
2256      In the special case of a DImode or DFmode that is split, we could put
2257      it together in a pseudoreg directly, but for now that's not worth
2258      bothering with.  */
2259   if (data->partial != 0)
2260     {
2261       /* Handle calls that pass values in multiple non-contiguous
2262          locations.  The Irix 6 ABI has examples of this.  */
2263       if (GET_CODE (entry_parm) == PARALLEL)
2264         emit_group_store (validize_mem (stack_parm), entry_parm,
2265                           data->passed_type, 
2266                           int_size_in_bytes (data->passed_type));
2267       else
2268         {
2269           gcc_assert (data->partial % UNITS_PER_WORD == 0);
2270           move_block_from_reg (REGNO (entry_parm), validize_mem (stack_parm),
2271                                data->partial / UNITS_PER_WORD);
2272         }
2273
2274       entry_parm = stack_parm;
2275     }
2276
2277   /* If we didn't decide this parm came in a register, by default it came
2278      on the stack.  */
2279   else if (entry_parm == NULL)
2280     entry_parm = stack_parm;
2281
2282   /* When an argument is passed in multiple locations, we can't make use
2283      of this information, but we can save some copying if the whole argument
2284      is passed in a single register.  */
2285   else if (GET_CODE (entry_parm) == PARALLEL
2286            && data->nominal_mode != BLKmode
2287            && data->passed_mode != BLKmode)
2288     {
2289       size_t i, len = XVECLEN (entry_parm, 0);
2290
2291       for (i = 0; i < len; i++)
2292         if (XEXP (XVECEXP (entry_parm, 0, i), 0) != NULL_RTX
2293             && REG_P (XEXP (XVECEXP (entry_parm, 0, i), 0))
2294             && (GET_MODE (XEXP (XVECEXP (entry_parm, 0, i), 0))
2295                 == data->passed_mode)
2296             && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
2297           {
2298             entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
2299             break;
2300           }
2301     }
2302
2303   data->entry_parm = entry_parm;
2304 }
2305
2306 /* A subroutine of assign_parms.  Adjust DATA->STACK_RTL such that it's
2307    always valid and properly aligned.  */
2308
2309 static void
2310 assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)
2311 {
2312   rtx stack_parm = data->stack_parm;
2313
2314   /* If we can't trust the parm stack slot to be aligned enough for its
2315      ultimate type, don't use that slot after entry.  We'll make another
2316      stack slot, if we need one.  */
2317   if (stack_parm
2318       && ((STRICT_ALIGNMENT
2319            && GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN (stack_parm))
2320           || (data->nominal_type
2321               && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)
2322               && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
2323     stack_parm = NULL;
2324
2325   /* If parm was passed in memory, and we need to convert it on entry,
2326      don't store it back in that same slot.  */
2327   else if (data->entry_parm == stack_parm
2328            && data->nominal_mode != BLKmode
2329            && data->nominal_mode != data->passed_mode)
2330     stack_parm = NULL;
2331
2332   data->stack_parm = stack_parm;
2333 }
2334
2335 /* A subroutine of assign_parms.  Return true if the current parameter
2336    should be stored as a BLKmode in the current frame.  */
2337
2338 static bool
2339 assign_parm_setup_block_p (struct assign_parm_data_one *data)
2340 {
2341   if (data->nominal_mode == BLKmode)
2342     return true;
2343   if (GET_CODE (data->entry_parm) == PARALLEL)
2344     return true;
2345
2346 #ifdef BLOCK_REG_PADDING
2347   /* Only assign_parm_setup_block knows how to deal with register arguments
2348      that are padded at the least significant end.  */
2349   if (REG_P (data->entry_parm)
2350       && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD
2351       && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1)
2352           == (BYTES_BIG_ENDIAN ? upward : downward)))
2353     return true;
2354 #endif
2355
2356   return false;
2357 }
2358
2359 /* A subroutine of assign_parms.  Arrange for the parameter to be 
2360    present and valid in DATA->STACK_RTL.  */
2361
2362 static void
2363 assign_parm_setup_block (struct assign_parm_data_all *all,
2364                          tree parm, struct assign_parm_data_one *data)
2365 {
2366   rtx entry_parm = data->entry_parm;
2367   rtx stack_parm = data->stack_parm;
2368   HOST_WIDE_INT size;
2369   HOST_WIDE_INT size_stored;
2370   rtx orig_entry_parm = entry_parm;
2371
2372   if (GET_CODE (entry_parm) == PARALLEL)
2373     entry_parm = emit_group_move_into_temps (entry_parm);
2374
2375   /* If we've a non-block object that's nevertheless passed in parts,
2376      reconstitute it in register operations rather than on the stack.  */
2377   if (GET_CODE (entry_parm) == PARALLEL
2378       && data->nominal_mode != BLKmode)
2379     {
2380       rtx elt0 = XEXP (XVECEXP (orig_entry_parm, 0, 0), 0);
2381
2382       if ((XVECLEN (entry_parm, 0) > 1
2383            || hard_regno_nregs[REGNO (elt0)][GET_MODE (elt0)] > 1)
2384           && use_register_for_decl (parm))
2385         {
2386           rtx parmreg = gen_reg_rtx (data->nominal_mode);
2387
2388           push_to_sequence (all->conversion_insns);
2389
2390           /* For values returned in multiple registers, handle possible
2391              incompatible calls to emit_group_store.
2392
2393              For example, the following would be invalid, and would have to
2394              be fixed by the conditional below:
2395
2396              emit_group_store ((reg:SF), (parallel:DF))
2397              emit_group_store ((reg:SI), (parallel:DI))
2398
2399              An example of this are doubles in e500 v2:
2400              (parallel:DF (expr_list (reg:SI) (const_int 0))
2401              (expr_list (reg:SI) (const_int 4))).  */
2402           if (data->nominal_mode != data->passed_mode)
2403             {
2404               rtx t = gen_reg_rtx (GET_MODE (entry_parm));
2405               emit_group_store (t, entry_parm, NULL_TREE,
2406                                 GET_MODE_SIZE (GET_MODE (entry_parm)));
2407               convert_move (parmreg, t, 0);
2408             }
2409           else
2410             emit_group_store (parmreg, entry_parm, data->nominal_type,
2411                               int_size_in_bytes (data->nominal_type));
2412
2413           all->conversion_insns = get_insns ();
2414           end_sequence ();
2415
2416           SET_DECL_RTL (parm, parmreg);
2417           return;
2418         }
2419     }
2420
2421   size = int_size_in_bytes (data->passed_type);
2422   size_stored = CEIL_ROUND (size, UNITS_PER_WORD);
2423   if (stack_parm == 0)
2424     {
2425       DECL_ALIGN (parm) = MAX (DECL_ALIGN (parm), BITS_PER_WORD);
2426       stack_parm = assign_stack_local (BLKmode, size_stored,
2427                                        DECL_ALIGN (parm));
2428       if (GET_MODE_SIZE (GET_MODE (entry_parm)) == size)
2429         PUT_MODE (stack_parm, GET_MODE (entry_parm));
2430       set_mem_attributes (stack_parm, parm, 1);
2431     }
2432
2433   /* If a BLKmode arrives in registers, copy it to a stack slot.  Handle
2434      calls that pass values in multiple non-contiguous locations.  */
2435   if (REG_P (entry_parm) || GET_CODE (entry_parm) == PARALLEL)
2436     {
2437       rtx mem;
2438
2439       /* Note that we will be storing an integral number of words.
2440          So we have to be careful to ensure that we allocate an
2441          integral number of words.  We do this above when we call
2442          assign_stack_local if space was not allocated in the argument
2443          list.  If it was, this will not work if PARM_BOUNDARY is not
2444          a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2445          if it becomes a problem.  Exception is when BLKmode arrives
2446          with arguments not conforming to word_mode.  */
2447
2448       if (data->stack_parm == 0)
2449         ;
2450       else if (GET_CODE (entry_parm) == PARALLEL)
2451         ;
2452       else
2453         gcc_assert (!size || !(PARM_BOUNDARY % BITS_PER_WORD));
2454
2455       mem = validize_mem (stack_parm);
2456
2457       /* Handle values in multiple non-contiguous locations.  */
2458       if (GET_CODE (entry_parm) == PARALLEL)
2459         {
2460           push_to_sequence (all->conversion_insns);
2461           emit_group_store (mem, entry_parm, data->passed_type, size);
2462           all->conversion_insns = get_insns ();
2463           end_sequence ();
2464         }
2465
2466       else if (size == 0)
2467         ;
2468
2469       /* If SIZE is that of a mode no bigger than a word, just use
2470          that mode's store operation.  */
2471       else if (size <= UNITS_PER_WORD)
2472         {
2473           enum machine_mode mode
2474             = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2475
2476           if (mode != BLKmode
2477 #ifdef BLOCK_REG_PADDING
2478               && (size == UNITS_PER_WORD
2479                   || (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2480                       != (BYTES_BIG_ENDIAN ? upward : downward)))
2481 #endif
2482               )
2483             {
2484               rtx reg = gen_rtx_REG (mode, REGNO (entry_parm));
2485               emit_move_insn (change_address (mem, mode, 0), reg);
2486             }
2487
2488           /* Blocks smaller than a word on a BYTES_BIG_ENDIAN
2489              machine must be aligned to the left before storing
2490              to memory.  Note that the previous test doesn't
2491              handle all cases (e.g. SIZE == 3).  */
2492           else if (size != UNITS_PER_WORD
2493 #ifdef BLOCK_REG_PADDING
2494                    && (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2495                        == downward)
2496 #else
2497                    && BYTES_BIG_ENDIAN
2498 #endif
2499                    )
2500             {
2501               rtx tem, x;
2502               int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
2503               rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2504
2505               x = expand_shift (LSHIFT_EXPR, word_mode, reg,
2506                                 build_int_cst (NULL_TREE, by),
2507                                 NULL_RTX, 1);
2508               tem = change_address (mem, word_mode, 0);
2509               emit_move_insn (tem, x);
2510             }
2511           else
2512             move_block_from_reg (REGNO (entry_parm), mem,
2513                                  size_stored / UNITS_PER_WORD);
2514         }
2515       else
2516         move_block_from_reg (REGNO (entry_parm), mem,
2517                              size_stored / UNITS_PER_WORD);
2518     }
2519   else if (data->stack_parm == 0)
2520     {
2521       push_to_sequence (all->conversion_insns);
2522       emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
2523                        BLOCK_OP_NORMAL);
2524       all->conversion_insns = get_insns ();
2525       end_sequence ();
2526     }
2527
2528   data->stack_parm = stack_parm;
2529   SET_DECL_RTL (parm, stack_parm);
2530 }
2531
2532 /* A subroutine of assign_parms.  Allocate a pseudo to hold the current
2533    parameter.  Get it there.  Perform all ABI specified conversions.  */
2534
2535 static void
2536 assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
2537                        struct assign_parm_data_one *data)
2538 {
2539   rtx parmreg;
2540   enum machine_mode promoted_nominal_mode;
2541   int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
2542   bool did_conversion = false;
2543
2544   /* Store the parm in a pseudoregister during the function, but we may
2545      need to do it in a wider mode.  */
2546
2547   promoted_nominal_mode
2548     = promote_mode (data->nominal_type, data->nominal_mode, &unsignedp, 0);
2549
2550   parmreg = gen_reg_rtx (promoted_nominal_mode);
2551
2552   if (!DECL_ARTIFICIAL (parm))
2553     mark_user_reg (parmreg);
2554
2555   /* If this was an item that we received a pointer to,
2556      set DECL_RTL appropriately.  */
2557   if (data->passed_pointer)
2558     {
2559       rtx x = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data->passed_type)), parmreg);
2560       set_mem_attributes (x, parm, 1);
2561       SET_DECL_RTL (parm, x);
2562     }
2563   else
2564     SET_DECL_RTL (parm, parmreg);
2565
2566   /* Copy the value into the register.  */
2567   if (data->nominal_mode != data->passed_mode
2568       || promoted_nominal_mode != data->promoted_mode)
2569     {
2570       int save_tree_used;
2571
2572       /* ENTRY_PARM has been converted to PROMOTED_MODE, its
2573          mode, by the caller.  We now have to convert it to
2574          NOMINAL_MODE, if different.  However, PARMREG may be in
2575          a different mode than NOMINAL_MODE if it is being stored
2576          promoted.
2577
2578          If ENTRY_PARM is a hard register, it might be in a register
2579          not valid for operating in its mode (e.g., an odd-numbered
2580          register for a DFmode).  In that case, moves are the only
2581          thing valid, so we can't do a convert from there.  This
2582          occurs when the calling sequence allow such misaligned
2583          usages.
2584
2585          In addition, the conversion may involve a call, which could
2586          clobber parameters which haven't been copied to pseudo
2587          registers yet.  Therefore, we must first copy the parm to
2588          a pseudo reg here, and save the conversion until after all
2589          parameters have been moved.  */
2590
2591       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2592
2593       emit_move_insn (tempreg, validize_mem (data->entry_parm));
2594
2595       push_to_sequence (all->conversion_insns);
2596       tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
2597
2598       if (GET_CODE (tempreg) == SUBREG
2599           && GET_MODE (tempreg) == data->nominal_mode
2600           && REG_P (SUBREG_REG (tempreg))
2601           && data->nominal_mode == data->passed_mode
2602           && GET_MODE (SUBREG_REG (tempreg)) == GET_MODE (data->entry_parm)
2603           && GET_MODE_SIZE (GET_MODE (tempreg))
2604              < GET_MODE_SIZE (GET_MODE (data->entry_parm)))
2605         {
2606           /* The argument is already sign/zero extended, so note it
2607              into the subreg.  */
2608           SUBREG_PROMOTED_VAR_P (tempreg) = 1;
2609           SUBREG_PROMOTED_UNSIGNED_SET (tempreg, unsignedp);
2610         }
2611
2612       /* TREE_USED gets set erroneously during expand_assignment.  */
2613       save_tree_used = TREE_USED (parm);
2614       expand_assignment (parm, make_tree (data->nominal_type, tempreg));
2615       TREE_USED (parm) = save_tree_used;
2616       all->conversion_insns = get_insns ();
2617       end_sequence ();
2618
2619       did_conversion = true;
2620     }
2621   else
2622     emit_move_insn (parmreg, validize_mem (data->entry_parm));
2623
2624   /* If we were passed a pointer but the actual value can safely live
2625      in a register, put it in one.  */
2626   if (data->passed_pointer
2627       && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
2628       /* If by-reference argument was promoted, demote it.  */
2629       && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
2630           || use_register_for_decl (parm)))
2631     {
2632       /* We can't use nominal_mode, because it will have been set to
2633          Pmode above.  We must use the actual mode of the parm.  */
2634       parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
2635       mark_user_reg (parmreg);
2636
2637       if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm)))
2638         {
2639           rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm)));
2640           int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
2641
2642           push_to_sequence (all->conversion_insns);
2643           emit_move_insn (tempreg, DECL_RTL (parm));
2644           tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
2645           emit_move_insn (parmreg, tempreg);
2646           all->conversion_insns = get_insns ();
2647           end_sequence ();
2648
2649           did_conversion = true;
2650         }
2651       else
2652         emit_move_insn (parmreg, DECL_RTL (parm));
2653
2654       SET_DECL_RTL (parm, parmreg);
2655
2656       /* STACK_PARM is the pointer, not the parm, and PARMREG is
2657          now the parm.  */
2658       data->stack_parm = NULL;
2659     }
2660
2661   /* Mark the register as eliminable if we did no conversion and it was
2662      copied from memory at a fixed offset, and the arg pointer was not
2663      copied to a pseudo-reg.  If the arg pointer is a pseudo reg or the
2664      offset formed an invalid address, such memory-equivalences as we
2665      make here would screw up life analysis for it.  */
2666   if (data->nominal_mode == data->passed_mode
2667       && !did_conversion
2668       && data->stack_parm != 0
2669       && MEM_P (data->stack_parm)
2670       && data->locate.offset.var == 0
2671       && reg_mentioned_p (virtual_incoming_args_rtx,
2672                           XEXP (data->stack_parm, 0)))
2673     {
2674       rtx linsn = get_last_insn ();
2675       rtx sinsn, set;
2676
2677       /* Mark complex types separately.  */
2678       if (GET_CODE (parmreg) == CONCAT)
2679         {
2680           enum machine_mode submode
2681             = GET_MODE_INNER (GET_MODE (parmreg));
2682           int regnor = REGNO (XEXP (parmreg, 0));
2683           int regnoi = REGNO (XEXP (parmreg, 1));
2684           rtx stackr = adjust_address_nv (data->stack_parm, submode, 0);
2685           rtx stacki = adjust_address_nv (data->stack_parm, submode,
2686                                           GET_MODE_SIZE (submode));
2687
2688           /* Scan backwards for the set of the real and
2689              imaginary parts.  */
2690           for (sinsn = linsn; sinsn != 0;
2691                sinsn = prev_nonnote_insn (sinsn))
2692             {
2693               set = single_set (sinsn);
2694               if (set == 0)
2695                 continue;
2696
2697               if (SET_DEST (set) == regno_reg_rtx [regnoi])
2698                 REG_NOTES (sinsn)
2699                   = gen_rtx_EXPR_LIST (REG_EQUIV, stacki,
2700                                        REG_NOTES (sinsn));
2701               else if (SET_DEST (set) == regno_reg_rtx [regnor])
2702                 REG_NOTES (sinsn)
2703                   = gen_rtx_EXPR_LIST (REG_EQUIV, stackr,
2704                                        REG_NOTES (sinsn));
2705             }
2706         }
2707       else if ((set = single_set (linsn)) != 0
2708                && SET_DEST (set) == parmreg)
2709         REG_NOTES (linsn)
2710           = gen_rtx_EXPR_LIST (REG_EQUIV,
2711                                data->stack_parm, REG_NOTES (linsn));
2712     }
2713
2714   /* For pointer data type, suggest pointer register.  */
2715   if (POINTER_TYPE_P (TREE_TYPE (parm)))
2716     mark_reg_pointer (parmreg,
2717                       TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
2718 }
2719
2720 /* A subroutine of assign_parms.  Allocate stack space to hold the current
2721    parameter.  Get it there.  Perform all ABI specified conversions.  */
2722
2723 static void
2724 assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
2725                          struct assign_parm_data_one *data)
2726 {
2727   /* Value must be stored in the stack slot STACK_PARM during function
2728      execution.  */
2729   bool to_conversion = false;
2730
2731   if (data->promoted_mode != data->nominal_mode)
2732     {
2733       /* Conversion is required.  */
2734       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2735
2736       emit_move_insn (tempreg, validize_mem (data->entry_parm));
2737
2738       push_to_sequence (all->conversion_insns);
2739       to_conversion = true;
2740
2741       data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
2742                                           TYPE_UNSIGNED (TREE_TYPE (parm)));
2743
2744       if (data->stack_parm)
2745         /* ??? This may need a big-endian conversion on sparc64.  */
2746         data->stack_parm
2747           = adjust_address (data->stack_parm, data->nominal_mode, 0);
2748     }
2749
2750   if (data->entry_parm != data->stack_parm)
2751     {
2752       rtx src, dest;
2753
2754       if (data->stack_parm == 0)
2755         {
2756           data->stack_parm
2757             = assign_stack_local (GET_MODE (data->entry_parm),
2758                                   GET_MODE_SIZE (GET_MODE (data->entry_parm)),
2759                                   TYPE_ALIGN (data->passed_type));
2760           set_mem_attributes (data->stack_parm, parm, 1);
2761         }
2762
2763       dest = validize_mem (data->stack_parm);
2764       src = validize_mem (data->entry_parm);
2765
2766       if (MEM_P (src))
2767         {
2768           /* Use a block move to handle potentially misaligned entry_parm.  */
2769           if (!to_conversion)
2770             push_to_sequence (all->conversion_insns);
2771           to_conversion = true;
2772
2773           emit_block_move (dest, src,
2774                            GEN_INT (int_size_in_bytes (data->passed_type)),
2775                            BLOCK_OP_NORMAL);
2776         }
2777       else
2778         emit_move_insn (dest, src);
2779     }
2780
2781   if (to_conversion)
2782     {
2783       all->conversion_insns = get_insns ();
2784       end_sequence ();
2785     }
2786
2787   SET_DECL_RTL (parm, data->stack_parm);
2788 }
2789
2790 /* A subroutine of assign_parms.  If the ABI splits complex arguments, then
2791    undo the frobbing that we did in assign_parms_augmented_arg_list.  */
2792
2793 static void
2794 assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs)
2795 {
2796   tree parm;
2797   tree orig_fnargs = all->orig_fnargs;
2798
2799   for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm))
2800     {
2801       if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
2802           && targetm.calls.split_complex_arg (TREE_TYPE (parm)))
2803         {
2804           rtx tmp, real, imag;
2805           enum machine_mode inner = GET_MODE_INNER (DECL_MODE (parm));
2806
2807           real = DECL_RTL (fnargs);
2808           imag = DECL_RTL (TREE_CHAIN (fnargs));
2809           if (inner != GET_MODE (real))
2810             {
2811               real = gen_lowpart_SUBREG (inner, real);
2812               imag = gen_lowpart_SUBREG (inner, imag);
2813             }
2814
2815           if (TREE_ADDRESSABLE (parm))
2816             {
2817               rtx rmem, imem;
2818               HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (parm));
2819
2820               /* split_complex_arg put the real and imag parts in
2821                  pseudos.  Move them to memory.  */
2822               tmp = assign_stack_local (DECL_MODE (parm), size,
2823                                         TYPE_ALIGN (TREE_TYPE (parm)));
2824               set_mem_attributes (tmp, parm, 1);
2825               rmem = adjust_address_nv (tmp, inner, 0);
2826               imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
2827               push_to_sequence (all->conversion_insns);
2828               emit_move_insn (rmem, real);
2829               emit_move_insn (imem, imag);
2830               all->conversion_insns = get_insns ();
2831               end_sequence ();
2832             }
2833           else
2834             tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2835           SET_DECL_RTL (parm, tmp);
2836
2837           real = DECL_INCOMING_RTL (fnargs);
2838           imag = DECL_INCOMING_RTL (TREE_CHAIN (fnargs));
2839           if (inner != GET_MODE (real))
2840             {
2841               real = gen_lowpart_SUBREG (inner, real);
2842               imag = gen_lowpart_SUBREG (inner, imag);
2843             }
2844           tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2845           set_decl_incoming_rtl (parm, tmp);
2846           fnargs = TREE_CHAIN (fnargs);
2847         }
2848       else
2849         {
2850           SET_DECL_RTL (parm, DECL_RTL (fnargs));
2851           set_decl_incoming_rtl (parm, DECL_INCOMING_RTL (fnargs));
2852
2853           /* Set MEM_EXPR to the original decl, i.e. to PARM,
2854              instead of the copy of decl, i.e. FNARGS.  */
2855           if (DECL_INCOMING_RTL (parm) && MEM_P (DECL_INCOMING_RTL (parm)))
2856             set_mem_expr (DECL_INCOMING_RTL (parm), parm);
2857         }
2858
2859       fnargs = TREE_CHAIN (fnargs);
2860     }
2861 }
2862
2863 /* Assign RTL expressions to the function's parameters.  This may involve
2864    copying them into registers and using those registers as the DECL_RTL.  */
2865
2866 static void
2867 assign_parms (tree fndecl)
2868 {
2869   struct assign_parm_data_all all;
2870   tree fnargs, parm;
2871   rtx internal_arg_pointer;
2872
2873   /* If the reg that the virtual arg pointer will be translated into is
2874      not a fixed reg or is the stack pointer, make a copy of the virtual
2875      arg pointer, and address parms via the copy.  The frame pointer is
2876      considered fixed even though it is not marked as such.
2877
2878      The second time through, simply use ap to avoid generating rtx.  */
2879
2880   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
2881        || ! (fixed_regs[ARG_POINTER_REGNUM]
2882              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
2883     internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
2884   else
2885     internal_arg_pointer = virtual_incoming_args_rtx;
2886   current_function_internal_arg_pointer = internal_arg_pointer;
2887
2888   assign_parms_initialize_all (&all);
2889   fnargs = assign_parms_augmented_arg_list (&all);
2890
2891   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
2892     {
2893       struct assign_parm_data_one data;
2894
2895       /* Extract the type of PARM; adjust it according to ABI.  */
2896       assign_parm_find_data_types (&all, parm, &data);
2897
2898       /* Early out for errors and void parameters.  */
2899       if (data.passed_mode == VOIDmode)
2900         {
2901           SET_DECL_RTL (parm, const0_rtx);
2902           DECL_INCOMING_RTL (parm) = DECL_RTL (parm);
2903           continue;
2904         }
2905
2906       if (current_function_stdarg && !TREE_CHAIN (parm))
2907         assign_parms_setup_varargs (&all, &data, false);
2908
2909       /* Find out where the parameter arrives in this function.  */
2910       assign_parm_find_entry_rtl (&all, &data);
2911
2912       /* Find out where stack space for this parameter might be.  */
2913       if (assign_parm_is_stack_parm (&all, &data))
2914         {
2915           assign_parm_find_stack_rtl (parm, &data);
2916           assign_parm_adjust_entry_rtl (&data);
2917         }
2918
2919       /* Record permanently how this parm was passed.  */
2920       set_decl_incoming_rtl (parm, data.entry_parm);
2921
2922       /* Update info on where next arg arrives in registers.  */
2923       FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
2924                             data.passed_type, data.named_arg);
2925
2926       assign_parm_adjust_stack_rtl (&data);
2927
2928       if (assign_parm_setup_block_p (&data))
2929         assign_parm_setup_block (&all, parm, &data);
2930       else if (data.passed_pointer || use_register_for_decl (parm))
2931         assign_parm_setup_reg (&all, parm, &data);
2932       else
2933         assign_parm_setup_stack (&all, parm, &data);
2934     }
2935
2936   if (targetm.calls.split_complex_arg && fnargs != all.orig_fnargs)
2937     assign_parms_unsplit_complex (&all, fnargs);
2938
2939   /* Output all parameter conversion instructions (possibly including calls)
2940      now that all parameters have been copied out of hard registers.  */
2941   emit_insn (all.conversion_insns);
2942
2943   /* If we are receiving a struct value address as the first argument, set up
2944      the RTL for the function result. As this might require code to convert
2945      the transmitted address to Pmode, we do this here to ensure that possible
2946      preliminary conversions of the address have been emitted already.  */
2947   if (all.function_result_decl)
2948     {
2949       tree result = DECL_RESULT (current_function_decl);
2950       rtx addr = DECL_RTL (all.function_result_decl);
2951       rtx x;
2952
2953       if (DECL_BY_REFERENCE (result))
2954         x = addr;
2955       else
2956         {
2957           addr = convert_memory_address (Pmode, addr);
2958           x = gen_rtx_MEM (DECL_MODE (result), addr);
2959           set_mem_attributes (x, result, 1);
2960         }
2961       SET_DECL_RTL (result, x);
2962     }
2963
2964   /* We have aligned all the args, so add space for the pretend args.  */
2965   current_function_pretend_args_size = all.pretend_args_size;
2966   all.stack_args_size.constant += all.extra_pretend_bytes;
2967   current_function_args_size = all.stack_args_size.constant;
2968
2969   /* Adjust function incoming argument size for alignment and
2970      minimum length.  */
2971
2972 #ifdef REG_PARM_STACK_SPACE
2973   current_function_args_size = MAX (current_function_args_size,
2974                                     REG_PARM_STACK_SPACE (fndecl));
2975 #endif
2976
2977   current_function_args_size
2978     = ((current_function_args_size + STACK_BYTES - 1)
2979        / STACK_BYTES) * STACK_BYTES;
2980
2981 #ifdef ARGS_GROW_DOWNWARD
2982   current_function_arg_offset_rtx
2983     = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
2984        : expand_expr (size_diffop (all.stack_args_size.var,
2985                                    size_int (-all.stack_args_size.constant)),
2986                       NULL_RTX, VOIDmode, 0));
2987 #else
2988   current_function_arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
2989 #endif
2990
2991   /* See how many bytes, if any, of its args a function should try to pop
2992      on return.  */
2993
2994   current_function_pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
2995                                                  current_function_args_size);
2996
2997   /* For stdarg.h function, save info about
2998      regs and stack space used by the named args.  */
2999
3000   current_function_args_info = all.args_so_far;
3001
3002   /* Set the rtx used for the function return value.  Put this in its
3003      own variable so any optimizers that need this information don't have
3004      to include tree.h.  Do this here so it gets done when an inlined
3005      function gets output.  */
3006
3007   current_function_return_rtx
3008     = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
3009        ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
3010
3011   /* If scalar return value was computed in a pseudo-reg, or was a named
3012      return value that got dumped to the stack, copy that to the hard
3013      return register.  */
3014   if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
3015     {
3016       tree decl_result = DECL_RESULT (fndecl);
3017       rtx decl_rtl = DECL_RTL (decl_result);
3018
3019       if (REG_P (decl_rtl)
3020           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
3021           : DECL_REGISTER (decl_result))
3022         {
3023           rtx real_decl_rtl;
3024
3025 #ifdef FUNCTION_OUTGOING_VALUE
3026           real_decl_rtl = FUNCTION_OUTGOING_VALUE (TREE_TYPE (decl_result),
3027                                                    fndecl);
3028 #else
3029           real_decl_rtl = FUNCTION_VALUE (TREE_TYPE (decl_result),
3030                                           fndecl);
3031 #endif
3032           REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
3033           /* The delay slot scheduler assumes that current_function_return_rtx
3034              holds the hard register containing the return value, not a
3035              temporary pseudo.  */
3036           current_function_return_rtx = real_decl_rtl;
3037         }
3038     }
3039 }
3040
3041 /* A subroutine of gimplify_parameters, invoked via walk_tree.
3042    For all seen types, gimplify their sizes.  */
3043
3044 static tree
3045 gimplify_parm_type (tree *tp, int *walk_subtrees, void *data)
3046 {
3047   tree t = *tp;
3048
3049   *walk_subtrees = 0;
3050   if (TYPE_P (t))
3051     {
3052       if (POINTER_TYPE_P (t))
3053         *walk_subtrees = 1;
3054       else if (TYPE_SIZE (t) && !TREE_CONSTANT (TYPE_SIZE (t))
3055                && !TYPE_SIZES_GIMPLIFIED (t))
3056         {
3057           gimplify_type_sizes (t, (tree *) data);
3058           *walk_subtrees = 1;
3059         }
3060     }
3061
3062   return NULL;
3063 }
3064
3065 /* Gimplify the parameter list for current_function_decl.  This involves
3066    evaluating SAVE_EXPRs of variable sized parameters and generating code
3067    to implement callee-copies reference parameters.  Returns a list of
3068    statements to add to the beginning of the function, or NULL if nothing
3069    to do.  */
3070
3071 tree
3072 gimplify_parameters (void)
3073 {
3074   struct assign_parm_data_all all;
3075   tree fnargs, parm, stmts = NULL;
3076
3077   assign_parms_initialize_all (&all);
3078   fnargs = assign_parms_augmented_arg_list (&all);
3079
3080   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
3081     {
3082       struct assign_parm_data_one data;
3083
3084       /* Extract the type of PARM; adjust it according to ABI.  */
3085       assign_parm_find_data_types (&all, parm, &data);
3086
3087       /* Early out for errors and void parameters.  */
3088       if (data.passed_mode == VOIDmode || DECL_SIZE (parm) == NULL)
3089         continue;
3090
3091       /* Update info on where next arg arrives in registers.  */
3092       FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
3093                             data.passed_type, data.named_arg);
3094
3095       /* ??? Once upon a time variable_size stuffed parameter list
3096          SAVE_EXPRs (amongst others) onto a pending sizes list.  This
3097          turned out to be less than manageable in the gimple world.
3098          Now we have to hunt them down ourselves.  */
3099       walk_tree_without_duplicates (&data.passed_type,
3100                                     gimplify_parm_type, &stmts);
3101
3102       if (!TREE_CONSTANT (DECL_SIZE (parm)))
3103         {
3104           gimplify_one_sizepos (&DECL_SIZE (parm), &stmts);
3105           gimplify_one_sizepos (&DECL_SIZE_UNIT (parm), &stmts);
3106         }
3107
3108       if (data.passed_pointer)
3109         {
3110           tree type = TREE_TYPE (data.passed_type);
3111           if (reference_callee_copied (&all.args_so_far, TYPE_MODE (type),
3112                                        type, data.named_arg))
3113             {
3114               tree local, t;
3115
3116               /* For constant sized objects, this is trivial; for
3117                  variable-sized objects, we have to play games.  */
3118               if (TREE_CONSTANT (DECL_SIZE (parm)))
3119                 {
3120                   local = create_tmp_var (type, get_name (parm));
3121                   DECL_IGNORED_P (local) = 0;
3122                 }
3123               else
3124                 {
3125                   tree ptr_type, addr, args;
3126
3127                   ptr_type = build_pointer_type (type);
3128                   addr = create_tmp_var (ptr_type, get_name (parm));
3129                   DECL_IGNORED_P (addr) = 0;
3130                   local = build_fold_indirect_ref (addr);
3131
3132                   args = tree_cons (NULL, DECL_SIZE_UNIT (parm), NULL);
3133                   t = built_in_decls[BUILT_IN_ALLOCA];
3134                   t = build_function_call_expr (t, args);
3135                   t = fold_convert (ptr_type, t);
3136                   t = build2 (MODIFY_EXPR, void_type_node, addr, t);
3137                   gimplify_and_add (t, &stmts);
3138                 }
3139
3140               t = build2 (MODIFY_EXPR, void_type_node, local, parm);
3141               gimplify_and_add (t, &stmts);
3142
3143               DECL_VALUE_EXPR (parm) = local;
3144             }
3145         }
3146     }
3147
3148   return stmts;
3149 }
3150 \f
3151 /* Indicate whether REGNO is an incoming argument to the current function
3152    that was promoted to a wider mode.  If so, return the RTX for the
3153    register (to get its mode).  PMODE and PUNSIGNEDP are set to the mode
3154    that REGNO is promoted from and whether the promotion was signed or
3155    unsigned.  */
3156
3157 rtx
3158 promoted_input_arg (unsigned int regno, enum machine_mode *pmode, int *punsignedp)
3159 {
3160   tree arg;
3161
3162   for (arg = DECL_ARGUMENTS (current_function_decl); arg;
3163        arg = TREE_CHAIN (arg))
3164     if (REG_P (DECL_INCOMING_RTL (arg))
3165         && REGNO (DECL_INCOMING_RTL (arg)) == regno
3166         && TYPE_MODE (DECL_ARG_TYPE (arg)) == TYPE_MODE (TREE_TYPE (arg)))
3167       {
3168         enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg));
3169         int unsignedp = TYPE_UNSIGNED (TREE_TYPE (arg));
3170
3171         mode = promote_mode (TREE_TYPE (arg), mode, &unsignedp, 1);
3172         if (mode == GET_MODE (DECL_INCOMING_RTL (arg))
3173             && mode != DECL_MODE (arg))
3174           {
3175             *pmode = DECL_MODE (arg);
3176             *punsignedp = unsignedp;
3177             return DECL_INCOMING_RTL (arg);
3178           }
3179       }
3180
3181   return 0;
3182 }
3183
3184 \f
3185 /* Compute the size and offset from the start of the stacked arguments for a
3186    parm passed in mode PASSED_MODE and with type TYPE.
3187
3188    INITIAL_OFFSET_PTR points to the current offset into the stacked
3189    arguments.
3190
3191    The starting offset and size for this parm are returned in
3192    LOCATE->OFFSET and LOCATE->SIZE, respectively.  When IN_REGS is
3193    nonzero, the offset is that of stack slot, which is returned in
3194    LOCATE->SLOT_OFFSET.  LOCATE->ALIGNMENT_PAD is the amount of
3195    padding required from the initial offset ptr to the stack slot.
3196
3197    IN_REGS is nonzero if the argument will be passed in registers.  It will
3198    never be set if REG_PARM_STACK_SPACE is not defined.
3199
3200    FNDECL is the function in which the argument was defined.
3201
3202    There are two types of rounding that are done.  The first, controlled by
3203    FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
3204    list to be aligned to the specific boundary (in bits).  This rounding
3205    affects the initial and starting offsets, but not the argument size.
3206
3207    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3208    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3209    initial offset is not affected by this rounding, while the size always
3210    is and the starting offset may be.  */
3211
3212 /*  LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
3213     INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
3214     callers pass in the total size of args so far as
3215     INITIAL_OFFSET_PTR.  LOCATE->SIZE is always positive.  */
3216
3217 void
3218 locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
3219                      int partial, tree fndecl ATTRIBUTE_UNUSED,
3220                      struct args_size *initial_offset_ptr,
3221                      struct locate_and_pad_arg_data *locate)
3222 {
3223   tree sizetree;
3224   enum direction where_pad;
3225   int boundary;
3226   int reg_parm_stack_space = 0;
3227   int part_size_in_regs;
3228
3229 #ifdef REG_PARM_STACK_SPACE
3230   reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3231
3232   /* If we have found a stack parm before we reach the end of the
3233      area reserved for registers, skip that area.  */
3234   if (! in_regs)
3235     {
3236       if (reg_parm_stack_space > 0)
3237         {
3238           if (initial_offset_ptr->var)
3239             {
3240               initial_offset_ptr->var
3241                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3242                               ssize_int (reg_parm_stack_space));
3243               initial_offset_ptr->constant = 0;
3244             }
3245           else if (initial_offset_ptr->constant < reg_parm_stack_space)
3246             initial_offset_ptr->constant = reg_parm_stack_space;
3247         }
3248     }
3249 #endif /* REG_PARM_STACK_SPACE */
3250
3251   part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
3252
3253   sizetree
3254     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3255   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3256   boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
3257   locate->where_pad = where_pad;
3258   locate->boundary = boundary;
3259
3260 #ifdef ARGS_GROW_DOWNWARD
3261   locate->slot_offset.constant = -initial_offset_ptr->constant;
3262   if (initial_offset_ptr->var)
3263     locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int (0),
3264                                           initial_offset_ptr->var);
3265
3266   {
3267     tree s2 = sizetree;
3268     if (where_pad != none
3269         && (!host_integerp (sizetree, 1)
3270             || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3271       s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
3272     SUB_PARM_SIZE (locate->slot_offset, s2);
3273   }
3274
3275   locate->slot_offset.constant += part_size_in_regs;
3276
3277   if (!in_regs
3278 #ifdef REG_PARM_STACK_SPACE
3279       || REG_PARM_STACK_SPACE (fndecl) > 0
3280 #endif
3281      )
3282     pad_to_arg_alignment (&locate->slot_offset, boundary,
3283                           &locate->alignment_pad);
3284
3285   locate->size.constant = (-initial_offset_ptr->constant
3286                            - locate->slot_offset.constant);
3287   if (initial_offset_ptr->var)
3288     locate->size.var = size_binop (MINUS_EXPR,
3289                                    size_binop (MINUS_EXPR,
3290                                                ssize_int (0),
3291                                                initial_offset_ptr->var),
3292                                    locate->slot_offset.var);
3293
3294   /* Pad_below needs the pre-rounded size to know how much to pad
3295      below.  */
3296   locate->offset = locate->slot_offset;
3297   if (where_pad == downward)
3298     pad_below (&locate->offset, passed_mode, sizetree);
3299
3300 #else /* !ARGS_GROW_DOWNWARD */
3301   if (!in_regs
3302 #ifdef REG_PARM_STACK_SPACE
3303       || REG_PARM_STACK_SPACE (fndecl) > 0
3304 #endif
3305       )
3306     pad_to_arg_alignment (initial_offset_ptr, boundary,
3307                           &locate->alignment_pad);
3308   locate->slot_offset = *initial_offset_ptr;
3309
3310 #ifdef PUSH_ROUNDING
3311   if (passed_mode != BLKmode)
3312     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3313 #endif
3314
3315   /* Pad_below needs the pre-rounded size to know how much to pad below
3316      so this must be done before rounding up.  */
3317   locate->offset = locate->slot_offset;
3318   if (where_pad == downward)
3319     pad_below (&locate->offset, passed_mode, sizetree);
3320
3321   if (where_pad != none
3322       && (!host_integerp (sizetree, 1)
3323           || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3324     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3325
3326   ADD_PARM_SIZE (locate->size, sizetree);
3327
3328   locate->size.constant -= part_size_in_regs;
3329 #endif /* ARGS_GROW_DOWNWARD */
3330 }
3331
3332 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3333    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
3334
3335 static void
3336 pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
3337                       struct args_size *alignment_pad)
3338 {
3339   tree save_var = NULL_TREE;
3340   HOST_WIDE_INT save_constant = 0;
3341   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3342   HOST_WIDE_INT sp_offset = STACK_POINTER_OFFSET;
3343
3344 #ifdef SPARC_STACK_BOUNDARY_HACK
3345   /* The sparc port has a bug.  It sometimes claims a STACK_BOUNDARY
3346      higher than the real alignment of %sp.  However, when it does this,
3347      the alignment of %sp+STACK_POINTER_OFFSET will be STACK_BOUNDARY.
3348      This is a temporary hack while the sparc port is fixed.  */
3349   if (SPARC_STACK_BOUNDARY_HACK)
3350     sp_offset = 0;
3351 #endif
3352
3353   if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
3354     {
3355       save_var = offset_ptr->var;
3356       save_constant = offset_ptr->constant;
3357     }
3358
3359   alignment_pad->var = NULL_TREE;
3360   alignment_pad->constant = 0;
3361
3362   if (boundary > BITS_PER_UNIT)
3363     {
3364       if (offset_ptr->var)
3365         {
3366           tree sp_offset_tree = ssize_int (sp_offset);
3367           tree offset = size_binop (PLUS_EXPR,
3368                                     ARGS_SIZE_TREE (*offset_ptr),
3369                                     sp_offset_tree);
3370 #ifdef ARGS_GROW_DOWNWARD
3371           tree rounded = round_down (offset, boundary / BITS_PER_UNIT);
3372 #else
3373           tree rounded = round_up   (offset, boundary / BITS_PER_UNIT);
3374 #endif
3375
3376           offset_ptr->var = size_binop (MINUS_EXPR, rounded, sp_offset_tree);
3377           /* ARGS_SIZE_TREE includes constant term.  */
3378           offset_ptr->constant = 0;
3379           if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
3380             alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
3381                                              save_var);
3382         }
3383       else
3384         {
3385           offset_ptr->constant = -sp_offset +
3386 #ifdef ARGS_GROW_DOWNWARD
3387             FLOOR_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3388 #else
3389             CEIL_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3390 #endif
3391             if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
3392               alignment_pad->constant = offset_ptr->constant - save_constant;
3393         }
3394     }
3395 }
3396
3397 static void
3398 pad_below (struct args_size *offset_ptr, enum machine_mode passed_mode, tree sizetree)
3399 {
3400   if (passed_mode != BLKmode)
3401     {
3402       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3403         offset_ptr->constant
3404           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3405                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3406               - GET_MODE_SIZE (passed_mode));
3407     }
3408   else
3409     {
3410       if (TREE_CODE (sizetree) != INTEGER_CST
3411           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3412         {
3413           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
3414           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3415           /* Add it in.  */
3416           ADD_PARM_SIZE (*offset_ptr, s2);
3417           SUB_PARM_SIZE (*offset_ptr, sizetree);
3418         }
3419     }
3420 }
3421 \f
3422 /* Walk the tree of blocks describing the binding levels within a function
3423    and warn about variables the might be killed by setjmp or vfork.
3424    This is done after calling flow_analysis and before global_alloc
3425    clobbers the pseudo-regs to hard regs.  */
3426
3427 void
3428 setjmp_vars_warning (tree block)
3429 {
3430   tree decl, sub;
3431
3432   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3433     {
3434       if (TREE_CODE (decl) == VAR_DECL
3435           && DECL_RTL_SET_P (decl)
3436           && REG_P (DECL_RTL (decl))
3437           && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3438         warning (0, "%Jvariable %qD might be clobbered by %<longjmp%>"
3439                  " or %<vfork%>",
3440                  decl, decl);
3441     }
3442
3443   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
3444     setjmp_vars_warning (sub);
3445 }
3446
3447 /* Do the appropriate part of setjmp_vars_warning
3448    but for arguments instead of local variables.  */
3449
3450 void
3451 setjmp_args_warning (void)
3452 {
3453   tree decl;
3454   for (decl = DECL_ARGUMENTS (current_function_decl);
3455        decl; decl = TREE_CHAIN (decl))
3456     if (DECL_RTL (decl) != 0
3457         && REG_P (DECL_RTL (decl))
3458         && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3459       warning (0, "%Jargument %qD might be clobbered by %<longjmp%> or %<vfork%>",
3460                decl, decl);
3461 }
3462
3463 \f
3464 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
3465    and create duplicate blocks.  */
3466 /* ??? Need an option to either create block fragments or to create
3467    abstract origin duplicates of a source block.  It really depends
3468    on what optimization has been performed.  */
3469
3470 void
3471 reorder_blocks (void)
3472 {
3473   tree block = DECL_INITIAL (current_function_decl);
3474   VEC(tree,heap) *block_stack;
3475
3476   if (block == NULL_TREE)
3477     return;
3478
3479   block_stack = VEC_alloc (tree, heap, 10);
3480
3481   /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
3482   clear_block_marks (block);
3483
3484   /* Prune the old trees away, so that they don't get in the way.  */
3485   BLOCK_SUBBLOCKS (block) = NULL_TREE;
3486   BLOCK_CHAIN (block) = NULL_TREE;
3487
3488   /* Recreate the block tree from the note nesting.  */
3489   reorder_blocks_1 (get_insns (), block, &block_stack);
3490   BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
3491
3492   /* Remove deleted blocks from the block fragment chains.  */
3493   reorder_fix_fragments (block);
3494
3495   VEC_free (tree, heap, block_stack);
3496 }
3497
3498 /* Helper function for reorder_blocks.  Reset TREE_ASM_WRITTEN.  */
3499
3500 void
3501 clear_block_marks (tree block)
3502 {
3503   while (block)
3504     {
3505       TREE_ASM_WRITTEN (block) = 0;
3506       clear_block_marks (BLOCK_SUBBLOCKS (block));
3507       block = BLOCK_CHAIN (block);
3508     }
3509 }
3510
3511 static void
3512 reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
3513 {
3514   rtx insn;
3515
3516   for (insn = insns; insn; insn = NEXT_INSN (insn))
3517     {
3518       if (NOTE_P (insn))
3519         {
3520           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
3521             {
3522               tree block = NOTE_BLOCK (insn);
3523
3524               /* If we have seen this block before, that means it now
3525                  spans multiple address regions.  Create a new fragment.  */
3526               if (TREE_ASM_WRITTEN (block))
3527                 {
3528                   tree new_block = copy_node (block);
3529                   tree origin;
3530
3531                   origin = (BLOCK_FRAGMENT_ORIGIN (block)
3532                             ? BLOCK_FRAGMENT_ORIGIN (block)
3533                             : block);
3534                   BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
3535                   BLOCK_FRAGMENT_CHAIN (new_block)
3536                     = BLOCK_FRAGMENT_CHAIN (origin);
3537                   BLOCK_FRAGMENT_CHAIN (origin) = new_block;
3538
3539                   NOTE_BLOCK (insn) = new_block;
3540                   block = new_block;
3541                 }
3542
3543               BLOCK_SUBBLOCKS (block) = 0;
3544               TREE_ASM_WRITTEN (block) = 1;
3545               /* When there's only one block for the entire function,
3546                  current_block == block and we mustn't do this, it
3547                  will cause infinite recursion.  */
3548               if (block != current_block)
3549                 {
3550                   BLOCK_SUPERCONTEXT (block) = current_block;
3551                   BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
3552                   BLOCK_SUBBLOCKS (current_block) = block;
3553                   current_block = block;
3554                 }
3555               VEC_safe_push (tree, heap, *p_block_stack, block);
3556             }
3557           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
3558             {
3559               NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack);
3560               BLOCK_SUBBLOCKS (current_block)
3561                 = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
3562               current_block = BLOCK_SUPERCONTEXT (current_block);
3563             }
3564         }
3565     }
3566 }
3567
3568 /* Rationalize BLOCK_FRAGMENT_ORIGIN.  If an origin block no longer
3569    appears in the block tree, select one of the fragments to become
3570    the new origin block.  */
3571
3572 static void
3573 reorder_fix_fragments (tree block)
3574 {
3575   while (block)
3576     {
3577       tree dup_origin = BLOCK_FRAGMENT_ORIGIN (block);
3578       tree new_origin = NULL_TREE;
3579
3580       if (dup_origin)
3581         {
3582           if (! TREE_ASM_WRITTEN (dup_origin))
3583             {
3584               new_origin = BLOCK_FRAGMENT_CHAIN (dup_origin);
3585
3586               /* Find the first of the remaining fragments.  There must
3587                  be at least one -- the current block.  */
3588               while (! TREE_ASM_WRITTEN (new_origin))
3589                 new_origin = BLOCK_FRAGMENT_CHAIN (new_origin);
3590               BLOCK_FRAGMENT_ORIGIN (new_origin) = NULL_TREE;
3591             }
3592         }
3593       else if (! dup_origin)
3594         new_origin = block;
3595
3596       /* Re-root the rest of the fragments to the new origin.  In the
3597          case that DUP_ORIGIN was null, that means BLOCK was the origin
3598          of a chain of fragments and we want to remove those fragments
3599          that didn't make it to the output.  */
3600       if (new_origin)
3601         {
3602           tree *pp = &BLOCK_FRAGMENT_CHAIN (new_origin);
3603           tree chain = *pp;
3604
3605           while (chain)
3606             {
3607               if (TREE_ASM_WRITTEN (chain))
3608                 {
3609                   BLOCK_FRAGMENT_ORIGIN (chain) = new_origin;
3610                   *pp = chain;
3611                   pp = &BLOCK_FRAGMENT_CHAIN (chain);
3612                 }
3613               chain = BLOCK_FRAGMENT_CHAIN (chain);
3614             }
3615           *pp = NULL_TREE;
3616         }
3617
3618       reorder_fix_fragments (BLOCK_SUBBLOCKS (block));
3619       block = BLOCK_CHAIN (block);
3620     }
3621 }
3622
3623 /* Reverse the order of elements in the chain T of blocks,
3624    and return the new head of the chain (old last element).  */
3625
3626 tree
3627 blocks_nreverse (tree t)
3628 {
3629   tree prev = 0, decl, next;
3630   for (decl = t; decl; decl = next)
3631     {
3632       next = BLOCK_CHAIN (decl);
3633       BLOCK_CHAIN (decl) = prev;
3634       prev = decl;
3635     }
3636   return prev;
3637 }
3638
3639 /* Count the subblocks of the list starting with BLOCK.  If VECTOR is
3640    non-NULL, list them all into VECTOR, in a depth-first preorder
3641    traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
3642    blocks.  */
3643
3644 static int
3645 all_blocks (tree block, tree *vector)
3646 {
3647   int n_blocks = 0;
3648
3649   while (block)
3650     {
3651       TREE_ASM_WRITTEN (block) = 0;
3652
3653       /* Record this block.  */
3654       if (vector)
3655         vector[n_blocks] = block;
3656
3657       ++n_blocks;
3658
3659       /* Record the subblocks, and their subblocks...  */
3660       n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
3661                               vector ? vector + n_blocks : 0);
3662       block = BLOCK_CHAIN (block);
3663     }
3664
3665   return n_blocks;
3666 }
3667
3668 /* Return a vector containing all the blocks rooted at BLOCK.  The
3669    number of elements in the vector is stored in N_BLOCKS_P.  The
3670    vector is dynamically allocated; it is the caller's responsibility
3671    to call `free' on the pointer returned.  */
3672
3673 static tree *
3674 get_block_vector (tree block, int *n_blocks_p)
3675 {
3676   tree *block_vector;
3677
3678   *n_blocks_p = all_blocks (block, NULL);
3679   block_vector = xmalloc (*n_blocks_p * sizeof (tree));
3680   all_blocks (block, block_vector);
3681
3682   return block_vector;
3683 }
3684
3685 static GTY(()) int next_block_index = 2;
3686
3687 /* Set BLOCK_NUMBER for all the blocks in FN.  */
3688
3689 void
3690 number_blocks (tree fn)
3691 {
3692   int i;
3693   int n_blocks;
3694   tree *block_vector;
3695
3696   /* For SDB and XCOFF debugging output, we start numbering the blocks
3697      from 1 within each function, rather than keeping a running
3698      count.  */
3699 #if defined (SDB_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3700   if (write_symbols == SDB_DEBUG || write_symbols == XCOFF_DEBUG)
3701     next_block_index = 1;
3702 #endif
3703
3704   block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
3705
3706   /* The top-level BLOCK isn't numbered at all.  */
3707   for (i = 1; i < n_blocks; ++i)
3708     /* We number the blocks from two.  */
3709     BLOCK_NUMBER (block_vector[i]) = next_block_index++;
3710
3711   free (block_vector);
3712
3713   return;
3714 }
3715
3716 /* If VAR is present in a subblock of BLOCK, return the subblock.  */
3717
3718 tree
3719 debug_find_var_in_block_tree (tree var, tree block)
3720 {
3721   tree t;
3722
3723   for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
3724     if (t == var)
3725       return block;
3726
3727   for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
3728     {
3729       tree ret = debug_find_var_in_block_tree (var, t);
3730       if (ret)
3731         return ret;
3732     }
3733
3734   return NULL_TREE;
3735 }
3736 \f
3737 /* Allocate a function structure for FNDECL and set its contents
3738    to the defaults.  */
3739
3740 void
3741 allocate_struct_function (tree fndecl)
3742 {
3743   tree result;
3744   tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;
3745
3746   cfun = ggc_alloc_cleared (sizeof (struct function));
3747
3748   cfun->stack_alignment_needed = STACK_BOUNDARY;
3749   cfun->preferred_stack_boundary = STACK_BOUNDARY;
3750
3751   current_function_funcdef_no = funcdef_no++;
3752
3753   cfun->function_frequency = FUNCTION_FREQUENCY_NORMAL;
3754
3755   init_eh_for_function ();
3756
3757   lang_hooks.function.init (cfun);
3758   if (init_machine_status)
3759     cfun->machine = (*init_machine_status) ();
3760
3761   if (fndecl == NULL)
3762     return;
3763
3764   DECL_STRUCT_FUNCTION (fndecl) = cfun;
3765   cfun->decl = fndecl;
3766
3767   result = DECL_RESULT (fndecl);
3768   if (aggregate_value_p (result, fndecl))
3769     {
3770 #ifdef PCC_STATIC_STRUCT_RETURN
3771       current_function_returns_pcc_struct = 1;
3772 #endif
3773       current_function_returns_struct = 1;
3774     }
3775
3776   current_function_returns_pointer = POINTER_TYPE_P (TREE_TYPE (result));
3777
3778   current_function_stdarg
3779     = (fntype
3780        && TYPE_ARG_TYPES (fntype) != 0
3781        && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3782            != void_type_node));
3783
3784   /* Assume all registers in stdarg functions need to be saved.  */
3785   cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
3786   cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
3787 }
3788
3789 /* Reset cfun, and other non-struct-function variables to defaults as
3790    appropriate for emitting rtl at the start of a function.  */
3791
3792 static void
3793 prepare_function_start (tree fndecl)
3794 {
3795   if (fndecl && DECL_STRUCT_FUNCTION (fndecl))
3796     cfun = DECL_STRUCT_FUNCTION (fndecl);
3797   else
3798     allocate_struct_function (fndecl);
3799   init_emit ();
3800   init_varasm_status (cfun);
3801   init_expr ();
3802
3803   cse_not_expected = ! optimize;
3804
3805   /* Caller save not needed yet.  */
3806   caller_save_needed = 0;
3807
3808   /* We haven't done register allocation yet.  */
3809   reg_renumber = 0;
3810
3811   /* Indicate that we have not instantiated virtual registers yet.  */
3812   virtuals_instantiated = 0;
3813
3814   /* Indicate that we want CONCATs now.  */
3815   generating_concat_p = 1;
3816
3817   /* Indicate we have no need of a frame pointer yet.  */
3818   frame_pointer_needed = 0;
3819 }
3820
3821 /* Initialize the rtl expansion mechanism so that we can do simple things
3822    like generate sequences.  This is used to provide a context during global
3823    initialization of some passes.  */
3824 void
3825 init_dummy_function_start (void)
3826 {
3827   prepare_function_start (NULL);
3828 }
3829
3830 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
3831    and initialize static variables for generating RTL for the statements
3832    of the function.  */
3833
3834 void
3835 init_function_start (tree subr)
3836 {
3837   prepare_function_start (subr);
3838
3839   /* Prevent ever trying to delete the first instruction of a
3840      function.  Also tell final how to output a linenum before the
3841      function prologue.  Note linenums could be missing, e.g. when
3842      compiling a Java .class file.  */
3843   if (! DECL_IS_BUILTIN (subr))
3844     emit_line_note (DECL_SOURCE_LOCATION (subr));
3845
3846   /* Make sure first insn is a note even if we don't want linenums.
3847      This makes sure the first insn will never be deleted.
3848      Also, final expects a note to appear there.  */
3849   emit_note (NOTE_INSN_DELETED);
3850
3851   /* Warn if this value is an aggregate type,
3852      regardless of which calling convention we are using for it.  */
3853   if (AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
3854     warning (OPT_Waggregate_return, "function returns an aggregate");
3855 }
3856
3857 /* Make sure all values used by the optimization passes have sane
3858    defaults.  */
3859 void
3860 init_function_for_compilation (void)
3861 {
3862   reg_renumber = 0;
3863
3864   /* No prologue/epilogue insns yet.  */
3865   VARRAY_GROW (prologue, 0);
3866   VARRAY_GROW (epilogue, 0);
3867   VARRAY_GROW (sibcall_epilogue, 0);
3868 }
3869
3870 void
3871 expand_main_function (void)
3872 {
3873 #ifdef FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN
3874   if (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN)
3875     {
3876       int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
3877       rtx tmp, seq;
3878
3879       start_sequence ();
3880       /* Forcibly align the stack.  */
3881 #ifdef STACK_GROWS_DOWNWARD
3882       tmp = expand_simple_binop (Pmode, AND, stack_pointer_rtx, GEN_INT(-align),
3883                                  stack_pointer_rtx, 1, OPTAB_WIDEN);
3884 #else
3885       tmp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
3886                                  GEN_INT (align - 1), NULL_RTX, 1, OPTAB_WIDEN);
3887       tmp = expand_simple_binop (Pmode, AND, tmp, GEN_INT (-align),
3888                                  stack_pointer_rtx, 1, OPTAB_WIDEN);
3889 #endif
3890       if (tmp != stack_pointer_rtx)
3891         emit_move_insn (stack_pointer_rtx, tmp);
3892
3893       /* Enlist allocate_dynamic_stack_space to pick up the pieces.  */
3894       tmp = force_reg (Pmode, const0_rtx);
3895       allocate_dynamic_stack_space (tmp, NULL_RTX, BIGGEST_ALIGNMENT);
3896       seq = get_insns ();
3897       end_sequence ();
3898
3899       for (tmp = get_last_insn (); tmp; tmp = PREV_INSN (tmp))
3900         if (NOTE_P (tmp) && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_FUNCTION_BEG)
3901           break;
3902       if (tmp)
3903         emit_insn_before (seq, tmp);
3904       else
3905         emit_insn (seq);
3906     }
3907 #endif
3908
3909 #if (defined(INVOKE__main)                              \
3910      || (!defined(HAS_INIT_SECTION)                     \
3911          && !defined(INIT_SECTION_ASM_OP)               \
3912          && !defined(INIT_ARRAY_SECTION_ASM_OP)))
3913   emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
3914 #endif
3915 }
3916 \f
3917 /* Start the RTL for a new function, and set variables used for
3918    emitting RTL.
3919    SUBR is the FUNCTION_DECL node.
3920    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
3921    the function's parameters, which must be run at any return statement.  */
3922
3923 void
3924 expand_function_start (tree subr)
3925 {
3926   /* Make sure volatile mem refs aren't considered
3927      valid operands of arithmetic insns.  */
3928   init_recog_no_volatile ();
3929
3930   current_function_profile
3931     = (profile_flag
3932        && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
3933
3934   current_function_limit_stack
3935     = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
3936
3937   /* Make the label for return statements to jump to.  Do not special
3938      case machines with special return instructions -- they will be
3939      handled later during jump, ifcvt, or epilogue creation.  */
3940   return_label = gen_label_rtx ();
3941
3942   /* Initialize rtx used to return the value.  */
3943   /* Do this before assign_parms so that we copy the struct value address
3944      before any library calls that assign parms might generate.  */
3945
3946   /* Decide whether to return the value in memory or in a register.  */
3947   if (aggregate_value_p (DECL_RESULT (subr), subr))
3948     {
3949       /* Returning something that won't go in a register.  */
3950       rtx value_address = 0;
3951
3952 #ifdef PCC_STATIC_STRUCT_RETURN
3953       if (current_function_returns_pcc_struct)
3954         {
3955           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
3956           value_address = assemble_static_space (size);
3957         }
3958       else
3959 #endif
3960         {
3961           rtx sv = targetm.calls.struct_value_rtx (TREE_TYPE (subr), 1);
3962           /* Expect to be passed the address of a place to store the value.
3963              If it is passed as an argument, assign_parms will take care of
3964              it.  */
3965           if (sv)
3966             {
3967               value_address = gen_reg_rtx (Pmode);
3968               emit_move_insn (value_address, sv);
3969             }
3970         }
3971       if (value_address)
3972         {
3973           rtx x = value_address;
3974           if (!DECL_BY_REFERENCE (DECL_RESULT (subr)))
3975             {
3976               x = gen_rtx_MEM (DECL_MODE (DECL_RESULT (subr)), x);
3977               set_mem_attributes (x, DECL_RESULT (subr), 1);
3978             }
3979           SET_DECL_RTL (DECL_RESULT (subr), x);
3980         }
3981     }
3982   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
3983     /* If return mode is void, this decl rtl should not be used.  */
3984     SET_DECL_RTL (DECL_RESULT (subr), NULL_RTX);
3985   else
3986     {
3987       /* Compute the return values into a pseudo reg, which we will copy
3988          into the true return register after the cleanups are done.  */
3989       tree return_type = TREE_TYPE (DECL_RESULT (subr));
3990       if (TYPE_MODE (return_type) != BLKmode
3991           && targetm.calls.return_in_msb (return_type))
3992         /* expand_function_end will insert the appropriate padding in
3993            this case.  Use the return value's natural (unpadded) mode
3994            within the function proper.  */
3995         SET_DECL_RTL (DECL_RESULT (subr),
3996                       gen_reg_rtx (TYPE_MODE (return_type)));
3997       else
3998         {
3999           /* In order to figure out what mode to use for the pseudo, we
4000              figure out what the mode of the eventual return register will
4001              actually be, and use that.  */
4002           rtx hard_reg = hard_function_value (return_type, subr, 1);
4003
4004           /* Structures that are returned in registers are not
4005              aggregate_value_p, so we may see a PARALLEL or a REG.  */
4006           if (REG_P (hard_reg))
4007             SET_DECL_RTL (DECL_RESULT (subr),
4008                           gen_reg_rtx (GET_MODE (hard_reg)));
4009           else
4010             {
4011               gcc_assert (GET_CODE (hard_reg) == PARALLEL);
4012               SET_DECL_RTL (DECL_RESULT (subr), gen_group_rtx (hard_reg));
4013             }
4014         }
4015
4016       /* Set DECL_REGISTER flag so that expand_function_end will copy the
4017          result to the real return register(s).  */
4018       DECL_REGISTER (DECL_RESULT (subr)) = 1;
4019     }
4020
4021   /* Initialize rtx for parameters and local variables.
4022      In some cases this requires emitting insns.  */
4023   assign_parms (subr);
4024
4025   /* If function gets a static chain arg, store it.  */
4026   if (cfun->static_chain_decl)
4027     {
4028       tree parm = cfun->static_chain_decl;
4029       rtx local = gen_reg_rtx (Pmode);
4030
4031       set_decl_incoming_rtl (parm, static_chain_incoming_rtx);
4032       SET_DECL_RTL (parm, local);
4033       mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
4034
4035       emit_move_insn (local, static_chain_incoming_rtx);
4036     }
4037
4038   /* If the function receives a non-local goto, then store the
4039      bits we need to restore the frame pointer.  */
4040   if (cfun->nonlocal_goto_save_area)
4041     {
4042       tree t_save;
4043       rtx r_save;
4044
4045       /* ??? We need to do this save early.  Unfortunately here is
4046          before the frame variable gets declared.  Help out...  */
4047       expand_var (TREE_OPERAND (cfun->nonlocal_goto_save_area, 0));
4048
4049       t_save = build4 (ARRAY_REF, ptr_type_node,
4050                        cfun->nonlocal_goto_save_area,
4051                        integer_zero_node, NULL_TREE, NULL_TREE);
4052       r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
4053       r_save = convert_memory_address (Pmode, r_save);
4054
4055       emit_move_insn (r_save, virtual_stack_vars_rtx);
4056       update_nonlocal_goto_save_area ();
4057     }
4058
4059   /* The following was moved from init_function_start.
4060      The move is supposed to make sdb output more accurate.  */
4061   /* Indicate the beginning of the function body,
4062      as opposed to parm setup.  */
4063   emit_note (NOTE_INSN_FUNCTION_BEG);
4064
4065   if (!NOTE_P (get_last_insn ()))
4066     emit_note (NOTE_INSN_DELETED);
4067   parm_birth_insn = get_last_insn ();
4068
4069   if (current_function_profile)
4070     {
4071 #ifdef PROFILE_HOOK
4072       PROFILE_HOOK (current_function_funcdef_no);
4073 #endif
4074     }
4075
4076   /* After the display initializations is where the tail-recursion label
4077      should go, if we end up needing one.   Ensure we have a NOTE here
4078      since some things (like trampolines) get placed before this.  */
4079   tail_recursion_reentry = emit_note (NOTE_INSN_DELETED);
4080
4081   /* Make sure there is a line number after the function entry setup code.  */
4082   force_next_line_note ();
4083 }
4084 \f
4085 /* Undo the effects of init_dummy_function_start.  */
4086 void
4087 expand_dummy_function_end (void)
4088 {
4089   /* End any sequences that failed to be closed due to syntax errors.  */
4090   while (in_sequence_p ())
4091     end_sequence ();
4092
4093   /* Outside function body, can't compute type's actual size
4094      until next function's body starts.  */
4095
4096   free_after_parsing (cfun);
4097   free_after_compilation (cfun);
4098   cfun = 0;
4099 }
4100
4101 /* Call DOIT for each hard register used as a return value from
4102    the current function.  */
4103
4104 void
4105 diddle_return_value (void (*doit) (rtx, void *), void *arg)
4106 {
4107   rtx outgoing = current_function_return_rtx;
4108
4109   if (! outgoing)
4110     return;
4111
4112   if (REG_P (outgoing))
4113     (*doit) (outgoing, arg);
4114   else if (GET_CODE (outgoing) == PARALLEL)
4115     {
4116       int i;
4117
4118       for (i = 0; i < XVECLEN (outgoing, 0); i++)
4119         {
4120           rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
4121
4122           if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
4123             (*doit) (x, arg);
4124         }
4125     }
4126 }
4127
4128 static void
4129 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4130 {
4131   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg));
4132 }
4133
4134 void
4135 clobber_return_register (void)
4136 {
4137   diddle_return_value (do_clobber_return_reg, NULL);
4138
4139   /* In case we do use pseudo to return value, clobber it too.  */
4140   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4141     {
4142       tree decl_result = DECL_RESULT (current_function_decl);
4143       rtx decl_rtl = DECL_RTL (decl_result);
4144       if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
4145         {
4146           do_clobber_return_reg (decl_rtl, NULL);
4147         }
4148     }
4149 }
4150
4151 static void
4152 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4153 {
4154   emit_insn (gen_rtx_USE (VOIDmode, reg));
4155 }
4156
4157 void
4158 use_return_register (void)
4159 {
4160   diddle_return_value (do_use_return_reg, NULL);
4161 }
4162
4163 /* Possibly warn about unused parameters.  */
4164 void
4165 do_warn_unused_parameter (tree fn)
4166 {
4167   tree decl;
4168
4169   for (decl = DECL_ARGUMENTS (fn);
4170        decl; decl = TREE_CHAIN (decl))
4171     if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
4172         && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl))
4173       warning (0, "%Junused parameter %qD", decl, decl);
4174 }
4175
4176 static GTY(()) rtx initial_trampoline;
4177
4178 /* Generate RTL for the end of the current function.  */
4179
4180 void
4181 expand_function_end (void)
4182 {
4183   rtx clobber_after;
4184
4185   /* If arg_pointer_save_area was referenced only from a nested
4186      function, we will not have initialized it yet.  Do that now.  */
4187   if (arg_pointer_save_area && ! cfun->arg_pointer_save_area_init)
4188     get_arg_pointer_save_area (cfun);
4189
4190   /* If we are doing stack checking and this function makes calls,
4191      do a stack probe at the start of the function to ensure we have enough
4192      space for another stack frame.  */
4193   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
4194     {
4195       rtx insn, seq;
4196
4197       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4198         if (CALL_P (insn))
4199           {
4200             start_sequence ();
4201             probe_stack_range (STACK_CHECK_PROTECT,
4202                                GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
4203             seq = get_insns ();
4204             end_sequence ();
4205             emit_insn_before (seq, tail_recursion_reentry);
4206             break;
4207           }
4208     }
4209
4210   /* Possibly warn about unused parameters.
4211      When frontend does unit-at-a-time, the warning is already
4212      issued at finalization time.  */
4213   if (warn_unused_parameter
4214       && !lang_hooks.callgraph.expand_function)
4215     do_warn_unused_parameter (current_function_decl);
4216
4217   /* End any sequences that failed to be closed due to syntax errors.  */
4218   while (in_sequence_p ())
4219     end_sequence ();
4220
4221   clear_pending_stack_adjust ();
4222   do_pending_stack_adjust ();
4223
4224   /* @@@ This is a kludge.  We want to ensure that instructions that
4225      may trap are not moved into the epilogue by scheduling, because
4226      we don't always emit unwind information for the epilogue.
4227      However, not all machine descriptions define a blockage insn, so
4228      emit an ASM_INPUT to act as one.  */
4229   if (flag_non_call_exceptions)
4230     emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
4231
4232   /* Mark the end of the function body.
4233      If control reaches this insn, the function can drop through
4234      without returning a value.  */
4235   emit_note (NOTE_INSN_FUNCTION_END);
4236
4237   /* Must mark the last line number note in the function, so that the test
4238      coverage code can avoid counting the last line twice.  This just tells
4239      the code to ignore the immediately following line note, since there
4240      already exists a copy of this note somewhere above.  This line number
4241      note is still needed for debugging though, so we can't delete it.  */
4242   if (flag_test_coverage)
4243     emit_note (NOTE_INSN_REPEATED_LINE_NUMBER);
4244
4245   /* Output a linenumber for the end of the function.
4246      SDB depends on this.  */
4247   force_next_line_note ();
4248   emit_line_note (input_location);
4249
4250   /* Before the return label (if any), clobber the return
4251      registers so that they are not propagated live to the rest of
4252      the function.  This can only happen with functions that drop
4253      through; if there had been a return statement, there would
4254      have either been a return rtx, or a jump to the return label.
4255
4256      We delay actual code generation after the current_function_value_rtx
4257      is computed.  */
4258   clobber_after = get_last_insn ();
4259
4260   /* Output the label for the actual return from the function.  */
4261   emit_label (return_label);
4262
4263   /* Let except.c know where it should emit the call to unregister
4264      the function context for sjlj exceptions.  */
4265   if (flag_exceptions && USING_SJLJ_EXCEPTIONS)
4266     sjlj_emit_function_exit_after (get_last_insn ());
4267
4268   /* If scalar return value was computed in a pseudo-reg, or was a named
4269      return value that got dumped to the stack, copy that to the hard
4270      return register.  */
4271   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4272     {
4273       tree decl_result = DECL_RESULT (current_function_decl);
4274       rtx decl_rtl = DECL_RTL (decl_result);
4275
4276       if (REG_P (decl_rtl)
4277           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
4278           : DECL_REGISTER (decl_result))
4279         {
4280           rtx real_decl_rtl = current_function_return_rtx;
4281
4282           /* This should be set in assign_parms.  */
4283           gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
4284
4285           /* If this is a BLKmode structure being returned in registers,
4286              then use the mode computed in expand_return.  Note that if
4287              decl_rtl is memory, then its mode may have been changed,
4288              but that current_function_return_rtx has not.  */
4289           if (GET_MODE (real_decl_rtl) == BLKmode)
4290             PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
4291
4292           /* If a non-BLKmode return value should be padded at the least
4293              significant end of the register, shift it left by the appropriate
4294              amount.  BLKmode results are handled using the group load/store
4295              machinery.  */
4296           if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
4297               && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
4298             {
4299               emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),
4300                                            REGNO (real_decl_rtl)),
4301                               decl_rtl);
4302               shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
4303             }
4304           /* If a named return value dumped decl_return to memory, then
4305              we may need to re-do the PROMOTE_MODE signed/unsigned
4306              extension.  */
4307           else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
4308             {
4309               int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
4310
4311               if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
4312                 promote_mode (TREE_TYPE (decl_result), GET_MODE (decl_rtl),
4313                               &unsignedp, 1);
4314
4315               convert_move (real_decl_rtl, decl_rtl, unsignedp);
4316             }
4317           else if (GET_CODE (real_decl_rtl) == PARALLEL)
4318             {
4319               /* If expand_function_start has created a PARALLEL for decl_rtl,
4320                  move the result to the real return registers.  Otherwise, do
4321                  a group load from decl_rtl for a named return.  */
4322               if (GET_CODE (decl_rtl) == PARALLEL)
4323                 emit_group_move (real_decl_rtl, decl_rtl);
4324               else
4325                 emit_group_load (real_decl_rtl, decl_rtl,
4326                                  TREE_TYPE (decl_result),
4327                                  int_size_in_bytes (TREE_TYPE (decl_result)));
4328             }
4329           else
4330             emit_move_insn (real_decl_rtl, decl_rtl);
4331         }
4332     }
4333
4334   /* If returning a structure, arrange to return the address of the value
4335      in a place where debuggers expect to find it.
4336
4337      If returning a structure PCC style,
4338      the caller also depends on this value.
4339      And current_function_returns_pcc_struct is not necessarily set.  */
4340   if (current_function_returns_struct
4341       || current_function_returns_pcc_struct)
4342     {
4343       rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
4344       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
4345       rtx outgoing;
4346
4347       if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
4348         type = TREE_TYPE (type);
4349       else
4350         value_address = XEXP (value_address, 0);
4351
4352 #ifdef FUNCTION_OUTGOING_VALUE
4353       outgoing = FUNCTION_OUTGOING_VALUE (build_pointer_type (type),
4354                                           current_function_decl);
4355 #else
4356       outgoing = FUNCTION_VALUE (build_pointer_type (type),
4357                                  current_function_decl);
4358 #endif 
4359
4360       /* Mark this as a function return value so integrate will delete the
4361          assignment and USE below when inlining this function.  */
4362       REG_FUNCTION_VALUE_P (outgoing) = 1;
4363
4364       /* The address may be ptr_mode and OUTGOING may be Pmode.  */
4365       value_address = convert_memory_address (GET_MODE (outgoing),
4366                                               value_address);
4367
4368       emit_move_insn (outgoing, value_address);
4369
4370       /* Show return register used to hold result (in this case the address
4371          of the result.  */
4372       current_function_return_rtx = outgoing;
4373     }
4374
4375   /* If this is an implementation of throw, do what's necessary to
4376      communicate between __builtin_eh_return and the epilogue.  */
4377   expand_eh_return ();
4378
4379   /* Emit the actual code to clobber return register.  */
4380   {
4381     rtx seq;
4382
4383     start_sequence ();
4384     clobber_return_register ();
4385     expand_naked_return ();
4386     seq = get_insns ();
4387     end_sequence ();
4388
4389     emit_insn_after (seq, clobber_after);
4390   }
4391
4392   /* Output the label for the naked return from the function.  */
4393   emit_label (naked_return_label);
4394
4395   /* If we had calls to alloca, and this machine needs
4396      an accurate stack pointer to exit the function,
4397      insert some code to save and restore the stack pointer.  */
4398   if (! EXIT_IGNORE_STACK
4399       && current_function_calls_alloca)
4400     {
4401       rtx tem = 0;
4402
4403       emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
4404       emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
4405     }
4406
4407   /* ??? This should no longer be necessary since stupid is no longer with
4408      us, but there are some parts of the compiler (eg reload_combine, and
4409      sh mach_dep_reorg) that still try and compute their own lifetime info
4410      instead of using the general framework.  */
4411   use_return_register ();
4412 }
4413
4414 rtx
4415 get_arg_pointer_save_area (struct function *f)
4416 {
4417   rtx ret = f->x_arg_pointer_save_area;
4418
4419   if (! ret)
4420     {
4421       ret = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, f);
4422       f->x_arg_pointer_save_area = ret;
4423     }
4424
4425   if (f == cfun && ! f->arg_pointer_save_area_init)
4426     {
4427       rtx seq;
4428
4429       /* Save the arg pointer at the beginning of the function.  The
4430          generated stack slot may not be a valid memory address, so we
4431          have to check it and fix it if necessary.  */
4432       start_sequence ();
4433       emit_move_insn (validize_mem (ret), virtual_incoming_args_rtx);
4434       seq = get_insns ();
4435       end_sequence ();
4436
4437       push_topmost_sequence ();
4438       emit_insn_after (seq, entry_of_function ());
4439       pop_topmost_sequence ();
4440     }
4441
4442   return ret;
4443 }
4444 \f
4445 /* Extend a vector that records the INSN_UIDs of INSNS
4446    (a list of one or more insns).  */
4447
4448 static void
4449 record_insns (rtx insns, varray_type *vecp)
4450 {
4451   int i, len;
4452   rtx tmp;
4453
4454   tmp = insns;
4455   len = 0;
4456   while (tmp != NULL_RTX)
4457     {
4458       len++;
4459       tmp = NEXT_INSN (tmp);
4460     }
4461
4462   i = VARRAY_SIZE (*vecp);
4463   VARRAY_GROW (*vecp, i + len);
4464   tmp = insns;
4465   while (tmp != NULL_RTX)
4466     {
4467       VARRAY_INT (*vecp, i) = INSN_UID (tmp);
4468       i++;
4469       tmp = NEXT_INSN (tmp);
4470     }
4471 }
4472
4473 /* Set the locator of the insn chain starting at INSN to LOC.  */
4474 static void
4475 set_insn_locators (rtx insn, int loc)
4476 {
4477   while (insn != NULL_RTX)
4478     {
4479       if (INSN_P (insn))
4480         INSN_LOCATOR (insn) = loc;
4481       insn = NEXT_INSN (insn);
4482     }
4483 }
4484
4485 /* Determine how many INSN_UIDs in VEC are part of INSN.  Because we can
4486    be running after reorg, SEQUENCE rtl is possible.  */
4487
4488 static int
4489 contains (rtx insn, varray_type vec)
4490 {
4491   int i, j;
4492
4493   if (NONJUMP_INSN_P (insn)
4494       && GET_CODE (PATTERN (insn)) == SEQUENCE)
4495     {
4496       int count = 0;
4497       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
4498         for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
4499           if (INSN_UID (XVECEXP (PATTERN (insn), 0, i)) == VARRAY_INT (vec, j))
4500             count++;
4501       return count;
4502     }
4503   else
4504     {
4505       for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
4506         if (INSN_UID (insn) == VARRAY_INT (vec, j))
4507           return 1;
4508     }
4509   return 0;
4510 }
4511
4512 int
4513 prologue_epilogue_contains (rtx insn)
4514 {
4515   if (contains (insn, prologue))
4516     return 1;
4517   if (contains (insn, epilogue))
4518     return 1;
4519   return 0;
4520 }
4521
4522 int
4523 sibcall_epilogue_contains (rtx insn)
4524 {
4525   if (sibcall_epilogue)
4526     return contains (insn, sibcall_epilogue);
4527   return 0;
4528 }
4529
4530 #ifdef HAVE_return
4531 /* Insert gen_return at the end of block BB.  This also means updating
4532    block_for_insn appropriately.  */
4533
4534 static void
4535 emit_return_into_block (basic_block bb, rtx line_note)
4536 {
4537   emit_jump_insn_after (gen_return (), BB_END (bb));
4538   if (line_note)
4539     emit_note_copy_after (line_note, PREV_INSN (BB_END (bb)));
4540 }
4541 #endif /* HAVE_return */
4542
4543 #if defined(HAVE_epilogue) && defined(INCOMING_RETURN_ADDR_RTX)
4544
4545 /* These functions convert the epilogue into a variant that does not
4546    modify the stack pointer.  This is used in cases where a function
4547    returns an object whose size is not known until it is computed.
4548    The called function leaves the object on the stack, leaves the
4549    stack depressed, and returns a pointer to the object.
4550
4551    What we need to do is track all modifications and references to the
4552    stack pointer, deleting the modifications and changing the
4553    references to point to the location the stack pointer would have
4554    pointed to had the modifications taken place.
4555
4556    These functions need to be portable so we need to make as few
4557    assumptions about the epilogue as we can.  However, the epilogue
4558    basically contains three things: instructions to reset the stack
4559    pointer, instructions to reload registers, possibly including the
4560    frame pointer, and an instruction to return to the caller.
4561
4562    We must be sure of what a relevant epilogue insn is doing.  We also
4563    make no attempt to validate the insns we make since if they are
4564    invalid, we probably can't do anything valid.  The intent is that
4565    these routines get "smarter" as more and more machines start to use
4566    them and they try operating on different epilogues.
4567
4568    We use the following structure to track what the part of the
4569    epilogue that we've already processed has done.  We keep two copies
4570    of the SP equivalence, one for use during the insn we are
4571    processing and one for use in the next insn.  The difference is
4572    because one part of a PARALLEL may adjust SP and the other may use
4573    it.  */
4574
4575 struct epi_info
4576 {
4577   rtx sp_equiv_reg;             /* REG that SP is set from, perhaps SP.  */
4578   HOST_WIDE_INT sp_offset;      /* Offset from SP_EQUIV_REG of present SP.  */
4579   rtx new_sp_equiv_reg;         /* REG to be used at end of insn.  */
4580   HOST_WIDE_INT new_sp_offset;  /* Offset to be used at end of insn.  */
4581   rtx equiv_reg_src;            /* If nonzero, the value that SP_EQUIV_REG
4582                                    should be set to once we no longer need
4583                                    its value.  */
4584   rtx const_equiv[FIRST_PSEUDO_REGISTER]; /* Any known constant equivalences
4585                                              for registers.  */
4586 };
4587
4588 static void handle_epilogue_set (rtx, struct epi_info *);
4589 static void update_epilogue_consts (rtx, rtx, void *);
4590 static void emit_equiv_load (struct epi_info *);
4591
4592 /* Modify INSN, a list of one or more insns that is part of the epilogue, to
4593    no modifications to the stack pointer.  Return the new list of insns.  */
4594
4595 static rtx
4596 keep_stack_depressed (rtx insns)
4597 {
4598   int j;
4599   struct epi_info info;
4600   rtx insn, next;
4601
4602   /* If the epilogue is just a single instruction, it must be OK as is.  */
4603   if (NEXT_INSN (insns) == NULL_RTX)
4604     return insns;
4605
4606   /* Otherwise, start a sequence, initialize the information we have, and
4607      process all the insns we were given.  */
4608   start_sequence ();
4609
4610   info.sp_equiv_reg = stack_pointer_rtx;
4611   info.sp_offset = 0;
4612   info.equiv_reg_src = 0;
4613
4614   for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
4615     info.const_equiv[j] = 0;
4616
4617   insn = insns;
4618   next = NULL_RTX;
4619   while (insn != NULL_RTX)
4620     {
4621       next = NEXT_INSN (insn);
4622
4623       if (!INSN_P (insn))
4624         {
4625           add_insn (insn);
4626           insn = next;
4627           continue;
4628         }
4629
4630       /* If this insn references the register that SP is equivalent to and
4631          we have a pending load to that register, we must force out the load
4632          first and then indicate we no longer know what SP's equivalent is.  */
4633       if (info.equiv_reg_src != 0
4634           && reg_referenced_p (info.sp_equiv_reg, PATTERN (insn)))
4635         {
4636           emit_equiv_load (&info);
4637           info.sp_equiv_reg = 0;
4638         }
4639
4640       info.new_sp_equiv_reg = info.sp_equiv_reg;
4641       info.new_sp_offset = info.sp_offset;
4642
4643       /* If this is a (RETURN) and the return address is on the stack,
4644          update the address and change to an indirect jump.  */
4645       if (GET_CODE (PATTERN (insn)) == RETURN
4646           || (GET_CODE (PATTERN (insn)) == PARALLEL
4647               && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == RETURN))
4648         {
4649           rtx retaddr = INCOMING_RETURN_ADDR_RTX;
4650           rtx base = 0;
4651           HOST_WIDE_INT offset = 0;
4652           rtx jump_insn, jump_set;
4653
4654           /* If the return address is in a register, we can emit the insn
4655              unchanged.  Otherwise, it must be a MEM and we see what the
4656              base register and offset are.  In any case, we have to emit any
4657              pending load to the equivalent reg of SP, if any.  */
4658           if (REG_P (retaddr))
4659             {
4660               emit_equiv_load (&info);
4661               add_insn (insn);
4662               insn = next;
4663               continue;
4664             }
4665           else
4666             {
4667               rtx ret_ptr;
4668               gcc_assert (MEM_P (retaddr));
4669
4670               ret_ptr = XEXP (retaddr, 0);
4671               
4672               if (REG_P (ret_ptr))
4673                 {
4674                   base = gen_rtx_REG (Pmode, REGNO (ret_ptr));
4675                   offset = 0;
4676                 }
4677               else
4678                 {
4679                   gcc_assert (GET_CODE (ret_ptr) == PLUS
4680                               && REG_P (XEXP (ret_ptr, 0))
4681                               && GET_CODE (XEXP (ret_ptr, 1)) == CONST_INT);
4682                   base = gen_rtx_REG (Pmode, REGNO (XEXP (ret_ptr, 0)));
4683                   offset = INTVAL (XEXP (ret_ptr, 1));
4684                 }
4685             }
4686
4687           /* If the base of the location containing the return pointer
4688              is SP, we must update it with the replacement address.  Otherwise,
4689              just build the necessary MEM.  */
4690           retaddr = plus_constant (base, offset);
4691           if (base == stack_pointer_rtx)
4692             retaddr = simplify_replace_rtx (retaddr, stack_pointer_rtx,
4693                                             plus_constant (info.sp_equiv_reg,
4694                                                            info.sp_offset));
4695
4696           retaddr = gen_rtx_MEM (Pmode, retaddr);
4697
4698           /* If there is a pending load to the equivalent register for SP
4699              and we reference that register, we must load our address into
4700              a scratch register and then do that load.  */
4701           if (info.equiv_reg_src
4702               && reg_overlap_mentioned_p (info.equiv_reg_src, retaddr))
4703             {
4704               unsigned int regno;
4705               rtx reg;
4706
4707               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4708                 if (HARD_REGNO_MODE_OK (regno, Pmode)
4709                     && !fixed_regs[regno]
4710                     && TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
4711                     && !REGNO_REG_SET_P (EXIT_BLOCK_PTR->global_live_at_start,
4712                                          regno)
4713                     && !refers_to_regno_p (regno,
4714                                            regno + hard_regno_nregs[regno]
4715                                                                    [Pmode],
4716                                            info.equiv_reg_src, NULL)
4717                     && info.const_equiv[regno] == 0)
4718                   break;
4719
4720               gcc_assert (regno < FIRST_PSEUDO_REGISTER);
4721
4722               reg = gen_rtx_REG (Pmode, regno);
4723               emit_move_insn (reg, retaddr);
4724               retaddr = reg;
4725             }
4726
4727           emit_equiv_load (&info);
4728           jump_insn = emit_jump_insn (gen_indirect_jump (retaddr));
4729
4730           /* Show the SET in the above insn is a RETURN.  */
4731           jump_set = single_set (jump_insn);
4732           gcc_assert (jump_set);
4733           SET_IS_RETURN_P (jump_set) = 1;
4734         }
4735
4736       /* If SP is not mentioned in the pattern and its equivalent register, if
4737          any, is not modified, just emit it.  Otherwise, if neither is set,
4738          replace the reference to SP and emit the insn.  If none of those are
4739          true, handle each SET individually.  */
4740       else if (!reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))
4741                && (info.sp_equiv_reg == stack_pointer_rtx
4742                    || !reg_set_p (info.sp_equiv_reg, insn)))
4743         add_insn (insn);
4744       else if (! reg_set_p (stack_pointer_rtx, insn)
4745                && (info.sp_equiv_reg == stack_pointer_rtx
4746                    || !reg_set_p (info.sp_equiv_reg, insn)))
4747         {
4748           int changed;
4749
4750           changed = validate_replace_rtx (stack_pointer_rtx,
4751                                           plus_constant (info.sp_equiv_reg,
4752                                                          info.sp_offset),
4753                                           insn);
4754           gcc_assert (changed);
4755
4756           add_insn (insn);
4757         }
4758       else if (GET_CODE (PATTERN (insn)) == SET)
4759         handle_epilogue_set (PATTERN (insn), &info);
4760       else if (GET_CODE (PATTERN (insn)) == PARALLEL)
4761         {
4762           for (j = 0; j < XVECLEN (PATTERN (insn), 0); j++)
4763             if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET)
4764               handle_epilogue_set (XVECEXP (PATTERN (insn), 0, j), &info);
4765         }
4766       else
4767         add_insn (insn);
4768
4769       info.sp_equiv_reg = info.new_sp_equiv_reg;
4770       info.sp_offset = info.new_sp_offset;
4771
4772       /* Now update any constants this insn sets.  */
4773       note_stores (PATTERN (insn), update_epilogue_consts, &info);
4774       insn = next;
4775     }
4776
4777   insns = get_insns ();
4778   end_sequence ();
4779   return insns;
4780 }
4781
4782 /* SET is a SET from an insn in the epilogue.  P is a pointer to the epi_info
4783    structure that contains information about what we've seen so far.  We
4784    process this SET by either updating that data or by emitting one or
4785    more insns.  */
4786
4787 static void
4788 handle_epilogue_set (rtx set, struct epi_info *p)
4789 {
4790   /* First handle the case where we are setting SP.  Record what it is being
4791      set from, which we must be able to determine  */
4792   if (reg_set_p (stack_pointer_rtx, set))
4793     {
4794       gcc_assert (SET_DEST (set) == stack_pointer_rtx);
4795
4796       if (GET_CODE (SET_SRC (set)) == PLUS)
4797         {
4798           p->new_sp_equiv_reg = XEXP (SET_SRC (set), 0);
4799           if (GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
4800             p->new_sp_offset = INTVAL (XEXP (SET_SRC (set), 1));
4801           else
4802             {
4803               gcc_assert (REG_P (XEXP (SET_SRC (set), 1))
4804                           && (REGNO (XEXP (SET_SRC (set), 1))
4805                               < FIRST_PSEUDO_REGISTER)
4806                           && p->const_equiv[REGNO (XEXP (SET_SRC (set), 1))]);
4807               p->new_sp_offset
4808                 = INTVAL (p->const_equiv[REGNO (XEXP (SET_SRC (set), 1))]);
4809             }
4810         }
4811       else
4812         p->new_sp_equiv_reg = SET_SRC (set), p->new_sp_offset = 0;
4813
4814       /* If we are adjusting SP, we adjust from the old data.  */
4815       if (p->new_sp_equiv_reg == stack_pointer_rtx)
4816         {
4817           p->new_sp_equiv_reg = p->sp_equiv_reg;
4818           p->new_sp_offset += p->sp_offset;
4819         }
4820
4821       gcc_assert (p->new_sp_equiv_reg && REG_P (p->new_sp_equiv_reg));
4822
4823       return;
4824     }
4825
4826   /* Next handle the case where we are setting SP's equivalent
4827      register.  We must not already have a value to set it to.  We
4828      could update, but there seems little point in handling that case.
4829      Note that we have to allow for the case where we are setting the
4830      register set in the previous part of a PARALLEL inside a single
4831      insn.  But use the old offset for any updates within this insn.
4832      We must allow for the case where the register is being set in a
4833      different (usually wider) mode than Pmode).  */
4834   else if (p->new_sp_equiv_reg != 0 && reg_set_p (p->new_sp_equiv_reg, set))
4835     {
4836       gcc_assert (!p->equiv_reg_src
4837                   && REG_P (p->new_sp_equiv_reg)
4838                   && REG_P (SET_DEST (set))
4839                   && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (set)))
4840                       <= BITS_PER_WORD)
4841                   && REGNO (p->new_sp_equiv_reg) == REGNO (SET_DEST (set)));
4842       p->equiv_reg_src
4843         = simplify_replace_rtx (SET_SRC (set), stack_pointer_rtx,
4844                                 plus_constant (p->sp_equiv_reg,
4845                                                p->sp_offset));
4846     }
4847
4848   /* Otherwise, replace any references to SP in the insn to its new value
4849      and emit the insn.  */
4850   else
4851     {
4852       SET_SRC (set) = simplify_replace_rtx (SET_SRC (set), stack_pointer_rtx,
4853                                             plus_constant (p->sp_equiv_reg,
4854                                                            p->sp_offset));
4855       SET_DEST (set) = simplify_replace_rtx (SET_DEST (set), stack_pointer_rtx,
4856                                              plus_constant (p->sp_equiv_reg,
4857                                                             p->sp_offset));
4858       emit_insn (set);
4859     }
4860 }
4861
4862 /* Update the tracking information for registers set to constants.  */
4863
4864 static void
4865 update_epilogue_consts (rtx dest, rtx x, void *data)
4866 {
4867   struct epi_info *p = (struct epi_info *) data;
4868   rtx new;
4869
4870   if (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER)
4871     return;
4872
4873   /* If we are either clobbering a register or doing a partial set,
4874      show we don't know the value.  */
4875   else if (GET_CODE (x) == CLOBBER || ! rtx_equal_p (dest, SET_DEST (x)))
4876     p->const_equiv[REGNO (dest)] = 0;
4877
4878   /* If we are setting it to a constant, record that constant.  */
4879   else if (GET_CODE (SET_SRC (x)) == CONST_INT)
4880     p->const_equiv[REGNO (dest)] = SET_SRC (x);
4881
4882   /* If this is a binary operation between a register we have been tracking
4883      and a constant, see if we can compute a new constant value.  */
4884   else if (ARITHMETIC_P (SET_SRC (x))
4885            && REG_P (XEXP (SET_SRC (x), 0))
4886            && REGNO (XEXP (SET_SRC (x), 0)) < FIRST_PSEUDO_REGISTER
4887            && p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))] != 0
4888            && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
4889            && 0 != (new = simplify_binary_operation
4890                     (GET_CODE (SET_SRC (x)), GET_MODE (dest),
4891                      p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))],
4892                      XEXP (SET_SRC (x), 1)))
4893            && GET_CODE (new) == CONST_INT)
4894     p->const_equiv[REGNO (dest)] = new;
4895
4896   /* Otherwise, we can't do anything with this value.  */
4897   else
4898     p->const_equiv[REGNO (dest)] = 0;
4899 }
4900
4901 /* Emit an insn to do the load shown in p->equiv_reg_src, if needed.  */
4902
4903 static void
4904 emit_equiv_load (struct epi_info *p)
4905 {
4906   if (p->equiv_reg_src != 0)
4907     {
4908       rtx dest = p->sp_equiv_reg;
4909
4910       if (GET_MODE (p->equiv_reg_src) != GET_MODE (dest))
4911         dest = gen_rtx_REG (GET_MODE (p->equiv_reg_src),
4912                             REGNO (p->sp_equiv_reg));
4913
4914       emit_move_insn (dest, p->equiv_reg_src);
4915       p->equiv_reg_src = 0;
4916     }
4917 }
4918 #endif
4919
4920 /* Generate the prologue and epilogue RTL if the machine supports it.  Thread
4921    this into place with notes indicating where the prologue ends and where
4922    the epilogue begins.  Update the basic block information when possible.  */
4923
4924 void
4925 thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
4926 {
4927   int inserted = 0;
4928   edge e;
4929 #if defined (HAVE_sibcall_epilogue) || defined (HAVE_epilogue) || defined (HAVE_return) || defined (HAVE_prologue)
4930   rtx seq;
4931 #endif
4932 #ifdef HAVE_prologue
4933   rtx prologue_end = NULL_RTX;
4934 #endif
4935 #if defined (HAVE_epilogue) || defined(HAVE_return)
4936   rtx epilogue_end = NULL_RTX;
4937 #endif
4938   edge_iterator ei;
4939
4940 #ifdef HAVE_prologue
4941   if (HAVE_prologue)
4942     {
4943       start_sequence ();
4944       seq = gen_prologue ();
4945       emit_insn (seq);
4946
4947       /* Retain a map of the prologue insns.  */
4948       record_insns (seq, &prologue);
4949       prologue_end = emit_note (NOTE_INSN_PROLOGUE_END);
4950
4951       seq = get_insns ();
4952       end_sequence ();
4953       set_insn_locators (seq, prologue_locator);
4954
4955       /* Can't deal with multiple successors of the entry block
4956          at the moment.  Function should always have at least one
4957          entry point.  */
4958       gcc_assert (single_succ_p (ENTRY_BLOCK_PTR));
4959
4960       insert_insn_on_edge (seq, single_succ_edge (ENTRY_BLOCK_PTR));
4961       inserted = 1;
4962     }
4963 #endif
4964
4965   /* If the exit block has no non-fake predecessors, we don't need
4966      an epilogue.  */
4967   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4968     if ((e->flags & EDGE_FAKE) == 0)
4969       break;
4970   if (e == NULL)
4971     goto epilogue_done;
4972
4973 #ifdef HAVE_return
4974   if (optimize && HAVE_return)
4975     {
4976       /* If we're allowed to generate a simple return instruction,
4977          then by definition we don't need a full epilogue.  Examine
4978          the block that falls through to EXIT.   If it does not
4979          contain any code, examine its predecessors and try to
4980          emit (conditional) return instructions.  */
4981
4982       basic_block last;
4983       rtx label;
4984
4985       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4986         if (e->flags & EDGE_FALLTHRU)
4987           break;
4988       if (e == NULL)
4989         goto epilogue_done;
4990       last = e->src;
4991
4992       /* Verify that there are no active instructions in the last block.  */
4993       label = BB_END (last);
4994       while (label && !LABEL_P (label))
4995         {
4996           if (active_insn_p (label))
4997             break;
4998           label = PREV_INSN (label);
4999         }
5000
5001       if (BB_HEAD (last) == label && LABEL_P (label))
5002         {
5003           edge_iterator ei2;
5004           rtx epilogue_line_note = NULL_RTX;
5005
5006           /* Locate the line number associated with the closing brace,
5007              if we can find one.  */
5008           for (seq = get_last_insn ();
5009                seq && ! active_insn_p (seq);
5010                seq = PREV_INSN (seq))
5011             if (NOTE_P (seq) && NOTE_LINE_NUMBER (seq) > 0)
5012               {
5013                 epilogue_line_note = seq;
5014                 break;
5015               }
5016
5017           for (ei2 = ei_start (last->preds); (e = ei_safe_edge (ei2)); )
5018             {
5019               basic_block bb = e->src;
5020               rtx jump;
5021
5022               if (bb == ENTRY_BLOCK_PTR)
5023                 {
5024                   ei_next (&ei2);
5025                   continue;
5026                 }
5027
5028               jump = BB_END (bb);
5029               if (!JUMP_P (jump) || JUMP_LABEL (jump) != label)
5030                 {
5031                   ei_next (&ei2);
5032                   continue;
5033                 }
5034
5035               /* If we have an unconditional jump, we can replace that
5036                  with a simple return instruction.  */
5037               if (simplejump_p (jump))
5038                 {
5039                   emit_return_into_block (bb, epilogue_line_note);
5040                   delete_insn (jump);
5041                 }
5042
5043               /* If we have a conditional jump, we can try to replace
5044                  that with a conditional return instruction.  */
5045               else if (condjump_p (jump))
5046                 {
5047                   if (! redirect_jump (jump, 0, 0))
5048                     {
5049                       ei_next (&ei2);
5050                       continue;
5051                     }
5052
5053                   /* If this block has only one successor, it both jumps
5054                      and falls through to the fallthru block, so we can't
5055                      delete the edge.  */
5056                   if (single_succ_p (bb))
5057                     {
5058                       ei_next (&ei2);
5059                       continue;
5060                     }
5061                 }
5062               else
5063                 {
5064                   ei_next (&ei2);
5065                   continue;
5066                 }
5067
5068               /* Fix up the CFG for the successful change we just made.  */
5069               redirect_edge_succ (e, EXIT_BLOCK_PTR);
5070             }
5071
5072           /* Emit a return insn for the exit fallthru block.  Whether
5073              this is still reachable will be determined later.  */
5074
5075           emit_barrier_after (BB_END (last));
5076           emit_return_into_block (last, epilogue_line_note);
5077           epilogue_end = BB_END (last);
5078           single_succ_edge (last)->flags &= ~EDGE_FALLTHRU;
5079           goto epilogue_done;
5080         }
5081     }
5082 #endif
5083   /* Find the edge that falls through to EXIT.  Other edges may exist
5084      due to RETURN instructions, but those don't need epilogues.
5085      There really shouldn't be a mixture -- either all should have
5086      been converted or none, however...  */
5087
5088   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5089     if (e->flags & EDGE_FALLTHRU)
5090       break;
5091   if (e == NULL)
5092     goto epilogue_done;
5093
5094 #ifdef HAVE_epilogue
5095   if (HAVE_epilogue)
5096     {
5097       start_sequence ();
5098       epilogue_end = emit_note (NOTE_INSN_EPILOGUE_BEG);
5099
5100       seq = gen_epilogue ();
5101
5102 #ifdef INCOMING_RETURN_ADDR_RTX
5103       /* If this function returns with the stack depressed and we can support
5104          it, massage the epilogue to actually do that.  */
5105       if (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
5106           && TYPE_RETURNS_STACK_DEPRESSED (TREE_TYPE (current_function_decl)))
5107         seq = keep_stack_depressed (seq);
5108 #endif
5109
5110       emit_jump_insn (seq);
5111
5112       /* Retain a map of the epilogue insns.  */
5113       record_insns (seq, &epilogue);
5114       set_insn_locators (seq, epilogue_locator);
5115
5116       seq = get_insns ();
5117       end_sequence ();
5118
5119       insert_insn_on_edge (seq, e);
5120       inserted = 1;
5121     }
5122   else
5123 #endif
5124     {
5125       basic_block cur_bb;
5126
5127       if (! next_active_insn (BB_END (e->src)))
5128         goto epilogue_done;
5129       /* We have a fall-through edge to the exit block, the source is not
5130          at the end of the function, and there will be an assembler epilogue
5131          at the end of the function.
5132          We can't use force_nonfallthru here, because that would try to
5133          use return.  Inserting a jump 'by hand' is extremely messy, so
5134          we take advantage of cfg_layout_finalize using
5135         fixup_fallthru_exit_predecessor.  */
5136       cfg_layout_initialize (0);
5137       FOR_EACH_BB (cur_bb)
5138         if (cur_bb->index >= 0 && cur_bb->next_bb->index >= 0)
5139           cur_bb->rbi->next = cur_bb->next_bb;
5140       cfg_layout_finalize ();
5141     }
5142 epilogue_done:
5143
5144   if (inserted)
5145     commit_edge_insertions ();
5146
5147 #ifdef HAVE_sibcall_epilogue
5148   /* Emit sibling epilogues before any sibling call sites.  */
5149   for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
5150     {
5151       basic_block bb = e->src;
5152       rtx insn = BB_END (bb);
5153
5154       if (!CALL_P (insn)
5155           || ! SIBLING_CALL_P (insn))
5156         {
5157           ei_next (&ei);
5158           continue;
5159         }
5160
5161       start_sequence ();
5162       emit_insn (gen_sibcall_epilogue ());
5163       seq = get_insns ();
5164       end_sequence ();
5165
5166       /* Retain a map of the epilogue insns.  Used in life analysis to
5167          avoid getting rid of sibcall epilogue insns.  Do this before we
5168          actually emit the sequence.  */
5169       record_insns (seq, &sibcall_epilogue);
5170       set_insn_locators (seq, epilogue_locator);
5171
5172       emit_insn_before (seq, insn);
5173       ei_next (&ei);
5174     }
5175 #endif
5176
5177 #ifdef HAVE_prologue
5178   /* This is probably all useless now that we use locators.  */
5179   if (prologue_end)
5180     {
5181       rtx insn, prev;
5182
5183       /* GDB handles `break f' by setting a breakpoint on the first
5184          line note after the prologue.  Which means (1) that if
5185          there are line number notes before where we inserted the
5186          prologue we should move them, and (2) we should generate a
5187          note before the end of the first basic block, if there isn't
5188          one already there.
5189
5190          ??? This behavior is completely broken when dealing with
5191          multiple entry functions.  We simply place the note always
5192          into first basic block and let alternate entry points
5193          to be missed.
5194        */
5195
5196       for (insn = prologue_end; insn; insn = prev)
5197         {
5198           prev = PREV_INSN (insn);
5199           if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
5200             {
5201               /* Note that we cannot reorder the first insn in the
5202                  chain, since rest_of_compilation relies on that
5203                  remaining constant.  */
5204               if (prev == NULL)
5205                 break;
5206               reorder_insns (insn, insn, prologue_end);
5207             }
5208         }
5209
5210       /* Find the last line number note in the first block.  */
5211       for (insn = BB_END (ENTRY_BLOCK_PTR->next_bb);
5212            insn != prologue_end && insn;
5213            insn = PREV_INSN (insn))
5214         if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
5215           break;
5216
5217       /* If we didn't find one, make a copy of the first line number
5218          we run across.  */
5219       if (! insn)
5220         {
5221           for (insn = next_active_insn (prologue_end);
5222                insn;
5223                insn = PREV_INSN (insn))
5224             if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) > 0)
5225               {
5226                 emit_note_copy_after (insn, prologue_end);
5227                 break;
5228               }
5229         }
5230     }
5231 #endif
5232 #ifdef HAVE_epilogue
5233   if (epilogue_end)
5234     {
5235       rtx insn, next;
5236
5237       /* Similarly, move any line notes that appear after the epilogue.
5238          There is no need, however, to be quite so anal about the existence
5239          of such a note.  Also move the NOTE_INSN_FUNCTION_END and (possibly)
5240          NOTE_INSN_FUNCTION_BEG notes, as those can be relevant for debug
5241          info generation.  */
5242       for (insn = epilogue_end; insn; insn = next)
5243         {
5244           next = NEXT_INSN (insn);
5245           if (NOTE_P (insn) 
5246               && (NOTE_LINE_NUMBER (insn) > 0
5247                   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG
5248                   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_END))
5249             reorder_insns (insn, insn, PREV_INSN (epilogue_end));
5250         }
5251     }
5252 #endif
5253 }
5254
5255 /* Reposition the prologue-end and epilogue-begin notes after instruction
5256    scheduling and delayed branch scheduling.  */
5257
5258 void
5259 reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
5260 {
5261 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
5262   rtx insn, last, note;
5263   int len;
5264
5265   if ((len = VARRAY_SIZE (prologue)) > 0)
5266     {
5267       last = 0, note = 0;
5268
5269       /* Scan from the beginning until we reach the last prologue insn.
5270          We apparently can't depend on basic_block_{head,end} after
5271          reorg has run.  */
5272       for (insn = f; insn; insn = NEXT_INSN (insn))
5273         {
5274           if (NOTE_P (insn))
5275             {
5276               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
5277                 note = insn;
5278             }
5279           else if (contains (insn, prologue))
5280             {
5281               last = insn;
5282               if (--len == 0)
5283                 break;
5284             }
5285         }
5286
5287       if (last)
5288         {
5289           /* Find the prologue-end note if we haven't already, and
5290              move it to just after the last prologue insn.  */
5291           if (note == 0)
5292             {
5293               for (note = last; (note = NEXT_INSN (note));)
5294                 if (NOTE_P (note)
5295                     && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END)
5296                   break;
5297             }
5298
5299           /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
5300           if (LABEL_P (last))
5301             last = NEXT_INSN (last);
5302           reorder_insns (note, note, last);
5303         }
5304     }
5305
5306   if ((len = VARRAY_SIZE (epilogue)) > 0)
5307     {
5308       last = 0, note = 0;
5309
5310       /* Scan from the end until we reach the first epilogue insn.
5311          We apparently can't depend on basic_block_{head,end} after
5312          reorg has run.  */
5313       for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5314         {
5315           if (NOTE_P (insn))
5316             {
5317               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
5318                 note = insn;
5319             }
5320           else if (contains (insn, epilogue))
5321             {
5322               last = insn;
5323               if (--len == 0)
5324                 break;
5325             }
5326         }
5327
5328       if (last)
5329         {
5330           /* Find the epilogue-begin note if we haven't already, and
5331              move it to just before the first epilogue insn.  */
5332           if (note == 0)
5333             {
5334               for (note = insn; (note = PREV_INSN (note));)
5335                 if (NOTE_P (note)
5336                     && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG)
5337                   break;
5338             }
5339
5340           if (PREV_INSN (last) != note)
5341             reorder_insns (note, note, PREV_INSN (last));
5342         }
5343     }
5344 #endif /* HAVE_prologue or HAVE_epilogue */
5345 }
5346
5347 /* Called once, at initialization, to initialize function.c.  */
5348
5349 void
5350 init_function_once (void)
5351 {
5352   VARRAY_INT_INIT (prologue, 0, "prologue");
5353   VARRAY_INT_INIT (epilogue, 0, "epilogue");
5354   VARRAY_INT_INIT (sibcall_epilogue, 0, "sibcall_epilogue");
5355 }
5356
5357 /* Resets insn_block_boundaries array.  */
5358
5359 void
5360 reset_block_changes (void)
5361 {
5362   VARRAY_TREE_INIT (cfun->ib_boundaries_block, 100, "ib_boundaries_block");
5363   VARRAY_PUSH_TREE (cfun->ib_boundaries_block, NULL_TREE);
5364 }
5365
5366 /* Record the boundary for BLOCK.  */
5367 void
5368 record_block_change (tree block)
5369 {
5370   int i, n;
5371   tree last_block;
5372
5373   if (!block)
5374     return;
5375
5376   last_block = VARRAY_TOP_TREE (cfun->ib_boundaries_block);
5377   VARRAY_POP (cfun->ib_boundaries_block);
5378   n = get_max_uid ();
5379   for (i = VARRAY_ACTIVE_SIZE (cfun->ib_boundaries_block); i < n; i++)
5380     VARRAY_PUSH_TREE (cfun->ib_boundaries_block, last_block);
5381
5382   VARRAY_PUSH_TREE (cfun->ib_boundaries_block, block);
5383 }
5384
5385 /* Finishes record of boundaries.  */
5386 void finalize_block_changes (void)
5387 {
5388   record_block_change (DECL_INITIAL (current_function_decl));
5389 }
5390
5391 /* For INSN return the BLOCK it belongs to.  */ 
5392 void
5393 check_block_change (rtx insn, tree *block)
5394 {
5395   unsigned uid = INSN_UID (insn);
5396
5397   if (uid >= VARRAY_ACTIVE_SIZE (cfun->ib_boundaries_block))
5398     return;
5399
5400   *block = VARRAY_TREE (cfun->ib_boundaries_block, uid);
5401 }
5402
5403 /* Releases the ib_boundaries_block records.  */
5404 void
5405 free_block_changes (void)
5406 {
5407   cfun->ib_boundaries_block = NULL;
5408 }
5409
5410 /* Returns the name of the current function.  */
5411 const char *
5412 current_function_name (void)
5413 {
5414   return lang_hooks.decl_printable_name (cfun->decl, 2);
5415 }
5416
5417 #include "gt-function.h"