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