OSDN Git Service

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