OSDN Git Service

* function.c (assign_parm_remove_parallels): Check mode of
[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 && GET_MODE (entry_parm) != BLKmode)
2368     {
2369       rtx parmreg = gen_reg_rtx (GET_MODE (entry_parm));
2370       emit_group_store (parmreg, entry_parm, NULL_TREE,
2371                         GET_MODE_SIZE (GET_MODE (entry_parm)));
2372       entry_parm = parmreg;
2373     }
2374
2375   data->entry_parm = entry_parm;
2376 }
2377
2378 /* A subroutine of assign_parms.  Adjust DATA->STACK_RTL such that it's
2379    always valid and properly aligned.  */
2380
2381 static void
2382 assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)
2383 {
2384   rtx stack_parm = data->stack_parm;
2385
2386   /* If we can't trust the parm stack slot to be aligned enough for its
2387      ultimate type, don't use that slot after entry.  We'll make another
2388      stack slot, if we need one.  */
2389   if (stack_parm
2390       && ((STRICT_ALIGNMENT
2391            && GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN (stack_parm))
2392           || (data->nominal_type
2393               && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)
2394               && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
2395     stack_parm = NULL;
2396
2397   /* If parm was passed in memory, and we need to convert it on entry,
2398      don't store it back in that same slot.  */
2399   else if (data->entry_parm == stack_parm
2400            && data->nominal_mode != BLKmode
2401            && data->nominal_mode != data->passed_mode)
2402     stack_parm = NULL;
2403
2404   /* If stack protection is in effect for this function, don't leave any
2405      pointers in their passed stack slots.  */
2406   else if (crtl->stack_protect_guard
2407            && (flag_stack_protect == 2
2408                || data->passed_pointer
2409                || POINTER_TYPE_P (data->nominal_type)))
2410     stack_parm = NULL;
2411
2412   data->stack_parm = stack_parm;
2413 }
2414
2415 /* A subroutine of assign_parms.  Return true if the current parameter
2416    should be stored as a BLKmode in the current frame.  */
2417
2418 static bool
2419 assign_parm_setup_block_p (struct assign_parm_data_one *data)
2420 {
2421   if (data->nominal_mode == BLKmode)
2422     return true;
2423   if (GET_MODE (data->entry_parm) == BLKmode)
2424     return true;
2425
2426 #ifdef BLOCK_REG_PADDING
2427   /* Only assign_parm_setup_block knows how to deal with register arguments
2428      that are padded at the least significant end.  */
2429   if (REG_P (data->entry_parm)
2430       && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD
2431       && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1)
2432           == (BYTES_BIG_ENDIAN ? upward : downward)))
2433     return true;
2434 #endif
2435
2436   return false;
2437 }
2438
2439 /* A subroutine of assign_parms.  Arrange for the parameter to be 
2440    present and valid in DATA->STACK_RTL.  */
2441
2442 static void
2443 assign_parm_setup_block (struct assign_parm_data_all *all,
2444                          tree parm, struct assign_parm_data_one *data)
2445 {
2446   rtx entry_parm = data->entry_parm;
2447   rtx stack_parm = data->stack_parm;
2448   HOST_WIDE_INT size;
2449   HOST_WIDE_INT size_stored;
2450
2451   if (GET_CODE (entry_parm) == PARALLEL)
2452     entry_parm = emit_group_move_into_temps (entry_parm);
2453
2454   size = int_size_in_bytes (data->passed_type);
2455   size_stored = CEIL_ROUND (size, UNITS_PER_WORD);
2456   if (stack_parm == 0)
2457     {
2458       DECL_ALIGN (parm) = MAX (DECL_ALIGN (parm), BITS_PER_WORD);
2459       stack_parm = assign_stack_local (BLKmode, size_stored,
2460                                        DECL_ALIGN (parm));
2461       if (GET_MODE_SIZE (GET_MODE (entry_parm)) == size)
2462         PUT_MODE (stack_parm, GET_MODE (entry_parm));
2463       set_mem_attributes (stack_parm, parm, 1);
2464     }
2465
2466   /* If a BLKmode arrives in registers, copy it to a stack slot.  Handle
2467      calls that pass values in multiple non-contiguous locations.  */
2468   if (REG_P (entry_parm) || GET_CODE (entry_parm) == PARALLEL)
2469     {
2470       rtx mem;
2471
2472       /* Note that we will be storing an integral number of words.
2473          So we have to be careful to ensure that we allocate an
2474          integral number of words.  We do this above when we call
2475          assign_stack_local if space was not allocated in the argument
2476          list.  If it was, this will not work if PARM_BOUNDARY is not
2477          a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2478          if it becomes a problem.  Exception is when BLKmode arrives
2479          with arguments not conforming to word_mode.  */
2480
2481       if (data->stack_parm == 0)
2482         ;
2483       else if (GET_CODE (entry_parm) == PARALLEL)
2484         ;
2485       else
2486         gcc_assert (!size || !(PARM_BOUNDARY % BITS_PER_WORD));
2487
2488       mem = validize_mem (stack_parm);
2489
2490       /* Handle values in multiple non-contiguous locations.  */
2491       if (GET_CODE (entry_parm) == PARALLEL)
2492         {
2493           push_to_sequence2 (all->first_conversion_insn,
2494                              all->last_conversion_insn);
2495           emit_group_store (mem, entry_parm, data->passed_type, size);
2496           all->first_conversion_insn = get_insns ();
2497           all->last_conversion_insn = get_last_insn ();
2498           end_sequence ();
2499         }
2500
2501       else if (size == 0)
2502         ;
2503
2504       /* If SIZE is that of a mode no bigger than a word, just use
2505          that mode's store operation.  */
2506       else if (size <= UNITS_PER_WORD)
2507         {
2508           enum machine_mode mode
2509             = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2510
2511           if (mode != BLKmode
2512 #ifdef BLOCK_REG_PADDING
2513               && (size == UNITS_PER_WORD
2514                   || (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2515                       != (BYTES_BIG_ENDIAN ? upward : downward)))
2516 #endif
2517               )
2518             {
2519               rtx reg;
2520
2521               /* We are really truncating a word_mode value containing
2522                  SIZE bytes into a value of mode MODE.  If such an
2523                  operation requires no actual instructions, we can refer
2524                  to the value directly in mode MODE, otherwise we must
2525                  start with the register in word_mode and explicitly
2526                  convert it.  */
2527               if (TRULY_NOOP_TRUNCATION (size * BITS_PER_UNIT, BITS_PER_WORD))
2528                 reg = gen_rtx_REG (mode, REGNO (entry_parm));
2529               else
2530                 {
2531                   reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2532                   reg = convert_to_mode (mode, copy_to_reg (reg), 1);
2533                 }
2534               emit_move_insn (change_address (mem, mode, 0), reg);
2535             }
2536
2537           /* Blocks smaller than a word on a BYTES_BIG_ENDIAN
2538              machine must be aligned to the left before storing
2539              to memory.  Note that the previous test doesn't
2540              handle all cases (e.g. SIZE == 3).  */
2541           else if (size != UNITS_PER_WORD
2542 #ifdef BLOCK_REG_PADDING
2543                    && (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2544                        == downward)
2545 #else
2546                    && BYTES_BIG_ENDIAN
2547 #endif
2548                    )
2549             {
2550               rtx tem, x;
2551               int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
2552               rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2553
2554               x = expand_shift (LSHIFT_EXPR, word_mode, reg,
2555                                 build_int_cst (NULL_TREE, by),
2556                                 NULL_RTX, 1);
2557               tem = change_address (mem, word_mode, 0);
2558               emit_move_insn (tem, x);
2559             }
2560           else
2561             move_block_from_reg (REGNO (entry_parm), mem,
2562                                  size_stored / UNITS_PER_WORD);
2563         }
2564       else
2565         move_block_from_reg (REGNO (entry_parm), mem,
2566                              size_stored / UNITS_PER_WORD);
2567     }
2568   else if (data->stack_parm == 0)
2569     {
2570       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2571       emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
2572                        BLOCK_OP_NORMAL);
2573       all->first_conversion_insn = get_insns ();
2574       all->last_conversion_insn = get_last_insn ();
2575       end_sequence ();
2576     }
2577
2578   data->stack_parm = stack_parm;
2579   SET_DECL_RTL (parm, stack_parm);
2580 }
2581
2582 /* A subroutine of assign_parms.  Allocate a pseudo to hold the current
2583    parameter.  Get it there.  Perform all ABI specified conversions.  */
2584
2585 static void
2586 assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
2587                        struct assign_parm_data_one *data)
2588 {
2589   rtx parmreg;
2590   enum machine_mode promoted_nominal_mode;
2591   int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
2592   bool did_conversion = false;
2593
2594   /* Store the parm in a pseudoregister during the function, but we may
2595      need to do it in a wider mode.  */
2596
2597   /* This is not really promoting for a call.  However we need to be
2598      consistent with assign_parm_find_data_types and expand_expr_real_1.  */
2599   promoted_nominal_mode
2600     = promote_mode (data->nominal_type, data->nominal_mode, &unsignedp, 1);
2601
2602   parmreg = gen_reg_rtx (promoted_nominal_mode);
2603
2604   if (!DECL_ARTIFICIAL (parm))
2605     mark_user_reg (parmreg);
2606
2607   /* If this was an item that we received a pointer to,
2608      set DECL_RTL appropriately.  */
2609   if (data->passed_pointer)
2610     {
2611       rtx x = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data->passed_type)), parmreg);
2612       set_mem_attributes (x, parm, 1);
2613       SET_DECL_RTL (parm, x);
2614     }
2615   else
2616     SET_DECL_RTL (parm, parmreg);
2617
2618   assign_parm_remove_parallels (data);
2619
2620   /* Copy the value into the register.  */
2621   if (data->nominal_mode != data->passed_mode
2622       || promoted_nominal_mode != data->promoted_mode)
2623     {
2624       int save_tree_used;
2625
2626       /* ENTRY_PARM has been converted to PROMOTED_MODE, its
2627          mode, by the caller.  We now have to convert it to
2628          NOMINAL_MODE, if different.  However, PARMREG may be in
2629          a different mode than NOMINAL_MODE if it is being stored
2630          promoted.
2631
2632          If ENTRY_PARM is a hard register, it might be in a register
2633          not valid for operating in its mode (e.g., an odd-numbered
2634          register for a DFmode).  In that case, moves are the only
2635          thing valid, so we can't do a convert from there.  This
2636          occurs when the calling sequence allow such misaligned
2637          usages.
2638
2639          In addition, the conversion may involve a call, which could
2640          clobber parameters which haven't been copied to pseudo
2641          registers yet.  Therefore, we must first copy the parm to
2642          a pseudo reg here, and save the conversion until after all
2643          parameters have been moved.  */
2644
2645       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2646
2647       emit_move_insn (tempreg, validize_mem (data->entry_parm));
2648
2649       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2650       tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
2651
2652       if (GET_CODE (tempreg) == SUBREG
2653           && GET_MODE (tempreg) == data->nominal_mode
2654           && REG_P (SUBREG_REG (tempreg))
2655           && data->nominal_mode == data->passed_mode
2656           && GET_MODE (SUBREG_REG (tempreg)) == GET_MODE (data->entry_parm)
2657           && GET_MODE_SIZE (GET_MODE (tempreg))
2658              < GET_MODE_SIZE (GET_MODE (data->entry_parm)))
2659         {
2660           /* The argument is already sign/zero extended, so note it
2661              into the subreg.  */
2662           SUBREG_PROMOTED_VAR_P (tempreg) = 1;
2663           SUBREG_PROMOTED_UNSIGNED_SET (tempreg, unsignedp);
2664         }
2665
2666       /* TREE_USED gets set erroneously during expand_assignment.  */
2667       save_tree_used = TREE_USED (parm);
2668       expand_assignment (parm, make_tree (data->nominal_type, tempreg), false);
2669       TREE_USED (parm) = save_tree_used;
2670       all->first_conversion_insn = get_insns ();
2671       all->last_conversion_insn = get_last_insn ();
2672       end_sequence ();
2673
2674       did_conversion = true;
2675     }
2676   else
2677     emit_move_insn (parmreg, validize_mem (data->entry_parm));
2678
2679   /* If we were passed a pointer but the actual value can safely live
2680      in a register, put it in one.  */
2681   if (data->passed_pointer
2682       && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
2683       /* If by-reference argument was promoted, demote it.  */
2684       && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
2685           || use_register_for_decl (parm)))
2686     {
2687       /* We can't use nominal_mode, because it will have been set to
2688          Pmode above.  We must use the actual mode of the parm.  */
2689       parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
2690       mark_user_reg (parmreg);
2691
2692       if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm)))
2693         {
2694           rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm)));
2695           int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
2696
2697           push_to_sequence2 (all->first_conversion_insn,
2698                              all->last_conversion_insn);
2699           emit_move_insn (tempreg, DECL_RTL (parm));
2700           tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
2701           emit_move_insn (parmreg, tempreg);
2702           all->first_conversion_insn = get_insns ();
2703           all->last_conversion_insn = get_last_insn ();
2704           end_sequence ();
2705
2706           did_conversion = true;
2707         }
2708       else
2709         emit_move_insn (parmreg, DECL_RTL (parm));
2710
2711       SET_DECL_RTL (parm, parmreg);
2712
2713       /* STACK_PARM is the pointer, not the parm, and PARMREG is
2714          now the parm.  */
2715       data->stack_parm = NULL;
2716     }
2717
2718   /* Mark the register as eliminable if we did no conversion and it was
2719      copied from memory at a fixed offset, and the arg pointer was not
2720      copied to a pseudo-reg.  If the arg pointer is a pseudo reg or the
2721      offset formed an invalid address, such memory-equivalences as we
2722      make here would screw up life analysis for it.  */
2723   if (data->nominal_mode == data->passed_mode
2724       && !did_conversion
2725       && data->stack_parm != 0
2726       && MEM_P (data->stack_parm)
2727       && data->locate.offset.var == 0
2728       && reg_mentioned_p (virtual_incoming_args_rtx,
2729                           XEXP (data->stack_parm, 0)))
2730     {
2731       rtx linsn = get_last_insn ();
2732       rtx sinsn, set;
2733
2734       /* Mark complex types separately.  */
2735       if (GET_CODE (parmreg) == CONCAT)
2736         {
2737           enum machine_mode submode
2738             = GET_MODE_INNER (GET_MODE (parmreg));
2739           int regnor = REGNO (XEXP (parmreg, 0));
2740           int regnoi = REGNO (XEXP (parmreg, 1));
2741           rtx stackr = adjust_address_nv (data->stack_parm, submode, 0);
2742           rtx stacki = adjust_address_nv (data->stack_parm, submode,
2743                                           GET_MODE_SIZE (submode));
2744
2745           /* Scan backwards for the set of the real and
2746              imaginary parts.  */
2747           for (sinsn = linsn; sinsn != 0;
2748                sinsn = prev_nonnote_insn (sinsn))
2749             {
2750               set = single_set (sinsn);
2751               if (set == 0)
2752                 continue;
2753
2754               if (SET_DEST (set) == regno_reg_rtx [regnoi])
2755                 set_unique_reg_note (sinsn, REG_EQUIV, stacki);
2756               else if (SET_DEST (set) == regno_reg_rtx [regnor])
2757                 set_unique_reg_note (sinsn, REG_EQUIV, stackr);
2758             }
2759         }
2760       else if ((set = single_set (linsn)) != 0
2761                && SET_DEST (set) == parmreg)
2762         set_unique_reg_note (linsn, REG_EQUIV, data->stack_parm);
2763     }
2764
2765   /* For pointer data type, suggest pointer register.  */
2766   if (POINTER_TYPE_P (TREE_TYPE (parm)))
2767     mark_reg_pointer (parmreg,
2768                       TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
2769 }
2770
2771 /* A subroutine of assign_parms.  Allocate stack space to hold the current
2772    parameter.  Get it there.  Perform all ABI specified conversions.  */
2773
2774 static void
2775 assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
2776                          struct assign_parm_data_one *data)
2777 {
2778   /* Value must be stored in the stack slot STACK_PARM during function
2779      execution.  */
2780   bool to_conversion = false;
2781
2782   assign_parm_remove_parallels (data);
2783
2784   if (data->promoted_mode != data->nominal_mode)
2785     {
2786       /* Conversion is required.  */
2787       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2788
2789       emit_move_insn (tempreg, validize_mem (data->entry_parm));
2790
2791       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2792       to_conversion = true;
2793
2794       data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
2795                                           TYPE_UNSIGNED (TREE_TYPE (parm)));
2796
2797       if (data->stack_parm)
2798         /* ??? This may need a big-endian conversion on sparc64.  */
2799         data->stack_parm
2800           = adjust_address (data->stack_parm, data->nominal_mode, 0);
2801     }
2802
2803   if (data->entry_parm != data->stack_parm)
2804     {
2805       rtx src, dest;
2806
2807       if (data->stack_parm == 0)
2808         {
2809           data->stack_parm
2810             = assign_stack_local (GET_MODE (data->entry_parm),
2811                                   GET_MODE_SIZE (GET_MODE (data->entry_parm)),
2812                                   TYPE_ALIGN (data->passed_type));
2813           set_mem_attributes (data->stack_parm, parm, 1);
2814         }
2815
2816       dest = validize_mem (data->stack_parm);
2817       src = validize_mem (data->entry_parm);
2818
2819       if (MEM_P (src))
2820         {
2821           /* Use a block move to handle potentially misaligned entry_parm.  */
2822           if (!to_conversion)
2823             push_to_sequence2 (all->first_conversion_insn,
2824                                all->last_conversion_insn);
2825           to_conversion = true;
2826
2827           emit_block_move (dest, src,
2828                            GEN_INT (int_size_in_bytes (data->passed_type)),
2829                            BLOCK_OP_NORMAL);
2830         }
2831       else
2832         emit_move_insn (dest, src);
2833     }
2834
2835   if (to_conversion)
2836     {
2837       all->first_conversion_insn = get_insns ();
2838       all->last_conversion_insn = get_last_insn ();
2839       end_sequence ();
2840     }
2841
2842   SET_DECL_RTL (parm, data->stack_parm);
2843 }
2844
2845 /* A subroutine of assign_parms.  If the ABI splits complex arguments, then
2846    undo the frobbing that we did in assign_parms_augmented_arg_list.  */
2847
2848 static void
2849 assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs)
2850 {
2851   tree parm;
2852   tree orig_fnargs = all->orig_fnargs;
2853
2854   for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm))
2855     {
2856       if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
2857           && targetm.calls.split_complex_arg (TREE_TYPE (parm)))
2858         {
2859           rtx tmp, real, imag;
2860           enum machine_mode inner = GET_MODE_INNER (DECL_MODE (parm));
2861
2862           real = DECL_RTL (fnargs);
2863           imag = DECL_RTL (TREE_CHAIN (fnargs));
2864           if (inner != GET_MODE (real))
2865             {
2866               real = gen_lowpart_SUBREG (inner, real);
2867               imag = gen_lowpart_SUBREG (inner, imag);
2868             }
2869
2870           if (TREE_ADDRESSABLE (parm))
2871             {
2872               rtx rmem, imem;
2873               HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (parm));
2874
2875               /* split_complex_arg put the real and imag parts in
2876                  pseudos.  Move them to memory.  */
2877               tmp = assign_stack_local (DECL_MODE (parm), size,
2878                                         TYPE_ALIGN (TREE_TYPE (parm)));
2879               set_mem_attributes (tmp, parm, 1);
2880               rmem = adjust_address_nv (tmp, inner, 0);
2881               imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
2882               push_to_sequence2 (all->first_conversion_insn,
2883                                  all->last_conversion_insn);
2884               emit_move_insn (rmem, real);
2885               emit_move_insn (imem, imag);
2886               all->first_conversion_insn = get_insns ();
2887               all->last_conversion_insn = get_last_insn ();
2888               end_sequence ();
2889             }
2890           else
2891             tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2892           SET_DECL_RTL (parm, tmp);
2893
2894           real = DECL_INCOMING_RTL (fnargs);
2895           imag = DECL_INCOMING_RTL (TREE_CHAIN (fnargs));
2896           if (inner != GET_MODE (real))
2897             {
2898               real = gen_lowpart_SUBREG (inner, real);
2899               imag = gen_lowpart_SUBREG (inner, imag);
2900             }
2901           tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2902           set_decl_incoming_rtl (parm, tmp, false);
2903           fnargs = TREE_CHAIN (fnargs);
2904         }
2905       else
2906         {
2907           SET_DECL_RTL (parm, DECL_RTL (fnargs));
2908           set_decl_incoming_rtl (parm, DECL_INCOMING_RTL (fnargs), false);
2909
2910           /* Set MEM_EXPR to the original decl, i.e. to PARM,
2911              instead of the copy of decl, i.e. FNARGS.  */
2912           if (DECL_INCOMING_RTL (parm) && MEM_P (DECL_INCOMING_RTL (parm)))
2913             set_mem_expr (DECL_INCOMING_RTL (parm), parm);
2914         }
2915
2916       fnargs = TREE_CHAIN (fnargs);
2917     }
2918 }
2919
2920 /* Assign RTL expressions to the function's parameters.  This may involve
2921    copying them into registers and using those registers as the DECL_RTL.  */
2922
2923 static void
2924 assign_parms (tree fndecl)
2925 {
2926   struct assign_parm_data_all all;
2927   tree fnargs, parm;
2928
2929   crtl->args.internal_arg_pointer
2930     = targetm.calls.internal_arg_pointer ();
2931
2932   assign_parms_initialize_all (&all);
2933   fnargs = assign_parms_augmented_arg_list (&all);
2934
2935   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
2936     {
2937       struct assign_parm_data_one data;
2938
2939       /* Extract the type of PARM; adjust it according to ABI.  */
2940       assign_parm_find_data_types (&all, parm, &data);
2941
2942       /* Early out for errors and void parameters.  */
2943       if (data.passed_mode == VOIDmode)
2944         {
2945           SET_DECL_RTL (parm, const0_rtx);
2946           DECL_INCOMING_RTL (parm) = DECL_RTL (parm);
2947           continue;
2948         }
2949
2950       if (cfun->stdarg && !TREE_CHAIN (parm))
2951         assign_parms_setup_varargs (&all, &data, false);
2952
2953       /* Find out where the parameter arrives in this function.  */
2954       assign_parm_find_entry_rtl (&all, &data);
2955
2956       /* Find out where stack space for this parameter might be.  */
2957       if (assign_parm_is_stack_parm (&all, &data))
2958         {
2959           assign_parm_find_stack_rtl (parm, &data);
2960           assign_parm_adjust_entry_rtl (&data);
2961         }
2962
2963       /* Record permanently how this parm was passed.  */
2964       set_decl_incoming_rtl (parm, data.entry_parm, data.passed_pointer);
2965
2966       /* Update info on where next arg arrives in registers.  */
2967       FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
2968                             data.passed_type, data.named_arg);
2969
2970       assign_parm_adjust_stack_rtl (&data);
2971
2972       if (assign_parm_setup_block_p (&data))
2973         assign_parm_setup_block (&all, parm, &data);
2974       else if (data.passed_pointer || use_register_for_decl (parm))
2975         assign_parm_setup_reg (&all, parm, &data);
2976       else
2977         assign_parm_setup_stack (&all, parm, &data);
2978     }
2979
2980   if (targetm.calls.split_complex_arg && fnargs != all.orig_fnargs)
2981     assign_parms_unsplit_complex (&all, fnargs);
2982
2983   /* Output all parameter conversion instructions (possibly including calls)
2984      now that all parameters have been copied out of hard registers.  */
2985   emit_insn (all.first_conversion_insn);
2986
2987   /* If we are receiving a struct value address as the first argument, set up
2988      the RTL for the function result. As this might require code to convert
2989      the transmitted address to Pmode, we do this here to ensure that possible
2990      preliminary conversions of the address have been emitted already.  */
2991   if (all.function_result_decl)
2992     {
2993       tree result = DECL_RESULT (current_function_decl);
2994       rtx addr = DECL_RTL (all.function_result_decl);
2995       rtx x;
2996
2997       if (DECL_BY_REFERENCE (result))
2998         x = addr;
2999       else
3000         {
3001           addr = convert_memory_address (Pmode, addr);
3002           x = gen_rtx_MEM (DECL_MODE (result), addr);
3003           set_mem_attributes (x, result, 1);
3004         }
3005       SET_DECL_RTL (result, x);
3006     }
3007
3008   /* We have aligned all the args, so add space for the pretend args.  */
3009   crtl->args.pretend_args_size = all.pretend_args_size;
3010   all.stack_args_size.constant += all.extra_pretend_bytes;
3011   crtl->args.size = all.stack_args_size.constant;
3012
3013   /* Adjust function incoming argument size for alignment and
3014      minimum length.  */
3015
3016 #ifdef REG_PARM_STACK_SPACE
3017   crtl->args.size = MAX (crtl->args.size,
3018                                     REG_PARM_STACK_SPACE (fndecl));
3019 #endif
3020
3021   crtl->args.size = CEIL_ROUND (crtl->args.size,
3022                                            PARM_BOUNDARY / BITS_PER_UNIT);
3023
3024 #ifdef ARGS_GROW_DOWNWARD
3025   crtl->args.arg_offset_rtx
3026     = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
3027        : expand_expr (size_diffop (all.stack_args_size.var,
3028                                    size_int (-all.stack_args_size.constant)),
3029                       NULL_RTX, VOIDmode, 0));
3030 #else
3031   crtl->args.arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
3032 #endif
3033
3034   /* See how many bytes, if any, of its args a function should try to pop
3035      on return.  */
3036
3037   crtl->args.pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
3038                                                  crtl->args.size);
3039
3040   /* For stdarg.h function, save info about
3041      regs and stack space used by the named args.  */
3042
3043   crtl->args.info = all.args_so_far;
3044
3045   /* Set the rtx used for the function return value.  Put this in its
3046      own variable so any optimizers that need this information don't have
3047      to include tree.h.  Do this here so it gets done when an inlined
3048      function gets output.  */
3049
3050   crtl->return_rtx
3051     = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
3052        ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
3053
3054   /* If scalar return value was computed in a pseudo-reg, or was a named
3055      return value that got dumped to the stack, copy that to the hard
3056      return register.  */
3057   if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
3058     {
3059       tree decl_result = DECL_RESULT (fndecl);
3060       rtx decl_rtl = DECL_RTL (decl_result);
3061
3062       if (REG_P (decl_rtl)
3063           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
3064           : DECL_REGISTER (decl_result))
3065         {
3066           rtx real_decl_rtl;
3067
3068           real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
3069                                                         fndecl, true);
3070           REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
3071           /* The delay slot scheduler assumes that crtl->return_rtx
3072              holds the hard register containing the return value, not a
3073              temporary pseudo.  */
3074           crtl->return_rtx = real_decl_rtl;
3075         }
3076     }
3077 }
3078
3079 /* A subroutine of gimplify_parameters, invoked via walk_tree.
3080    For all seen types, gimplify their sizes.  */
3081
3082 static tree
3083 gimplify_parm_type (tree *tp, int *walk_subtrees, void *data)
3084 {
3085   tree t = *tp;
3086
3087   *walk_subtrees = 0;
3088   if (TYPE_P (t))
3089     {
3090       if (POINTER_TYPE_P (t))
3091         *walk_subtrees = 1;
3092       else if (TYPE_SIZE (t) && !TREE_CONSTANT (TYPE_SIZE (t))
3093                && !TYPE_SIZES_GIMPLIFIED (t))
3094         {
3095           gimplify_type_sizes (t, (tree *) data);
3096           *walk_subtrees = 1;
3097         }
3098     }
3099
3100   return NULL;
3101 }
3102
3103 /* Gimplify the parameter list for current_function_decl.  This involves
3104    evaluating SAVE_EXPRs of variable sized parameters and generating code
3105    to implement callee-copies reference parameters.  Returns a list of
3106    statements to add to the beginning of the function, or NULL if nothing
3107    to do.  */
3108
3109 tree
3110 gimplify_parameters (void)
3111 {
3112   struct assign_parm_data_all all;
3113   tree fnargs, parm, stmts = NULL;
3114
3115   assign_parms_initialize_all (&all);
3116   fnargs = assign_parms_augmented_arg_list (&all);
3117
3118   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
3119     {
3120       struct assign_parm_data_one data;
3121
3122       /* Extract the type of PARM; adjust it according to ABI.  */
3123       assign_parm_find_data_types (&all, parm, &data);
3124
3125       /* Early out for errors and void parameters.  */
3126       if (data.passed_mode == VOIDmode || DECL_SIZE (parm) == NULL)
3127         continue;
3128
3129       /* Update info on where next arg arrives in registers.  */
3130       FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
3131                             data.passed_type, data.named_arg);
3132
3133       /* ??? Once upon a time variable_size stuffed parameter list
3134          SAVE_EXPRs (amongst others) onto a pending sizes list.  This
3135          turned out to be less than manageable in the gimple world.
3136          Now we have to hunt them down ourselves.  */
3137       walk_tree_without_duplicates (&data.passed_type,
3138                                     gimplify_parm_type, &stmts);
3139
3140       if (!TREE_CONSTANT (DECL_SIZE (parm)))
3141         {
3142           gimplify_one_sizepos (&DECL_SIZE (parm), &stmts);
3143           gimplify_one_sizepos (&DECL_SIZE_UNIT (parm), &stmts);
3144         }
3145
3146       if (data.passed_pointer)
3147         {
3148           tree type = TREE_TYPE (data.passed_type);
3149           if (reference_callee_copied (&all.args_so_far, TYPE_MODE (type),
3150                                        type, data.named_arg))
3151             {
3152               tree local, t;
3153
3154               /* For constant sized objects, this is trivial; for
3155                  variable-sized objects, we have to play games.  */
3156               if (TREE_CONSTANT (DECL_SIZE (parm)))
3157                 {
3158                   local = create_tmp_var (type, get_name (parm));
3159                   DECL_IGNORED_P (local) = 0;
3160                 }
3161               else
3162                 {
3163                   tree ptr_type, addr;
3164
3165                   ptr_type = build_pointer_type (type);
3166                   addr = create_tmp_var (ptr_type, get_name (parm));
3167                   DECL_IGNORED_P (addr) = 0;
3168                   local = build_fold_indirect_ref (addr);
3169
3170                   t = built_in_decls[BUILT_IN_ALLOCA];
3171                   t = build_call_expr (t, 1, DECL_SIZE_UNIT (parm));
3172                   t = fold_convert (ptr_type, t);
3173                   t = build_gimple_modify_stmt (addr, t);
3174                   gimplify_and_add (t, &stmts);
3175                 }
3176
3177               t = build_gimple_modify_stmt (local, parm);
3178               gimplify_and_add (t, &stmts);
3179
3180               SET_DECL_VALUE_EXPR (parm, local);
3181               DECL_HAS_VALUE_EXPR_P (parm) = 1;
3182             }
3183         }
3184     }
3185
3186   return stmts;
3187 }
3188 \f
3189 /* Compute the size and offset from the start of the stacked arguments for a
3190    parm passed in mode PASSED_MODE and with type TYPE.
3191
3192    INITIAL_OFFSET_PTR points to the current offset into the stacked
3193    arguments.
3194
3195    The starting offset and size for this parm are returned in
3196    LOCATE->OFFSET and LOCATE->SIZE, respectively.  When IN_REGS is
3197    nonzero, the offset is that of stack slot, which is returned in
3198    LOCATE->SLOT_OFFSET.  LOCATE->ALIGNMENT_PAD is the amount of
3199    padding required from the initial offset ptr to the stack slot.
3200
3201    IN_REGS is nonzero if the argument will be passed in registers.  It will
3202    never be set if REG_PARM_STACK_SPACE is not defined.
3203
3204    FNDECL is the function in which the argument was defined.
3205
3206    There are two types of rounding that are done.  The first, controlled by
3207    FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
3208    list to be aligned to the specific boundary (in bits).  This rounding
3209    affects the initial and starting offsets, but not the argument size.
3210
3211    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3212    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3213    initial offset is not affected by this rounding, while the size always
3214    is and the starting offset may be.  */
3215
3216 /*  LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
3217     INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
3218     callers pass in the total size of args so far as
3219     INITIAL_OFFSET_PTR.  LOCATE->SIZE is always positive.  */
3220
3221 void
3222 locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
3223                      int partial, tree fndecl ATTRIBUTE_UNUSED,
3224                      struct args_size *initial_offset_ptr,
3225                      struct locate_and_pad_arg_data *locate)
3226 {
3227   tree sizetree;
3228   enum direction where_pad;
3229   unsigned int boundary;
3230   int reg_parm_stack_space = 0;
3231   int part_size_in_regs;
3232
3233 #ifdef REG_PARM_STACK_SPACE
3234   reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3235
3236   /* If we have found a stack parm before we reach the end of the
3237      area reserved for registers, skip that area.  */
3238   if (! in_regs)
3239     {
3240       if (reg_parm_stack_space > 0)
3241         {
3242           if (initial_offset_ptr->var)
3243             {
3244               initial_offset_ptr->var
3245                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3246                               ssize_int (reg_parm_stack_space));
3247               initial_offset_ptr->constant = 0;
3248             }
3249           else if (initial_offset_ptr->constant < reg_parm_stack_space)
3250             initial_offset_ptr->constant = reg_parm_stack_space;
3251         }
3252     }
3253 #endif /* REG_PARM_STACK_SPACE */
3254
3255   part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
3256
3257   sizetree
3258     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3259   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3260   boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
3261   locate->where_pad = where_pad;
3262   locate->boundary = boundary;
3263
3264   /* Remember if the outgoing parameter requires extra alignment on the
3265      calling function side.  */
3266   if (boundary > PREFERRED_STACK_BOUNDARY)
3267     boundary = PREFERRED_STACK_BOUNDARY;
3268   if (crtl->stack_alignment_needed < boundary)
3269     crtl->stack_alignment_needed = boundary;
3270
3271 #ifdef ARGS_GROW_DOWNWARD
3272   locate->slot_offset.constant = -initial_offset_ptr->constant;
3273   if (initial_offset_ptr->var)
3274     locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int (0),
3275                                           initial_offset_ptr->var);
3276
3277   {
3278     tree s2 = sizetree;
3279     if (where_pad != none
3280         && (!host_integerp (sizetree, 1)
3281             || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3282       s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
3283     SUB_PARM_SIZE (locate->slot_offset, s2);
3284   }
3285
3286   locate->slot_offset.constant += part_size_in_regs;
3287
3288   if (!in_regs
3289 #ifdef REG_PARM_STACK_SPACE
3290       || REG_PARM_STACK_SPACE (fndecl) > 0
3291 #endif
3292      )
3293     pad_to_arg_alignment (&locate->slot_offset, boundary,
3294                           &locate->alignment_pad);
3295
3296   locate->size.constant = (-initial_offset_ptr->constant
3297                            - locate->slot_offset.constant);
3298   if (initial_offset_ptr->var)
3299     locate->size.var = size_binop (MINUS_EXPR,
3300                                    size_binop (MINUS_EXPR,
3301                                                ssize_int (0),
3302                                                initial_offset_ptr->var),
3303                                    locate->slot_offset.var);
3304
3305   /* Pad_below needs the pre-rounded size to know how much to pad
3306      below.  */
3307   locate->offset = locate->slot_offset;
3308   if (where_pad == downward)
3309     pad_below (&locate->offset, passed_mode, sizetree);
3310
3311 #else /* !ARGS_GROW_DOWNWARD */
3312   if (!in_regs
3313 #ifdef REG_PARM_STACK_SPACE
3314       || REG_PARM_STACK_SPACE (fndecl) > 0
3315 #endif
3316       )
3317     pad_to_arg_alignment (initial_offset_ptr, boundary,
3318                           &locate->alignment_pad);
3319   locate->slot_offset = *initial_offset_ptr;
3320
3321 #ifdef PUSH_ROUNDING
3322   if (passed_mode != BLKmode)
3323     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3324 #endif
3325
3326   /* Pad_below needs the pre-rounded size to know how much to pad below
3327      so this must be done before rounding up.  */
3328   locate->offset = locate->slot_offset;
3329   if (where_pad == downward)
3330     pad_below (&locate->offset, passed_mode, sizetree);
3331
3332   if (where_pad != none
3333       && (!host_integerp (sizetree, 1)
3334           || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3335     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3336
3337   ADD_PARM_SIZE (locate->size, sizetree);
3338
3339   locate->size.constant -= part_size_in_regs;
3340 #endif /* ARGS_GROW_DOWNWARD */
3341 }
3342
3343 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3344    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
3345
3346 static void
3347 pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
3348                       struct args_size *alignment_pad)
3349 {
3350   tree save_var = NULL_TREE;
3351   HOST_WIDE_INT save_constant = 0;
3352   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3353   HOST_WIDE_INT sp_offset = STACK_POINTER_OFFSET;
3354
3355 #ifdef SPARC_STACK_BOUNDARY_HACK
3356   /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
3357      the real alignment of %sp.  However, when it does this, the
3358      alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY.  */
3359   if (SPARC_STACK_BOUNDARY_HACK)
3360     sp_offset = 0;
3361 #endif
3362
3363   if (boundary > PARM_BOUNDARY)
3364     {
3365       save_var = offset_ptr->var;
3366       save_constant = offset_ptr->constant;
3367     }
3368
3369   alignment_pad->var = NULL_TREE;
3370   alignment_pad->constant = 0;
3371
3372   if (boundary > BITS_PER_UNIT)
3373     {
3374       if (offset_ptr->var)
3375         {
3376           tree sp_offset_tree = ssize_int (sp_offset);
3377           tree offset = size_binop (PLUS_EXPR,
3378                                     ARGS_SIZE_TREE (*offset_ptr),
3379                                     sp_offset_tree);
3380 #ifdef ARGS_GROW_DOWNWARD
3381           tree rounded = round_down (offset, boundary / BITS_PER_UNIT);
3382 #else
3383           tree rounded = round_up   (offset, boundary / BITS_PER_UNIT);
3384 #endif
3385
3386           offset_ptr->var = size_binop (MINUS_EXPR, rounded, sp_offset_tree);
3387           /* ARGS_SIZE_TREE includes constant term.  */
3388           offset_ptr->constant = 0;
3389           if (boundary > PARM_BOUNDARY)
3390             alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
3391                                              save_var);
3392         }
3393       else
3394         {
3395           offset_ptr->constant = -sp_offset +
3396 #ifdef ARGS_GROW_DOWNWARD
3397             FLOOR_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3398 #else
3399             CEIL_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3400 #endif
3401             if (boundary > PARM_BOUNDARY)
3402               alignment_pad->constant = offset_ptr->constant - save_constant;
3403         }
3404     }
3405 }
3406
3407 static void
3408 pad_below (struct args_size *offset_ptr, enum machine_mode passed_mode, tree sizetree)
3409 {
3410   if (passed_mode != BLKmode)
3411     {
3412       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3413         offset_ptr->constant
3414           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3415                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3416               - GET_MODE_SIZE (passed_mode));
3417     }
3418   else
3419     {
3420       if (TREE_CODE (sizetree) != INTEGER_CST
3421           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3422         {
3423           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
3424           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3425           /* Add it in.  */
3426           ADD_PARM_SIZE (*offset_ptr, s2);
3427           SUB_PARM_SIZE (*offset_ptr, sizetree);
3428         }
3429     }
3430 }
3431 \f
3432
3433 /* True if register REGNO was alive at a place where `setjmp' was
3434    called and was set more than once or is an argument.  Such regs may
3435    be clobbered by `longjmp'.  */
3436
3437 static bool
3438 regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)
3439 {
3440   /* There appear to be cases where some local vars never reach the
3441      backend but have bogus regnos.  */
3442   if (regno >= max_reg_num ())
3443     return false;
3444
3445   return ((REG_N_SETS (regno) > 1
3446            || REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), regno))
3447           && REGNO_REG_SET_P (setjmp_crosses, regno));
3448 }
3449
3450 /* Walk the tree of blocks describing the binding levels within a
3451    function and warn about variables the might be killed by setjmp or
3452    vfork.  This is done after calling flow_analysis before register
3453    allocation since that will clobber the pseudo-regs to hard
3454    regs.  */
3455
3456 static void
3457 setjmp_vars_warning (bitmap setjmp_crosses, tree block)
3458 {
3459   tree decl, sub;
3460
3461   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3462     {
3463       if (TREE_CODE (decl) == VAR_DECL
3464           && DECL_RTL_SET_P (decl)
3465           && REG_P (DECL_RTL (decl))
3466           && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
3467         warning (OPT_Wclobbered, "variable %q+D might be clobbered by" 
3468                  " %<longjmp%> or %<vfork%>", decl);
3469     }
3470
3471   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = BLOCK_CHAIN (sub))
3472     setjmp_vars_warning (setjmp_crosses, sub);
3473 }
3474
3475 /* Do the appropriate part of setjmp_vars_warning
3476    but for arguments instead of local variables.  */
3477
3478 static void
3479 setjmp_args_warning (bitmap setjmp_crosses)
3480 {
3481   tree decl;
3482   for (decl = DECL_ARGUMENTS (current_function_decl);
3483        decl; decl = TREE_CHAIN (decl))
3484     if (DECL_RTL (decl) != 0
3485         && REG_P (DECL_RTL (decl))
3486         && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
3487       warning (OPT_Wclobbered, 
3488                "argument %q+D might be clobbered by %<longjmp%> or %<vfork%>",
3489                decl);
3490 }
3491
3492 /* Generate warning messages for variables live across setjmp.  */
3493
3494 void 
3495 generate_setjmp_warnings (void)
3496 {
3497   bitmap setjmp_crosses = regstat_get_setjmp_crosses ();
3498
3499   if (n_basic_blocks == NUM_FIXED_BLOCKS
3500       || bitmap_empty_p (setjmp_crosses))
3501     return;
3502
3503   setjmp_vars_warning (setjmp_crosses, DECL_INITIAL (current_function_decl));
3504   setjmp_args_warning (setjmp_crosses);
3505 }
3506
3507 \f
3508 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
3509    and create duplicate blocks.  */
3510 /* ??? Need an option to either create block fragments or to create
3511    abstract origin duplicates of a source block.  It really depends
3512    on what optimization has been performed.  */
3513
3514 void
3515 reorder_blocks (void)
3516 {
3517   tree block = DECL_INITIAL (current_function_decl);
3518   VEC(tree,heap) *block_stack;
3519
3520   if (block == NULL_TREE)
3521     return;
3522
3523   block_stack = VEC_alloc (tree, heap, 10);
3524
3525   /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
3526   clear_block_marks (block);
3527
3528   /* Prune the old trees away, so that they don't get in the way.  */
3529   BLOCK_SUBBLOCKS (block) = NULL_TREE;
3530   BLOCK_CHAIN (block) = NULL_TREE;
3531
3532   /* Recreate the block tree from the note nesting.  */
3533   reorder_blocks_1 (get_insns (), block, &block_stack);
3534   BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
3535
3536   VEC_free (tree, heap, block_stack);
3537 }
3538
3539 /* Helper function for reorder_blocks.  Reset TREE_ASM_WRITTEN.  */
3540
3541 void
3542 clear_block_marks (tree block)
3543 {
3544   while (block)
3545     {
3546       TREE_ASM_WRITTEN (block) = 0;
3547       clear_block_marks (BLOCK_SUBBLOCKS (block));
3548       block = BLOCK_CHAIN (block);
3549     }
3550 }
3551
3552 static void
3553 reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
3554 {
3555   rtx insn;
3556
3557   for (insn = insns; insn; insn = NEXT_INSN (insn))
3558     {
3559       if (NOTE_P (insn))
3560         {
3561           if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_BEG)
3562             {
3563               tree block = NOTE_BLOCK (insn);
3564               tree origin;
3565
3566               origin = (BLOCK_FRAGMENT_ORIGIN (block)
3567                         ? BLOCK_FRAGMENT_ORIGIN (block)
3568                         : block);
3569
3570               /* If we have seen this block before, that means it now
3571                  spans multiple address regions.  Create a new fragment.  */
3572               if (TREE_ASM_WRITTEN (block))
3573                 {
3574                   tree new_block = copy_node (block);
3575
3576                   BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
3577                   BLOCK_FRAGMENT_CHAIN (new_block)
3578                     = BLOCK_FRAGMENT_CHAIN (origin);
3579                   BLOCK_FRAGMENT_CHAIN (origin) = new_block;
3580
3581                   NOTE_BLOCK (insn) = new_block;
3582                   block = new_block;
3583                 }
3584
3585               BLOCK_SUBBLOCKS (block) = 0;
3586               TREE_ASM_WRITTEN (block) = 1;
3587               /* When there's only one block for the entire function,
3588                  current_block == block and we mustn't do this, it
3589                  will cause infinite recursion.  */
3590               if (block != current_block)
3591                 {
3592                   if (block != origin)
3593                     gcc_assert (BLOCK_SUPERCONTEXT (origin) == current_block);
3594
3595                   BLOCK_SUPERCONTEXT (block) = current_block;
3596                   BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
3597                   BLOCK_SUBBLOCKS (current_block) = block;
3598                   current_block = origin;
3599                 }
3600               VEC_safe_push (tree, heap, *p_block_stack, block);
3601             }
3602           else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END)
3603             {
3604               NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack);
3605               BLOCK_SUBBLOCKS (current_block)
3606                 = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
3607               current_block = BLOCK_SUPERCONTEXT (current_block);
3608             }
3609         }
3610     }
3611 }
3612
3613 /* Reverse the order of elements in the chain T of blocks,
3614    and return the new head of the chain (old last element).  */
3615
3616 tree
3617 blocks_nreverse (tree t)
3618 {
3619   tree prev = 0, decl, next;
3620   for (decl = t; decl; decl = next)
3621     {
3622       next = BLOCK_CHAIN (decl);
3623       BLOCK_CHAIN (decl) = prev;
3624       prev = decl;
3625     }
3626   return prev;
3627 }
3628
3629 /* Count the subblocks of the list starting with BLOCK.  If VECTOR is
3630    non-NULL, list them all into VECTOR, in a depth-first preorder
3631    traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
3632    blocks.  */
3633
3634 static int
3635 all_blocks (tree block, tree *vector)
3636 {
3637   int n_blocks = 0;
3638
3639   while (block)
3640     {
3641       TREE_ASM_WRITTEN (block) = 0;
3642
3643       /* Record this block.  */
3644       if (vector)
3645         vector[n_blocks] = block;
3646
3647       ++n_blocks;
3648
3649       /* Record the subblocks, and their subblocks...  */
3650       n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
3651                               vector ? vector + n_blocks : 0);
3652       block = BLOCK_CHAIN (block);
3653     }
3654
3655   return n_blocks;
3656 }
3657
3658 /* Return a vector containing all the blocks rooted at BLOCK.  The
3659    number of elements in the vector is stored in N_BLOCKS_P.  The
3660    vector is dynamically allocated; it is the caller's responsibility
3661    to call `free' on the pointer returned.  */
3662
3663 static tree *
3664 get_block_vector (tree block, int *n_blocks_p)
3665 {
3666   tree *block_vector;
3667
3668   *n_blocks_p = all_blocks (block, NULL);
3669   block_vector = XNEWVEC (tree, *n_blocks_p);
3670   all_blocks (block, block_vector);
3671
3672   return block_vector;
3673 }
3674
3675 static GTY(()) int next_block_index = 2;
3676
3677 /* Set BLOCK_NUMBER for all the blocks in FN.  */
3678
3679 void
3680 number_blocks (tree fn)
3681 {
3682   int i;
3683   int n_blocks;
3684   tree *block_vector;
3685
3686   /* For SDB and XCOFF debugging output, we start numbering the blocks
3687      from 1 within each function, rather than keeping a running
3688      count.  */
3689 #if defined (SDB_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3690   if (write_symbols == SDB_DEBUG || write_symbols == XCOFF_DEBUG)
3691     next_block_index = 1;
3692 #endif
3693
3694   block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
3695
3696   /* The top-level BLOCK isn't numbered at all.  */
3697   for (i = 1; i < n_blocks; ++i)
3698     /* We number the blocks from two.  */
3699     BLOCK_NUMBER (block_vector[i]) = next_block_index++;
3700
3701   free (block_vector);
3702
3703   return;
3704 }
3705
3706 /* If VAR is present in a subblock of BLOCK, return the subblock.  */
3707
3708 tree
3709 debug_find_var_in_block_tree (tree var, tree block)
3710 {
3711   tree t;
3712
3713   for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
3714     if (t == var)
3715       return block;
3716
3717   for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
3718     {
3719       tree ret = debug_find_var_in_block_tree (var, t);
3720       if (ret)
3721         return ret;
3722     }
3723
3724   return NULL_TREE;
3725 }
3726 \f
3727 /* Keep track of whether we're in a dummy function context.  If we are,
3728    we don't want to invoke the set_current_function hook, because we'll
3729    get into trouble if the hook calls target_reinit () recursively or
3730    when the initial initialization is not yet complete.  */
3731
3732 static bool in_dummy_function;
3733
3734 /* Invoke the target hook when setting cfun.  */
3735
3736 static void
3737 invoke_set_current_function_hook (tree fndecl)
3738 {
3739   if (!in_dummy_function)
3740     targetm.set_current_function (fndecl);
3741 }
3742
3743 /* cfun should never be set directly; use this function.  */
3744
3745 void
3746 set_cfun (struct function *new_cfun)
3747 {
3748   if (cfun != new_cfun)
3749     {
3750       cfun = new_cfun;
3751       invoke_set_current_function_hook (new_cfun ? new_cfun->decl : NULL_TREE);
3752     }
3753 }
3754
3755 /* Keep track of the cfun stack.  */
3756
3757 typedef struct function *function_p;
3758
3759 DEF_VEC_P(function_p);
3760 DEF_VEC_ALLOC_P(function_p,heap);
3761
3762 /* Initialized with NOGC, making this poisonous to the garbage collector.  */
3763
3764 static VEC(function_p,heap) *cfun_stack;
3765
3766 /* We save the value of in_system_header here when pushing the first
3767    function on the cfun stack, and we restore it from here when
3768    popping the last function.  */
3769
3770 static bool saved_in_system_header;
3771
3772 /* Push the current cfun onto the stack, and set cfun to new_cfun.  */
3773
3774 void
3775 push_cfun (struct function *new_cfun)
3776 {
3777   if (cfun == NULL)
3778     saved_in_system_header = in_system_header;
3779   VEC_safe_push (function_p, heap, cfun_stack, cfun);
3780   if (new_cfun)
3781     in_system_header = DECL_IN_SYSTEM_HEADER (new_cfun->decl);
3782   set_cfun (new_cfun);
3783 }
3784
3785 /* Pop cfun from the stack.  */
3786
3787 void
3788 pop_cfun (void)
3789 {
3790   struct function *new_cfun = VEC_pop (function_p, cfun_stack);
3791   in_system_header = ((new_cfun == NULL) ? saved_in_system_header
3792                       : DECL_IN_SYSTEM_HEADER (new_cfun->decl));
3793   set_cfun (new_cfun);
3794 }
3795
3796 /* Return value of funcdef and increase it.  */
3797 int
3798 get_next_funcdef_no (void) 
3799 {
3800   return funcdef_no++;
3801 }
3802
3803 /* Allocate a function structure for FNDECL and set its contents
3804    to the defaults.  Set cfun to the newly-allocated object.
3805    Some of the helper functions invoked during initialization assume
3806    that cfun has already been set.  Therefore, assign the new object
3807    directly into cfun and invoke the back end hook explicitly at the
3808    very end, rather than initializing a temporary and calling set_cfun
3809    on it.
3810
3811    ABSTRACT_P is true if this is a function that will never be seen by
3812    the middle-end.  Such functions are front-end concepts (like C++
3813    function templates) that do not correspond directly to functions
3814    placed in object files.  */
3815
3816 void
3817 allocate_struct_function (tree fndecl, bool abstract_p)
3818 {
3819   tree result;
3820   tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;
3821
3822   cfun = GGC_CNEW (struct function);
3823
3824   cfun->function_frequency = FUNCTION_FREQUENCY_NORMAL;
3825
3826   init_eh_for_function ();
3827
3828   if (init_machine_status)
3829     cfun->machine = (*init_machine_status) ();
3830
3831 #ifdef OVERRIDE_ABI_FORMAT
3832   OVERRIDE_ABI_FORMAT (fndecl);
3833 #endif
3834
3835   if (fndecl != NULL_TREE)
3836     {
3837       DECL_STRUCT_FUNCTION (fndecl) = cfun;
3838       cfun->decl = fndecl;
3839       current_function_funcdef_no = get_next_funcdef_no ();
3840
3841       result = DECL_RESULT (fndecl);
3842       if (!abstract_p && aggregate_value_p (result, fndecl))
3843         {
3844 #ifdef PCC_STATIC_STRUCT_RETURN
3845           cfun->returns_pcc_struct = 1;
3846 #endif
3847           cfun->returns_struct = 1;
3848         }
3849
3850       cfun->stdarg
3851         = (fntype
3852            && TYPE_ARG_TYPES (fntype) != 0
3853            && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3854                != void_type_node));
3855       
3856       /* Assume all registers in stdarg functions need to be saved.  */
3857       cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
3858       cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
3859     }
3860
3861   invoke_set_current_function_hook (fndecl);
3862 }
3863
3864 /* This is like allocate_struct_function, but pushes a new cfun for FNDECL
3865    instead of just setting it.  */
3866
3867 void
3868 push_struct_function (tree fndecl)
3869 {
3870   if (cfun == NULL)
3871     saved_in_system_header = in_system_header;
3872   VEC_safe_push (function_p, heap, cfun_stack, cfun);
3873   if (fndecl)
3874     in_system_header = DECL_IN_SYSTEM_HEADER (fndecl);
3875   allocate_struct_function (fndecl, false);
3876 }
3877
3878 /* Reset cfun, and other non-struct-function variables to defaults as
3879    appropriate for emitting rtl at the start of a function.  */
3880
3881 static void
3882 prepare_function_start (void)
3883 {
3884   gcc_assert (!crtl->emit.x_last_insn);
3885   init_emit ();
3886   init_varasm_status ();
3887   init_expr ();
3888
3889   cse_not_expected = ! optimize;
3890
3891   /* Caller save not needed yet.  */
3892   caller_save_needed = 0;
3893
3894   /* We haven't done register allocation yet.  */
3895   reg_renumber = 0;
3896
3897   /* Indicate that we have not instantiated virtual registers yet.  */
3898   virtuals_instantiated = 0;
3899
3900   /* Indicate that we want CONCATs now.  */
3901   generating_concat_p = 1;
3902
3903   /* Indicate we have no need of a frame pointer yet.  */
3904   frame_pointer_needed = 0;
3905 }
3906
3907 /* Initialize the rtl expansion mechanism so that we can do simple things
3908    like generate sequences.  This is used to provide a context during global
3909    initialization of some passes.  You must call expand_dummy_function_end
3910    to exit this context.  */
3911
3912 void
3913 init_dummy_function_start (void)
3914 {
3915   gcc_assert (!in_dummy_function);
3916   in_dummy_function = true;
3917   push_struct_function (NULL_TREE);
3918   prepare_function_start ();
3919 }
3920
3921 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
3922    and initialize static variables for generating RTL for the statements
3923    of the function.  */
3924
3925 void
3926 init_function_start (tree subr)
3927 {
3928   if (subr && DECL_STRUCT_FUNCTION (subr))
3929     set_cfun (DECL_STRUCT_FUNCTION (subr));
3930   else
3931     allocate_struct_function (subr, false);
3932   prepare_function_start ();
3933
3934   /* Warn if this value is an aggregate type,
3935      regardless of which calling convention we are using for it.  */
3936   if (AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
3937     warning (OPT_Waggregate_return, "function returns an aggregate");
3938 }
3939
3940 /* Make sure all values used by the optimization passes have sane
3941    defaults.  */
3942 unsigned int
3943 init_function_for_compilation (void)
3944 {
3945   reg_renumber = 0;
3946
3947   /* No prologue/epilogue insns yet.  Make sure that these vectors are
3948      empty.  */
3949   gcc_assert (VEC_length (int, prologue) == 0);
3950   gcc_assert (VEC_length (int, epilogue) == 0);
3951   gcc_assert (VEC_length (int, sibcall_epilogue) == 0);
3952   return 0;
3953 }
3954
3955 struct rtl_opt_pass pass_init_function =
3956 {
3957  {
3958   RTL_PASS,
3959   NULL,                                 /* name */
3960   NULL,                                 /* gate */   
3961   init_function_for_compilation,        /* execute */       
3962   NULL,                                 /* sub */
3963   NULL,                                 /* next */
3964   0,                                    /* static_pass_number */
3965   0,                                    /* tv_id */
3966   0,                                    /* properties_required */
3967   0,                                    /* properties_provided */
3968   0,                                    /* properties_destroyed */
3969   0,                                    /* todo_flags_start */
3970   0                                     /* todo_flags_finish */
3971  }
3972 };
3973
3974
3975 void
3976 expand_main_function (void)
3977 {
3978 #if (defined(INVOKE__main)                              \
3979      || (!defined(HAS_INIT_SECTION)                     \
3980          && !defined(INIT_SECTION_ASM_OP)               \
3981          && !defined(INIT_ARRAY_SECTION_ASM_OP)))
3982   emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
3983 #endif
3984 }
3985 \f
3986 /* Expand code to initialize the stack_protect_guard.  This is invoked at
3987    the beginning of a function to be protected.  */
3988
3989 #ifndef HAVE_stack_protect_set
3990 # define HAVE_stack_protect_set         0
3991 # define gen_stack_protect_set(x,y)     (gcc_unreachable (), NULL_RTX)
3992 #endif
3993
3994 void
3995 stack_protect_prologue (void)
3996 {
3997   tree guard_decl = targetm.stack_protect_guard ();
3998   rtx x, y;
3999
4000   /* Avoid expand_expr here, because we don't want guard_decl pulled
4001      into registers unless absolutely necessary.  And we know that
4002      crtl->stack_protect_guard is a local stack slot, so this skips
4003      all the fluff.  */
4004   x = validize_mem (DECL_RTL (crtl->stack_protect_guard));
4005   y = validize_mem (DECL_RTL (guard_decl));
4006
4007   /* Allow the target to copy from Y to X without leaking Y into a
4008      register.  */
4009   if (HAVE_stack_protect_set)
4010     {
4011       rtx insn = gen_stack_protect_set (x, y);
4012       if (insn)
4013         {
4014           emit_insn (insn);
4015           return;
4016         }
4017     }
4018
4019   /* Otherwise do a straight move.  */
4020   emit_move_insn (x, y);
4021 }
4022
4023 /* Expand code to verify the stack_protect_guard.  This is invoked at
4024    the end of a function to be protected.  */
4025
4026 #ifndef HAVE_stack_protect_test
4027 # define HAVE_stack_protect_test                0
4028 # define gen_stack_protect_test(x, y, z)        (gcc_unreachable (), NULL_RTX)
4029 #endif
4030
4031 void
4032 stack_protect_epilogue (void)
4033 {
4034   tree guard_decl = targetm.stack_protect_guard ();
4035   rtx label = gen_label_rtx ();
4036   rtx x, y, tmp;
4037
4038   /* Avoid expand_expr here, because we don't want guard_decl pulled
4039      into registers unless absolutely necessary.  And we know that
4040      crtl->stack_protect_guard is a local stack slot, so this skips
4041      all the fluff.  */
4042   x = validize_mem (DECL_RTL (crtl->stack_protect_guard));
4043   y = validize_mem (DECL_RTL (guard_decl));
4044
4045   /* Allow the target to compare Y with X without leaking either into
4046      a register.  */
4047   switch (HAVE_stack_protect_test != 0)
4048     {
4049     case 1:
4050       tmp = gen_stack_protect_test (x, y, label);
4051       if (tmp)
4052         {
4053           emit_insn (tmp);
4054           break;
4055         }
4056       /* FALLTHRU */
4057
4058     default:
4059       emit_cmp_and_jump_insns (x, y, EQ, NULL_RTX, ptr_mode, 1, label);
4060       break;
4061     }
4062
4063   /* The noreturn predictor has been moved to the tree level.  The rtl-level
4064      predictors estimate this branch about 20%, which isn't enough to get
4065      things moved out of line.  Since this is the only extant case of adding
4066      a noreturn function at the rtl level, it doesn't seem worth doing ought
4067      except adding the prediction by hand.  */
4068   tmp = get_last_insn ();
4069   if (JUMP_P (tmp))
4070     predict_insn_def (tmp, PRED_NORETURN, TAKEN);
4071
4072   expand_expr_stmt (targetm.stack_protect_fail ());
4073   emit_label (label);
4074 }
4075 \f
4076 /* Start the RTL for a new function, and set variables used for
4077    emitting RTL.
4078    SUBR is the FUNCTION_DECL node.
4079    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
4080    the function's parameters, which must be run at any return statement.  */
4081
4082 void
4083 expand_function_start (tree subr)
4084 {
4085   /* Make sure volatile mem refs aren't considered
4086      valid operands of arithmetic insns.  */
4087   init_recog_no_volatile ();
4088
4089   crtl->profile
4090     = (profile_flag
4091        && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
4092
4093   crtl->limit_stack
4094     = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
4095
4096   /* Make the label for return statements to jump to.  Do not special
4097      case machines with special return instructions -- they will be
4098      handled later during jump, ifcvt, or epilogue creation.  */
4099   return_label = gen_label_rtx ();
4100
4101   /* Initialize rtx used to return the value.  */
4102   /* Do this before assign_parms so that we copy the struct value address
4103      before any library calls that assign parms might generate.  */
4104
4105   /* Decide whether to return the value in memory or in a register.  */
4106   if (aggregate_value_p (DECL_RESULT (subr), subr))
4107     {
4108       /* Returning something that won't go in a register.  */
4109       rtx value_address = 0;
4110
4111 #ifdef PCC_STATIC_STRUCT_RETURN
4112       if (cfun->returns_pcc_struct)
4113         {
4114           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
4115           value_address = assemble_static_space (size);
4116         }
4117       else
4118 #endif
4119         {
4120           rtx sv = targetm.calls.struct_value_rtx (TREE_TYPE (subr), 2);
4121           /* Expect to be passed the address of a place to store the value.
4122              If it is passed as an argument, assign_parms will take care of
4123              it.  */
4124           if (sv)
4125             {
4126               value_address = gen_reg_rtx (Pmode);
4127               emit_move_insn (value_address, sv);
4128             }
4129         }
4130       if (value_address)
4131         {
4132           rtx x = value_address;
4133           if (!DECL_BY_REFERENCE (DECL_RESULT (subr)))
4134             {
4135               x = gen_rtx_MEM (DECL_MODE (DECL_RESULT (subr)), x);
4136               set_mem_attributes (x, DECL_RESULT (subr), 1);
4137             }
4138           SET_DECL_RTL (DECL_RESULT (subr), x);
4139         }
4140     }
4141   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
4142     /* If return mode is void, this decl rtl should not be used.  */
4143     SET_DECL_RTL (DECL_RESULT (subr), NULL_RTX);
4144   else
4145     {
4146       /* Compute the return values into a pseudo reg, which we will copy
4147          into the true return register after the cleanups are done.  */
4148       tree return_type = TREE_TYPE (DECL_RESULT (subr));
4149       if (TYPE_MODE (return_type) != BLKmode
4150           && targetm.calls.return_in_msb (return_type))
4151         /* expand_function_end will insert the appropriate padding in
4152            this case.  Use the return value's natural (unpadded) mode
4153            within the function proper.  */
4154         SET_DECL_RTL (DECL_RESULT (subr),
4155                       gen_reg_rtx (TYPE_MODE (return_type)));
4156       else
4157         {
4158           /* In order to figure out what mode to use for the pseudo, we
4159              figure out what the mode of the eventual return register will
4160              actually be, and use that.  */
4161           rtx hard_reg = hard_function_value (return_type, subr, 0, 1);
4162
4163           /* Structures that are returned in registers are not
4164              aggregate_value_p, so we may see a PARALLEL or a REG.  */
4165           if (REG_P (hard_reg))
4166             SET_DECL_RTL (DECL_RESULT (subr),
4167                           gen_reg_rtx (GET_MODE (hard_reg)));
4168           else
4169             {
4170               gcc_assert (GET_CODE (hard_reg) == PARALLEL);
4171               SET_DECL_RTL (DECL_RESULT (subr), gen_group_rtx (hard_reg));
4172             }
4173         }
4174
4175       /* Set DECL_REGISTER flag so that expand_function_end will copy the
4176          result to the real return register(s).  */
4177       DECL_REGISTER (DECL_RESULT (subr)) = 1;
4178     }
4179
4180   /* Initialize rtx for parameters and local variables.
4181      In some cases this requires emitting insns.  */
4182   assign_parms (subr);
4183
4184   /* If function gets a static chain arg, store it.  */
4185   if (cfun->static_chain_decl)
4186     {
4187       tree parm = cfun->static_chain_decl;
4188       rtx local = gen_reg_rtx (Pmode);
4189
4190       set_decl_incoming_rtl (parm, static_chain_incoming_rtx, false);
4191       SET_DECL_RTL (parm, local);
4192       mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
4193
4194       emit_move_insn (local, static_chain_incoming_rtx);
4195     }
4196
4197   /* If the function receives a non-local goto, then store the
4198      bits we need to restore the frame pointer.  */
4199   if (cfun->nonlocal_goto_save_area)
4200     {
4201       tree t_save;
4202       rtx r_save;
4203
4204       /* ??? We need to do this save early.  Unfortunately here is
4205          before the frame variable gets declared.  Help out...  */
4206       tree var = TREE_OPERAND (cfun->nonlocal_goto_save_area, 0);
4207       if (!DECL_RTL_SET_P (var))
4208         expand_decl (var);
4209
4210       t_save = build4 (ARRAY_REF, ptr_type_node,
4211                        cfun->nonlocal_goto_save_area,
4212                        integer_zero_node, NULL_TREE, NULL_TREE);
4213       r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
4214       r_save = convert_memory_address (Pmode, r_save);
4215
4216       emit_move_insn (r_save, targetm.builtin_setjmp_frame_value ());
4217       update_nonlocal_goto_save_area ();
4218     }
4219
4220   /* The following was moved from init_function_start.
4221      The move is supposed to make sdb output more accurate.  */
4222   /* Indicate the beginning of the function body,
4223      as opposed to parm setup.  */
4224   emit_note (NOTE_INSN_FUNCTION_BEG);
4225
4226   gcc_assert (NOTE_P (get_last_insn ()));
4227
4228   parm_birth_insn = get_last_insn ();
4229
4230   if (crtl->profile)
4231     {
4232 #ifdef PROFILE_HOOK
4233       PROFILE_HOOK (current_function_funcdef_no);
4234 #endif
4235     }
4236
4237   /* After the display initializations is where the stack checking
4238      probe should go.  */
4239   if(flag_stack_check)
4240     stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
4241
4242   /* Make sure there is a line number after the function entry setup code.  */
4243   force_next_line_note ();
4244 }
4245 \f
4246 /* Undo the effects of init_dummy_function_start.  */
4247 void
4248 expand_dummy_function_end (void)
4249 {
4250   gcc_assert (in_dummy_function);
4251
4252   /* End any sequences that failed to be closed due to syntax errors.  */
4253   while (in_sequence_p ())
4254     end_sequence ();
4255
4256   /* Outside function body, can't compute type's actual size
4257      until next function's body starts.  */
4258
4259   free_after_parsing (cfun);
4260   free_after_compilation (cfun);
4261   pop_cfun ();
4262   in_dummy_function = false;
4263 }
4264
4265 /* Call DOIT for each hard register used as a return value from
4266    the current function.  */
4267
4268 void
4269 diddle_return_value (void (*doit) (rtx, void *), void *arg)
4270 {
4271   rtx outgoing = crtl->return_rtx;
4272
4273   if (! outgoing)
4274     return;
4275
4276   if (REG_P (outgoing))
4277     (*doit) (outgoing, arg);
4278   else if (GET_CODE (outgoing) == PARALLEL)
4279     {
4280       int i;
4281
4282       for (i = 0; i < XVECLEN (outgoing, 0); i++)
4283         {
4284           rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
4285
4286           if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
4287             (*doit) (x, arg);
4288         }
4289     }
4290 }
4291
4292 static void
4293 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4294 {
4295   emit_clobber (reg);
4296 }
4297
4298 void
4299 clobber_return_register (void)
4300 {
4301   diddle_return_value (do_clobber_return_reg, NULL);
4302
4303   /* In case we do use pseudo to return value, clobber it too.  */
4304   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4305     {
4306       tree decl_result = DECL_RESULT (current_function_decl);
4307       rtx decl_rtl = DECL_RTL (decl_result);
4308       if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
4309         {
4310           do_clobber_return_reg (decl_rtl, NULL);
4311         }
4312     }
4313 }
4314
4315 static void
4316 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4317 {
4318   emit_use (reg);
4319 }
4320
4321 static void
4322 use_return_register (void)
4323 {
4324   diddle_return_value (do_use_return_reg, NULL);
4325 }
4326
4327 /* Possibly warn about unused parameters.  */
4328 void
4329 do_warn_unused_parameter (tree fn)
4330 {
4331   tree decl;
4332
4333   for (decl = DECL_ARGUMENTS (fn);
4334        decl; decl = TREE_CHAIN (decl))
4335     if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
4336         && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)
4337         && !TREE_NO_WARNING (decl))
4338       warning (OPT_Wunused_parameter, "unused parameter %q+D", decl);
4339 }
4340
4341 static GTY(()) rtx initial_trampoline;
4342
4343 /* Generate RTL for the end of the current function.  */
4344
4345 void
4346 expand_function_end (void)
4347 {
4348   rtx clobber_after;
4349
4350   /* If arg_pointer_save_area was referenced only from a nested
4351      function, we will not have initialized it yet.  Do that now.  */
4352   if (arg_pointer_save_area && ! crtl->arg_pointer_save_area_init)
4353     get_arg_pointer_save_area ();
4354
4355   /* If we are doing stack checking and this function makes calls,
4356      do a stack probe at the start of the function to ensure we have enough
4357      space for another stack frame.  */
4358   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
4359     {
4360       rtx insn, seq;
4361
4362       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4363         if (CALL_P (insn))
4364           {
4365             start_sequence ();
4366             probe_stack_range (STACK_CHECK_PROTECT,
4367                                GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
4368             seq = get_insns ();
4369             end_sequence ();
4370             emit_insn_before (seq, stack_check_probe_note);
4371             break;
4372           }
4373     }
4374
4375   /* End any sequences that failed to be closed due to syntax errors.  */
4376   while (in_sequence_p ())
4377     end_sequence ();
4378
4379   clear_pending_stack_adjust ();
4380   do_pending_stack_adjust ();
4381
4382   /* Output a linenumber for the end of the function.
4383      SDB depends on this.  */
4384   force_next_line_note ();
4385   set_curr_insn_source_location (input_location);
4386
4387   /* Before the return label (if any), clobber the return
4388      registers so that they are not propagated live to the rest of
4389      the function.  This can only happen with functions that drop
4390      through; if there had been a return statement, there would
4391      have either been a return rtx, or a jump to the return label.
4392
4393      We delay actual code generation after the current_function_value_rtx
4394      is computed.  */
4395   clobber_after = get_last_insn ();
4396
4397   /* Output the label for the actual return from the function.  */
4398   emit_label (return_label);
4399
4400   if (USING_SJLJ_EXCEPTIONS)
4401     {
4402       /* Let except.c know where it should emit the call to unregister
4403          the function context for sjlj exceptions.  */
4404       if (flag_exceptions)
4405         sjlj_emit_function_exit_after (get_last_insn ());
4406     }
4407   else
4408     {
4409       /* We want to ensure that instructions that may trap are not
4410          moved into the epilogue by scheduling, because we don't
4411          always emit unwind information for the epilogue.  */
4412       if (flag_non_call_exceptions)
4413         emit_insn (gen_blockage ());
4414     }
4415
4416   /* If this is an implementation of throw, do what's necessary to
4417      communicate between __builtin_eh_return and the epilogue.  */
4418   expand_eh_return ();
4419
4420   /* If scalar return value was computed in a pseudo-reg, or was a named
4421      return value that got dumped to the stack, copy that to the hard
4422      return register.  */
4423   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4424     {
4425       tree decl_result = DECL_RESULT (current_function_decl);
4426       rtx decl_rtl = DECL_RTL (decl_result);
4427
4428       if (REG_P (decl_rtl)
4429           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
4430           : DECL_REGISTER (decl_result))
4431         {
4432           rtx real_decl_rtl = crtl->return_rtx;
4433
4434           /* This should be set in assign_parms.  */
4435           gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
4436
4437           /* If this is a BLKmode structure being returned in registers,
4438              then use the mode computed in expand_return.  Note that if
4439              decl_rtl is memory, then its mode may have been changed,
4440              but that crtl->return_rtx has not.  */
4441           if (GET_MODE (real_decl_rtl) == BLKmode)
4442             PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
4443
4444           /* If a non-BLKmode return value should be padded at the least
4445              significant end of the register, shift it left by the appropriate
4446              amount.  BLKmode results are handled using the group load/store
4447              machinery.  */
4448           if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
4449               && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
4450             {
4451               emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),
4452                                            REGNO (real_decl_rtl)),
4453                               decl_rtl);
4454               shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
4455             }
4456           /* If a named return value dumped decl_return to memory, then
4457              we may need to re-do the PROMOTE_MODE signed/unsigned
4458              extension.  */
4459           else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
4460             {
4461               int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
4462
4463               if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
4464                 promote_mode (TREE_TYPE (decl_result), GET_MODE (decl_rtl),
4465                               &unsignedp, 1);
4466
4467               convert_move (real_decl_rtl, decl_rtl, unsignedp);
4468             }
4469           else if (GET_CODE (real_decl_rtl) == PARALLEL)
4470             {
4471               /* If expand_function_start has created a PARALLEL for decl_rtl,
4472                  move the result to the real return registers.  Otherwise, do
4473                  a group load from decl_rtl for a named return.  */
4474               if (GET_CODE (decl_rtl) == PARALLEL)
4475                 emit_group_move (real_decl_rtl, decl_rtl);
4476               else
4477                 emit_group_load (real_decl_rtl, decl_rtl,
4478                                  TREE_TYPE (decl_result),
4479                                  int_size_in_bytes (TREE_TYPE (decl_result)));
4480             }
4481           /* In the case of complex integer modes smaller than a word, we'll
4482              need to generate some non-trivial bitfield insertions.  Do that
4483              on a pseudo and not the hard register.  */
4484           else if (GET_CODE (decl_rtl) == CONCAT
4485                    && GET_MODE_CLASS (GET_MODE (decl_rtl)) == MODE_COMPLEX_INT
4486                    && GET_MODE_BITSIZE (GET_MODE (decl_rtl)) <= BITS_PER_WORD)
4487             {
4488               int old_generating_concat_p;
4489               rtx tmp;
4490
4491               old_generating_concat_p = generating_concat_p;
4492               generating_concat_p = 0;
4493               tmp = gen_reg_rtx (GET_MODE (decl_rtl));
4494               generating_concat_p = old_generating_concat_p;
4495
4496               emit_move_insn (tmp, decl_rtl);
4497               emit_move_insn (real_decl_rtl, tmp);
4498             }
4499           else
4500             emit_move_insn (real_decl_rtl, decl_rtl);
4501         }
4502     }
4503
4504   /* If returning a structure, arrange to return the address of the value
4505      in a place where debuggers expect to find it.
4506
4507      If returning a structure PCC style,
4508      the caller also depends on this value.
4509      And cfun->returns_pcc_struct is not necessarily set.  */
4510   if (cfun->returns_struct
4511       || cfun->returns_pcc_struct)
4512     {
4513       rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
4514       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
4515       rtx outgoing;
4516
4517       if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
4518         type = TREE_TYPE (type);
4519       else
4520         value_address = XEXP (value_address, 0);
4521
4522       outgoing = targetm.calls.function_value (build_pointer_type (type),
4523                                                current_function_decl, true);
4524
4525       /* Mark this as a function return value so integrate will delete the
4526          assignment and USE below when inlining this function.  */
4527       REG_FUNCTION_VALUE_P (outgoing) = 1;
4528
4529       /* The address may be ptr_mode and OUTGOING may be Pmode.  */
4530       value_address = convert_memory_address (GET_MODE (outgoing),
4531                                               value_address);
4532
4533       emit_move_insn (outgoing, value_address);
4534
4535       /* Show return register used to hold result (in this case the address
4536          of the result.  */
4537       crtl->return_rtx = outgoing;
4538     }
4539
4540   /* Emit the actual code to clobber return register.  */
4541   {
4542     rtx seq;
4543
4544     start_sequence ();
4545     clobber_return_register ();
4546     expand_naked_return ();
4547     seq = get_insns ();
4548     end_sequence ();
4549
4550     emit_insn_after (seq, clobber_after);
4551   }
4552
4553   /* Output the label for the naked return from the function.  */
4554   emit_label (naked_return_label);
4555
4556   /* @@@ This is a kludge.  We want to ensure that instructions that
4557      may trap are not moved into the epilogue by scheduling, because
4558      we don't always emit unwind information for the epilogue.  */
4559   if (! USING_SJLJ_EXCEPTIONS && flag_non_call_exceptions)
4560     emit_insn (gen_blockage ());
4561
4562   /* If stack protection is enabled for this function, check the guard.  */
4563   if (crtl->stack_protect_guard)
4564     stack_protect_epilogue ();
4565
4566   /* If we had calls to alloca, and this machine needs
4567      an accurate stack pointer to exit the function,
4568      insert some code to save and restore the stack pointer.  */
4569   if (! EXIT_IGNORE_STACK
4570       && cfun->calls_alloca)
4571     {
4572       rtx tem = 0;
4573
4574       emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
4575       emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
4576     }
4577
4578   /* ??? This should no longer be necessary since stupid is no longer with
4579      us, but there are some parts of the compiler (eg reload_combine, and
4580      sh mach_dep_reorg) that still try and compute their own lifetime info
4581      instead of using the general framework.  */
4582   use_return_register ();
4583 }
4584
4585 rtx
4586 get_arg_pointer_save_area (void)
4587 {
4588   rtx ret = arg_pointer_save_area;
4589
4590   if (! ret)
4591     {
4592       ret = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
4593       arg_pointer_save_area = ret;
4594     }
4595
4596   if (! crtl->arg_pointer_save_area_init)
4597     {
4598       rtx seq;
4599
4600       /* Save the arg pointer at the beginning of the function.  The
4601          generated stack slot may not be a valid memory address, so we
4602          have to check it and fix it if necessary.  */
4603       start_sequence ();
4604       emit_move_insn (validize_mem (ret), virtual_incoming_args_rtx);
4605       seq = get_insns ();
4606       end_sequence ();
4607
4608       push_topmost_sequence ();
4609       emit_insn_after (seq, entry_of_function ());
4610       pop_topmost_sequence ();
4611     }
4612
4613   return ret;
4614 }
4615 \f
4616 /* Extend a vector that records the INSN_UIDs of INSNS
4617    (a list of one or more insns).  */
4618
4619 static void
4620 record_insns (rtx insns, VEC(int,heap) **vecp)
4621 {
4622   rtx tmp;
4623
4624   for (tmp = insns; tmp != NULL_RTX; tmp = NEXT_INSN (tmp))
4625     VEC_safe_push (int, heap, *vecp, INSN_UID (tmp));
4626 }
4627
4628 /* Set the locator of the insn chain starting at INSN to LOC.  */
4629 static void
4630 set_insn_locators (rtx insn, int loc)
4631 {
4632   while (insn != NULL_RTX)
4633     {
4634       if (INSN_P (insn))
4635         INSN_LOCATOR (insn) = loc;
4636       insn = NEXT_INSN (insn);
4637     }
4638 }
4639
4640 /* Determine how many INSN_UIDs in VEC are part of INSN.  Because we can
4641    be running after reorg, SEQUENCE rtl is possible.  */
4642
4643 static int
4644 contains (const_rtx insn, VEC(int,heap) **vec)
4645 {
4646   int i, j;
4647
4648   if (NONJUMP_INSN_P (insn)
4649       && GET_CODE (PATTERN (insn)) == SEQUENCE)
4650     {
4651       int count = 0;
4652       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
4653         for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
4654           if (INSN_UID (XVECEXP (PATTERN (insn), 0, i))
4655               == VEC_index (int, *vec, j))
4656             count++;
4657       return count;
4658     }
4659   else
4660     {
4661       for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
4662         if (INSN_UID (insn) == VEC_index (int, *vec, j))
4663           return 1;
4664     }
4665   return 0;
4666 }
4667
4668 int
4669 prologue_epilogue_contains (const_rtx insn)
4670 {
4671   if (contains (insn, &prologue))
4672     return 1;
4673   if (contains (insn, &epilogue))
4674     return 1;
4675   return 0;
4676 }
4677
4678 int
4679 sibcall_epilogue_contains (const_rtx insn)
4680 {
4681   if (sibcall_epilogue)
4682     return contains (insn, &sibcall_epilogue);
4683   return 0;
4684 }
4685
4686 #ifdef HAVE_return
4687 /* Insert gen_return at the end of block BB.  This also means updating
4688    block_for_insn appropriately.  */
4689
4690 static void
4691 emit_return_into_block (basic_block bb)
4692 {
4693   emit_jump_insn_after (gen_return (), BB_END (bb));
4694 }
4695 #endif /* HAVE_return */
4696
4697 /* Generate the prologue and epilogue RTL if the machine supports it.  Thread
4698    this into place with notes indicating where the prologue ends and where
4699    the epilogue begins.  Update the basic block information when possible.  */
4700
4701 static void
4702 thread_prologue_and_epilogue_insns (void)
4703 {
4704   int inserted = 0;
4705   edge e;
4706 #if defined (HAVE_sibcall_epilogue) || defined (HAVE_epilogue) || defined (HAVE_return) || defined (HAVE_prologue)
4707   rtx seq;
4708 #endif
4709 #if defined (HAVE_epilogue) || defined(HAVE_return)
4710   rtx epilogue_end = NULL_RTX;
4711 #endif
4712   edge_iterator ei;
4713
4714 #ifdef HAVE_prologue
4715   if (HAVE_prologue)
4716     {
4717       start_sequence ();
4718       seq = gen_prologue ();
4719       emit_insn (seq);
4720
4721       /* Insert an explicit USE for the frame pointer 
4722          if the profiling is on and the frame pointer is required.  */
4723       if (crtl->profile && frame_pointer_needed)
4724         emit_use (hard_frame_pointer_rtx);
4725
4726       /* Retain a map of the prologue insns.  */
4727       record_insns (seq, &prologue);
4728       emit_note (NOTE_INSN_PROLOGUE_END);
4729  
4730 #ifndef PROFILE_BEFORE_PROLOGUE
4731       /* Ensure that instructions are not moved into the prologue when
4732          profiling is on.  The call to the profiling routine can be
4733          emitted within the live range of a call-clobbered register.  */
4734       if (crtl->profile)
4735         emit_insn (gen_blockage ());
4736 #endif
4737
4738       seq = get_insns ();
4739       end_sequence ();
4740       set_insn_locators (seq, prologue_locator);
4741
4742       /* Can't deal with multiple successors of the entry block
4743          at the moment.  Function should always have at least one
4744          entry point.  */
4745       gcc_assert (single_succ_p (ENTRY_BLOCK_PTR));
4746
4747       insert_insn_on_edge (seq, single_succ_edge (ENTRY_BLOCK_PTR));
4748       inserted = 1;
4749     }
4750 #endif
4751
4752   /* If the exit block has no non-fake predecessors, we don't need
4753      an epilogue.  */
4754   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4755     if ((e->flags & EDGE_FAKE) == 0)
4756       break;
4757   if (e == NULL)
4758     goto epilogue_done;
4759
4760 #ifdef HAVE_return
4761   if (optimize && HAVE_return)
4762     {
4763       /* If we're allowed to generate a simple return instruction,
4764          then by definition we don't need a full epilogue.  Examine
4765          the block that falls through to EXIT.   If it does not
4766          contain any code, examine its predecessors and try to
4767          emit (conditional) return instructions.  */
4768
4769       basic_block last;
4770       rtx label;
4771
4772       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4773         if (e->flags & EDGE_FALLTHRU)
4774           break;
4775       if (e == NULL)
4776         goto epilogue_done;
4777       last = e->src;
4778
4779       /* Verify that there are no active instructions in the last block.  */
4780       label = BB_END (last);
4781       while (label && !LABEL_P (label))
4782         {
4783           if (active_insn_p (label))
4784             break;
4785           label = PREV_INSN (label);
4786         }
4787
4788       if (BB_HEAD (last) == label && LABEL_P (label))
4789         {
4790           edge_iterator ei2;
4791
4792           for (ei2 = ei_start (last->preds); (e = ei_safe_edge (ei2)); )
4793             {
4794               basic_block bb = e->src;
4795               rtx jump;
4796
4797               if (bb == ENTRY_BLOCK_PTR)
4798                 {
4799                   ei_next (&ei2);
4800                   continue;
4801                 }
4802
4803               jump = BB_END (bb);
4804               if (!JUMP_P (jump) || JUMP_LABEL (jump) != label)
4805                 {
4806                   ei_next (&ei2);
4807                   continue;
4808                 }
4809
4810               /* If we have an unconditional jump, we can replace that
4811                  with a simple return instruction.  */
4812               if (simplejump_p (jump))
4813                 {
4814                   emit_return_into_block (bb);
4815                   delete_insn (jump);
4816                 }
4817
4818               /* If we have a conditional jump, we can try to replace
4819                  that with a conditional return instruction.  */
4820               else if (condjump_p (jump))
4821                 {
4822                   if (! redirect_jump (jump, 0, 0))
4823                     {
4824                       ei_next (&ei2);
4825                       continue;
4826                     }
4827
4828                   /* If this block has only one successor, it both jumps
4829                      and falls through to the fallthru block, so we can't
4830                      delete the edge.  */
4831                   if (single_succ_p (bb))
4832                     {
4833                       ei_next (&ei2);
4834                       continue;
4835                     }
4836                 }
4837               else
4838                 {
4839                   ei_next (&ei2);
4840                   continue;
4841                 }
4842
4843               /* Fix up the CFG for the successful change we just made.  */
4844               redirect_edge_succ (e, EXIT_BLOCK_PTR);
4845             }
4846
4847           /* Emit a return insn for the exit fallthru block.  Whether
4848              this is still reachable will be determined later.  */
4849
4850           emit_barrier_after (BB_END (last));
4851           emit_return_into_block (last);
4852           epilogue_end = BB_END (last);
4853           single_succ_edge (last)->flags &= ~EDGE_FALLTHRU;
4854           goto epilogue_done;
4855         }
4856     }
4857 #endif
4858   /* Find the edge that falls through to EXIT.  Other edges may exist
4859      due to RETURN instructions, but those don't need epilogues.
4860      There really shouldn't be a mixture -- either all should have
4861      been converted or none, however...  */
4862
4863   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4864     if (e->flags & EDGE_FALLTHRU)
4865       break;
4866   if (e == NULL)
4867     goto epilogue_done;
4868
4869 #ifdef HAVE_epilogue
4870   if (HAVE_epilogue)
4871     {
4872       start_sequence ();
4873       epilogue_end = emit_note (NOTE_INSN_EPILOGUE_BEG);
4874       seq = gen_epilogue ();
4875       emit_jump_insn (seq);
4876
4877       /* Retain a map of the epilogue insns.  */
4878       record_insns (seq, &epilogue);
4879       set_insn_locators (seq, epilogue_locator);
4880
4881       seq = get_insns ();
4882       end_sequence ();
4883
4884       insert_insn_on_edge (seq, e);
4885       inserted = 1;
4886     }
4887   else
4888 #endif
4889     {
4890       basic_block cur_bb;
4891
4892       if (! next_active_insn (BB_END (e->src)))
4893         goto epilogue_done;
4894       /* We have a fall-through edge to the exit block, the source is not
4895          at the end of the function, and there will be an assembler epilogue
4896          at the end of the function.
4897          We can't use force_nonfallthru here, because that would try to
4898          use return.  Inserting a jump 'by hand' is extremely messy, so
4899          we take advantage of cfg_layout_finalize using
4900         fixup_fallthru_exit_predecessor.  */
4901       cfg_layout_initialize (0);
4902       FOR_EACH_BB (cur_bb)
4903         if (cur_bb->index >= NUM_FIXED_BLOCKS
4904             && cur_bb->next_bb->index >= NUM_FIXED_BLOCKS)
4905           cur_bb->aux = cur_bb->next_bb;
4906       cfg_layout_finalize ();
4907     }
4908 epilogue_done:
4909
4910   if (inserted)
4911     {
4912       commit_edge_insertions ();
4913
4914       /* The epilogue insns we inserted may cause the exit edge to no longer
4915          be fallthru.  */
4916       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
4917         {
4918           if (((e->flags & EDGE_FALLTHRU) != 0)
4919               && returnjump_p (BB_END (e->src)))
4920             e->flags &= ~EDGE_FALLTHRU;
4921         }
4922     }
4923
4924 #ifdef HAVE_sibcall_epilogue
4925   /* Emit sibling epilogues before any sibling call sites.  */
4926   for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
4927     {
4928       basic_block bb = e->src;
4929       rtx insn = BB_END (bb);
4930
4931       if (!CALL_P (insn)
4932           || ! SIBLING_CALL_P (insn))
4933         {
4934           ei_next (&ei);
4935           continue;
4936         }
4937
4938       start_sequence ();
4939       emit_insn (gen_sibcall_epilogue ());
4940       seq = get_insns ();
4941       end_sequence ();
4942
4943       /* Retain a map of the epilogue insns.  Used in life analysis to
4944          avoid getting rid of sibcall epilogue insns.  Do this before we
4945          actually emit the sequence.  */
4946       record_insns (seq, &sibcall_epilogue);
4947       set_insn_locators (seq, epilogue_locator);
4948
4949       emit_insn_before (seq, insn);
4950       ei_next (&ei);
4951     }
4952 #endif
4953
4954 #ifdef HAVE_epilogue
4955   if (epilogue_end)
4956     {
4957       rtx insn, next;
4958
4959       /* Similarly, move any line notes that appear after the epilogue.
4960          There is no need, however, to be quite so anal about the existence
4961          of such a note.  Also possibly move
4962          NOTE_INSN_FUNCTION_BEG notes, as those can be relevant for debug
4963          info generation.  */
4964       for (insn = epilogue_end; insn; insn = next)
4965         {
4966           next = NEXT_INSN (insn);
4967           if (NOTE_P (insn) 
4968               && (NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG))
4969             reorder_insns (insn, insn, PREV_INSN (epilogue_end));
4970         }
4971     }
4972 #endif
4973
4974   /* Threading the prologue and epilogue changes the artificial refs
4975      in the entry and exit blocks.  */
4976   epilogue_completed = 1;
4977   df_update_entry_exit_and_calls ();
4978 }
4979
4980 /* Reposition the prologue-end and epilogue-begin notes after instruction
4981    scheduling and delayed branch scheduling.  */
4982
4983 void
4984 reposition_prologue_and_epilogue_notes (void)
4985 {
4986 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
4987   rtx insn, last, note;
4988   int len;
4989
4990   if ((len = VEC_length (int, prologue)) > 0)
4991     {
4992       last = 0, note = 0;
4993
4994       /* Scan from the beginning until we reach the last prologue insn.
4995          We apparently can't depend on basic_block_{head,end} after
4996          reorg has run.  */
4997       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4998         {
4999           if (NOTE_P (insn))
5000             {
5001               if (NOTE_KIND (insn) == NOTE_INSN_PROLOGUE_END)
5002                 note = insn;
5003             }
5004           else if (contains (insn, &prologue))
5005             {
5006               last = insn;
5007               if (--len == 0)
5008                 break;
5009             }
5010         }
5011
5012       if (last)
5013         {
5014           /* Find the prologue-end note if we haven't already, and
5015              move it to just after the last prologue insn.  */
5016           if (note == 0)
5017             {
5018               for (note = last; (note = NEXT_INSN (note));)
5019                 if (NOTE_P (note)
5020                     && NOTE_KIND (note) == NOTE_INSN_PROLOGUE_END)
5021                   break;
5022             }
5023
5024           /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
5025           if (LABEL_P (last))
5026             last = NEXT_INSN (last);
5027           reorder_insns (note, note, last);
5028         }
5029     }
5030
5031   if ((len = VEC_length (int, epilogue)) > 0)
5032     {
5033       last = 0, note = 0;
5034
5035       /* Scan from the end until we reach the first epilogue insn.
5036          We apparently can't depend on basic_block_{head,end} after
5037          reorg has run.  */
5038       for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5039         {
5040           if (NOTE_P (insn))
5041             {
5042               if (NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
5043                 note = insn;
5044             }
5045           else if (contains (insn, &epilogue))
5046             {
5047               last = insn;
5048               if (--len == 0)
5049                 break;
5050             }
5051         }
5052
5053       if (last)
5054         {
5055           /* Find the epilogue-begin note if we haven't already, and
5056              move it to just before the first epilogue insn.  */
5057           if (note == 0)
5058             {
5059               for (note = insn; (note = PREV_INSN (note));)
5060                 if (NOTE_P (note)
5061                     && NOTE_KIND (note) == NOTE_INSN_EPILOGUE_BEG)
5062                   break;
5063             }
5064
5065           if (PREV_INSN (last) != note)
5066             reorder_insns (note, note, PREV_INSN (last));
5067         }
5068     }
5069 #endif /* HAVE_prologue or HAVE_epilogue */
5070 }
5071
5072 /* Returns the name of the current function.  */
5073 const char *
5074 current_function_name (void)
5075 {
5076   return lang_hooks.decl_printable_name (cfun->decl, 2);
5077 }
5078
5079 /* Returns the raw (mangled) name of the current function.  */
5080 const char *
5081 current_function_assembler_name (void)
5082 {
5083   return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (cfun->decl));
5084 }
5085 \f
5086
5087 static unsigned int
5088 rest_of_handle_check_leaf_regs (void)
5089 {
5090 #ifdef LEAF_REGISTERS
5091   current_function_uses_only_leaf_regs
5092     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
5093 #endif
5094   return 0;
5095 }
5096
5097 /* Insert a TYPE into the used types hash table of CFUN.  */
5098 static void
5099 used_types_insert_helper (tree type, struct function *func)
5100 {
5101   if (type != NULL && func != NULL)
5102     {
5103       void **slot;
5104
5105       if (func->used_types_hash == NULL)
5106         func->used_types_hash = htab_create_ggc (37, htab_hash_pointer,
5107                                                  htab_eq_pointer, NULL);
5108       slot = htab_find_slot (func->used_types_hash, type, INSERT);
5109       if (*slot == NULL)
5110         *slot = type;
5111     }
5112 }
5113
5114 /* Given a type, insert it into the used hash table in cfun.  */
5115 void
5116 used_types_insert (tree t)
5117 {
5118   while (POINTER_TYPE_P (t) || TREE_CODE (t) == ARRAY_TYPE)
5119     t = TREE_TYPE (t);
5120   t = TYPE_MAIN_VARIANT (t);
5121   if (debug_info_level > DINFO_LEVEL_NONE)
5122     used_types_insert_helper (t, cfun);
5123 }
5124
5125 struct rtl_opt_pass pass_leaf_regs =
5126 {
5127  {
5128   RTL_PASS,
5129   NULL,                                 /* name */
5130   NULL,                                 /* gate */
5131   rest_of_handle_check_leaf_regs,       /* execute */
5132   NULL,                                 /* sub */
5133   NULL,                                 /* next */
5134   0,                                    /* static_pass_number */
5135   0,                                    /* tv_id */
5136   0,                                    /* properties_required */
5137   0,                                    /* properties_provided */
5138   0,                                    /* properties_destroyed */
5139   0,                                    /* todo_flags_start */
5140   0                                     /* todo_flags_finish */
5141  }
5142 };
5143
5144 static unsigned int
5145 rest_of_handle_thread_prologue_and_epilogue (void)
5146 {
5147   if (optimize)
5148     cleanup_cfg (CLEANUP_EXPENSIVE);
5149   /* On some machines, the prologue and epilogue code, or parts thereof,
5150      can be represented as RTL.  Doing so lets us schedule insns between
5151      it and the rest of the code and also allows delayed branch
5152      scheduling to operate in the epilogue.  */
5153
5154   thread_prologue_and_epilogue_insns ();
5155   return 0;
5156 }
5157
5158 struct rtl_opt_pass pass_thread_prologue_and_epilogue =
5159 {
5160  {
5161   RTL_PASS,
5162   "pro_and_epilogue",                   /* name */
5163   NULL,                                 /* gate */
5164   rest_of_handle_thread_prologue_and_epilogue, /* execute */
5165   NULL,                                 /* sub */
5166   NULL,                                 /* next */
5167   0,                                    /* static_pass_number */
5168   TV_THREAD_PROLOGUE_AND_EPILOGUE,      /* tv_id */
5169   0,                                    /* properties_required */
5170   0,                                    /* properties_provided */
5171   0,                                    /* properties_destroyed */
5172   TODO_verify_flow,                     /* todo_flags_start */
5173   TODO_dump_func |
5174   TODO_df_verify |
5175   TODO_df_finish | TODO_verify_rtl_sharing |
5176   TODO_ggc_collect                      /* todo_flags_finish */
5177  }
5178 };
5179 \f
5180
5181 /* This mini-pass fixes fall-out from SSA in asm statements that have
5182    in-out constraints.  Say you start with 
5183
5184      orig = inout;
5185      asm ("": "+mr" (inout));
5186      use (orig);
5187
5188    which is transformed very early to use explicit output and match operands:
5189
5190      orig = inout;
5191      asm ("": "=mr" (inout) : "0" (inout));
5192      use (orig);
5193
5194    Or, after SSA and copyprop,
5195
5196      asm ("": "=mr" (inout_2) : "0" (inout_1));
5197      use (inout_1);
5198
5199    Clearly inout_2 and inout_1 can't be coalesced easily anymore, as
5200    they represent two separate values, so they will get different pseudo
5201    registers during expansion.  Then, since the two operands need to match
5202    per the constraints, but use different pseudo registers, reload can
5203    only register a reload for these operands.  But reloads can only be
5204    satisfied by hardregs, not by memory, so we need a register for this
5205    reload, just because we are presented with non-matching operands.
5206    So, even though we allow memory for this operand, no memory can be
5207    used for it, just because the two operands don't match.  This can
5208    cause reload failures on register-starved targets.
5209
5210    So it's a symptom of reload not being able to use memory for reloads
5211    or, alternatively it's also a symptom of both operands not coming into
5212    reload as matching (in which case the pseudo could go to memory just
5213    fine, as the alternative allows it, and no reload would be necessary).
5214    We fix the latter problem here, by transforming
5215
5216      asm ("": "=mr" (inout_2) : "0" (inout_1));
5217
5218    back to
5219
5220      inout_2 = inout_1;
5221      asm ("": "=mr" (inout_2) : "0" (inout_2));  */
5222
5223 static void
5224 match_asm_constraints_1 (rtx insn, rtx *p_sets, int noutputs)
5225 {
5226   int i;
5227   bool changed = false;
5228   rtx op = SET_SRC (p_sets[0]);
5229   int ninputs = ASM_OPERANDS_INPUT_LENGTH (op);
5230   rtvec inputs = ASM_OPERANDS_INPUT_VEC (op);
5231   bool *output_matched = XALLOCAVEC (bool, noutputs);
5232
5233   memset (output_matched, 0, noutputs * sizeof (bool));
5234   for (i = 0; i < ninputs; i++)
5235     {
5236       rtx input, output, insns;
5237       const char *constraint = ASM_OPERANDS_INPUT_CONSTRAINT (op, i);
5238       char *end;
5239       int match, j;
5240
5241       match = strtoul (constraint, &end, 10);
5242       if (end == constraint)
5243         continue;
5244
5245       gcc_assert (match < noutputs);
5246       output = SET_DEST (p_sets[match]);
5247       input = RTVEC_ELT (inputs, i);
5248       /* Only do the transformation for pseudos.  */
5249       if (! REG_P (output)
5250           || rtx_equal_p (output, input)
5251           || (GET_MODE (input) != VOIDmode
5252               && GET_MODE (input) != GET_MODE (output)))
5253         continue;
5254
5255       /* We can't do anything if the output is also used as input,
5256          as we're going to overwrite it.  */
5257       for (j = 0; j < ninputs; j++)
5258         if (reg_overlap_mentioned_p (output, RTVEC_ELT (inputs, j)))
5259           break;
5260       if (j != ninputs)
5261         continue;
5262
5263       /* Avoid changing the same input several times.  For
5264          asm ("" : "=mr" (out1), "=mr" (out2) : "0" (in), "1" (in));
5265          only change in once (to out1), rather than changing it
5266          first to out1 and afterwards to out2.  */
5267       if (i > 0)
5268         {
5269           for (j = 0; j < noutputs; j++)
5270             if (output_matched[j] && input == SET_DEST (p_sets[j]))
5271               break;
5272           if (j != noutputs)
5273             continue;
5274         }
5275       output_matched[match] = true;
5276
5277       start_sequence ();
5278       emit_move_insn (output, input);
5279       insns = get_insns ();
5280       end_sequence ();
5281       emit_insn_before (insns, insn);
5282
5283       /* Now replace all mentions of the input with output.  We can't
5284          just replace the occurrence in inputs[i], as the register might
5285          also be used in some other input (or even in an address of an
5286          output), which would mean possibly increasing the number of
5287          inputs by one (namely 'output' in addition), which might pose
5288          a too complicated problem for reload to solve.  E.g. this situation:
5289
5290            asm ("" : "=r" (output), "=m" (input) : "0" (input))
5291
5292          Here 'input' is used in two occurrences as input (once for the
5293          input operand, once for the address in the second output operand).
5294          If we would replace only the occurrence of the input operand (to
5295          make the matching) we would be left with this:
5296
5297            output = input
5298            asm ("" : "=r" (output), "=m" (input) : "0" (output))
5299
5300          Now we suddenly have two different input values (containing the same
5301          value, but different pseudos) where we formerly had only one.
5302          With more complicated asms this might lead to reload failures
5303          which wouldn't have happen without this pass.  So, iterate over
5304          all operands and replace all occurrences of the register used.  */
5305       for (j = 0; j < noutputs; j++)
5306         if (!rtx_equal_p (SET_DEST (p_sets[j]), input)
5307             && reg_overlap_mentioned_p (input, SET_DEST (p_sets[j])))
5308           SET_DEST (p_sets[j]) = replace_rtx (SET_DEST (p_sets[j]),
5309                                               input, output);
5310       for (j = 0; j < ninputs; j++)
5311         if (reg_overlap_mentioned_p (input, RTVEC_ELT (inputs, j)))
5312           RTVEC_ELT (inputs, j) = replace_rtx (RTVEC_ELT (inputs, j),
5313                                                input, output);
5314
5315       changed = true;
5316     }
5317
5318   if (changed)
5319     df_insn_rescan (insn);
5320 }
5321
5322 static unsigned
5323 rest_of_match_asm_constraints (void)
5324 {
5325   basic_block bb;
5326   rtx insn, pat, *p_sets;
5327   int noutputs;
5328
5329   if (!crtl->has_asm_statement)
5330     return 0;
5331
5332   df_set_flags (DF_DEFER_INSN_RESCAN);
5333   FOR_EACH_BB (bb)
5334     {
5335       FOR_BB_INSNS (bb, insn)
5336         {
5337           if (!INSN_P (insn))
5338             continue;
5339
5340           pat = PATTERN (insn);
5341           if (GET_CODE (pat) == PARALLEL)
5342             p_sets = &XVECEXP (pat, 0, 0), noutputs = XVECLEN (pat, 0);
5343           else if (GET_CODE (pat) == SET)
5344             p_sets = &PATTERN (insn), noutputs = 1;
5345           else
5346             continue;
5347
5348           if (GET_CODE (*p_sets) == SET
5349               && GET_CODE (SET_SRC (*p_sets)) == ASM_OPERANDS)
5350             match_asm_constraints_1 (insn, p_sets, noutputs);
5351          }
5352     }
5353
5354   return TODO_df_finish;
5355 }
5356
5357 struct rtl_opt_pass pass_match_asm_constraints =
5358 {
5359  {
5360   RTL_PASS,
5361   "asmcons",                            /* name */
5362   NULL,                                 /* gate */
5363   rest_of_match_asm_constraints,        /* execute */
5364   NULL,                                 /* sub */
5365   NULL,                                 /* next */
5366   0,                                    /* static_pass_number */
5367   0,                                    /* tv_id */
5368   0,                                    /* properties_required */
5369   0,                                    /* properties_provided */
5370   0,                                    /* properties_destroyed */
5371   0,                                    /* todo_flags_start */
5372   TODO_dump_func                       /* todo_flags_finish */
5373  }
5374 };
5375
5376
5377 #include "gt-function.h"