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