OSDN Git Service

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