OSDN Git Service

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