OSDN Git Service

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