OSDN Git Service

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