OSDN Git Service

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