OSDN Git Service

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