OSDN Git Service

(CC): Add -U__STDC__.
[pf3gnuchains/gcc-fork.git] / gcc / function.c
1 /* Expands front end tree to back end RTL for GNU C-Compiler
2    Copyright (C) 1987, 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 /* This file handles the generation of rtl code from tree structure
22    at the level of the function as a whole.
23    It creates the rtl expressions for parameters and auto variables
24    and has full responsibility for allocating stack slots.
25
26    `expand_function_start' is called at the beginning of a function,
27    before the function body is parsed, and `expand_function_end' is
28    called after parsing the body.
29
30    Call `assign_stack_local' to allocate a stack slot for a local variable.
31    This is usually done during the RTL generation for the function body,
32    but it can also be done in the reload pass when a pseudo-register does
33    not get a hard register.
34
35    Call `put_var_into_stack' when you learn, belatedly, that a variable
36    previously given a pseudo-register must in fact go in the stack.
37    This function changes the DECL_RTL to be a stack slot instead of a reg
38    then scans all the RTL instructions so far generated to correct them.  */
39
40 #include "config.h"
41
42 #include <stdio.h>
43
44 #include "rtl.h"
45 #include "tree.h"
46 #include "flags.h"
47 #include "function.h"
48 #include "insn-flags.h"
49 #include "expr.h"
50 #include "insn-codes.h"
51 #include "regs.h"
52 #include "hard-reg-set.h"
53 #include "insn-config.h"
54 #include "recog.h"
55 #include "output.h"
56 #include "basic-block.h"
57
58 /* Round a value to the lowest integer less than it that is a multiple of
59    the required alignment.  Avoid using division in case the value is
60    negative.  Assume the alignment is a power of two.  */
61 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
62
63 /* Similar, but round to the next highest integer that meets the
64    alignment.  */
65 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
66
67 /* NEED_SEPARATE_AP means that we cannot derive ap from the value of fp
68    during rtl generation.  If they are different register numbers, this is
69    always true.  It may also be true if
70    FIRST_PARM_OFFSET - STARTING_FRAME_OFFSET is not a constant during rtl
71    generation.  See fix_lexical_addr for details.  */
72
73 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
74 #define NEED_SEPARATE_AP
75 #endif
76
77 /* Number of bytes of args popped by function being compiled on its return.
78    Zero if no bytes are to be popped.
79    May affect compilation of return insn or of function epilogue.  */
80
81 int current_function_pops_args;
82
83 /* Nonzero if function being compiled needs to be given an address
84    where the value should be stored.  */
85
86 int current_function_returns_struct;
87
88 /* Nonzero if function being compiled needs to
89    return the address of where it has put a structure value.  */
90
91 int current_function_returns_pcc_struct;
92
93 /* Nonzero if function being compiled needs to be passed a static chain.  */
94
95 int current_function_needs_context;
96
97 /* Nonzero if function being compiled can call setjmp.  */
98
99 int current_function_calls_setjmp;
100
101 /* Nonzero if function being compiled can call longjmp.  */
102
103 int current_function_calls_longjmp;
104
105 /* Nonzero if function being compiled receives nonlocal gotos
106    from nested functions.  */
107
108 int current_function_has_nonlocal_label;
109
110 /* Nonzero if function being compiled contains nested functions.  */
111
112 int current_function_contains_functions;
113
114 /* Nonzero if function being compiled can call alloca,
115    either as a subroutine or builtin.  */
116
117 int current_function_calls_alloca;
118
119 /* Nonzero if the current function returns a pointer type */
120
121 int current_function_returns_pointer;
122
123 /* If some insns can be deferred to the delay slots of the epilogue, the
124    delay list for them is recorded here.  */
125
126 rtx current_function_epilogue_delay_list;
127
128 /* If function's args have a fixed size, this is that size, in bytes.
129    Otherwise, it is -1.
130    May affect compilation of return insn or of function epilogue.  */
131
132 int current_function_args_size;
133
134 /* # bytes the prologue should push and pretend that the caller pushed them.
135    The prologue must do this, but only if parms can be passed in registers.  */
136
137 int current_function_pretend_args_size;
138
139 /* # of bytes of outgoing arguments required to be pushed by the prologue.
140    If this is non-zero, it means that ACCUMULATE_OUTGOING_ARGS was defined
141    and no stack adjusts will be done on function calls.  */
142
143 int current_function_outgoing_args_size;
144
145 /* This is the offset from the arg pointer to the place where the first
146    anonymous arg can be found, if there is one.  */
147
148 rtx current_function_arg_offset_rtx;
149
150 /* Nonzero if current function uses varargs.h or equivalent.
151    Zero for functions that use stdarg.h.  */
152
153 int current_function_varargs;
154
155 /* Quantities of various kinds of registers
156    used for the current function's args.  */
157
158 CUMULATIVE_ARGS current_function_args_info;
159
160 /* Name of function now being compiled.  */
161
162 char *current_function_name;
163
164 /* If non-zero, an RTL expression for that location at which the current
165    function returns its result.  Always equal to
166    DECL_RTL (DECL_RESULT (current_function_decl)), but provided
167    independently of the tree structures.  */
168
169 rtx current_function_return_rtx;
170
171 /* Nonzero if the current function uses the constant pool.  */
172
173 int current_function_uses_const_pool;
174
175 /* Nonzero if the current function uses pic_offset_table_rtx.  */
176 int current_function_uses_pic_offset_table;
177
178 /* The arg pointer hard register, or the pseudo into which it was copied.  */
179 rtx current_function_internal_arg_pointer;
180
181 /* The FUNCTION_DECL for an inline function currently being expanded.  */
182 tree inline_function_decl;
183
184 /* Number of function calls seen so far in current function.  */
185
186 int function_call_count;
187
188 /* List (chain of TREE_LIST) of LABEL_DECLs for all nonlocal labels
189    (labels to which there can be nonlocal gotos from nested functions)
190    in this function.  */
191
192 tree nonlocal_labels;
193
194 /* RTX for stack slot that holds the current handler for nonlocal gotos.
195    Zero when function does not have nonlocal labels.  */
196
197 rtx nonlocal_goto_handler_slot;
198
199 /* RTX for stack slot that holds the stack pointer value to restore
200    for a nonlocal goto.
201    Zero when function does not have nonlocal labels.  */
202
203 rtx nonlocal_goto_stack_level;
204
205 /* Label that will go on parm cleanup code, if any.
206    Jumping to this label runs cleanup code for parameters, if
207    such code must be run.  Following this code is the logical return label.  */
208
209 rtx cleanup_label;
210
211 /* Label that will go on function epilogue.
212    Jumping to this label serves as a "return" instruction
213    on machines which require execution of the epilogue on all returns.  */
214
215 rtx return_label;
216
217 /* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs.
218    So we can mark them all live at the end of the function, if nonopt.  */
219 rtx save_expr_regs;
220
221 /* List (chain of EXPR_LISTs) of all stack slots in this function.
222    Made for the sake of unshare_all_rtl.  */
223 rtx stack_slot_list;
224
225 /* Chain of all RTL_EXPRs that have insns in them.  */
226 tree rtl_expr_chain;
227
228 /* Label to jump back to for tail recursion, or 0 if we have
229    not yet needed one for this function.  */
230 rtx tail_recursion_label;
231
232 /* Place after which to insert the tail_recursion_label if we need one.  */
233 rtx tail_recursion_reentry;
234
235 /* Location at which to save the argument pointer if it will need to be
236    referenced.  There are two cases where this is done: if nonlocal gotos
237    exist, or if vars stored at an offset from the argument pointer will be
238    needed by inner routines.  */
239
240 rtx arg_pointer_save_area;
241
242 /* Offset to end of allocated area of stack frame.
243    If stack grows down, this is the address of the last stack slot allocated.
244    If stack grows up, this is the address for the next slot.  */
245 int frame_offset;
246
247 /* List (chain of TREE_LISTs) of static chains for containing functions.
248    Each link has a FUNCTION_DECL in the TREE_PURPOSE and a reg rtx
249    in an RTL_EXPR in the TREE_VALUE.  */
250 static tree context_display;
251
252 /* List (chain of TREE_LISTs) of trampolines for nested functions.
253    The trampoline sets up the static chain and jumps to the function.
254    We supply the trampoline's address when the function's address is requested.
255
256    Each link has a FUNCTION_DECL in the TREE_PURPOSE and a reg rtx
257    in an RTL_EXPR in the TREE_VALUE.  */
258 static tree trampoline_list;
259
260 /* Insn after which register parms and SAVE_EXPRs are born, if nonopt.  */
261 static rtx parm_birth_insn;
262
263 #if 0
264 /* Nonzero if a stack slot has been generated whose address is not
265    actually valid.  It means that the generated rtl must all be scanned
266    to detect and correct the invalid addresses where they occur.  */
267 static int invalid_stack_slot;
268 #endif
269
270 /* Last insn of those whose job was to put parms into their nominal homes.  */
271 static rtx last_parm_insn;
272
273 /* 1 + last pseudo register number used for loading a copy
274    of a parameter of this function.  */
275 static int max_parm_reg;
276
277 /* Vector indexed by REGNO, containing location on stack in which
278    to put the parm which is nominally in pseudo register REGNO,
279    if we discover that that parm must go in the stack.  */
280 static rtx *parm_reg_stack_loc;
281
282 #if 0  /* Turned off because 0 seems to work just as well.  */
283 /* Cleanup lists are required for binding levels regardless of whether
284    that binding level has cleanups or not.  This node serves as the
285    cleanup list whenever an empty list is required.  */
286 static tree empty_cleanup_list;
287 #endif
288
289 /* Nonzero once virtual register instantiation has been done.
290    assign_stack_local uses frame_pointer_rtx when this is nonzero.  */
291 static int virtuals_instantiated;
292
293 /* Nonzero if we need to distinguish between the return value of this function
294    and the return value of a function called by this function.  This helps
295    integrate.c  */
296
297 extern int rtx_equal_function_value_matters;
298
299 void fixup_gotos ();
300
301 static tree round_down ();
302 static rtx round_trampoline_addr ();
303 static rtx fixup_stack_1 ();
304 static void fixup_var_refs ();
305 static void fixup_var_refs_insns ();
306 static void fixup_var_refs_1 ();
307 static void optimize_bit_field ();
308 static void instantiate_decls ();
309 static void instantiate_decls_1 ();
310 static void instantiate_decl ();
311 static int instantiate_virtual_regs_1 ();
312 static rtx fixup_memory_subreg ();
313 static rtx walk_fixup_memory_subreg ();
314 \f
315 /* In order to evaluate some expressions, such as function calls returning
316    structures in memory, we need to temporarily allocate stack locations.
317    We record each allocated temporary in the following structure.
318
319    Associated with each temporary slot is a nesting level.  When we pop up
320    one level, all temporaries associated with the previous level are freed.
321    Normally, all temporaries are freed after the execution of the statement
322    in which they were created.  However, if we are inside a ({...}) grouping,
323    the result may be in a temporary and hence must be preserved.  If the
324    result could be in a temporary, we preserve it if we can determine which
325    one it is in.  If we cannot determine which temporary may contain the
326    result, all temporaries are preserved.  A temporary is preserved by
327    pretending it was allocated at the previous nesting level.
328
329    Automatic variables are also assigned temporary slots, at the nesting
330    level where they are defined.  They are marked a "kept" so that
331    free_temp_slots will not free them.  */
332
333 struct temp_slot
334 {
335   /* Points to next temporary slot.  */
336   struct temp_slot *next;
337   /* The rtx to used to reference the slot. */
338   rtx slot;
339   /* The size, in units, of the slot.  */
340   int size;
341   /* Non-zero if this temporary is currently in use.  */
342   char in_use;
343   /* Nesting level at which this slot is being used.  */
344   int level;
345   /* Non-zero if this should survive a call to free_temp_slots.  */
346   int keep;
347 };
348
349 /* List of all temporaries allocated, both available and in use.  */
350
351 struct temp_slot *temp_slots;
352
353 /* Current nesting level for temporaries.  */
354
355 int temp_slot_level;
356 \f
357 /* Pointer to chain of `struct function' for containing functions.  */
358 struct function *outer_function_chain;
359
360 /* Given a function decl for a containing function,
361    return the `struct function' for it.  */
362
363 struct function *
364 find_function_data (decl)
365      tree decl;
366 {
367   struct function *p;
368   for (p = outer_function_chain; p; p = p->next)
369     if (p->decl == decl)
370       return p;
371   abort ();
372 }
373
374 /* Save the current context for compilation of a nested function.
375    This is called from language-specific code.
376    The caller is responsible for saving any language-specific status,
377    since this function knows only about language-independent variables.  */
378
379 void
380 push_function_context ()
381 {
382   struct function *p = (struct function *) xmalloc (sizeof (struct function));
383
384   p->next = outer_function_chain;
385   outer_function_chain = p;
386
387   p->name = current_function_name;
388   p->decl = current_function_decl;
389   p->pops_args = current_function_pops_args;
390   p->returns_struct = current_function_returns_struct;
391   p->returns_pcc_struct = current_function_returns_pcc_struct;
392   p->needs_context = current_function_needs_context;
393   p->calls_setjmp = current_function_calls_setjmp;
394   p->calls_longjmp = current_function_calls_longjmp;
395   p->calls_alloca = current_function_calls_alloca;
396   p->has_nonlocal_label = current_function_has_nonlocal_label;
397   p->args_size = current_function_args_size;
398   p->pretend_args_size = current_function_pretend_args_size;
399   p->arg_offset_rtx = current_function_arg_offset_rtx;
400   p->uses_const_pool = current_function_uses_const_pool;
401   p->uses_pic_offset_table = current_function_uses_pic_offset_table;
402   p->internal_arg_pointer = current_function_internal_arg_pointer;
403   p->max_parm_reg = max_parm_reg;
404   p->parm_reg_stack_loc = parm_reg_stack_loc;
405   p->outgoing_args_size = current_function_outgoing_args_size;
406   p->return_rtx = current_function_return_rtx;
407   p->nonlocal_goto_handler_slot = nonlocal_goto_handler_slot;
408   p->nonlocal_goto_stack_level = nonlocal_goto_stack_level;
409   p->nonlocal_labels = nonlocal_labels;
410   p->cleanup_label = cleanup_label;
411   p->return_label = return_label;
412   p->save_expr_regs = save_expr_regs;
413   p->stack_slot_list = stack_slot_list;
414   p->parm_birth_insn = parm_birth_insn;
415   p->frame_offset = frame_offset;
416   p->tail_recursion_label = tail_recursion_label;
417   p->tail_recursion_reentry = tail_recursion_reentry;
418   p->arg_pointer_save_area = arg_pointer_save_area;
419   p->rtl_expr_chain = rtl_expr_chain;
420   p->last_parm_insn = last_parm_insn;
421   p->context_display = context_display;
422   p->trampoline_list = trampoline_list;
423   p->function_call_count = function_call_count;
424   p->temp_slots = temp_slots;
425   p->temp_slot_level = temp_slot_level;
426   p->fixup_var_refs_queue = 0;
427   p->epilogue_delay_list = current_function_epilogue_delay_list;
428
429   save_tree_status (p);
430   save_storage_status (p);
431   save_emit_status (p);
432   init_emit ();
433   save_expr_status (p);
434   save_stmt_status (p);
435   save_varasm_status (p);
436 }
437
438 /* Restore the last saved context, at the end of a nested function.
439    This function is called from language-specific code.  */
440
441 void
442 pop_function_context ()
443 {
444   struct function *p = outer_function_chain;
445
446   outer_function_chain = p->next;
447
448   current_function_name = p->name;
449   current_function_decl = p->decl;
450   current_function_pops_args = p->pops_args;
451   current_function_returns_struct = p->returns_struct;
452   current_function_returns_pcc_struct = p->returns_pcc_struct;
453   current_function_needs_context = p->needs_context;
454   current_function_calls_setjmp = p->calls_setjmp;
455   current_function_calls_longjmp = p->calls_longjmp;
456   current_function_calls_alloca = p->calls_alloca;
457   current_function_has_nonlocal_label = p->has_nonlocal_label;
458   current_function_contains_functions = 1;
459   current_function_args_size = p->args_size;
460   current_function_pretend_args_size = p->pretend_args_size;
461   current_function_arg_offset_rtx = p->arg_offset_rtx;
462   current_function_uses_const_pool = p->uses_const_pool;
463   current_function_uses_pic_offset_table = p->uses_pic_offset_table;
464   current_function_internal_arg_pointer = p->internal_arg_pointer;
465   max_parm_reg = p->max_parm_reg;
466   parm_reg_stack_loc = p->parm_reg_stack_loc;
467   current_function_outgoing_args_size = p->outgoing_args_size;
468   current_function_return_rtx = p->return_rtx;
469   nonlocal_goto_handler_slot = p->nonlocal_goto_handler_slot;
470   nonlocal_goto_stack_level = p->nonlocal_goto_stack_level;
471   nonlocal_labels = p->nonlocal_labels;
472   cleanup_label = p->cleanup_label;
473   return_label = p->return_label;
474   save_expr_regs = p->save_expr_regs;
475   stack_slot_list = p->stack_slot_list;
476   parm_birth_insn = p->parm_birth_insn;
477   frame_offset = p->frame_offset;
478   tail_recursion_label = p->tail_recursion_label;
479   tail_recursion_reentry = p->tail_recursion_reentry;
480   arg_pointer_save_area = p->arg_pointer_save_area;
481   rtl_expr_chain = p->rtl_expr_chain;
482   last_parm_insn = p->last_parm_insn;
483   context_display = p->context_display;
484   trampoline_list = p->trampoline_list;
485   function_call_count = p->function_call_count;
486   temp_slots = p->temp_slots;
487   temp_slot_level = p->temp_slot_level;
488   current_function_epilogue_delay_list = p->epilogue_delay_list;
489
490   restore_tree_status (p);
491   restore_storage_status (p);
492   restore_expr_status (p);
493   restore_emit_status (p);
494   restore_stmt_status (p);
495   restore_varasm_status (p);
496
497   /* Finish doing put_var_into_stack for any of our variables
498      which became addressable during the nested function.  */
499   {
500     struct var_refs_queue *queue = p->fixup_var_refs_queue;
501     for (; queue; queue = queue->next)
502       fixup_var_refs (queue->modified, queue->promoted_mode, queue->unsignedp);
503   }
504
505   free (p);
506
507   /* Reset variables that have known state during rtx generation.  */
508   rtx_equal_function_value_matters = 1;
509   virtuals_instantiated = 0;
510 }
511 \f
512 /* Allocate fixed slots in the stack frame of the current function.  */
513
514 /* Return size needed for stack frame based on slots so far allocated.
515    This size counts from zero.  It is not rounded to STACK_BOUNDARY;
516    the caller may have to do that.  */
517
518 int
519 get_frame_size ()
520 {
521 #ifdef FRAME_GROWS_DOWNWARD
522   return -frame_offset;
523 #else
524   return frame_offset;
525 #endif
526 }
527
528 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
529    with machine mode MODE.
530    
531    ALIGN controls the amount of alignment for the address of the slot:
532    0 means according to MODE,
533    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
534    positive specifies alignment boundary in bits.
535
536    We do not round to stack_boundary here.  */
537
538 rtx
539 assign_stack_local (mode, size, align)
540      enum machine_mode mode;
541      int size;
542      int align;
543 {
544   register rtx x, addr;
545   int bigend_correction = 0;
546   int alignment;
547
548   if (align == 0)
549     {
550       alignment = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
551       if (mode == BLKmode)
552         alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
553     }
554   else if (align == -1)
555     {
556       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
557       size = CEIL_ROUND (size, alignment);
558     }
559   else
560     alignment = align / BITS_PER_UNIT;
561
562   /* Round frame offset to that alignment.
563      We must be careful here, since FRAME_OFFSET might be negative and
564      division with a negative dividend isn't as well defined as we might
565      like.  So we instead assume that ALIGNMENT is a power of two and
566      use logical operations which are unambiguous.  */
567 #ifdef FRAME_GROWS_DOWNWARD
568   frame_offset = FLOOR_ROUND (frame_offset, alignment);
569 #else
570   frame_offset = CEIL_ROUND (frame_offset, alignment);
571 #endif
572
573   /* On a big-endian machine, if we are allocating more space than we will use,
574      use the least significant bytes of those that are allocated.  */
575 #if BYTES_BIG_ENDIAN
576   if (mode != BLKmode)
577     bigend_correction = size - GET_MODE_SIZE (mode);
578 #endif
579
580 #ifdef FRAME_GROWS_DOWNWARD
581   frame_offset -= size;
582 #endif
583
584   /* If we have already instantiated virtual registers, return the actual
585      address relative to the frame pointer.  */
586   if (virtuals_instantiated)
587     addr = plus_constant (frame_pointer_rtx,
588                           (frame_offset + bigend_correction
589                            + STARTING_FRAME_OFFSET));
590   else
591     addr = plus_constant (virtual_stack_vars_rtx,
592                           frame_offset + bigend_correction);
593
594 #ifndef FRAME_GROWS_DOWNWARD
595   frame_offset += size;
596 #endif
597
598   x = gen_rtx (MEM, mode, addr);
599
600   stack_slot_list = gen_rtx (EXPR_LIST, VOIDmode, x, stack_slot_list);
601
602   return x;
603 }
604
605 /* Assign a stack slot in a containing function.
606    First three arguments are same as in preceding function.
607    The last argument specifies the function to allocate in.  */
608
609 rtx
610 assign_outer_stack_local (mode, size, align, function)
611      enum machine_mode mode;
612      int size;
613      int align;
614      struct function *function;
615 {
616   register rtx x, addr;
617   int bigend_correction = 0;
618   int alignment;
619
620   /* Allocate in the memory associated with the function in whose frame
621      we are assigning.  */
622   push_obstacks (function->function_obstack,
623                  function->function_maybepermanent_obstack);
624
625   if (align == 0)
626     {
627       alignment = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
628       if (mode == BLKmode)
629         alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
630     }
631   else if (align == -1)
632     {
633       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
634       size = CEIL_ROUND (size, alignment);
635     }
636   else
637     alignment = align / BITS_PER_UNIT;
638
639   /* Round frame offset to that alignment.  */
640 #ifdef FRAME_GROWS_DOWNWARD
641   function->frame_offset = FLOOR_ROUND (function->frame_offset, alignment);
642 #else
643   function->frame_offset = CEIL_ROUND (function->frame_offset, alignment);
644 #endif
645
646   /* On a big-endian machine, if we are allocating more space than we will use,
647      use the least significant bytes of those that are allocated.  */
648 #if BYTES_BIG_ENDIAN
649   if (mode != BLKmode)
650     bigend_correction = size - GET_MODE_SIZE (mode);
651 #endif
652
653 #ifdef FRAME_GROWS_DOWNWARD
654   function->frame_offset -= size;
655 #endif
656   addr = plus_constant (virtual_stack_vars_rtx,
657                         function->frame_offset + bigend_correction);
658 #ifndef FRAME_GROWS_DOWNWARD
659   function->frame_offset += size;
660 #endif
661
662   x = gen_rtx (MEM, mode, addr);
663
664   function->stack_slot_list
665     = gen_rtx (EXPR_LIST, VOIDmode, x, function->stack_slot_list);
666
667   pop_obstacks ();
668
669   return x;
670 }
671 \f
672 /* Allocate a temporary stack slot and record it for possible later
673    reuse.
674
675    MODE is the machine mode to be given to the returned rtx.
676
677    SIZE is the size in units of the space required.  We do no rounding here
678    since assign_stack_local will do any required rounding.
679
680    KEEP is non-zero if this slot is to be retained after a call to
681    free_temp_slots.  Automatic variables for a block are allocated with this
682    flag.  */
683
684 rtx
685 assign_stack_temp (mode, size, keep)
686      enum machine_mode mode;
687      int size;
688      int keep;
689 {
690   struct temp_slot *p, *best_p = 0;
691
692   /* First try to find an available, already-allocated temporary that is the
693      exact size we require.  */
694   for (p = temp_slots; p; p = p->next)
695     if (p->size == size && GET_MODE (p->slot) == mode && ! p->in_use)
696       break;
697
698   /* If we didn't find, one, try one that is larger than what we want.  We
699      find the smallest such.  */
700   if (p == 0)
701     for (p = temp_slots; p; p = p->next)
702       if (p->size > size && GET_MODE (p->slot) == mode && ! p->in_use
703           && (best_p == 0 || best_p->size > p->size))
704         best_p = p;
705
706   /* Make our best, if any, the one to use.  */
707   if (best_p)
708     p = best_p;
709
710   /* If we still didn't find one, make a new temporary.  */
711   if (p == 0)
712     {
713       p = (struct temp_slot *) oballoc (sizeof (struct temp_slot));
714       p->size = size;
715       /* If the temp slot mode doesn't indicate the alignment,
716          use the largest possible, so no one will be disappointed.  */
717       p->slot = assign_stack_local (mode, size, mode == BLKmode ? -1 : 0); 
718       p->next = temp_slots;
719       temp_slots = p;
720     }
721
722   p->in_use = 1;
723   p->level = temp_slot_level;
724   p->keep = keep;
725   return p->slot;
726 }
727 \f
728 /* If X could be a reference to a temporary slot, mark that slot as belonging
729    to the to one level higher.  If X matched one of our slots, just mark that
730    one.  Otherwise, we can't easily predict which it is, so upgrade all of
731    them.  Kept slots need not be touched.
732
733    This is called when an ({...}) construct occurs and a statement
734    returns a value in memory.  */
735
736 void
737 preserve_temp_slots (x)
738      rtx x;
739 {
740   struct temp_slot *p;
741
742   /* If X is not in memory or is at a constant address, it cannot be in
743      a temporary slot.  */
744   if (x == 0 || GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0)))
745     return;
746
747   /* First see if we can find a match.  */
748   for (p = temp_slots; p; p = p->next)
749     if (p->in_use && x == p->slot)
750       {
751         p->level--;
752         return;
753       }
754
755   /* Otherwise, preserve all non-kept slots at this level.  */
756   for (p = temp_slots; p; p = p->next)
757     if (p->in_use && p->level == temp_slot_level && ! p->keep)
758       p->level--;
759 }
760
761 /* Free all temporaries used so far.  This is normally called at the end
762    of generating code for a statement.  */
763
764 void
765 free_temp_slots ()
766 {
767   struct temp_slot *p;
768
769   for (p = temp_slots; p; p = p->next)
770     if (p->in_use && p->level == temp_slot_level && ! p->keep)
771       p->in_use = 0;
772 }
773
774 /* Push deeper into the nesting level for stack temporaries.  */
775
776 void
777 push_temp_slots ()
778 {
779   /* For GNU C++, we must allow a sequence to be emitted anywhere in
780      the level where the sequence was started.  By not changing levels
781      when the compiler is inside a sequence, the temporaries for the
782      sequence and the temporaries will not unwittingly conflict with
783      the temporaries for other sequences and/or code at that level.  */
784   if (in_sequence_p ())
785     return;
786
787   temp_slot_level++;
788 }
789
790 /* Pop a temporary nesting level.  All slots in use in the current level
791    are freed.  */
792
793 void
794 pop_temp_slots ()
795 {
796   struct temp_slot *p;
797
798   /* See comment in push_temp_slots about why we don't change levels
799      in sequences.  */
800   if (in_sequence_p ())
801     return;
802
803   for (p = temp_slots; p; p = p->next)
804     if (p->in_use && p->level == temp_slot_level)
805       p->in_use = 0;
806
807   temp_slot_level--;
808 }
809 \f
810 /* Retroactively move an auto variable from a register to a stack slot.
811    This is done when an address-reference to the variable is seen.  */
812
813 void
814 put_var_into_stack (decl)
815      tree decl;
816 {
817   register rtx reg;
818   register rtx new = 0;
819   enum machine_mode promoted_mode, decl_mode;
820   struct function *function = 0;
821   tree context = decl_function_context (decl);
822
823   /* Get the current rtl used for this object and it's original mode.  */
824   reg = TREE_CODE (decl) == SAVE_EXPR ? SAVE_EXPR_RTL (decl) : DECL_RTL (decl);
825
826   /* No need to do anything if decl has no rtx yet
827      since in that case caller is setting TREE_ADDRESSABLE
828      and a stack slot will be assigned when the rtl is made.  */
829   if (reg == 0)
830     return;
831
832   /* Get the declared mode for this object.  */
833   decl_mode = (TREE_CODE (decl) == SAVE_EXPR ? TYPE_MODE (TREE_TYPE (decl))
834                : DECL_MODE (decl));
835   /* Get the mode it's actually stored in.  */
836   promoted_mode = GET_MODE (reg);
837
838   /* If this variable comes from an outer function,
839      find that function's saved context.  */
840   if (context != current_function_decl)
841     for (function = outer_function_chain; function; function = function->next)
842       if (function->decl == context)
843         break;
844
845   /* If this is a variable-size object with a pseudo to address it,
846      put that pseudo into the stack, if the var is nonlocal.  */
847   if (DECL_NONLOCAL (decl)
848       && GET_CODE (reg) == MEM
849       && GET_CODE (XEXP (reg, 0)) == REG
850       && REGNO (XEXP (reg, 0)) > LAST_VIRTUAL_REGISTER)
851     {
852       reg = XEXP (reg, 0);
853       decl_mode = promoted_mode = GET_MODE (reg);
854     }
855   if (GET_CODE (reg) != REG)
856     return;
857
858   if (function)
859     {
860       if (REGNO (reg) < function->max_parm_reg)
861         new = function->parm_reg_stack_loc[REGNO (reg)];
862       if (new == 0)
863         new = assign_outer_stack_local (GET_MODE (reg),
864                                         GET_MODE_SIZE (decl_mode),
865                                         0, function);
866     }
867   else
868     {
869       if (REGNO (reg) < max_parm_reg)
870         new = parm_reg_stack_loc[REGNO (reg)];
871       if (new == 0)
872         new = assign_stack_local (GET_MODE (reg),
873                                   GET_MODE_SIZE (decl_mode), 0);
874     }
875
876   XEXP (reg, 0) = XEXP (new, 0);
877   /* `volatil' bit means one thing for MEMs, another entirely for REGs.  */
878   REG_USERVAR_P (reg) = 0;
879   PUT_CODE (reg, MEM);
880   PUT_MODE (reg, decl_mode);
881
882   /* If this is a memory ref that contains aggregate components,
883      mark it as such for cse and loop optimize.  */
884   MEM_IN_STRUCT_P (reg)
885     = (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
886        || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
887        || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE);
888
889   /* Now make sure that all refs to the variable, previously made
890      when it was a register, are fixed up to be valid again.  */
891   if (function)
892     {
893       struct var_refs_queue *temp;
894
895       /* Variable is inherited; fix it up when we get back to its function.  */
896       push_obstacks (function->function_obstack,
897                      function->function_maybepermanent_obstack);
898       temp
899         = (struct var_refs_queue *) oballoc (sizeof (struct var_refs_queue));
900       temp->modified = reg;
901       temp->promoted_mode = promoted_mode;
902       temp->unsignedp = TREE_UNSIGNED (TREE_TYPE (decl));
903       temp->next = function->fixup_var_refs_queue;
904       function->fixup_var_refs_queue = temp;
905       pop_obstacks ();
906     }
907   else
908     /* Variable is local; fix it up now.  */
909     fixup_var_refs (reg, promoted_mode, TREE_UNSIGNED (TREE_TYPE (decl)));
910 }
911 \f
912 static void
913 fixup_var_refs (var, promoted_mode, unsignedp)
914      rtx var;
915      enum machine_mode promoted_mode;
916      int unsignedp;
917 {
918   tree pending;
919   rtx first_insn = get_insns ();
920   struct sequence_stack *stack = sequence_stack;
921   tree rtl_exps = rtl_expr_chain;
922
923   /* Must scan all insns for stack-refs that exceed the limit.  */
924   fixup_var_refs_insns (var, promoted_mode, unsignedp, first_insn, stack == 0);
925
926   /* Scan all pending sequences too.  */
927   for (; stack; stack = stack->next)
928     {
929       push_to_sequence (stack->first);
930       fixup_var_refs_insns (var, promoted_mode, unsignedp,
931                             stack->first, stack->next != 0);
932       /* Update remembered end of sequence
933          in case we added an insn at the end.  */
934       stack->last = get_last_insn ();
935       end_sequence ();
936     }
937
938   /* Scan all waiting RTL_EXPRs too.  */
939   for (pending = rtl_exps; pending; pending = TREE_CHAIN (pending))
940     {
941       rtx seq = RTL_EXPR_SEQUENCE (TREE_VALUE (pending));
942       if (seq != const0_rtx && seq != 0)
943         {
944           push_to_sequence (seq);
945           fixup_var_refs_insns (var, promoted_mode, unsignedp, seq, 0);
946           end_sequence ();
947         }
948     }
949 }
950 \f
951 /* This structure is used by the following two functions to record MEMs or
952    pseudos used to replace VAR, any SUBREGs of VAR, and any MEMs containing
953    VAR as an address.  We need to maintain this list in case two operands of
954    an insn were required to match; in that case we must ensure we use the
955    same replacement.  */
956
957 struct fixup_replacement
958 {
959   rtx old;
960   rtx new;
961   struct fixup_replacement *next;
962 };
963    
964 /* REPLACEMENTS is a pointer to a list of the above structures and X is
965    some part of an insn.  Return a struct fixup_replacement whose OLD
966    value is equal to X.  Allocate a new structure if no such entry exists. */
967
968 static struct fixup_replacement *
969 find_fixup_replacement (replacements, x)
970      struct fixup_replacement **replacements;
971      rtx x;
972 {
973   struct fixup_replacement *p;
974
975   /* See if we have already replaced this.  */
976   for (p = *replacements; p && p->old != x; p = p->next)
977     ;
978
979   if (p == 0)
980     {
981       p = (struct fixup_replacement *) oballoc (sizeof (struct fixup_replacement));
982       p->old = x;
983       p->new = 0;
984       p->next = *replacements;
985       *replacements = p;
986     }
987
988   return p;
989 }
990
991 /* Scan the insn-chain starting with INSN for refs to VAR
992    and fix them up.  TOPLEVEL is nonzero if this chain is the
993    main chain of insns for the current function.  */
994
995 static void
996 fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel)
997      rtx var;
998      enum machine_mode promoted_mode;
999      int unsignedp;
1000      rtx insn;
1001      int toplevel;
1002 {
1003   while (insn)
1004     {
1005       rtx next = NEXT_INSN (insn);
1006       rtx note;
1007       if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
1008           || GET_CODE (insn) == JUMP_INSN)
1009         {
1010           /* The insn to load VAR from a home in the arglist
1011              is now a no-op.  When we see it, just delete it.  */
1012           if (toplevel
1013               && GET_CODE (PATTERN (insn)) == SET
1014               && SET_DEST (PATTERN (insn)) == var
1015               && rtx_equal_p (SET_SRC (PATTERN (insn)), var))
1016             {
1017               /* In unoptimized compilation, we shouldn't call delete_insn
1018                  except in jump.c doing warnings.  */
1019               PUT_CODE (insn, NOTE);
1020               NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1021               NOTE_SOURCE_FILE (insn) = 0;
1022               if (insn == last_parm_insn)
1023                 last_parm_insn = PREV_INSN (next);
1024             }
1025           else
1026             {
1027               /* See if we have to do anything to INSN now that VAR is in
1028                  memory.  If it needs to be loaded into a pseudo, use a single
1029                  pseudo for the entire insn in case there is a MATCH_DUP
1030                  between two operands.  We pass a pointer to the head of
1031                  a list of struct fixup_replacements.  If fixup_var_refs_1
1032                  needs to allocate pseudos or replacement MEMs (for SUBREGs),
1033                  it will record them in this list.
1034                  
1035                  If it allocated a pseudo for any replacement, we copy into
1036                  it here.  */
1037
1038               struct fixup_replacement *replacements = 0;
1039               rtx next_insn = NEXT_INSN (insn);
1040
1041               fixup_var_refs_1 (var, promoted_mode, &PATTERN (insn), insn,
1042                                 &replacements);
1043
1044               /* If this is last_parm_insn, and any instructions were output
1045                  after it to fix it up, then we must set last_parm_insn to
1046                  the last such instruction emitted.  */
1047               if (insn == last_parm_insn)
1048                 last_parm_insn = PREV_INSN (next_insn);
1049
1050               while (replacements)
1051                 {
1052                   if (GET_CODE (replacements->new) == REG)
1053                     {
1054                       rtx insert_before;
1055                       rtx seq;
1056
1057                       /* OLD might be a (subreg (mem)).  */
1058                       if (GET_CODE (replacements->old) == SUBREG)
1059                         replacements->old
1060                           = fixup_memory_subreg (replacements->old, insn, 0);
1061                       else
1062                         replacements->old
1063                           = fixup_stack_1 (replacements->old, insn);
1064
1065                       /* We can not separate USE insns from the CALL_INSN
1066                          that they belong to.  If this is a CALL_INSN, insert
1067                          the move insn before the USE insns preceding it
1068                          instead of immediately before the insn.  */
1069                       if (GET_CODE (insn) == CALL_INSN)
1070                         {
1071                           insert_before = insn;
1072                           while (GET_CODE (PREV_INSN (insert_before)) == INSN
1073                                  && GET_CODE (PATTERN (PREV_INSN (insert_before))) == USE)
1074                             insert_before = PREV_INSN (insert_before);
1075                         }
1076                       else
1077                         insert_before = insn;
1078
1079                       /* If we are changing the mode, do a conversion.
1080                          This might be wasteful, but combine.c will
1081                          eliminate much of the waste.  */
1082
1083                       if (GET_MODE (replacements->new)
1084                           != GET_MODE (replacements->old))
1085                         {
1086                           start_sequence ();
1087                           convert_move (replacements->new,
1088                                         replacements->old, unsignedp);
1089                           seq = gen_sequence ();
1090                           end_sequence ();
1091                         }
1092                       else
1093                         seq = gen_move_insn (replacements->new,
1094                                              replacements->old);
1095
1096                       emit_insn_before (seq, insert_before);
1097                     }
1098
1099                   replacements = replacements->next;
1100                 }
1101             }
1102
1103           /* Also fix up any invalid exprs in the REG_NOTES of this insn.
1104              But don't touch other insns referred to by reg-notes;
1105              we will get them elsewhere.  */
1106           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1107             if (GET_CODE (note) != INSN_LIST)
1108               XEXP (note, 0) = walk_fixup_memory_subreg (XEXP (note, 0), insn);
1109         }
1110       insn = next;
1111     }
1112 }
1113 \f
1114 /* VAR is a MEM that used to be a pseudo register with mode PROMOTED_MODE.
1115    See if the rtx expression at *LOC in INSN needs to be changed.  
1116
1117    REPLACEMENTS is a pointer to a list head that starts out zero, but may
1118    contain a list of original rtx's and replacements. If we find that we need
1119    to modify this insn by replacing a memory reference with a pseudo or by
1120    making a new MEM to implement a SUBREG, we consult that list to see if
1121    we have already chosen a replacement. If none has already been allocated,
1122    we allocate it and update the list.  fixup_var_refs_insns will copy VAR
1123    or the SUBREG, as appropriate, to the pseudo.  */
1124
1125 static void
1126 fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
1127      register rtx var;
1128      enum machine_mode promoted_mode;
1129      register rtx *loc;
1130      rtx insn;
1131      struct fixup_replacement **replacements;
1132 {
1133   register int i;
1134   register rtx x = *loc;
1135   RTX_CODE code = GET_CODE (x);
1136   register char *fmt;
1137   register rtx tem, tem1;
1138   struct fixup_replacement *replacement;
1139
1140   switch (code)
1141     {
1142     case MEM:
1143       if (var == x)
1144         {
1145           /* If we already have a replacement, use it.  Otherwise, 
1146              try to fix up this address in case it is invalid.  */
1147
1148           replacement = find_fixup_replacement (replacements, var);
1149           if (replacement->new)
1150             {
1151               *loc = replacement->new;
1152               return;
1153             }
1154
1155           *loc = replacement->new = x = fixup_stack_1 (x, insn);
1156
1157           /* Unless we are forcing memory to register or we changed the mode,
1158              we can leave things the way they are if the insn is valid.  */
1159              
1160           INSN_CODE (insn) = -1;
1161           if (! flag_force_mem && GET_MODE (x) == promoted_mode
1162               && recog_memoized (insn) >= 0)
1163             return;
1164
1165           *loc = replacement->new = gen_reg_rtx (promoted_mode);
1166           return;
1167         }
1168
1169       /* If X contains VAR, we need to unshare it here so that we update
1170          each occurrence separately.  But all identical MEMs in one insn
1171          must be replaced with the same rtx because of the possibility of
1172          MATCH_DUPs.  */
1173
1174       if (reg_mentioned_p (var, x))
1175         {
1176           replacement = find_fixup_replacement (replacements, x);
1177           if (replacement->new == 0)
1178             replacement->new = copy_most_rtx (x, var);
1179
1180           *loc = x = replacement->new;
1181         }
1182       break;
1183
1184     case REG:
1185     case CC0:
1186     case PC:
1187     case CONST_INT:
1188     case CONST:
1189     case SYMBOL_REF:
1190     case LABEL_REF:
1191     case CONST_DOUBLE:
1192       return;
1193
1194     case SIGN_EXTRACT:
1195     case ZERO_EXTRACT:
1196       /* Note that in some cases those types of expressions are altered
1197          by optimize_bit_field, and do not survive to get here.  */
1198       if (XEXP (x, 0) == var
1199           || (GET_CODE (XEXP (x, 0)) == SUBREG
1200               && SUBREG_REG (XEXP (x, 0)) == var))
1201         {
1202           /* Get TEM as a valid MEM in the mode presently in the insn.
1203
1204              We don't worry about the possibility of MATCH_DUP here; it
1205              is highly unlikely and would be tricky to handle.  */
1206
1207           tem = XEXP (x, 0);
1208           if (GET_CODE (tem) == SUBREG)
1209             tem = fixup_memory_subreg (tem, insn, 1);
1210           tem = fixup_stack_1 (tem, insn);
1211
1212           /* Unless we want to load from memory, get TEM into the proper mode
1213              for an extract from memory.  This can only be done if the
1214              extract is at a constant position and length.  */
1215
1216           if (! flag_force_mem && GET_CODE (XEXP (x, 1)) == CONST_INT
1217               && GET_CODE (XEXP (x, 2)) == CONST_INT
1218               && ! mode_dependent_address_p (XEXP (tem, 0))
1219               && ! MEM_VOLATILE_P (tem))
1220             {
1221               enum machine_mode wanted_mode = VOIDmode;
1222               enum machine_mode is_mode = GET_MODE (tem);
1223               int width = INTVAL (XEXP (x, 1));
1224               int pos = INTVAL (XEXP (x, 2));
1225
1226 #ifdef HAVE_extzv
1227               if (GET_CODE (x) == ZERO_EXTRACT)
1228                 wanted_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
1229 #endif
1230 #ifdef HAVE_extv
1231               if (GET_CODE (x) == SIGN_EXTRACT)
1232                 wanted_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
1233 #endif
1234               /* If we have a narrower mode, we can do something.  */
1235               if (wanted_mode != VOIDmode
1236                   && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
1237                 {
1238                   int offset = pos / BITS_PER_UNIT;
1239                   rtx old_pos = XEXP (x, 2);
1240                   rtx newmem;
1241
1242                   /* If the bytes and bits are counted differently, we
1243                      must adjust the offset.  */
1244 #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
1245                   offset = (GET_MODE_SIZE (is_mode)
1246                             - GET_MODE_SIZE (wanted_mode) - offset);
1247 #endif
1248
1249                   pos %= GET_MODE_BITSIZE (wanted_mode);
1250
1251                   newmem = gen_rtx (MEM, wanted_mode,
1252                                     plus_constant (XEXP (tem, 0), offset));
1253                   RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (tem);
1254                   MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (tem);
1255                   MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (tem);
1256
1257                   /* Make the change and see if the insn remains valid.  */
1258                   INSN_CODE (insn) = -1;
1259                   XEXP (x, 0) = newmem;
1260                   XEXP (x, 2) = GEN_INT (pos);
1261
1262                   if (recog_memoized (insn) >= 0)
1263                     return;
1264
1265                   /* Otherwise, restore old position.  XEXP (x, 0) will be
1266                      restored later.  */
1267                   XEXP (x, 2) = old_pos;
1268                 }
1269             }
1270
1271           /* If we get here, the bitfield extract insn can't accept a memory
1272              reference.  Copy the input into a register.  */
1273
1274           tem1 = gen_reg_rtx (GET_MODE (tem));
1275           emit_insn_before (gen_move_insn (tem1, tem), insn);
1276           XEXP (x, 0) = tem1;
1277           return;
1278         }
1279       break;
1280               
1281     case SUBREG:
1282       if (SUBREG_REG (x) == var)
1283         {
1284           /* If this is a special SUBREG made because VAR was promoted
1285              from a wider mode, replace it with VAR and call ourself
1286              recursively, this time saying that the object previously
1287              had its current mode (by virtue of the SUBREG).  */
1288
1289           if (SUBREG_PROMOTED_VAR_P (x))
1290             {
1291               *loc = var;
1292               fixup_var_refs_1 (var, GET_MODE (var), loc, insn, replacements);
1293               return;
1294             }
1295
1296           /* If this SUBREG makes VAR wider, it has become a paradoxical
1297              SUBREG with VAR in memory, but these aren't allowed at this 
1298              stage of the compilation.  So load VAR into a pseudo and take
1299              a SUBREG of that pseudo.  */
1300           if (GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (var)))
1301             {
1302               replacement = find_fixup_replacement (replacements, var);
1303               if (replacement->new == 0)
1304                 replacement->new = gen_reg_rtx (GET_MODE (var));
1305               SUBREG_REG (x) = replacement->new;
1306               return;
1307             }
1308
1309           /* See if we have already found a replacement for this SUBREG.
1310              If so, use it.  Otherwise, make a MEM and see if the insn
1311              is recognized.  If not, or if we should force MEM into a register,
1312              make a pseudo for this SUBREG.  */
1313           replacement = find_fixup_replacement (replacements, x);
1314           if (replacement->new)
1315             {
1316               *loc = replacement->new;
1317               return;
1318             }
1319           
1320           replacement->new = *loc = fixup_memory_subreg (x, insn, 0);
1321
1322           if (! flag_force_mem && recog_memoized (insn) >= 0)
1323             return;
1324
1325           *loc = replacement->new = gen_reg_rtx (GET_MODE (x));
1326           return;
1327         }
1328       break;
1329
1330     case SET:
1331       /* First do special simplification of bit-field references.  */
1332       if (GET_CODE (SET_DEST (x)) == SIGN_EXTRACT
1333           || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1334         optimize_bit_field (x, insn, 0);
1335       if (GET_CODE (SET_SRC (x)) == SIGN_EXTRACT
1336           || GET_CODE (SET_SRC (x)) == ZERO_EXTRACT)
1337         optimize_bit_field (x, insn, NULL_PTR);
1338
1339       /* If SET_DEST is now a paradoxical SUBREG, put the result of this
1340          insn into a pseudo and store the low part of the pseudo into VAR. */
1341       if (GET_CODE (SET_DEST (x)) == SUBREG
1342           && SUBREG_REG (SET_DEST (x)) == var
1343           && (GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
1344               > GET_MODE_SIZE (GET_MODE (var))))
1345         {
1346           SET_DEST (x) = tem = gen_reg_rtx (GET_MODE (SET_DEST (x)));
1347           emit_insn_after (gen_move_insn (var, gen_lowpart (GET_MODE (var),
1348                                                             tem)),
1349                            insn);
1350           break;
1351         }
1352           
1353       {
1354         rtx dest = SET_DEST (x);
1355         rtx src = SET_SRC (x);
1356         rtx outerdest = dest;
1357
1358         while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
1359                || GET_CODE (dest) == SIGN_EXTRACT
1360                || GET_CODE (dest) == ZERO_EXTRACT)
1361           dest = XEXP (dest, 0);
1362
1363         if (GET_CODE (src) == SUBREG)
1364           src = XEXP (src, 0);
1365
1366         /* If VAR does not appear at the top level of the SET
1367            just scan the lower levels of the tree.  */
1368
1369         if (src != var && dest != var)
1370           break;
1371
1372         /* We will need to rerecognize this insn.  */
1373         INSN_CODE (insn) = -1;
1374
1375 #ifdef HAVE_insv
1376         if (GET_CODE (outerdest) == ZERO_EXTRACT && dest == var)
1377           {
1378             /* Since this case will return, ensure we fixup all the
1379                operands here.  */
1380             fixup_var_refs_1 (var, promoted_mode, &XEXP (outerdest, 1),
1381                               insn, replacements);
1382             fixup_var_refs_1 (var, promoted_mode, &XEXP (outerdest, 2),
1383                               insn, replacements);
1384             fixup_var_refs_1 (var, promoted_mode, &SET_SRC (x),
1385                               insn, replacements);
1386
1387             tem = XEXP (outerdest, 0);
1388
1389             /* Clean up (SUBREG:SI (MEM:mode ...) 0)
1390                that may appear inside a ZERO_EXTRACT.
1391                This was legitimate when the MEM was a REG.  */
1392             if (GET_CODE (tem) == SUBREG
1393                 && SUBREG_REG (tem) == var)
1394               tem = fixup_memory_subreg (tem, insn, 1);
1395             else
1396               tem = fixup_stack_1 (tem, insn);
1397
1398             if (GET_CODE (XEXP (outerdest, 1)) == CONST_INT
1399                 && GET_CODE (XEXP (outerdest, 2)) == CONST_INT
1400                 && ! mode_dependent_address_p (XEXP (tem, 0))
1401                 && ! MEM_VOLATILE_P (tem))
1402               {
1403                 enum machine_mode wanted_mode
1404                   = insn_operand_mode[(int) CODE_FOR_insv][0];
1405                 enum machine_mode is_mode = GET_MODE (tem);
1406                 int width = INTVAL (XEXP (outerdest, 1));
1407                 int pos = INTVAL (XEXP (outerdest, 2));
1408
1409                 /* If we have a narrower mode, we can do something.  */
1410                 if (GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
1411                   {
1412                     int offset = pos / BITS_PER_UNIT;
1413                     rtx old_pos = XEXP (outerdest, 2);
1414                     rtx newmem;
1415
1416 #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
1417                     offset = (GET_MODE_SIZE (is_mode)
1418                               - GET_MODE_SIZE (wanted_mode) - offset);
1419 #endif
1420
1421                     pos %= GET_MODE_BITSIZE (wanted_mode);
1422
1423                     newmem = gen_rtx (MEM, wanted_mode,
1424                                       plus_constant (XEXP (tem, 0), offset));
1425                     RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (tem);
1426                     MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (tem);
1427                     MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (tem);
1428
1429                     /* Make the change and see if the insn remains valid.  */
1430                     INSN_CODE (insn) = -1;
1431                     XEXP (outerdest, 0) = newmem;
1432                     XEXP (outerdest, 2) = GEN_INT (pos);
1433                     
1434                     if (recog_memoized (insn) >= 0)
1435                       return;
1436                     
1437                     /* Otherwise, restore old position.  XEXP (x, 0) will be
1438                        restored later.  */
1439                     XEXP (outerdest, 2) = old_pos;
1440                   }
1441               }
1442
1443             /* If we get here, the bit-field store doesn't allow memory
1444                or isn't located at a constant position.  Load the value into
1445                a register, do the store, and put it back into memory.  */
1446
1447             tem1 = gen_reg_rtx (GET_MODE (tem));
1448             emit_insn_before (gen_move_insn (tem1, tem), insn);
1449             emit_insn_after (gen_move_insn (tem, tem1), insn);
1450             XEXP (outerdest, 0) = tem1;
1451             return;
1452           }
1453 #endif
1454
1455         /* STRICT_LOW_PART is a no-op on memory references
1456            and it can cause combinations to be unrecognizable,
1457            so eliminate it.  */
1458
1459         if (dest == var && GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1460           SET_DEST (x) = XEXP (SET_DEST (x), 0);
1461
1462         /* A valid insn to copy VAR into or out of a register
1463            must be left alone, to avoid an infinite loop here.
1464            If the reference to VAR is by a subreg, fix that up,
1465            since SUBREG is not valid for a memref.
1466            Also fix up the address of the stack slot.  */
1467
1468         if ((SET_SRC (x) == var
1469              || (GET_CODE (SET_SRC (x)) == SUBREG
1470                  && SUBREG_REG (SET_SRC (x)) == var))
1471             && (GET_CODE (SET_DEST (x)) == REG
1472                 || (GET_CODE (SET_DEST (x)) == SUBREG
1473                     && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG))
1474             && recog_memoized (insn) >= 0)
1475           {
1476             replacement = find_fixup_replacement (replacements, SET_SRC (x));
1477             if (replacement->new)
1478               {
1479               SET_SRC (x) = replacement->new;
1480               return;
1481             }
1482             else if (GET_CODE (SET_SRC (x)) == SUBREG)
1483               SET_SRC (x) = replacement->new
1484                 = fixup_memory_subreg (SET_SRC (x), insn, 0);
1485             else
1486               SET_SRC (x) = replacement->new
1487                 = fixup_stack_1 (SET_SRC (x), insn);
1488             return;
1489           }
1490
1491         if ((SET_DEST (x) == var
1492              || (GET_CODE (SET_DEST (x)) == SUBREG
1493                  && SUBREG_REG (SET_DEST (x)) == var))
1494             && (GET_CODE (SET_SRC (x)) == REG
1495                 || (GET_CODE (SET_SRC (x)) == SUBREG
1496                     && GET_CODE (SUBREG_REG (SET_SRC (x))) == REG))
1497             && recog_memoized (insn) >= 0)
1498           {
1499             if (GET_CODE (SET_DEST (x)) == SUBREG)
1500               SET_DEST (x) = fixup_memory_subreg (SET_DEST (x), insn, 0);
1501             else
1502               SET_DEST (x) = fixup_stack_1 (SET_DEST (x), insn);
1503             return;
1504           }
1505
1506         /* Otherwise, storing into VAR must be handled specially
1507            by storing into a temporary and copying that into VAR
1508            with a new insn after this one.  Note that this case
1509            will be used when storing into a promoted scalar since
1510            the insn will now have different modes on the input
1511            and output and hence will be invalid (except for the case
1512            of setting it to a constant, which does not need any
1513            change if it is valid).  We generate extra code in that case,
1514            but combine.c will eliminate it.  */
1515
1516         if (dest == var)
1517           {
1518             rtx temp;
1519             rtx fixeddest = SET_DEST (x);
1520
1521             /* STRICT_LOW_PART can be discarded, around a MEM.  */
1522             if (GET_CODE (fixeddest) == STRICT_LOW_PART)
1523               fixeddest = XEXP (fixeddest, 0);
1524             /* Convert (SUBREG (MEM)) to a MEM in a changed mode.  */
1525             if (GET_CODE (fixeddest) == SUBREG)
1526               fixeddest = fixup_memory_subreg (fixeddest, insn, 0);
1527             else
1528               fixeddest = fixup_stack_1 (fixeddest, insn);
1529
1530             temp = gen_reg_rtx (GET_MODE (SET_SRC (x)) == VOIDmode
1531                                 ? GET_MODE (fixeddest)
1532                                 : GET_MODE (SET_SRC (x)));
1533
1534             emit_insn_after (gen_move_insn (fixeddest,
1535                                             gen_lowpart (GET_MODE (fixeddest),
1536                                                          temp)),
1537                              insn);
1538
1539             SET_DEST (x) = temp;
1540           }
1541       }
1542     }
1543
1544   /* Nothing special about this RTX; fix its operands.  */
1545
1546   fmt = GET_RTX_FORMAT (code);
1547   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1548     {
1549       if (fmt[i] == 'e')
1550         fixup_var_refs_1 (var, promoted_mode, &XEXP (x, i), insn, replacements);
1551       if (fmt[i] == 'E')
1552         {
1553           register int j;
1554           for (j = 0; j < XVECLEN (x, i); j++)
1555             fixup_var_refs_1 (var, promoted_mode, &XVECEXP (x, i, j),
1556                               insn, replacements);
1557         }
1558     }
1559 }
1560 \f
1561 /* Given X, an rtx of the form (SUBREG:m1 (MEM:m2 addr)),
1562    return an rtx (MEM:m1 newaddr) which is equivalent.
1563    If any insns must be emitted to compute NEWADDR, put them before INSN.
1564
1565    UNCRITICAL nonzero means accept paradoxical subregs.
1566    This is used for subregs found inside of ZERO_EXTRACTs.  */
1567
1568 static rtx
1569 fixup_memory_subreg (x, insn, uncritical)
1570      rtx x;
1571      rtx insn;
1572      int uncritical;
1573 {
1574   int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
1575   rtx addr = XEXP (SUBREG_REG (x), 0);
1576   enum machine_mode mode = GET_MODE (x);
1577   rtx saved, result;
1578
1579   /* Paradoxical SUBREGs are usually invalid during RTL generation.  */
1580   if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
1581       && ! uncritical)
1582     abort ();
1583
1584 #if BYTES_BIG_ENDIAN
1585   offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
1586              - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
1587 #endif
1588   addr = plus_constant (addr, offset);
1589   if (!flag_force_addr && memory_address_p (mode, addr))
1590     /* Shortcut if no insns need be emitted.  */
1591     return change_address (SUBREG_REG (x), mode, addr);
1592   start_sequence ();
1593   result = change_address (SUBREG_REG (x), mode, addr);
1594   emit_insn_before (gen_sequence (), insn);
1595   end_sequence ();
1596   return result;
1597 }
1598
1599 /* Do fixup_memory_subreg on all (SUBREG (MEM ...) ...) contained in X.
1600    Replace subexpressions of X in place.
1601    If X itself is a (SUBREG (MEM ...) ...), return the replacement expression.
1602    Otherwise return X, with its contents possibly altered.
1603
1604    If any insns must be emitted to compute NEWADDR, put them before INSN.  */
1605
1606 static rtx
1607 walk_fixup_memory_subreg (x, insn)
1608      register rtx x;
1609      rtx insn;
1610 {
1611   register enum rtx_code code;
1612   register char *fmt;
1613   register int i;
1614
1615   if (x == 0)
1616     return 0;
1617
1618   code = GET_CODE (x);
1619
1620   if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
1621     return fixup_memory_subreg (x, insn, 0);
1622
1623   /* Nothing special about this RTX; fix its operands.  */
1624
1625   fmt = GET_RTX_FORMAT (code);
1626   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1627     {
1628       if (fmt[i] == 'e')
1629         XEXP (x, i) = walk_fixup_memory_subreg (XEXP (x, i), insn);
1630       if (fmt[i] == 'E')
1631         {
1632           register int j;
1633           for (j = 0; j < XVECLEN (x, i); j++)
1634             XVECEXP (x, i, j)
1635               = walk_fixup_memory_subreg (XVECEXP (x, i, j), insn);
1636         }
1637     }
1638   return x;
1639 }
1640 \f
1641 #if 0
1642 /* Fix up any references to stack slots that are invalid memory addresses
1643    because they exceed the maximum range of a displacement.  */
1644
1645 void
1646 fixup_stack_slots ()
1647 {
1648   register rtx insn;
1649
1650   /* Did we generate a stack slot that is out of range
1651      or otherwise has an invalid address?  */
1652   if (invalid_stack_slot)
1653     {
1654       /* Yes.  Must scan all insns for stack-refs that exceed the limit.  */
1655       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1656         if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
1657             || GET_CODE (insn) == JUMP_INSN)
1658           fixup_stack_1 (PATTERN (insn), insn);
1659     }
1660 }
1661 #endif
1662
1663 /* For each memory ref within X, if it refers to a stack slot
1664    with an out of range displacement, put the address in a temp register
1665    (emitting new insns before INSN to load these registers)
1666    and alter the memory ref to use that register.
1667    Replace each such MEM rtx with a copy, to avoid clobberage.  */
1668
1669 static rtx
1670 fixup_stack_1 (x, insn)
1671      rtx x;
1672      rtx insn;
1673 {
1674   register int i;
1675   register RTX_CODE code = GET_CODE (x);
1676   register char *fmt;
1677
1678   if (code == MEM)
1679     {
1680       register rtx ad = XEXP (x, 0);
1681       /* If we have address of a stack slot but it's not valid
1682          (displacement is too large), compute the sum in a register.  */
1683       if (GET_CODE (ad) == PLUS
1684           && GET_CODE (XEXP (ad, 0)) == REG
1685           && REGNO (XEXP (ad, 0)) >= FIRST_VIRTUAL_REGISTER
1686           && REGNO (XEXP (ad, 0)) <= LAST_VIRTUAL_REGISTER
1687           && GET_CODE (XEXP (ad, 1)) == CONST_INT)
1688         {
1689           rtx temp, seq;
1690           if (memory_address_p (GET_MODE (x), ad))
1691             return x;
1692
1693           start_sequence ();
1694           temp = copy_to_reg (ad);
1695           seq = gen_sequence ();
1696           end_sequence ();
1697           emit_insn_before (seq, insn);
1698           return change_address (x, VOIDmode, temp);
1699         }
1700       return x;
1701     }
1702
1703   fmt = GET_RTX_FORMAT (code);
1704   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1705     {
1706       if (fmt[i] == 'e')
1707         XEXP (x, i) = fixup_stack_1 (XEXP (x, i), insn);
1708       if (fmt[i] == 'E')
1709         {
1710           register int j;
1711           for (j = 0; j < XVECLEN (x, i); j++)
1712             XVECEXP (x, i, j) = fixup_stack_1 (XVECEXP (x, i, j), insn);
1713         }
1714     }
1715   return x;
1716 }
1717 \f
1718 /* Optimization: a bit-field instruction whose field
1719    happens to be a byte or halfword in memory
1720    can be changed to a move instruction.
1721
1722    We call here when INSN is an insn to examine or store into a bit-field.
1723    BODY is the SET-rtx to be altered.
1724
1725    EQUIV_MEM is the table `reg_equiv_mem' if that is available; else 0.
1726    (Currently this is called only from function.c, and EQUIV_MEM
1727    is always 0.)  */
1728
1729 static void
1730 optimize_bit_field (body, insn, equiv_mem)
1731      rtx body;
1732      rtx insn;
1733      rtx *equiv_mem;
1734 {
1735   register rtx bitfield;
1736   int destflag;
1737   rtx seq = 0;
1738   enum machine_mode mode;
1739
1740   if (GET_CODE (SET_DEST (body)) == SIGN_EXTRACT
1741       || GET_CODE (SET_DEST (body)) == ZERO_EXTRACT)
1742     bitfield = SET_DEST (body), destflag = 1;
1743   else
1744     bitfield = SET_SRC (body), destflag = 0;
1745
1746   /* First check that the field being stored has constant size and position
1747      and is in fact a byte or halfword suitably aligned.  */
1748
1749   if (GET_CODE (XEXP (bitfield, 1)) == CONST_INT
1750       && GET_CODE (XEXP (bitfield, 2)) == CONST_INT
1751       && ((mode = mode_for_size (INTVAL (XEXP (bitfield, 1)), MODE_INT, 1))
1752           != BLKmode)
1753       && INTVAL (XEXP (bitfield, 2)) % INTVAL (XEXP (bitfield, 1)) == 0)
1754     {
1755       register rtx memref = 0;
1756
1757       /* Now check that the containing word is memory, not a register,
1758          and that it is safe to change the machine mode.  */
1759
1760       if (GET_CODE (XEXP (bitfield, 0)) == MEM)
1761         memref = XEXP (bitfield, 0);
1762       else if (GET_CODE (XEXP (bitfield, 0)) == REG
1763                && equiv_mem != 0)
1764         memref = equiv_mem[REGNO (XEXP (bitfield, 0))];
1765       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
1766                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == MEM)
1767         memref = SUBREG_REG (XEXP (bitfield, 0));
1768       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
1769                && equiv_mem != 0
1770                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == REG)
1771         memref = equiv_mem[REGNO (SUBREG_REG (XEXP (bitfield, 0)))];
1772
1773       if (memref
1774           && ! mode_dependent_address_p (XEXP (memref, 0))
1775           && ! MEM_VOLATILE_P (memref))
1776         {
1777           /* Now adjust the address, first for any subreg'ing
1778              that we are now getting rid of,
1779              and then for which byte of the word is wanted.  */
1780
1781           register int offset = INTVAL (XEXP (bitfield, 2));
1782           /* Adjust OFFSET to count bits from low-address byte.  */
1783 #if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN
1784           offset = (GET_MODE_BITSIZE (GET_MODE (XEXP (bitfield, 0)))
1785                     - offset - INTVAL (XEXP (bitfield, 1)));
1786 #endif
1787           /* Adjust OFFSET to count bytes from low-address byte.  */
1788           offset /= BITS_PER_UNIT;
1789           if (GET_CODE (XEXP (bitfield, 0)) == SUBREG)
1790             {
1791               offset += SUBREG_WORD (XEXP (bitfield, 0)) * UNITS_PER_WORD;
1792 #if BYTES_BIG_ENDIAN
1793               offset -= (MIN (UNITS_PER_WORD,
1794                               GET_MODE_SIZE (GET_MODE (XEXP (bitfield, 0))))
1795                          - MIN (UNITS_PER_WORD,
1796                                 GET_MODE_SIZE (GET_MODE (memref))));
1797 #endif
1798             }
1799
1800           memref = change_address (memref, mode, 
1801                                    plus_constant (XEXP (memref, 0), offset));
1802
1803           /* Store this memory reference where
1804              we found the bit field reference.  */
1805
1806           if (destflag)
1807             {
1808               validate_change (insn, &SET_DEST (body), memref, 1);
1809               if (! CONSTANT_ADDRESS_P (SET_SRC (body)))
1810                 {
1811                   rtx src = SET_SRC (body);
1812                   while (GET_CODE (src) == SUBREG
1813                          && SUBREG_WORD (src) == 0)
1814                     src = SUBREG_REG (src);
1815                   if (GET_MODE (src) != GET_MODE (memref))
1816                     src = gen_lowpart (GET_MODE (memref), SET_SRC (body));
1817                   validate_change (insn, &SET_SRC (body), src, 1);
1818                 }
1819               else if (GET_MODE (SET_SRC (body)) != VOIDmode
1820                        && GET_MODE (SET_SRC (body)) != GET_MODE (memref))
1821                 /* This shouldn't happen because anything that didn't have
1822                    one of these modes should have got converted explicitly
1823                    and then referenced through a subreg.
1824                    This is so because the original bit-field was
1825                    handled by agg_mode and so its tree structure had
1826                    the same mode that memref now has.  */
1827                 abort ();
1828             }
1829           else
1830             {
1831               rtx dest = SET_DEST (body);
1832
1833               while (GET_CODE (dest) == SUBREG
1834                      && SUBREG_WORD (dest) == 0)
1835                 dest = SUBREG_REG (dest);
1836
1837               validate_change (insn, &SET_DEST (body), dest, 1);
1838
1839               if (GET_MODE (dest) == GET_MODE (memref))
1840                 validate_change (insn, &SET_SRC (body), memref, 1);
1841               else
1842                 {
1843                   /* Convert the mem ref to the destination mode.  */
1844                   rtx newreg = gen_reg_rtx (GET_MODE (dest));
1845
1846                   start_sequence ();
1847                   convert_move (newreg, memref,
1848                                 GET_CODE (SET_SRC (body)) == ZERO_EXTRACT);
1849                   seq = get_insns ();
1850                   end_sequence ();
1851
1852                   validate_change (insn, &SET_SRC (body), newreg, 1);
1853                 }
1854             }
1855
1856           /* See if we can convert this extraction or insertion into
1857              a simple move insn.  We might not be able to do so if this
1858              was, for example, part of a PARALLEL.
1859
1860              If we succeed, write out any needed conversions.  If we fail,
1861              it is hard to guess why we failed, so don't do anything
1862              special; just let the optimization be suppressed.  */
1863
1864           if (apply_change_group () && seq)
1865             emit_insns_before (seq, insn);
1866         }
1867     }
1868 }
1869 \f
1870 /* These routines are responsible for converting virtual register references
1871    to the actual hard register references once RTL generation is complete.
1872
1873    The following four variables are used for communication between the
1874    routines.  They contain the offsets of the virtual registers from their
1875    respective hard registers.  */
1876
1877 static int in_arg_offset;
1878 static int var_offset;
1879 static int dynamic_offset;
1880 static int out_arg_offset;
1881
1882 /* In most machines, the stack pointer register is equivalent to the bottom
1883    of the stack.  */
1884
1885 #ifndef STACK_POINTER_OFFSET
1886 #define STACK_POINTER_OFFSET    0
1887 #endif
1888
1889 /* If not defined, pick an appropriate default for the offset of dynamically
1890    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1891    REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
1892
1893 #ifndef STACK_DYNAMIC_OFFSET
1894
1895 #ifdef ACCUMULATE_OUTGOING_ARGS
1896 /* The bottom of the stack points to the actual arguments.  If
1897    REG_PARM_STACK_SPACE is defined, this includes the space for the register
1898    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
1899    stack space for register parameters is not pushed by the caller, but 
1900    rather part of the fixed stack areas and hence not included in
1901    `current_function_outgoing_args_size'.  Nevertheless, we must allow
1902    for it when allocating stack dynamic objects.  */
1903
1904 #if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
1905 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1906 (current_function_outgoing_args_size    \
1907  + REG_PARM_STACK_SPACE (FNDECL) + (STACK_POINTER_OFFSET))
1908
1909 #else
1910 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1911 (current_function_outgoing_args_size + (STACK_POINTER_OFFSET))
1912 #endif
1913
1914 #else
1915 #define STACK_DYNAMIC_OFFSET(FNDECL) STACK_POINTER_OFFSET
1916 #endif
1917 #endif
1918
1919 /* Pass through the INSNS of function FNDECL and convert virtual register
1920    references to hard register references.  */
1921
1922 void
1923 instantiate_virtual_regs (fndecl, insns)
1924      tree fndecl;
1925      rtx insns;
1926 {
1927   rtx insn;
1928
1929   /* Compute the offsets to use for this function.  */
1930   in_arg_offset = FIRST_PARM_OFFSET (fndecl);
1931   var_offset = STARTING_FRAME_OFFSET;
1932   dynamic_offset = STACK_DYNAMIC_OFFSET (fndecl);
1933   out_arg_offset = STACK_POINTER_OFFSET;
1934
1935   /* Scan all variables and parameters of this function.  For each that is
1936      in memory, instantiate all virtual registers if the result is a valid
1937      address.  If not, we do it later.  That will handle most uses of virtual
1938      regs on many machines.  */
1939   instantiate_decls (fndecl, 1);
1940
1941   /* Initialize recognition, indicating that volatile is OK.  */
1942   init_recog ();
1943
1944   /* Scan through all the insns, instantiating every virtual register still
1945      present.  */
1946   for (insn = insns; insn; insn = NEXT_INSN (insn))
1947     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
1948         || GET_CODE (insn) == CALL_INSN)
1949       {
1950         instantiate_virtual_regs_1 (&PATTERN (insn), insn, 1);
1951         instantiate_virtual_regs_1 (&REG_NOTES (insn), NULL_RTX, 0);
1952       }
1953
1954   /* Now instantiate the remaining register equivalences for debugging info.
1955      These will not be valid addresses.  */
1956   instantiate_decls (fndecl, 0);
1957
1958   /* Indicate that, from now on, assign_stack_local should use
1959      frame_pointer_rtx.  */
1960   virtuals_instantiated = 1;
1961 }
1962
1963 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1964    all virtual registers in their DECL_RTL's.
1965
1966    If VALID_ONLY, do this only if the resulting address is still valid.
1967    Otherwise, always do it.  */
1968
1969 static void
1970 instantiate_decls (fndecl, valid_only)
1971      tree fndecl;
1972      int valid_only;
1973 {
1974   tree decl;
1975
1976   if (DECL_INLINE (fndecl))
1977     /* When compiling an inline function, the obstack used for
1978        rtl allocation is the maybepermanent_obstack.  Calling
1979        `resume_temporary_allocation' switches us back to that
1980        obstack while we process this function's parameters.  */
1981     resume_temporary_allocation ();
1982
1983   /* Process all parameters of the function.  */
1984   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
1985     {
1986       instantiate_decl (DECL_RTL (decl), int_size_in_bytes (TREE_TYPE (decl)),
1987                         valid_only);    
1988       instantiate_decl (DECL_INCOMING_RTL (decl),
1989                         int_size_in_bytes (TREE_TYPE (decl)), valid_only);
1990     }
1991
1992   /* Now process all variables defined in the function or its subblocks. */
1993   instantiate_decls_1 (DECL_INITIAL (fndecl), valid_only);
1994
1995   if (DECL_INLINE (fndecl))
1996     {
1997       /* Save all rtl allocated for this function by raising the
1998          high-water mark on the maybepermanent_obstack.  */
1999       preserve_data ();
2000       /* All further rtl allocation is now done in the current_obstack.  */
2001       rtl_in_current_obstack ();
2002     }
2003 }
2004
2005 /* Subroutine of instantiate_decls: Process all decls in the given
2006    BLOCK node and all its subblocks.  */
2007
2008 static void
2009 instantiate_decls_1 (let, valid_only)
2010      tree let;
2011      int valid_only;
2012 {
2013   tree t;
2014
2015   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
2016     instantiate_decl (DECL_RTL (t), int_size_in_bytes (TREE_TYPE (t)),
2017                       valid_only);
2018
2019   /* Process all subblocks.  */
2020   for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
2021     instantiate_decls_1 (t, valid_only);
2022 }
2023
2024 /* Subroutine of the preceeding procedures: Given RTL representing a
2025    decl and the size of the object, do any instantiation required.
2026
2027    If VALID_ONLY is non-zero, it means that the RTL should only be
2028    changed if the new address is valid.  */
2029
2030 static void
2031 instantiate_decl (x, size, valid_only)
2032      rtx x;
2033      int size;
2034      int valid_only;
2035 {
2036   enum machine_mode mode;
2037   rtx addr;
2038
2039   /* If this is not a MEM, no need to do anything.  Similarly if the
2040      address is a constant or a register that is not a virtual register.  */
2041
2042   if (x == 0 || GET_CODE (x) != MEM)
2043     return;
2044
2045   addr = XEXP (x, 0);
2046   if (CONSTANT_P (addr)
2047       || (GET_CODE (addr) == REG
2048           && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
2049               || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
2050     return;
2051
2052   /* If we should only do this if the address is valid, copy the address.
2053      We need to do this so we can undo any changes that might make the
2054      address invalid.  This copy is unfortunate, but probably can't be
2055      avoided.  */
2056
2057   if (valid_only)
2058     addr = copy_rtx (addr);
2059
2060   instantiate_virtual_regs_1 (&addr, NULL_RTX, 0);
2061
2062   if (! valid_only)
2063     return;
2064
2065   /* Now verify that the resulting address is valid for every integer or
2066      floating-point mode up to and including SIZE bytes long.  We do this
2067      since the object might be accessed in any mode and frame addresses
2068      are shared.  */
2069
2070   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2071        mode != VOIDmode && GET_MODE_SIZE (mode) <= size;
2072        mode = GET_MODE_WIDER_MODE (mode))
2073     if (! memory_address_p (mode, addr))
2074       return;
2075
2076   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
2077        mode != VOIDmode && GET_MODE_SIZE (mode) <= size;
2078        mode = GET_MODE_WIDER_MODE (mode))
2079     if (! memory_address_p (mode, addr))
2080       return;
2081
2082   /* Otherwise, put back the address, now that we have updated it and we
2083      know it is valid.  */
2084
2085   XEXP (x, 0) = addr;
2086 }
2087 \f
2088 /* Given a pointer to a piece of rtx and an optional pointer to the
2089    containing object, instantiate any virtual registers present in it.
2090
2091    If EXTRA_INSNS, we always do the replacement and generate
2092    any extra insns before OBJECT.  If it zero, we do nothing if replacement
2093    is not valid.
2094
2095    Return 1 if we either had nothing to do or if we were able to do the
2096    needed replacement.  Return 0 otherwise; we only return zero if 
2097    EXTRA_INSNS is zero.
2098
2099    We first try some simple transformations to avoid the creation of extra
2100    pseudos.  */
2101
2102 static int
2103 instantiate_virtual_regs_1 (loc, object, extra_insns)
2104      rtx *loc;
2105      rtx object;
2106      int extra_insns;
2107 {
2108   rtx x;
2109   RTX_CODE code;
2110   rtx new = 0;
2111   int offset;
2112   rtx temp;
2113   rtx seq;
2114   int i, j;
2115   char *fmt;
2116
2117   /* Re-start here to avoid recursion in common cases.  */
2118  restart:
2119
2120   x = *loc;
2121   if (x == 0)
2122     return 1;
2123
2124   code = GET_CODE (x);
2125
2126   /* Check for some special cases.  */
2127   switch (code)
2128     {
2129     case CONST_INT:
2130     case CONST_DOUBLE:
2131     case CONST:
2132     case SYMBOL_REF:
2133     case CODE_LABEL:
2134     case PC:
2135     case CC0:
2136     case ASM_INPUT:
2137     case ADDR_VEC:
2138     case ADDR_DIFF_VEC:
2139     case RETURN:
2140       return 1;
2141
2142     case SET:
2143       /* We are allowed to set the virtual registers.  This means that
2144          that the actual register should receive the source minus the
2145          appropriate offset.  This is used, for example, in the handling
2146          of non-local gotos.  */
2147       if (SET_DEST (x) == virtual_incoming_args_rtx)
2148         new = arg_pointer_rtx, offset = - in_arg_offset;
2149       else if (SET_DEST (x) == virtual_stack_vars_rtx)
2150         new = frame_pointer_rtx, offset = - var_offset;
2151       else if (SET_DEST (x) == virtual_stack_dynamic_rtx)
2152         new = stack_pointer_rtx, offset = - dynamic_offset;
2153       else if (SET_DEST (x) == virtual_outgoing_args_rtx)
2154         new = stack_pointer_rtx, offset = - out_arg_offset;
2155
2156       if (new)
2157         {
2158           /* The only valid sources here are PLUS or REG.  Just do
2159              the simplest possible thing to handle them.  */
2160           if (GET_CODE (SET_SRC (x)) != REG
2161               && GET_CODE (SET_SRC (x)) != PLUS)
2162             abort ();
2163
2164           start_sequence ();
2165           if (GET_CODE (SET_SRC (x)) != REG)
2166             temp = force_operand (SET_SRC (x), NULL_RTX);
2167           else
2168             temp = SET_SRC (x);
2169           temp = force_operand (plus_constant (temp, offset), NULL_RTX);
2170           seq = get_insns ();
2171           end_sequence ();
2172
2173           emit_insns_before (seq, object);
2174           SET_DEST (x) = new;
2175
2176           if (!validate_change (object, &SET_SRC (x), temp, 0)
2177               || ! extra_insns)
2178             abort ();
2179
2180           return 1;
2181         }
2182
2183       instantiate_virtual_regs_1 (&SET_DEST (x), object, extra_insns);
2184       loc = &SET_SRC (x);
2185       goto restart;
2186
2187     case PLUS:
2188       /* Handle special case of virtual register plus constant.  */
2189       if (CONSTANT_P (XEXP (x, 1)))
2190         {
2191           rtx old;
2192
2193           /* Check for (plus (plus VIRT foo) (const_int)) first.  */
2194           if (GET_CODE (XEXP (x, 0)) == PLUS)
2195             {
2196               rtx inner = XEXP (XEXP (x, 0), 0);
2197
2198               if (inner == virtual_incoming_args_rtx)
2199                 new = arg_pointer_rtx, offset = in_arg_offset;
2200               else if (inner == virtual_stack_vars_rtx)
2201                 new = frame_pointer_rtx, offset = var_offset;
2202               else if (inner == virtual_stack_dynamic_rtx)
2203                 new = stack_pointer_rtx, offset = dynamic_offset;
2204               else if (inner == virtual_outgoing_args_rtx)
2205                 new = stack_pointer_rtx, offset = out_arg_offset;
2206               else
2207                 {
2208                   loc = &XEXP (x, 0);
2209                   goto restart;
2210                 }
2211
2212               instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 1), object,
2213                                           extra_insns);
2214               new = gen_rtx (PLUS, Pmode, new, XEXP (XEXP (x, 0), 1));
2215             }
2216
2217           else if (XEXP (x, 0) == virtual_incoming_args_rtx)
2218             new = arg_pointer_rtx, offset = in_arg_offset;
2219           else if (XEXP (x, 0) == virtual_stack_vars_rtx)
2220             new = frame_pointer_rtx, offset = var_offset;
2221           else if (XEXP (x, 0) == virtual_stack_dynamic_rtx)
2222             new = stack_pointer_rtx, offset = dynamic_offset;
2223           else if (XEXP (x, 0) == virtual_outgoing_args_rtx)
2224             new = stack_pointer_rtx, offset = out_arg_offset;
2225           else
2226             {
2227               /* We know the second operand is a constant.  Unless the
2228                  first operand is a REG (which has been already checked),
2229                  it needs to be checked.  */
2230               if (GET_CODE (XEXP (x, 0)) != REG)
2231                 {
2232                   loc = &XEXP (x, 0);
2233                   goto restart;
2234                 }
2235               return 1;
2236             }
2237
2238           old = XEXP (x, 0);
2239           XEXP (x, 0) = new;
2240           new = plus_constant (XEXP (x, 1), offset);
2241
2242           /* If the new constant is zero, try to replace the sum with its
2243              first operand.  */
2244           if (new == const0_rtx
2245               && validate_change (object, loc, XEXP (x, 0), 0))
2246             return 1;
2247
2248           /* Next try to replace constant with new one.  */
2249           if (!validate_change (object, &XEXP (x, 1), new, 0))
2250             {
2251               if (! extra_insns)
2252                 {
2253                   XEXP (x, 0) = old;
2254                   return 0;
2255                 }
2256
2257               /* Otherwise copy the new constant into a register and replace
2258                  constant with that register.  */
2259               temp = gen_reg_rtx (Pmode);
2260               if (validate_change (object, &XEXP (x, 1), temp, 0))
2261                 emit_insn_before (gen_move_insn (temp, new), object);
2262               else
2263                 {
2264                   /* If that didn't work, replace this expression with a
2265                      register containing the sum.  */
2266
2267                   new = gen_rtx (PLUS, Pmode, XEXP (x, 0), new);
2268                   XEXP (x, 0) = old;
2269
2270                   start_sequence ();
2271                   temp = force_operand (new, NULL_RTX);
2272                   seq = get_insns ();
2273                   end_sequence ();
2274
2275                   emit_insns_before (seq, object);
2276                   if (! validate_change (object, loc, temp, 0)
2277                       && ! validate_replace_rtx (x, temp, object))
2278                     abort ();
2279                 }
2280             }
2281
2282           return 1;
2283         }
2284
2285       /* Fall through to generic two-operand expression case.  */
2286     case EXPR_LIST:
2287     case CALL:
2288     case COMPARE:
2289     case MINUS:
2290     case MULT:
2291     case DIV:      case UDIV:
2292     case MOD:      case UMOD:
2293     case AND:      case IOR:      case XOR:
2294     case LSHIFT:   case ASHIFT:   case ROTATE:
2295     case ASHIFTRT: case LSHIFTRT: case ROTATERT:
2296     case NE:       case EQ:
2297     case GE:       case GT:       case GEU:    case GTU:
2298     case LE:       case LT:       case LEU:    case LTU:
2299       if (XEXP (x, 1) && ! CONSTANT_P (XEXP (x, 1)))
2300         instantiate_virtual_regs_1 (&XEXP (x, 1), object, extra_insns);
2301       loc = &XEXP (x, 0);
2302       goto restart;
2303
2304     case MEM:
2305       /* Most cases of MEM that convert to valid addresses have already been
2306          handled by our scan of regno_reg_rtx.  The only special handling we
2307          need here is to make a copy of the rtx to ensure it isn't being
2308          shared if we have to change it to a pseudo. 
2309
2310          If the rtx is a simple reference to an address via a virtual register,
2311          it can potentially be shared.  In such cases, first try to make it
2312          a valid address, which can also be shared.  Otherwise, copy it and
2313          proceed normally. 
2314
2315          First check for common cases that need no processing.  These are
2316          usually due to instantiation already being done on a previous instance
2317          of a shared rtx.  */
2318
2319       temp = XEXP (x, 0);
2320       if (CONSTANT_ADDRESS_P (temp)
2321 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
2322           || temp == arg_pointer_rtx
2323 #endif
2324           || temp == frame_pointer_rtx)
2325         return 1;
2326
2327       if (GET_CODE (temp) == PLUS
2328           && CONSTANT_ADDRESS_P (XEXP (temp, 1))
2329           && (XEXP (temp, 0) == frame_pointer_rtx
2330 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
2331               || XEXP (temp, 0) == arg_pointer_rtx
2332 #endif
2333               ))
2334         return 1;
2335
2336       if (temp == virtual_stack_vars_rtx
2337           || temp == virtual_incoming_args_rtx
2338           || (GET_CODE (temp) == PLUS
2339               && CONSTANT_ADDRESS_P (XEXP (temp, 1))
2340               && (XEXP (temp, 0) == virtual_stack_vars_rtx
2341                   || XEXP (temp, 0) == virtual_incoming_args_rtx)))
2342         {
2343           /* This MEM may be shared.  If the substitution can be done without
2344              the need to generate new pseudos, we want to do it in place
2345              so all copies of the shared rtx benefit.  The call below will
2346              only make substitutions if the resulting address is still
2347              valid.
2348
2349              Note that we cannot pass X as the object in the recursive call
2350              since the insn being processed may not allow all valid
2351              addresses.  However, if we were not passed on object, we can
2352              only modify X without copying it if X will have a valid
2353              address.
2354
2355              ??? Also note that this can still lose if OBJECT is an insn that
2356              has less restrictions on an address that some other insn.
2357              In that case, we will modify the shared address.  This case
2358              doesn't seem very likely, though.  */
2359
2360           if (instantiate_virtual_regs_1 (&XEXP (x, 0),
2361                                           object ? object : x, 0))
2362             return 1;
2363
2364           /* Otherwise make a copy and process that copy.  We copy the entire
2365              RTL expression since it might be a PLUS which could also be
2366              shared.  */
2367           *loc = x = copy_rtx (x);
2368         }
2369
2370       /* Fall through to generic unary operation case.  */
2371     case USE:
2372     case CLOBBER:
2373     case SUBREG:
2374     case STRICT_LOW_PART:
2375     case NEG:          case NOT:
2376     case PRE_DEC:      case PRE_INC:      case POST_DEC:    case POST_INC:
2377     case SIGN_EXTEND:  case ZERO_EXTEND:
2378     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
2379     case FLOAT:        case FIX:
2380     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
2381     case ABS:
2382     case SQRT:
2383     case FFS:
2384       /* These case either have just one operand or we know that we need not
2385          check the rest of the operands.  */
2386       loc = &XEXP (x, 0);
2387       goto restart;
2388
2389     case REG:
2390       /* Try to replace with a PLUS.  If that doesn't work, compute the sum
2391          in front of this insn and substitute the temporary.  */
2392       if (x == virtual_incoming_args_rtx)
2393         new = arg_pointer_rtx, offset = in_arg_offset;
2394       else if (x == virtual_stack_vars_rtx)
2395         new = frame_pointer_rtx, offset = var_offset;
2396       else if (x == virtual_stack_dynamic_rtx)
2397         new = stack_pointer_rtx, offset = dynamic_offset;
2398       else if (x == virtual_outgoing_args_rtx)
2399         new = stack_pointer_rtx, offset = out_arg_offset;
2400
2401       if (new)
2402         {
2403           temp = plus_constant (new, offset);
2404           if (!validate_change (object, loc, temp, 0))
2405             {
2406               if (! extra_insns)
2407                 return 0;
2408
2409               start_sequence ();
2410               temp = force_operand (temp, NULL_RTX);
2411               seq = get_insns ();
2412               end_sequence ();
2413
2414               emit_insns_before (seq, object);
2415               if (! validate_change (object, loc, temp, 0)
2416                   && ! validate_replace_rtx (x, temp, object))
2417                 abort ();
2418             }
2419         }
2420
2421       return 1;
2422     }
2423
2424   /* Scan all subexpressions.  */
2425   fmt = GET_RTX_FORMAT (code);
2426   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
2427     if (*fmt == 'e')
2428       {
2429         if (!instantiate_virtual_regs_1 (&XEXP (x, i), object, extra_insns))
2430           return 0;
2431       }
2432     else if (*fmt == 'E')
2433       for (j = 0; j < XVECLEN (x, i); j++)
2434         if (! instantiate_virtual_regs_1 (&XVECEXP (x, i, j), object,
2435                                           extra_insns))
2436           return 0;
2437
2438   return 1;
2439 }
2440 \f
2441 /* Optimization: assuming this function does not receive nonlocal gotos,
2442    delete the handlers for such, as well as the insns to establish
2443    and disestablish them.  */
2444
2445 static void
2446 delete_handlers ()
2447 {
2448   rtx insn;
2449   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2450     {
2451       /* Delete the handler by turning off the flag that would
2452          prevent jump_optimize from deleting it.
2453          Also permit deletion of the nonlocal labels themselves
2454          if nothing local refers to them.  */
2455       if (GET_CODE (insn) == CODE_LABEL)
2456         LABEL_PRESERVE_P (insn) = 0;
2457       if (GET_CODE (insn) == INSN
2458           && ((nonlocal_goto_handler_slot != 0
2459                && reg_mentioned_p (nonlocal_goto_handler_slot, PATTERN (insn)))
2460               || (nonlocal_goto_stack_level != 0
2461                   && reg_mentioned_p (nonlocal_goto_stack_level,
2462                                       PATTERN (insn)))))
2463         delete_insn (insn);
2464     }
2465 }
2466
2467 /* Return a list (chain of EXPR_LIST nodes) for the nonlocal labels
2468    of the current function.  */
2469
2470 rtx
2471 nonlocal_label_rtx_list ()
2472 {
2473   tree t;
2474   rtx x = 0;
2475
2476   for (t = nonlocal_labels; t; t = TREE_CHAIN (t))
2477     x = gen_rtx (EXPR_LIST, VOIDmode, label_rtx (TREE_VALUE (t)), x);
2478
2479   return x;
2480 }
2481 \f
2482 /* Output a USE for any register use in RTL.
2483    This is used with -noreg to mark the extent of lifespan
2484    of any registers used in a user-visible variable's DECL_RTL.  */
2485
2486 void
2487 use_variable (rtl)
2488      rtx rtl;
2489 {
2490   if (GET_CODE (rtl) == REG)
2491     /* This is a register variable.  */
2492     emit_insn (gen_rtx (USE, VOIDmode, rtl));
2493   else if (GET_CODE (rtl) == MEM
2494            && GET_CODE (XEXP (rtl, 0)) == REG
2495            && (REGNO (XEXP (rtl, 0)) < FIRST_VIRTUAL_REGISTER
2496                || REGNO (XEXP (rtl, 0)) > LAST_VIRTUAL_REGISTER)
2497            && XEXP (rtl, 0) != current_function_internal_arg_pointer)
2498     /* This is a variable-sized structure.  */
2499     emit_insn (gen_rtx (USE, VOIDmode, XEXP (rtl, 0)));
2500 }
2501
2502 /* Like use_variable except that it outputs the USEs after INSN
2503    instead of at the end of the insn-chain.  */
2504
2505 void
2506 use_variable_after (rtl, insn)
2507      rtx rtl, insn;
2508 {
2509   if (GET_CODE (rtl) == REG)
2510     /* This is a register variable.  */
2511     emit_insn_after (gen_rtx (USE, VOIDmode, rtl), insn);
2512   else if (GET_CODE (rtl) == MEM
2513            && GET_CODE (XEXP (rtl, 0)) == REG
2514            && (REGNO (XEXP (rtl, 0)) < FIRST_VIRTUAL_REGISTER
2515                || REGNO (XEXP (rtl, 0)) > LAST_VIRTUAL_REGISTER)
2516            && XEXP (rtl, 0) != current_function_internal_arg_pointer)
2517     /* This is a variable-sized structure.  */
2518     emit_insn_after (gen_rtx (USE, VOIDmode, XEXP (rtl, 0)), insn);
2519 }
2520 \f
2521 int
2522 max_parm_reg_num ()
2523 {
2524   return max_parm_reg;
2525 }
2526
2527 /* Return the first insn following those generated by `assign_parms'.  */
2528
2529 rtx
2530 get_first_nonparm_insn ()
2531 {
2532   if (last_parm_insn)
2533     return NEXT_INSN (last_parm_insn);
2534   return get_insns ();
2535 }
2536
2537 /* Return the first NOTE_INSN_BLOCK_BEG note in the function.
2538    Crash if there is none.  */
2539
2540 rtx
2541 get_first_block_beg ()
2542 {
2543   register rtx searcher;
2544   register rtx insn = get_first_nonparm_insn ();
2545
2546   for (searcher = insn; searcher; searcher = NEXT_INSN (searcher))
2547     if (GET_CODE (searcher) == NOTE
2548         && NOTE_LINE_NUMBER (searcher) == NOTE_INSN_BLOCK_BEG)
2549       return searcher;
2550
2551   abort ();     /* Invalid call to this function.  (See comments above.)  */
2552   return NULL_RTX;
2553 }
2554
2555 /* Return 1 if EXP returns an aggregate value, for which an address
2556    must be passed to the function or returned by the function.  */
2557
2558 int
2559 aggregate_value_p (exp)
2560      tree exp;
2561 {
2562   int i, regno, nregs;
2563   rtx reg;
2564   if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
2565     return 1;
2566   if (RETURN_IN_MEMORY (TREE_TYPE (exp)))
2567     return 1;
2568   if (flag_pcc_struct_return
2569       && (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
2570           || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE))
2571     return 1;
2572   /* Make sure we have suitable call-clobbered regs to return
2573      the value in; if not, we must return it in memory.  */
2574   reg = hard_function_value (TREE_TYPE (exp), 0);
2575   regno = REGNO (reg);
2576   nregs = HARD_REGNO_NREGS (regno, TYPE_MODE (TREE_TYPE (exp)));
2577   for (i = 0; i < nregs; i++)
2578     if (! call_used_regs[regno + i])
2579       return 1;
2580   return 0;
2581 }
2582 \f
2583 /* Assign RTL expressions to the function's parameters.
2584    This may involve copying them into registers and using
2585    those registers as the RTL for them.
2586
2587    If SECOND_TIME is non-zero it means that this function is being
2588    called a second time.  This is done by integrate.c when a function's
2589    compilation is deferred.  We need to come back here in case the
2590    FUNCTION_ARG macro computes items needed for the rest of the compilation
2591    (such as changing which registers are fixed or caller-saved).  But suppress
2592    writing any insns or setting DECL_RTL of anything in this case.  */
2593
2594 void
2595 assign_parms (fndecl, second_time)
2596      tree fndecl;
2597      int second_time;
2598 {
2599   register tree parm;
2600   register rtx entry_parm = 0;
2601   register rtx stack_parm = 0;
2602   CUMULATIVE_ARGS args_so_far;
2603   enum machine_mode promoted_mode, passed_mode, nominal_mode;
2604   int unsignedp;
2605   /* Total space needed so far for args on the stack,
2606      given as a constant and a tree-expression.  */
2607   struct args_size stack_args_size;
2608   tree fntype = TREE_TYPE (fndecl);
2609   tree fnargs = DECL_ARGUMENTS (fndecl);
2610   /* This is used for the arg pointer when referring to stack args.  */
2611   rtx internal_arg_pointer;
2612   /* This is a dummy PARM_DECL that we used for the function result if 
2613      the function returns a structure.  */
2614   tree function_result_decl = 0;
2615   int nparmregs = list_length (fnargs) + LAST_VIRTUAL_REGISTER + 1;
2616   int varargs_setup = 0;
2617   rtx conversion_insns = 0;
2618
2619   /* Nonzero if the last arg is named `__builtin_va_alist',
2620      which is used on some machines for old-fashioned non-ANSI varargs.h;
2621      this should be stuck onto the stack as if it had arrived there.  */
2622   int vararg
2623     = (fnargs
2624        && (parm = tree_last (fnargs)) != 0
2625        && DECL_NAME (parm)
2626        && (! strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
2627                      "__builtin_va_alist")));
2628
2629   /* Nonzero if function takes extra anonymous args.
2630      This means the last named arg must be on the stack
2631      right before the anonymous ones. */
2632   int stdarg
2633     = (TYPE_ARG_TYPES (fntype) != 0
2634        && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
2635            != void_type_node));
2636
2637   /* If the reg that the virtual arg pointer will be translated into is
2638      not a fixed reg or is the stack pointer, make a copy of the virtual
2639      arg pointer, and address parms via the copy.  The frame pointer is
2640      considered fixed even though it is not marked as such.
2641
2642      The second time through, simply use ap to avoid generating rtx.  */
2643
2644   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
2645        || ! (fixed_regs[ARG_POINTER_REGNUM]
2646              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM))
2647       && ! second_time)
2648     internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
2649   else
2650     internal_arg_pointer = virtual_incoming_args_rtx;
2651   current_function_internal_arg_pointer = internal_arg_pointer;
2652
2653   stack_args_size.constant = 0;
2654   stack_args_size.var = 0;
2655
2656   /* If struct value address is treated as the first argument, make it so.  */
2657   if (aggregate_value_p (DECL_RESULT (fndecl))
2658       && ! current_function_returns_pcc_struct
2659       && struct_value_incoming_rtx == 0)
2660     {
2661       tree type = build_pointer_type (fntype);
2662
2663       function_result_decl = build_decl (PARM_DECL, NULL_TREE, type);
2664
2665       DECL_ARG_TYPE (function_result_decl) = type;
2666       TREE_CHAIN (function_result_decl) = fnargs;
2667       fnargs = function_result_decl;
2668     }
2669                                
2670   parm_reg_stack_loc = (rtx *) oballoc (nparmregs * sizeof (rtx));
2671   bzero (parm_reg_stack_loc, nparmregs * sizeof (rtx));
2672
2673 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
2674   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far, fntype, NULL_RTX);
2675 #else
2676   INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX);
2677 #endif
2678
2679   /* We haven't yet found an argument that we must push and pretend the
2680      caller did.  */
2681   current_function_pretend_args_size = 0;
2682
2683   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
2684     {
2685       int aggregate
2686         = (TREE_CODE (TREE_TYPE (parm)) == ARRAY_TYPE
2687            || TREE_CODE (TREE_TYPE (parm)) == RECORD_TYPE
2688            || TREE_CODE (TREE_TYPE (parm)) == UNION_TYPE);
2689       struct args_size stack_offset;
2690       struct args_size arg_size;
2691       int passed_pointer = 0;
2692       tree passed_type = DECL_ARG_TYPE (parm);
2693
2694       /* Set LAST_NAMED if this is last named arg before some
2695          anonymous args.  We treat it as if it were anonymous too.  */
2696       int last_named = ((TREE_CHAIN (parm) == 0
2697                          || DECL_NAME (TREE_CHAIN (parm)) == 0)
2698                         && (vararg || stdarg));
2699
2700       if (TREE_TYPE (parm) == error_mark_node
2701           /* This can happen after weird syntax errors
2702              or if an enum type is defined among the parms.  */
2703           || TREE_CODE (parm) != PARM_DECL
2704           || passed_type == NULL)
2705         {
2706           DECL_INCOMING_RTL (parm) = DECL_RTL (parm) = gen_rtx (MEM, BLKmode,
2707                                                                 const0_rtx);
2708           TREE_USED (parm) = 1;
2709           continue;
2710         }
2711
2712       /* For varargs.h function, save info about regs and stack space
2713          used by the individual args, not including the va_alist arg.  */
2714       if (vararg && last_named)
2715         current_function_args_info = args_so_far;
2716
2717       /* Find mode of arg as it is passed, and mode of arg
2718          as it should be during execution of this function.  */
2719       passed_mode = TYPE_MODE (passed_type);
2720       nominal_mode = TYPE_MODE (TREE_TYPE (parm));
2721
2722       /* If the parm's mode is VOID, its value doesn't matter,
2723          and avoid the usual things like emit_move_insn that could crash.  */
2724       if (nominal_mode == VOIDmode)
2725         {
2726           DECL_INCOMING_RTL (parm) = DECL_RTL (parm) = const0_rtx;
2727           continue;
2728         }
2729
2730 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
2731       /* See if this arg was passed by invisible reference.  */
2732       if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, passed_mode,
2733                                           passed_type, ! last_named))
2734         {
2735           passed_type = build_pointer_type (passed_type);
2736           passed_pointer = 1;
2737           passed_mode = nominal_mode = Pmode;
2738         }
2739 #endif
2740
2741       promoted_mode = passed_mode;
2742
2743 #ifdef PROMOTE_FUNCTION_ARGS
2744       /* Compute the mode in which the arg is actually extended to.  */
2745       if (TREE_CODE (passed_type) == INTEGER_TYPE
2746           || TREE_CODE (passed_type) == ENUMERAL_TYPE
2747           || TREE_CODE (passed_type) == BOOLEAN_TYPE
2748           || TREE_CODE (passed_type) == CHAR_TYPE
2749           || TREE_CODE (passed_type) == REAL_TYPE
2750           || TREE_CODE (passed_type) == POINTER_TYPE
2751           || TREE_CODE (passed_type) == OFFSET_TYPE)
2752         {
2753           unsignedp = TREE_UNSIGNED (passed_type);
2754           PROMOTE_MODE (promoted_mode, unsignedp, passed_type);
2755         }
2756 #endif
2757
2758       /* Let machine desc say which reg (if any) the parm arrives in.
2759          0 means it arrives on the stack.  */
2760 #ifdef FUNCTION_INCOMING_ARG
2761       entry_parm = FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
2762                                           passed_type, ! last_named);
2763 #else
2764       entry_parm = FUNCTION_ARG (args_so_far, promoted_mode,
2765                                  passed_type, ! last_named);
2766 #endif
2767
2768       if (entry_parm)
2769         passed_mode = promoted_mode;
2770
2771 #ifdef SETUP_INCOMING_VARARGS
2772       /* If this is the last named parameter, do any required setup for
2773          varargs or stdargs.  We need to know about the case of this being an
2774          addressable type, in which case we skip the registers it
2775          would have arrived in.
2776
2777          For stdargs, LAST_NAMED will be set for two parameters, the one that
2778          is actually the last named, and the dummy parameter.  We only
2779          want to do this action once.
2780
2781          Also, indicate when RTL generation is to be suppressed.  */
2782       if (last_named && !varargs_setup)
2783         {
2784           SETUP_INCOMING_VARARGS (args_so_far, passed_mode, passed_type,
2785                                   current_function_pretend_args_size,
2786                                   second_time);
2787           varargs_setup = 1;
2788         }
2789 #endif
2790
2791       /* Determine parm's home in the stack,
2792          in case it arrives in the stack or we should pretend it did.
2793
2794          Compute the stack position and rtx where the argument arrives
2795          and its size.
2796
2797          There is one complexity here:  If this was a parameter that would
2798          have been passed in registers, but wasn't only because it is
2799          __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2800          it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2801          In this case, we call FUNCTION_ARG with NAMED set to 1 instead of
2802          0 as it was the previous time.  */
2803
2804       locate_and_pad_parm (passed_mode, passed_type,
2805 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2806                            1,
2807 #else
2808 #ifdef FUNCTION_INCOMING_ARG
2809                            FUNCTION_INCOMING_ARG (args_so_far, passed_mode,
2810                                                   passed_type,
2811                                                   (! last_named
2812                                                    || varargs_setup)) != 0,
2813 #else
2814                            FUNCTION_ARG (args_so_far, passed_mode,
2815                                          passed_type,
2816                                          ! last_named || varargs_setup) != 0,
2817 #endif
2818 #endif
2819                            fndecl, &stack_args_size, &stack_offset, &arg_size);
2820
2821       if (! second_time)
2822         {
2823           rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
2824
2825           if (offset_rtx == const0_rtx)
2826             stack_parm = gen_rtx (MEM, passed_mode, internal_arg_pointer);
2827           else
2828             stack_parm = gen_rtx (MEM, passed_mode,
2829                                   gen_rtx (PLUS, Pmode,
2830                                            internal_arg_pointer, offset_rtx));
2831
2832           /* If this is a memory ref that contains aggregate components,
2833              mark it as such for cse and loop optimize.  */
2834           MEM_IN_STRUCT_P (stack_parm) = aggregate;
2835         }
2836
2837       /* If this parameter was passed both in registers and in the stack,
2838          use the copy on the stack.  */
2839       if (MUST_PASS_IN_STACK (passed_mode, passed_type))
2840         entry_parm = 0;
2841
2842       /* If this parm was passed part in regs and part in memory,
2843          pretend it arrived entirely in memory
2844          by pushing the register-part onto the stack.
2845
2846          In the special case of a DImode or DFmode that is split,
2847          we could put it together in a pseudoreg directly,
2848          but for now that's not worth bothering with.  */
2849
2850       if (entry_parm)
2851         {
2852           int nregs = 0;
2853 #ifdef FUNCTION_ARG_PARTIAL_NREGS
2854           nregs = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, passed_mode,
2855                                               passed_type, ! last_named);
2856 #endif
2857
2858           if (nregs > 0)
2859             {
2860               current_function_pretend_args_size
2861                 = (((nregs * UNITS_PER_WORD) + (PARM_BOUNDARY / BITS_PER_UNIT) - 1)
2862                    / (PARM_BOUNDARY / BITS_PER_UNIT)
2863                    * (PARM_BOUNDARY / BITS_PER_UNIT));
2864
2865               if (! second_time)
2866                 move_block_from_reg (REGNO (entry_parm),
2867                                      validize_mem (stack_parm), nregs);
2868               entry_parm = stack_parm;
2869             }
2870         }
2871
2872       /* If we didn't decide this parm came in a register,
2873          by default it came on the stack.  */
2874       if (entry_parm == 0)
2875         entry_parm = stack_parm;
2876
2877       /* Record permanently how this parm was passed.  */
2878       if (! second_time)
2879         DECL_INCOMING_RTL (parm) = entry_parm;
2880
2881       /* If there is actually space on the stack for this parm,
2882          count it in stack_args_size; otherwise set stack_parm to 0
2883          to indicate there is no preallocated stack slot for the parm.  */
2884
2885       if (entry_parm == stack_parm
2886 #if defined (REG_PARM_STACK_SPACE) && ! defined (MAYBE_REG_PARM_STACK_SPACE)
2887           /* On some machines, even if a parm value arrives in a register
2888              there is still an (uninitialized) stack slot allocated for it.
2889
2890              ??? When MAYBE_REG_PARM_STACK_SPACE is defined, we can't tell
2891              whether this parameter already has a stack slot allocated,
2892              because an arg block exists only if current_function_args_size
2893              is larger than some threshhold, and we haven't calculated that
2894              yet.  So, for now, we just assume that stack slots never exist
2895              in this case.  */
2896           || REG_PARM_STACK_SPACE (fndecl) > 0
2897 #endif
2898           )
2899         {
2900           stack_args_size.constant += arg_size.constant;
2901           if (arg_size.var)
2902             ADD_PARM_SIZE (stack_args_size, arg_size.var);
2903         }
2904       else
2905         /* No stack slot was pushed for this parm.  */
2906         stack_parm = 0;
2907
2908       /* Update info on where next arg arrives in registers.  */
2909
2910       FUNCTION_ARG_ADVANCE (args_so_far, passed_mode,
2911                             passed_type, ! last_named);
2912
2913       /* If this is our second time through, we are done with this parm. */
2914       if (second_time)
2915         continue;
2916
2917       /* If we can't trust the parm stack slot to be aligned enough
2918          for its ultimate type, don't use that slot after entry.
2919          We'll make another stack slot, if we need one.  */
2920       {
2921 #ifdef FUNCTION_ARG_BOUNDARY
2922         int thisparm_boundary
2923           = FUNCTION_ARG_BOUNDARY (passed_mode, passed_type);
2924 #else
2925         int thisparm_boundary = PARM_BOUNDARY;
2926 #endif
2927
2928         if (GET_MODE_ALIGNMENT (nominal_mode) > thisparm_boundary)
2929           stack_parm = 0;
2930       }
2931
2932       /* Now adjust STACK_PARM to the mode and precise location
2933          where this parameter should live during execution,
2934          if we discover that it must live in the stack during execution.
2935          To make debuggers happier on big-endian machines, we store
2936          the value in the last bytes of the space available.  */
2937
2938       if (nominal_mode != BLKmode && nominal_mode != passed_mode
2939           && stack_parm != 0)
2940         {
2941           rtx offset_rtx;
2942
2943 #if BYTES_BIG_ENDIAN
2944           if (GET_MODE_SIZE (nominal_mode) < UNITS_PER_WORD)
2945             stack_offset.constant += (GET_MODE_SIZE (passed_mode)
2946                                       - GET_MODE_SIZE (nominal_mode));
2947 #endif
2948
2949           offset_rtx = ARGS_SIZE_RTX (stack_offset);
2950           if (offset_rtx == const0_rtx)
2951             stack_parm = gen_rtx (MEM, nominal_mode, internal_arg_pointer);
2952           else
2953             stack_parm = gen_rtx (MEM, nominal_mode,
2954                                   gen_rtx (PLUS, Pmode,
2955                                            internal_arg_pointer, offset_rtx));
2956
2957           /* If this is a memory ref that contains aggregate components,
2958              mark it as such for cse and loop optimize.  */
2959           MEM_IN_STRUCT_P (stack_parm) = aggregate;
2960         }
2961
2962       /* ENTRY_PARM is an RTX for the parameter as it arrives,
2963          in the mode in which it arrives.
2964          STACK_PARM is an RTX for a stack slot where the parameter can live
2965          during the function (in case we want to put it there).
2966          STACK_PARM is 0 if no stack slot was pushed for it.
2967
2968          Now output code if necessary to convert ENTRY_PARM to
2969          the type in which this function declares it,
2970          and store that result in an appropriate place,
2971          which may be a pseudo reg, may be STACK_PARM,
2972          or may be a local stack slot if STACK_PARM is 0.
2973
2974          Set DECL_RTL to that place.  */
2975
2976       if (nominal_mode == BLKmode)
2977         {
2978           /* If a BLKmode arrives in registers, copy it to a stack slot.  */
2979           if (GET_CODE (entry_parm) == REG)
2980             {
2981               int size_stored = CEIL_ROUND (int_size_in_bytes (TREE_TYPE (parm)),
2982                                             UNITS_PER_WORD);
2983
2984               /* Note that we will be storing an integral number of words.
2985                  So we have to be careful to ensure that we allocate an
2986                  integral number of words.  We do this below in the
2987                  assign_stack_local if space was not allocated in the argument
2988                  list.  If it was, this will not work if PARM_BOUNDARY is not
2989                  a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2990                  if it becomes a problem.  */
2991
2992               if (stack_parm == 0)
2993                 {
2994                   stack_parm
2995                     = assign_stack_local (GET_MODE (entry_parm), size_stored, 0);
2996                   /* If this is a memory ref that contains aggregate components,
2997                      mark it as such for cse and loop optimize.  */
2998                   MEM_IN_STRUCT_P (stack_parm) = aggregate;
2999                 }
3000
3001               else if (PARM_BOUNDARY % BITS_PER_WORD != 0)
3002                 abort ();
3003
3004               move_block_from_reg (REGNO (entry_parm),
3005                                    validize_mem (stack_parm),
3006                                    size_stored / UNITS_PER_WORD);
3007             }
3008           DECL_RTL (parm) = stack_parm;
3009         }
3010       else if (! ((obey_regdecls && ! DECL_REGISTER (parm)
3011                    && ! DECL_INLINE (fndecl))
3012                   /* layout_decl may set this.  */
3013                   || TREE_ADDRESSABLE (parm)
3014                   || TREE_SIDE_EFFECTS (parm)
3015                   /* If -ffloat-store specified, don't put explicit
3016                      float variables into registers.  */
3017                   || (flag_float_store
3018                       && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE))
3019                /* Always assign pseudo to structure return or item passed
3020                   by invisible reference.  */
3021                || passed_pointer || parm == function_result_decl)
3022         {
3023           /* Store the parm in a pseudoregister during the function, but we
3024              may need to do it in a wider mode.  */
3025
3026           register rtx parmreg;
3027
3028           unsignedp = TREE_UNSIGNED (TREE_TYPE (parm));
3029           if (TREE_CODE (TREE_TYPE (parm)) == INTEGER_TYPE
3030               || TREE_CODE (TREE_TYPE (parm)) == ENUMERAL_TYPE
3031               || TREE_CODE (TREE_TYPE (parm)) == BOOLEAN_TYPE
3032               || TREE_CODE (TREE_TYPE (parm)) == CHAR_TYPE
3033               || TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE
3034               || TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE
3035               || TREE_CODE (TREE_TYPE (parm)) == OFFSET_TYPE)
3036             {
3037               PROMOTE_MODE (nominal_mode, unsignedp, TREE_TYPE (parm));
3038             }
3039
3040           parmreg = gen_reg_rtx (nominal_mode);
3041           REG_USERVAR_P (parmreg) = 1;
3042
3043           /* If this was an item that we received a pointer to, set DECL_RTL
3044              appropriately.  */
3045           if (passed_pointer)
3046             {
3047               DECL_RTL (parm) = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (passed_type)), parmreg);
3048               MEM_IN_STRUCT_P (DECL_RTL (parm)) = aggregate;
3049             }
3050           else
3051             DECL_RTL (parm) = parmreg;
3052
3053           /* Copy the value into the register.  */
3054           if (GET_MODE (parmreg) != GET_MODE (entry_parm))
3055             {
3056               /* If ENTRY_PARM is a hard register, it might be in a register
3057                  not valid for operating in its mode (e.g., an odd-numbered
3058                  register for a DFmode).  In that case, moves are the only
3059                  thing valid, so we can't do a convert from there.  This
3060                  occurs when the calling sequence allow such misaligned
3061                  usages.
3062
3063                  In addition, the conversion may involve a call, which could
3064                  clobber parameters which haven't been copied to pseudo
3065                  registers yet.  Therefore, we must first copy the parm to
3066                  a pseudo reg here, and save the conversion until after all
3067                  parameters have been moved.  */
3068
3069               rtx tempreg = gen_reg_rtx (GET_MODE (entry_parm));
3070
3071               emit_move_insn (tempreg, validize_mem (entry_parm));
3072
3073               push_to_sequence (conversion_insns);
3074               convert_move (parmreg, tempreg);
3075               conversion_insns = get_insns ();
3076               end_sequence ();
3077             }
3078           else
3079             emit_move_insn (parmreg, validize_mem (entry_parm));
3080
3081           /* If we were passed a pointer but the actual value
3082              can safely live in a register, put it in one.  */
3083           if (passed_pointer && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
3084               && ! ((obey_regdecls && ! DECL_REGISTER (parm)
3085                      && ! DECL_INLINE (fndecl))
3086                     /* layout_decl may set this.  */
3087                     || TREE_ADDRESSABLE (parm)
3088                     || TREE_SIDE_EFFECTS (parm)
3089                     /* If -ffloat-store specified, don't put explicit
3090                        float variables into registers.  */
3091                     || (flag_float_store
3092                         && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE)))
3093             {
3094               /* We can't use nominal_mode, because it will have been set to
3095                  Pmode above.  We must use the actual mode of the parm.  */
3096               parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
3097               emit_move_insn (parmreg, DECL_RTL (parm));
3098               DECL_RTL (parm) = parmreg;
3099             }
3100
3101           /* In any case, record the parm's desired stack location
3102              in case we later discover it must live in the stack.  */
3103           if (REGNO (parmreg) >= nparmregs)
3104             {
3105               rtx *new;
3106               nparmregs = REGNO (parmreg) + 5;
3107               new = (rtx *) oballoc (nparmregs * sizeof (rtx));
3108               bcopy (parm_reg_stack_loc, new, nparmregs * sizeof (rtx));
3109               parm_reg_stack_loc = new;
3110             }
3111           parm_reg_stack_loc[REGNO (parmreg)] = stack_parm;
3112
3113           /* Mark the register as eliminable if we did no conversion
3114              and it was copied from memory at a fixed offset,
3115              and the arg pointer was not copied to a pseudo-reg.
3116              If the arg pointer is a pseudo reg or the offset formed
3117              an invalid address, such memory-equivalences
3118              as we make here would screw up life analysis for it.  */
3119           if (nominal_mode == passed_mode
3120               && GET_CODE (entry_parm) == MEM
3121               && entry_parm == stack_parm
3122               && stack_offset.var == 0
3123               && reg_mentioned_p (virtual_incoming_args_rtx,
3124                                   XEXP (entry_parm, 0)))
3125             REG_NOTES (get_last_insn ())
3126               = gen_rtx (EXPR_LIST, REG_EQUIV,
3127                          entry_parm, REG_NOTES (get_last_insn ()));
3128
3129           /* For pointer data type, suggest pointer register.  */
3130           if (TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE)
3131             mark_reg_pointer (parmreg);
3132         }
3133       else
3134         {
3135           /* Value must be stored in the stack slot STACK_PARM
3136              during function execution.  */
3137
3138           if (passed_mode != nominal_mode)
3139             {
3140               /* Conversion is required.   */
3141               rtx tempreg = gen_reg_rtx (GET_MODE (entry_parm));
3142
3143               emit_move_insn (tempreg, validize_mem (entry_parm));
3144
3145               push_to_sequence (conversion_insns);
3146               entry_parm = convert_to_mode (nominal_mode, tempreg,
3147                                             TREE_UNSIGNED (TREE_TYPE (parm)));
3148               conversion_insns = get_insns ();
3149               end_sequence ();
3150             }
3151
3152           if (entry_parm != stack_parm)
3153             {
3154               if (stack_parm == 0)
3155                 {
3156                   stack_parm
3157                     = assign_stack_local (GET_MODE (entry_parm),
3158                                           GET_MODE_SIZE (GET_MODE (entry_parm)), 0);
3159                   /* If this is a memory ref that contains aggregate components,
3160                      mark it as such for cse and loop optimize.  */
3161                   MEM_IN_STRUCT_P (stack_parm) = aggregate;
3162                 }
3163
3164               if (passed_mode != nominal_mode)
3165                 {
3166                   push_to_sequence (conversion_insns);
3167                   emit_move_insn (validize_mem (stack_parm),
3168                                   validize_mem (entry_parm));
3169                   conversion_insns = get_insns ();
3170                   end_sequence ();
3171                 }
3172               else
3173                 emit_move_insn (validize_mem (stack_parm),
3174                                 validize_mem (entry_parm));
3175             }
3176
3177           DECL_RTL (parm) = stack_parm;
3178         }
3179       
3180       /* If this "parameter" was the place where we are receiving the
3181          function's incoming structure pointer, set up the result.  */
3182       if (parm == function_result_decl)
3183         DECL_RTL (DECL_RESULT (fndecl))
3184           = gen_rtx (MEM, DECL_MODE (DECL_RESULT (fndecl)), DECL_RTL (parm));
3185
3186       if (TREE_THIS_VOLATILE (parm))
3187         MEM_VOLATILE_P (DECL_RTL (parm)) = 1;
3188       if (TREE_READONLY (parm))
3189         RTX_UNCHANGING_P (DECL_RTL (parm)) = 1;
3190     }
3191
3192   /* Output all parameter conversion instructions (possibly including calls)
3193      now that all parameters have been copied out of hard registers.  */
3194   emit_insns (conversion_insns);
3195
3196   max_parm_reg = max_reg_num ();
3197   last_parm_insn = get_last_insn ();
3198
3199   current_function_args_size = stack_args_size.constant;
3200
3201   /* Adjust function incoming argument size for alignment and
3202      minimum length.  */
3203
3204 #ifdef REG_PARM_STACK_SPACE
3205 #ifndef MAYBE_REG_PARM_STACK_SPACE
3206   current_function_args_size = MAX (current_function_args_size,
3207                                     REG_PARM_STACK_SPACE (fndecl));
3208 #endif
3209 #endif
3210
3211 #ifdef STACK_BOUNDARY
3212 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
3213
3214   current_function_args_size
3215     = ((current_function_args_size + STACK_BYTES - 1)
3216        / STACK_BYTES) * STACK_BYTES;
3217 #endif  
3218
3219 #ifdef ARGS_GROW_DOWNWARD
3220   current_function_arg_offset_rtx
3221     = (stack_args_size.var == 0 ? GEN_INT (-stack_args_size.constant)
3222        : expand_expr (size_binop (MINUS_EXPR, stack_args_size.var,      
3223                                   size_int (-stack_args_size.constant)),   
3224                       NULL_RTX, VOIDmode, 0));
3225 #else
3226   current_function_arg_offset_rtx = ARGS_SIZE_RTX (stack_args_size);
3227 #endif
3228
3229   /* See how many bytes, if any, of its args a function should try to pop
3230      on return.  */
3231
3232   current_function_pops_args = RETURN_POPS_ARGS (TREE_TYPE (fndecl),
3233                                                  current_function_args_size);
3234
3235   /* For stdarg.h function, save info about regs and stack space
3236      used by the named args.  */
3237
3238   if (stdarg)
3239     current_function_args_info = args_so_far;
3240
3241   /* Set the rtx used for the function return value.  Put this in its
3242      own variable so any optimizers that need this information don't have
3243      to include tree.h.  Do this here so it gets done when an inlined
3244      function gets output.  */
3245
3246   current_function_return_rtx = DECL_RTL (DECL_RESULT (fndecl));
3247 }
3248 \f
3249 /* Compute the size and offset from the start of the stacked arguments for a
3250    parm passed in mode PASSED_MODE and with type TYPE.
3251
3252    INITIAL_OFFSET_PTR points to the current offset into the stacked
3253    arguments.
3254
3255    The starting offset and size for this parm are returned in *OFFSET_PTR
3256    and *ARG_SIZE_PTR, respectively.
3257
3258    IN_REGS is non-zero if the argument will be passed in registers.  It will
3259    never be set if REG_PARM_STACK_SPACE is not defined.
3260
3261    FNDECL is the function in which the argument was defined.
3262
3263    There are two types of rounding that are done.  The first, controlled by
3264    FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
3265    list to be aligned to the specific boundary (in bits).  This rounding
3266    affects the initial and starting offsets, but not the argument size.
3267
3268    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3269    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3270    initial offset is not affected by this rounding, while the size always
3271    is and the starting offset may be.  */
3272
3273 /*  offset_ptr will be negative for ARGS_GROW_DOWNWARD case; 
3274     initial_offset_ptr is positive because locate_and_pad_parm's
3275     callers pass in the total size of args so far as
3276     initial_offset_ptr. arg_size_ptr is always positive.*/
3277
3278 static void pad_to_arg_alignment (), pad_below ();
3279
3280 void
3281 locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
3282                      initial_offset_ptr, offset_ptr, arg_size_ptr)
3283      enum machine_mode passed_mode;
3284      tree type;
3285      int in_regs;
3286      tree fndecl;
3287      struct args_size *initial_offset_ptr;
3288      struct args_size *offset_ptr;
3289      struct args_size *arg_size_ptr;
3290 {
3291   tree sizetree
3292     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3293   enum direction where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3294   int boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
3295   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3296   int reg_parm_stack_space = 0;
3297
3298 #ifdef REG_PARM_STACK_SPACE
3299   /* If we have found a stack parm before we reach the end of the
3300      area reserved for registers, skip that area.  */
3301   if (! in_regs)
3302     {
3303 #ifdef MAYBE_REG_PARM_STACK_SPACE
3304       reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
3305 #else
3306       reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3307 #endif
3308       if (reg_parm_stack_space > 0)
3309         {
3310           if (initial_offset_ptr->var)
3311             {
3312               initial_offset_ptr->var
3313                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3314                               size_int (reg_parm_stack_space));
3315               initial_offset_ptr->constant = 0;
3316             }
3317           else if (initial_offset_ptr->constant < reg_parm_stack_space)
3318             initial_offset_ptr->constant = reg_parm_stack_space;
3319         }
3320     }
3321 #endif /* REG_PARM_STACK_SPACE */
3322
3323   arg_size_ptr->var = 0;
3324   arg_size_ptr->constant = 0;
3325
3326 #ifdef ARGS_GROW_DOWNWARD
3327   if (initial_offset_ptr->var)
3328     {
3329       offset_ptr->constant = 0;
3330       offset_ptr->var = size_binop (MINUS_EXPR, integer_zero_node,
3331                                     initial_offset_ptr->var);
3332     }
3333   else
3334     {
3335       offset_ptr->constant = - initial_offset_ptr->constant;
3336       offset_ptr->var = 0;
3337     }
3338   if (where_pad == upward
3339       && (TREE_CODE (sizetree) != INTEGER_CST
3340           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
3341     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3342   SUB_PARM_SIZE (*offset_ptr, sizetree);
3343   if (where_pad != downward)
3344     pad_to_arg_alignment (offset_ptr, boundary);
3345   if (initial_offset_ptr->var)
3346     {
3347       arg_size_ptr->var = size_binop (MINUS_EXPR,
3348                                       size_binop (MINUS_EXPR,
3349                                                   integer_zero_node,
3350                                                   initial_offset_ptr->var),
3351                                       offset_ptr->var);
3352     }
3353   else
3354     {
3355       arg_size_ptr->constant = (- initial_offset_ptr->constant -
3356                                 offset_ptr->constant); 
3357     }
3358 /*  ADD_PARM_SIZE (*arg_size_ptr, sizetree); */
3359   if (where_pad == downward)
3360     pad_below (arg_size_ptr, passed_mode, sizetree);
3361 #else /* !ARGS_GROW_DOWNWARD */
3362   pad_to_arg_alignment (initial_offset_ptr, boundary);
3363   *offset_ptr = *initial_offset_ptr;
3364   if (where_pad == downward)
3365     pad_below (offset_ptr, passed_mode, sizetree);
3366
3367 #ifdef PUSH_ROUNDING
3368   if (passed_mode != BLKmode)
3369     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3370 #endif
3371
3372   if (where_pad != none
3373       && (TREE_CODE (sizetree) != INTEGER_CST
3374           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
3375     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3376
3377   ADD_PARM_SIZE (*arg_size_ptr, sizetree);
3378 #endif /* ARGS_GROW_DOWNWARD */
3379 }
3380
3381 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3382    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
3383
3384 static void
3385 pad_to_arg_alignment (offset_ptr, boundary)
3386      struct args_size *offset_ptr;
3387      int boundary;
3388 {
3389   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3390   
3391   if (boundary > BITS_PER_UNIT)
3392     {
3393       if (offset_ptr->var)
3394         {
3395           offset_ptr->var  =
3396 #ifdef ARGS_GROW_DOWNWARD
3397             round_down 
3398 #else
3399             round_up
3400 #endif
3401               (ARGS_SIZE_TREE (*offset_ptr),
3402                boundary / BITS_PER_UNIT);
3403           offset_ptr->constant = 0; /*?*/
3404         }
3405       else
3406         offset_ptr->constant =
3407 #ifdef ARGS_GROW_DOWNWARD
3408           FLOOR_ROUND (offset_ptr->constant, boundary_in_bytes);
3409 #else
3410           CEIL_ROUND (offset_ptr->constant, boundary_in_bytes);
3411 #endif
3412     }
3413 }
3414
3415 static void
3416 pad_below (offset_ptr, passed_mode, sizetree)
3417      struct args_size *offset_ptr;
3418      enum machine_mode passed_mode;
3419      tree sizetree;
3420 {
3421   if (passed_mode != BLKmode)
3422     {
3423       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3424         offset_ptr->constant
3425           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3426                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3427               - GET_MODE_SIZE (passed_mode));
3428     }
3429   else
3430     {
3431       if (TREE_CODE (sizetree) != INTEGER_CST
3432           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3433         {
3434           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
3435           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3436           /* Add it in.  */
3437           ADD_PARM_SIZE (*offset_ptr, s2);
3438           SUB_PARM_SIZE (*offset_ptr, sizetree);
3439         }
3440     }
3441 }
3442
3443 static tree
3444 round_down (value, divisor)
3445      tree value;
3446      int divisor;
3447 {
3448   return size_binop (MULT_EXPR,
3449                      size_binop (FLOOR_DIV_EXPR, value, size_int (divisor)),
3450                      size_int (divisor));
3451 }
3452 \f
3453 /* Walk the tree of blocks describing the binding levels within a function
3454    and warn about uninitialized variables.
3455    This is done after calling flow_analysis and before global_alloc
3456    clobbers the pseudo-regs to hard regs.  */
3457
3458 void
3459 uninitialized_vars_warning (block)
3460      tree block;
3461 {
3462   register tree decl, sub;
3463   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3464     {
3465       if (TREE_CODE (decl) == VAR_DECL
3466           /* These warnings are unreliable for and aggregates
3467              because assigning the fields one by one can fail to convince
3468              flow.c that the entire aggregate was initialized.
3469              Unions are troublesome because members may be shorter.  */
3470           && TREE_CODE (TREE_TYPE (decl)) != RECORD_TYPE
3471           && TREE_CODE (TREE_TYPE (decl)) != UNION_TYPE
3472           && TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE
3473           && DECL_RTL (decl) != 0
3474           && GET_CODE (DECL_RTL (decl)) == REG
3475           && regno_uninitialized (REGNO (DECL_RTL (decl))))
3476         warning_with_decl (decl,
3477                            "`%s' may be used uninitialized in this function");
3478       if (TREE_CODE (decl) == VAR_DECL
3479           && DECL_RTL (decl) != 0
3480           && GET_CODE (DECL_RTL (decl)) == REG
3481           && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3482         warning_with_decl (decl,
3483                            "variable `%s' may be clobbered by `longjmp'");
3484     }
3485   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
3486     uninitialized_vars_warning (sub);
3487 }
3488
3489 /* Do the appropriate part of uninitialized_vars_warning
3490    but for arguments instead of local variables.  */
3491
3492 void
3493 setjmp_args_warning (block)
3494      tree block;
3495 {
3496   register tree decl;
3497   for (decl = DECL_ARGUMENTS (current_function_decl);
3498        decl; decl = TREE_CHAIN (decl))
3499     if (DECL_RTL (decl) != 0
3500         && GET_CODE (DECL_RTL (decl)) == REG
3501         && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3502       warning_with_decl (decl, "argument `%s' may be clobbered by `longjmp'");
3503 }
3504
3505 /* If this function call setjmp, put all vars into the stack
3506    unless they were declared `register'.  */
3507
3508 void
3509 setjmp_protect (block)
3510      tree block;
3511 {
3512   register tree decl, sub;
3513   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3514     if ((TREE_CODE (decl) == VAR_DECL
3515          || TREE_CODE (decl) == PARM_DECL)
3516         && DECL_RTL (decl) != 0
3517         && GET_CODE (DECL_RTL (decl)) == REG
3518         /* If this variable came from an inline function, it must be
3519            that it's life doesn't overlap the setjmp.  If there was a
3520            setjmp in the function, it would already be in memory.  We
3521            must exclude such variable because their DECL_RTL might be
3522            set to strange things such as virtual_stack_vars_rtx.  */
3523         && ! DECL_FROM_INLINE (decl)
3524         && (
3525 #ifdef NON_SAVING_SETJMP
3526             /* If longjmp doesn't restore the registers,
3527                don't put anything in them.  */
3528             NON_SAVING_SETJMP
3529             ||
3530 #endif
3531             ! DECL_REGISTER (decl)))
3532       put_var_into_stack (decl);
3533   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
3534     setjmp_protect (sub);
3535 }
3536 \f
3537 /* Like the previous function, but for args instead of local variables.  */
3538
3539 void
3540 setjmp_protect_args ()
3541 {
3542   register tree decl, sub;
3543   for (decl = DECL_ARGUMENTS (current_function_decl);
3544        decl; decl = TREE_CHAIN (decl))
3545     if ((TREE_CODE (decl) == VAR_DECL
3546          || TREE_CODE (decl) == PARM_DECL)
3547         && DECL_RTL (decl) != 0
3548         && GET_CODE (DECL_RTL (decl)) == REG
3549         && (
3550             /* If longjmp doesn't restore the registers,
3551                don't put anything in them.  */
3552 #ifdef NON_SAVING_SETJMP
3553             NON_SAVING_SETJMP
3554             ||
3555 #endif
3556             ! DECL_REGISTER (decl)))
3557       put_var_into_stack (decl);
3558 }
3559 \f
3560 /* Return the context-pointer register corresponding to DECL,
3561    or 0 if it does not need one.  */
3562
3563 rtx
3564 lookup_static_chain (decl)
3565      tree decl;
3566 {
3567   tree context = decl_function_context (decl);
3568   tree link;
3569
3570   if (context == 0)
3571     return 0;
3572   
3573   /* We treat inline_function_decl as an alias for the current function
3574      because that is the inline function whose vars, types, etc.
3575      are being merged into the current function.
3576      See expand_inline_function.  */
3577   if (context == current_function_decl || context == inline_function_decl)
3578     return virtual_stack_vars_rtx;
3579
3580   for (link = context_display; link; link = TREE_CHAIN (link))
3581     if (TREE_PURPOSE (link) == context)
3582       return RTL_EXPR_RTL (TREE_VALUE (link));
3583
3584   abort ();
3585 }
3586 \f
3587 /* Convert a stack slot address ADDR for variable VAR
3588    (from a containing function)
3589    into an address valid in this function (using a static chain).  */
3590
3591 rtx
3592 fix_lexical_addr (addr, var)
3593      rtx addr;
3594      tree var;
3595 {
3596   rtx basereg;
3597   int displacement;
3598   tree context = decl_function_context (var);
3599   struct function *fp;
3600   rtx base = 0;
3601
3602   /* If this is the present function, we need not do anything.  */
3603   if (context == current_function_decl || context == inline_function_decl)
3604     return addr;
3605
3606   for (fp = outer_function_chain; fp; fp = fp->next)
3607     if (fp->decl == context)
3608       break;
3609
3610   if (fp == 0)
3611     abort ();
3612
3613   /* Decode given address as base reg plus displacement.  */
3614   if (GET_CODE (addr) == REG)
3615     basereg = addr, displacement = 0;
3616   else if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
3617     basereg = XEXP (addr, 0), displacement = INTVAL (XEXP (addr, 1));
3618   else
3619     abort ();
3620
3621   /* We accept vars reached via the containing function's
3622      incoming arg pointer and via its stack variables pointer.  */
3623   if (basereg == fp->internal_arg_pointer)
3624     {
3625       /* If reached via arg pointer, get the arg pointer value
3626          out of that function's stack frame.
3627
3628          There are two cases:  If a separate ap is needed, allocate a
3629          slot in the outer function for it and dereference it that way.
3630          This is correct even if the real ap is actually a pseudo.
3631          Otherwise, just adjust the offset from the frame pointer to
3632          compensate.  */
3633
3634 #ifdef NEED_SEPARATE_AP
3635       rtx addr;
3636
3637       if (fp->arg_pointer_save_area == 0)
3638         fp->arg_pointer_save_area
3639           = assign_outer_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0, fp);
3640
3641       addr = fix_lexical_addr (XEXP (fp->arg_pointer_save_area, 0), var);
3642       addr = memory_address (Pmode, addr);
3643
3644       base = copy_to_reg (gen_rtx (MEM, Pmode, addr));
3645 #else
3646       displacement += (FIRST_PARM_OFFSET (context) - STARTING_FRAME_OFFSET);
3647       base = lookup_static_chain (var);
3648 #endif
3649     }
3650
3651   else if (basereg == virtual_stack_vars_rtx)
3652     {
3653       /* This is the same code as lookup_static_chain, duplicated here to
3654          avoid an extra call to decl_function_context.  */
3655       tree link;
3656
3657       for (link = context_display; link; link = TREE_CHAIN (link))
3658         if (TREE_PURPOSE (link) == context)
3659           {
3660             base = RTL_EXPR_RTL (TREE_VALUE (link));
3661             break;
3662           }
3663     }
3664
3665   if (base == 0)
3666     abort ();
3667
3668   /* Use same offset, relative to appropriate static chain or argument
3669      pointer.  */
3670   return plus_constant (base, displacement);
3671 }
3672 \f
3673 /* Return the address of the trampoline for entering nested fn FUNCTION.
3674    If necessary, allocate a trampoline (in the stack frame)
3675    and emit rtl to initialize its contents (at entry to this function).  */
3676
3677 rtx
3678 trampoline_address (function)
3679      tree function;
3680 {
3681   tree link;
3682   tree rtlexp;
3683   rtx tramp;
3684   struct function *fp;
3685   tree fn_context;
3686
3687   /* Find an existing trampoline and return it.  */
3688   for (link = trampoline_list; link; link = TREE_CHAIN (link))
3689     if (TREE_PURPOSE (link) == function)
3690       return XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0);
3691   for (fp = outer_function_chain; fp; fp = fp->next)
3692     for (link = fp->trampoline_list; link; link = TREE_CHAIN (link))
3693       if (TREE_PURPOSE (link) == function)
3694         {
3695           tramp = fix_lexical_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0),
3696                                     function);
3697           return round_trampoline_addr (tramp);
3698         }
3699
3700   /* None exists; we must make one.  */
3701
3702   /* Find the `struct function' for the function containing FUNCTION.  */
3703   fp = 0;
3704   fn_context = decl_function_context (function);
3705   if (fn_context != current_function_decl)
3706     for (fp = outer_function_chain; fp; fp = fp->next)
3707       if (fp->decl == fn_context)
3708         break;
3709
3710   /* Allocate run-time space for this trampoline
3711      (usually in the defining function's stack frame).  */
3712 #ifdef ALLOCATE_TRAMPOLINE
3713   tramp = ALLOCATE_TRAMPOLINE (fp);
3714 #else
3715   /* If rounding needed, allocate extra space
3716      to ensure we have TRAMPOLINE_SIZE bytes left after rounding up.  */
3717 #ifdef TRAMPOLINE_ALIGNMENT
3718 #define TRAMPOLINE_REAL_SIZE (TRAMPOLINE_SIZE + TRAMPOLINE_ALIGNMENT - 1)
3719 #else
3720 #define TRAMPOLINE_REAL_SIZE (TRAMPOLINE_SIZE)
3721 #endif
3722   if (fp != 0)
3723     tramp = assign_outer_stack_local (BLKmode, TRAMPOLINE_REAL_SIZE, 0, fp);
3724   else
3725     tramp = assign_stack_local (BLKmode, TRAMPOLINE_REAL_SIZE, 0);
3726 #endif
3727
3728   /* Record the trampoline for reuse and note it for later initialization
3729      by expand_function_end.  */
3730   if (fp != 0)
3731     {
3732       push_obstacks (fp->current_obstack, fp->function_maybepermanent_obstack);
3733       rtlexp = make_node (RTL_EXPR);
3734       RTL_EXPR_RTL (rtlexp) = tramp;
3735       fp->trampoline_list = tree_cons (function, rtlexp, fp->trampoline_list);
3736       pop_obstacks ();
3737     }
3738   else
3739     {
3740       /* Make the RTL_EXPR node temporary, not momentary, so that the
3741          trampoline_list doesn't become garbage.  */
3742       int momentary = suspend_momentary ();
3743       rtlexp = make_node (RTL_EXPR);
3744       resume_momentary (momentary);
3745
3746       RTL_EXPR_RTL (rtlexp) = tramp;
3747       trampoline_list = tree_cons (function, rtlexp, trampoline_list);
3748     }
3749
3750   tramp = fix_lexical_addr (XEXP (tramp, 0), function);
3751   return round_trampoline_addr (tramp);
3752 }
3753
3754 /* Given a trampoline address,
3755    round it to multiple of TRAMPOLINE_ALIGNMENT.  */
3756
3757 static rtx
3758 round_trampoline_addr (tramp)
3759      rtx tramp;
3760 {
3761 #ifdef TRAMPOLINE_ALIGNMENT
3762   /* Round address up to desired boundary.  */
3763   rtx temp = gen_reg_rtx (Pmode);
3764   temp = expand_binop (Pmode, add_optab, tramp,
3765                        GEN_INT (TRAMPOLINE_ALIGNMENT - 1),
3766                        temp, 0, OPTAB_LIB_WIDEN);
3767   tramp = expand_binop (Pmode, and_optab, temp,
3768                         GEN_INT (- TRAMPOLINE_ALIGNMENT),
3769                         temp, 0, OPTAB_LIB_WIDEN);
3770 #endif
3771   return tramp;
3772 }
3773 \f
3774 /* The functions identify_blocks and reorder_blocks provide a way to
3775    reorder the tree of BLOCK nodes, for optimizers that reshuffle or
3776    duplicate portions of the RTL code.  Call identify_blocks before
3777    changing the RTL, and call reorder_blocks after.  */
3778
3779 static int all_blocks ();
3780 static tree blocks_nreverse ();
3781
3782 /* Put all this function's BLOCK nodes into a vector, and return it.
3783    Also store in each NOTE for the beginning or end of a block
3784    the index of that block in the vector.
3785    The arguments are TOP_BLOCK, the top-level block of the function,
3786    and INSNS, the insn chain of the function.  */
3787
3788 tree *
3789 identify_blocks (top_block, insns)
3790      tree top_block;
3791      rtx insns;
3792 {
3793   int n_blocks;
3794   tree *block_vector;
3795   int *block_stack;
3796   int depth = 0;
3797   int next_block_number = 0;
3798   int current_block_number = 0;
3799   rtx insn;
3800
3801   if (top_block == 0)
3802     return 0;
3803
3804   n_blocks = all_blocks (top_block, 0);
3805   block_vector = (tree *) xmalloc (n_blocks * sizeof (tree));
3806   block_stack = (int *) alloca (n_blocks * sizeof (int));
3807
3808   all_blocks (top_block, block_vector);
3809
3810   for (insn = insns; insn; insn = NEXT_INSN (insn))
3811     if (GET_CODE (insn) == NOTE)
3812       {
3813         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
3814           {
3815             block_stack[depth++] = current_block_number;
3816             current_block_number = next_block_number;
3817             NOTE_BLOCK_NUMBER (insn) =  next_block_number++;
3818           }
3819         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
3820           {
3821             current_block_number = block_stack[--depth];
3822             NOTE_BLOCK_NUMBER (insn) = current_block_number;
3823           }
3824       }
3825
3826   return block_vector;
3827 }
3828
3829 /* Given BLOCK_VECTOR which was returned by identify_blocks,
3830    and a revised instruction chain, rebuild the tree structure
3831    of BLOCK nodes to correspond to the new order of RTL.
3832    The new block tree is inserted below TOP_BLOCK.
3833    Returns the current top-level block.  */
3834
3835 tree
3836 reorder_blocks (block_vector, top_block, insns)
3837      tree *block_vector;
3838      tree top_block;
3839      rtx insns;
3840 {
3841   tree current_block = top_block;
3842   rtx insn;
3843
3844   if (block_vector == 0)
3845     return top_block;
3846
3847   /* Prune the old tree away, so that it doesn't get in the way.  */
3848   BLOCK_SUBBLOCKS (current_block) = 0;
3849
3850   for (insn = insns; insn; insn = NEXT_INSN (insn))
3851     if (GET_CODE (insn) == NOTE)
3852       {
3853         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
3854           {
3855             tree block = block_vector[NOTE_BLOCK_NUMBER (insn)];
3856             /* If we have seen this block before, copy it.  */
3857             if (TREE_ASM_WRITTEN (block))
3858               block = copy_node (block);
3859             BLOCK_SUBBLOCKS (block) = 0;
3860             TREE_ASM_WRITTEN (block) = 1;
3861             BLOCK_SUPERCONTEXT (block) = current_block; 
3862             BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
3863             BLOCK_SUBBLOCKS (current_block) = block;
3864             current_block = block;
3865             NOTE_SOURCE_FILE (insn) = 0;
3866           }
3867         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
3868           {
3869             BLOCK_SUBBLOCKS (current_block)
3870               = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
3871             current_block = BLOCK_SUPERCONTEXT (current_block);
3872             NOTE_SOURCE_FILE (insn) = 0;
3873           }
3874       }
3875
3876   return current_block;
3877 }
3878
3879 /* Reverse the order of elements in the chain T of blocks,
3880    and return the new head of the chain (old last element).  */
3881
3882 static tree
3883 blocks_nreverse (t)
3884      tree t;
3885 {
3886   register tree prev = 0, decl, next;
3887   for (decl = t; decl; decl = next)
3888     {
3889       next = BLOCK_CHAIN (decl);
3890       BLOCK_CHAIN (decl) = prev;
3891       prev = decl;
3892     }
3893   return prev;
3894 }
3895
3896 /* Count the subblocks of BLOCK, and list them all into the vector VECTOR.
3897    Also clear TREE_ASM_WRITTEN in all blocks.  */
3898
3899 static int
3900 all_blocks (block, vector)
3901      tree block;
3902      tree *vector;
3903 {
3904   int n_blocks = 1;
3905   tree subblocks; 
3906
3907   TREE_ASM_WRITTEN (block) = 0;
3908   /* Record this block.  */
3909   if (vector)
3910     vector[0] = block;
3911
3912   /* Record the subblocks, and their subblocks.  */
3913   for (subblocks = BLOCK_SUBBLOCKS (block);
3914        subblocks; subblocks = BLOCK_CHAIN (subblocks))
3915     n_blocks += all_blocks (subblocks, vector ? vector + n_blocks : 0);
3916
3917   return n_blocks;
3918 }
3919 \f
3920 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
3921    and initialize static variables for generating RTL for the statements
3922    of the function.  */
3923
3924 void
3925 init_function_start (subr, filename, line)
3926      tree subr;
3927      char *filename;
3928      int line;
3929 {
3930   char *junk;
3931
3932   init_stmt_for_function ();
3933
3934   cse_not_expected = ! optimize;
3935
3936   /* Caller save not needed yet.  */
3937   caller_save_needed = 0;
3938
3939   /* No stack slots have been made yet.  */
3940   stack_slot_list = 0;
3941
3942   /* There is no stack slot for handling nonlocal gotos.  */
3943   nonlocal_goto_handler_slot = 0;
3944   nonlocal_goto_stack_level = 0;
3945
3946   /* No labels have been declared for nonlocal use.  */
3947   nonlocal_labels = 0;
3948
3949   /* No function calls so far in this function.  */
3950   function_call_count = 0;
3951
3952   /* No parm regs have been allocated.
3953      (This is important for output_inline_function.)  */
3954   max_parm_reg = LAST_VIRTUAL_REGISTER + 1;
3955
3956   /* Initialize the RTL mechanism.  */
3957   init_emit ();
3958
3959   /* Initialize the queue of pending postincrement and postdecrements,
3960      and some other info in expr.c.  */
3961   init_expr ();
3962
3963   /* We haven't done register allocation yet.  */
3964   reg_renumber = 0;
3965
3966   init_const_rtx_hash_table ();
3967
3968   current_function_name = (*decl_printable_name) (subr, &junk);
3969
3970   /* Nonzero if this is a nested function that uses a static chain.  */
3971
3972   current_function_needs_context
3973     = (decl_function_context (current_function_decl) != 0);
3974
3975   /* Set if a call to setjmp is seen.  */
3976   current_function_calls_setjmp = 0;
3977
3978   /* Set if a call to longjmp is seen.  */
3979   current_function_calls_longjmp = 0;
3980
3981   current_function_calls_alloca = 0;
3982   current_function_has_nonlocal_label = 0;
3983   current_function_contains_functions = 0;
3984
3985   current_function_returns_pcc_struct = 0;
3986   current_function_returns_struct = 0;
3987   current_function_epilogue_delay_list = 0;
3988   current_function_uses_const_pool = 0;
3989   current_function_uses_pic_offset_table = 0;
3990
3991   /* We have not yet needed to make a label to jump to for tail-recursion.  */
3992   tail_recursion_label = 0;
3993
3994   /* We haven't had a need to make a save area for ap yet.  */
3995
3996   arg_pointer_save_area = 0;
3997
3998   /* No stack slots allocated yet.  */
3999   frame_offset = 0;
4000
4001   /* No SAVE_EXPRs in this function yet.  */
4002   save_expr_regs = 0;
4003
4004   /* No RTL_EXPRs in this function yet.  */
4005   rtl_expr_chain = 0;
4006
4007   /* We have not allocated any temporaries yet.  */
4008   temp_slots = 0;
4009   temp_slot_level = 0;
4010
4011   /* Within function body, compute a type's size as soon it is laid out.  */
4012   immediate_size_expand++;
4013
4014   init_pending_stack_adjust ();
4015   inhibit_defer_pop = 0;
4016
4017   current_function_outgoing_args_size = 0;
4018
4019   /* Initialize the insn lengths.  */
4020   init_insn_lengths ();
4021
4022   /* Prevent ever trying to delete the first instruction of a function.
4023      Also tell final how to output a linenum before the function prologue.  */
4024   emit_line_note (filename, line);
4025
4026   /* Make sure first insn is a note even if we don't want linenums.
4027      This makes sure the first insn will never be deleted.
4028      Also, final expects a note to appear there.  */
4029   emit_note (NULL_PTR, NOTE_INSN_DELETED);
4030
4031   /* Set flags used by final.c.  */
4032   if (aggregate_value_p (DECL_RESULT (subr)))
4033     {
4034 #ifdef PCC_STATIC_STRUCT_RETURN
4035       if (flag_pcc_struct_return)
4036         current_function_returns_pcc_struct = 1;
4037       else
4038 #endif
4039         current_function_returns_struct = 1;
4040     }
4041
4042   /* Warn if this value is an aggregate type,
4043      regardless of which calling convention we are using for it.  */
4044   if (warn_aggregate_return
4045       && (TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == RECORD_TYPE
4046           || TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == UNION_TYPE
4047           || TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == ARRAY_TYPE))
4048     warning ("function returns an aggregate");
4049
4050   current_function_returns_pointer
4051     = (TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == POINTER_TYPE);
4052
4053   /* Indicate that we need to distinguish between the return value of the
4054      present function and the return value of a function being called.  */
4055   rtx_equal_function_value_matters = 1;
4056
4057   /* Indicate that we have not instantiated virtual registers yet.  */
4058   virtuals_instantiated = 0;
4059
4060   /* Indicate we have no need of a frame pointer yet.  */
4061   frame_pointer_needed = 0;
4062
4063   /* By default assume not varargs.  */
4064   current_function_varargs = 0;
4065 }
4066
4067 /* Indicate that the current function uses extra args
4068    not explicitly mentioned in the argument list in any fashion.  */
4069
4070 void
4071 mark_varargs ()
4072 {
4073   current_function_varargs = 1;
4074 }
4075
4076 /* Expand a call to __main at the beginning of a possible main function.  */
4077
4078 void
4079 expand_main_function ()
4080 {
4081 #if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
4082   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__main"), 0,
4083                      VOIDmode, 0);
4084 #endif /* not INIT_SECTION_ASM_OP or INVOKE__main */
4085 }
4086 \f
4087 /* Start the RTL for a new function, and set variables used for
4088    emitting RTL.
4089    SUBR is the FUNCTION_DECL node.
4090    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
4091    the function's parameters, which must be run at any return statement.  */
4092
4093 void
4094 expand_function_start (subr, parms_have_cleanups)
4095      tree subr;
4096      int parms_have_cleanups;
4097 {
4098   register int i;
4099   tree tem;
4100   rtx last_ptr;
4101
4102   /* Make sure volatile mem refs aren't considered
4103      valid operands of arithmetic insns.  */
4104   init_recog_no_volatile ();
4105
4106   /* If function gets a static chain arg, store it in the stack frame.
4107      Do this first, so it gets the first stack slot offset.  */
4108   if (current_function_needs_context)
4109     {
4110       last_ptr = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
4111       emit_move_insn (last_ptr, static_chain_incoming_rtx);
4112     }
4113
4114   /* If the parameters of this function need cleaning up, get a label
4115      for the beginning of the code which executes those cleanups.  This must
4116      be done before doing anything with return_label.  */
4117   if (parms_have_cleanups)
4118     cleanup_label = gen_label_rtx ();
4119   else
4120     cleanup_label = 0;
4121
4122   /* Make the label for return statements to jump to, if this machine
4123      does not have a one-instruction return and uses an epilogue,
4124      or if it returns a structure, or if it has parm cleanups.  */
4125 #ifdef HAVE_return
4126   if (cleanup_label == 0 && HAVE_return
4127       && ! current_function_returns_pcc_struct
4128       && ! (current_function_returns_struct && ! optimize))
4129     return_label = 0;
4130   else
4131     return_label = gen_label_rtx ();
4132 #else
4133   return_label = gen_label_rtx ();
4134 #endif
4135
4136   /* Initialize rtx used to return the value.  */
4137   /* Do this before assign_parms so that we copy the struct value address
4138      before any library calls that assign parms might generate.  */
4139
4140   /* Decide whether to return the value in memory or in a register.  */
4141   if (aggregate_value_p (DECL_RESULT (subr)))
4142     {
4143       /* Returning something that won't go in a register.  */
4144       register rtx value_address;
4145
4146 #ifdef PCC_STATIC_STRUCT_RETURN
4147       if (current_function_returns_pcc_struct)
4148         {
4149           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
4150           value_address = assemble_static_space (size);
4151         }
4152       else
4153 #endif
4154         {
4155           /* Expect to be passed the address of a place to store the value.
4156              If it is passed as an argument, assign_parms will take care of
4157              it.  */
4158           if (struct_value_incoming_rtx)
4159             {
4160               value_address = gen_reg_rtx (Pmode);
4161               emit_move_insn (value_address, struct_value_incoming_rtx);
4162             }
4163         }
4164       if (value_address)
4165         DECL_RTL (DECL_RESULT (subr))
4166           = gen_rtx (MEM, DECL_MODE (DECL_RESULT (subr)),
4167                      value_address);
4168     }
4169   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
4170     /* If return mode is void, this decl rtl should not be used.  */
4171     DECL_RTL (DECL_RESULT (subr)) = 0;
4172   else if (parms_have_cleanups)
4173     {
4174       /* If function will end with cleanup code for parms,
4175          compute the return values into a pseudo reg,
4176          which we will copy into the true return register
4177          after the cleanups are done.  */
4178
4179       enum machine_mode mode = DECL_MODE (DECL_RESULT (subr));
4180 #ifdef PROMOTE_FUNCTION_RETURN
4181       tree type = TREE_TYPE (DECL_RESULT (subr));
4182       int unsignedp = TREE_UNSIGNED (type);
4183
4184       if (TREE_CODE (type) == INTEGER_TYPE || TREE_CODE (type) == ENUMERAL_TYPE
4185           || TREE_CODE (type) == BOOLEAN_TYPE || TREE_CODE (type) == CHAR_TYPE
4186           || TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == POINTER_TYPE
4187           || TREE_CODE (type) == OFFSET_TYPE)
4188         {
4189           PROMOTE_MODE (mode, unsignedp, type);
4190         }
4191 #endif
4192
4193       DECL_RTL (DECL_RESULT (subr)) = gen_reg_rtx (mode);
4194     }
4195   else
4196     /* Scalar, returned in a register.  */
4197     {
4198 #ifdef FUNCTION_OUTGOING_VALUE
4199       DECL_RTL (DECL_RESULT (subr))
4200         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (subr)), subr);
4201 #else
4202       DECL_RTL (DECL_RESULT (subr))
4203         = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (subr)), subr);
4204 #endif
4205
4206       /* Mark this reg as the function's return value.  */
4207       if (GET_CODE (DECL_RTL (DECL_RESULT (subr))) == REG)
4208         {
4209           REG_FUNCTION_VALUE_P (DECL_RTL (DECL_RESULT (subr))) = 1;
4210           /* Needed because we may need to move this to memory
4211              in case it's a named return value whose address is taken.  */
4212           DECL_REGISTER (DECL_RESULT (subr)) = 1;
4213         }
4214     }
4215
4216   /* Initialize rtx for parameters and local variables.
4217      In some cases this requires emitting insns.  */
4218
4219   assign_parms (subr, 0);
4220
4221   /* The following was moved from init_function_start.
4222      The move is supposed to make sdb output more accurate.  */
4223   /* Indicate the beginning of the function body,
4224      as opposed to parm setup.  */
4225   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_BEG);
4226
4227   /* If doing stupid allocation, mark parms as born here.  */
4228
4229   if (GET_CODE (get_last_insn ()) != NOTE)
4230     emit_note (NULL_PTR, NOTE_INSN_DELETED);
4231   parm_birth_insn = get_last_insn ();
4232
4233   if (obey_regdecls)
4234     {
4235       for (i = LAST_VIRTUAL_REGISTER + 1; i < max_parm_reg; i++)
4236         use_variable (regno_reg_rtx[i]);
4237
4238       if (current_function_internal_arg_pointer != virtual_incoming_args_rtx)
4239         use_variable (current_function_internal_arg_pointer);
4240     }
4241
4242   /* Fetch static chain values for containing functions.  */
4243   tem = decl_function_context (current_function_decl);
4244   /* If not doing stupid register allocation, then start off with the static
4245      chain pointer in a pseudo register.  Otherwise, we use the stack
4246      address that was generated above.  */
4247   if (tem && ! obey_regdecls)
4248     last_ptr = copy_to_reg (static_chain_incoming_rtx);
4249   context_display = 0;
4250   while (tem)
4251     {
4252       tree rtlexp = make_node (RTL_EXPR);
4253
4254       RTL_EXPR_RTL (rtlexp) = last_ptr;
4255       context_display = tree_cons (tem, rtlexp, context_display);
4256       tem = decl_function_context (tem);
4257       if (tem == 0)
4258         break;
4259       /* Chain thru stack frames, assuming pointer to next lexical frame
4260          is found at the place we always store it.  */
4261 #ifdef FRAME_GROWS_DOWNWARD
4262       last_ptr = plus_constant (last_ptr, - GET_MODE_SIZE (Pmode));
4263 #endif
4264       last_ptr = copy_to_reg (gen_rtx (MEM, Pmode,
4265                                        memory_address (Pmode, last_ptr)));
4266     }
4267
4268   /* After the display initializations is where the tail-recursion label
4269      should go, if we end up needing one.   Ensure we have a NOTE here
4270      since some things (like trampolines) get placed before this.  */
4271   tail_recursion_reentry = emit_note (NULL_PTR, NOTE_INSN_DELETED);
4272
4273   /* Evaluate now the sizes of any types declared among the arguments.  */
4274   for (tem = nreverse (get_pending_sizes ()); tem; tem = TREE_CHAIN (tem))
4275     expand_expr (TREE_VALUE (tem), NULL_RTX, VOIDmode, 0);
4276
4277   /* Make sure there is a line number after the function entry setup code.  */
4278   force_next_line_note ();
4279 }
4280 \f
4281 /* Generate RTL for the end of the current function.
4282    FILENAME and LINE are the current position in the source file.  */
4283
4284 /* It is up to language-specific callers to do cleanups for parameters.  */
4285
4286 void
4287 expand_function_end (filename, line)
4288      char *filename;
4289      int line;
4290 {
4291   register int i;
4292   tree link;
4293
4294   static rtx initial_trampoline;
4295
4296 #ifdef NON_SAVING_SETJMP
4297   /* Don't put any variables in registers if we call setjmp
4298      on a machine that fails to restore the registers.  */
4299   if (NON_SAVING_SETJMP && current_function_calls_setjmp)
4300     {
4301       setjmp_protect (DECL_INITIAL (current_function_decl));
4302       setjmp_protect_args ();
4303     }
4304 #endif
4305
4306   /* Save the argument pointer if a save area was made for it.  */
4307   if (arg_pointer_save_area)
4308     {
4309       rtx x = gen_move_insn (arg_pointer_save_area, virtual_incoming_args_rtx);
4310       emit_insn_before (x, tail_recursion_reentry);
4311     }
4312
4313   /* Initialize any trampolines required by this function.  */
4314   for (link = trampoline_list; link; link = TREE_CHAIN (link))
4315     {
4316       tree function = TREE_PURPOSE (link);
4317       rtx context = lookup_static_chain (function);
4318       rtx tramp = RTL_EXPR_RTL (TREE_VALUE (link));
4319       rtx seq;
4320
4321       /* First make sure this compilation has a template for
4322          initializing trampolines.  */
4323       if (initial_trampoline == 0)
4324         {
4325           end_temporary_allocation ();
4326           initial_trampoline
4327             = gen_rtx (MEM, BLKmode, assemble_trampoline_template ());
4328           resume_temporary_allocation ();
4329         }
4330
4331       /* Generate insns to initialize the trampoline.  */
4332       start_sequence ();
4333       tramp = change_address (initial_trampoline, BLKmode,
4334                               round_trampoline_addr (XEXP (tramp, 0)));
4335       emit_block_move (tramp, initial_trampoline, GEN_INT (TRAMPOLINE_SIZE),
4336                        FUNCTION_BOUNDARY / BITS_PER_UNIT);
4337       INITIALIZE_TRAMPOLINE (XEXP (tramp, 0),
4338                              XEXP (DECL_RTL (function), 0), context);
4339       seq = get_insns ();
4340       end_sequence ();
4341
4342       /* Put those insns at entry to the containing function (this one).  */
4343       emit_insns_before (seq, tail_recursion_reentry);
4344     }
4345   /* Clear the trampoline_list for the next function.  */
4346   trampoline_list = 0;
4347
4348 #if 0  /* I think unused parms are legitimate enough.  */
4349   /* Warn about unused parms.  */
4350   if (warn_unused)
4351     {
4352       rtx decl;
4353
4354       for (decl = DECL_ARGUMENTS (current_function_decl);
4355            decl; decl = TREE_CHAIN (decl))
4356         if (! TREE_USED (decl) && TREE_CODE (decl) == VAR_DECL)
4357           warning_with_decl (decl, "unused parameter `%s'");
4358     }
4359 #endif
4360
4361   /* Delete handlers for nonlocal gotos if nothing uses them.  */
4362   if (nonlocal_goto_handler_slot != 0 && !current_function_has_nonlocal_label)
4363     delete_handlers ();
4364
4365   /* End any sequences that failed to be closed due to syntax errors.  */
4366   while (in_sequence_p ())
4367     end_sequence ();
4368
4369   /* Outside function body, can't compute type's actual size
4370      until next function's body starts.  */
4371   immediate_size_expand--;
4372
4373   /* If doing stupid register allocation,
4374      mark register parms as dying here.  */
4375
4376   if (obey_regdecls)
4377     {
4378       rtx tem;
4379       for (i = LAST_VIRTUAL_REGISTER + 1; i < max_parm_reg; i++)
4380         use_variable (regno_reg_rtx[i]);
4381
4382       /* Likewise for the regs of all the SAVE_EXPRs in the function.  */
4383
4384       for (tem = save_expr_regs; tem; tem = XEXP (tem, 1))
4385         {
4386           use_variable (XEXP (tem, 0));
4387           use_variable_after (XEXP (tem, 0), parm_birth_insn);
4388         }
4389
4390       if (current_function_internal_arg_pointer != virtual_incoming_args_rtx)
4391         use_variable (current_function_internal_arg_pointer);
4392     }
4393
4394   clear_pending_stack_adjust ();
4395   do_pending_stack_adjust ();
4396
4397   /* Mark the end of the function body.
4398      If control reaches this insn, the function can drop through
4399      without returning a value.  */
4400   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_END);
4401
4402   /* Output a linenumber for the end of the function.
4403      SDB depends on this.  */
4404   emit_line_note_force (filename, line);
4405
4406   /* Output the label for the actual return from the function,
4407      if one is expected.  This happens either because a function epilogue
4408      is used instead of a return instruction, or because a return was done
4409      with a goto in order to run local cleanups, or because of pcc-style
4410      structure returning.  */
4411
4412   if (return_label)
4413     emit_label (return_label);
4414
4415   /* If we had calls to alloca, and this machine needs
4416      an accurate stack pointer to exit the function,
4417      insert some code to save and restore the stack pointer.  */
4418 #ifdef EXIT_IGNORE_STACK
4419   if (! EXIT_IGNORE_STACK)
4420 #endif
4421     if (current_function_calls_alloca)
4422       {
4423         rtx tem = 0;
4424
4425         emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
4426         emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
4427       }
4428
4429   /* If scalar return value was computed in a pseudo-reg,
4430      copy that to the hard return register.  */
4431   if (DECL_RTL (DECL_RESULT (current_function_decl)) != 0
4432       && GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) == REG
4433       && (REGNO (DECL_RTL (DECL_RESULT (current_function_decl)))
4434           >= FIRST_PSEUDO_REGISTER))
4435     {
4436       rtx real_decl_result;
4437
4438 #ifdef FUNCTION_OUTGOING_VALUE
4439       real_decl_result
4440         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
4441                                    current_function_decl);
4442 #else
4443       real_decl_result
4444         = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
4445                           current_function_decl);
4446 #endif
4447       REG_FUNCTION_VALUE_P (real_decl_result) = 1;
4448       emit_move_insn (real_decl_result,
4449                       DECL_RTL (DECL_RESULT (current_function_decl)));
4450       emit_insn (gen_rtx (USE, VOIDmode, real_decl_result));
4451     }
4452
4453   /* If returning a structure, arrange to return the address of the value
4454      in a place where debuggers expect to find it.
4455
4456      If returning a structure PCC style,
4457      the caller also depends on this value.
4458      And current_function_returns_pcc_struct is not necessarily set.  */
4459   if (current_function_returns_struct
4460       || current_function_returns_pcc_struct)
4461     {
4462       rtx value_address = XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
4463       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
4464 #ifdef FUNCTION_OUTGOING_VALUE
4465       rtx outgoing
4466         = FUNCTION_OUTGOING_VALUE (build_pointer_type (type),
4467                                    current_function_decl);
4468 #else
4469       rtx outgoing
4470         = FUNCTION_VALUE (build_pointer_type (type),
4471                           current_function_decl);
4472 #endif
4473
4474       /* Mark this as a function return value so integrate will delete the
4475          assignment and USE below when inlining this function.  */
4476       REG_FUNCTION_VALUE_P (outgoing) = 1;
4477
4478       emit_move_insn (outgoing, value_address);
4479       use_variable (outgoing);
4480     }
4481
4482   /* Output a return insn if we are using one.
4483      Otherwise, let the rtl chain end here, to drop through
4484      into the epilogue.  */
4485
4486 #ifdef HAVE_return
4487   if (HAVE_return)
4488     {
4489       emit_jump_insn (gen_return ());
4490       emit_barrier ();
4491     }
4492 #endif
4493
4494   /* Fix up any gotos that jumped out to the outermost
4495      binding level of the function.
4496      Must follow emitting RETURN_LABEL.  */
4497
4498   /* If you have any cleanups to do at this point,
4499      and they need to create temporary variables,
4500      then you will lose.  */
4501   fixup_gotos (NULL_PTR, NULL_RTX, NULL_TREE, get_insns (), 0);
4502 }
4503 \f
4504 /* These arrays record the INSN_UIDs of the prologue and epilogue insns.  */
4505
4506 static int *prologue;
4507 static int *epilogue;
4508
4509 /* Create an array that records the INSN_UIDs of INSNS (either a sequence
4510    or a single insn).  */
4511
4512 static int *
4513 record_insns (insns)
4514      rtx insns;
4515 {
4516   int *vec;
4517
4518   if (GET_CODE (insns) == SEQUENCE)
4519     {
4520       int len = XVECLEN (insns, 0);
4521       vec = (int *) oballoc ((len + 1) * sizeof (int));
4522       vec[len] = 0;
4523       while (--len >= 0)
4524         vec[len] = INSN_UID (XVECEXP (insns, 0, len));
4525     }
4526   else
4527     {
4528       vec = (int *) oballoc (2 * sizeof (int));
4529       vec[0] = INSN_UID (insns);
4530       vec[1] = 0;
4531     }
4532   return vec;
4533 }
4534
4535 /* Determine how many INSN_UIDs in VEC are part of INSN.  */
4536
4537 static int
4538 contains (insn, vec)
4539      rtx insn;
4540      int *vec;
4541 {
4542   register int i, j;
4543
4544   if (GET_CODE (insn) == INSN
4545       && GET_CODE (PATTERN (insn)) == SEQUENCE)
4546     {
4547       int count = 0;
4548       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
4549         for (j = 0; vec[j]; j++)
4550           if (INSN_UID (XVECEXP (PATTERN (insn), 0, i)) == vec[j])
4551             count++;
4552       return count;
4553     }
4554   else
4555     {
4556       for (j = 0; vec[j]; j++)
4557         if (INSN_UID (insn) == vec[j])
4558           return 1;
4559     }
4560   return 0;
4561 }
4562
4563 /* Generate the prologe and epilogue RTL if the machine supports it.  Thread
4564    this into place with notes indicating where the prologue ends and where
4565    the epilogue begins.  Update the basic block information when possible.  */
4566
4567 void
4568 thread_prologue_and_epilogue_insns (f)
4569      rtx f;
4570 {
4571 #ifdef HAVE_prologue
4572   if (HAVE_prologue)
4573     {
4574       rtx head, seq, insn;
4575
4576       /* The first insn (a NOTE_INSN_DELETED) is followed by zero or more
4577          prologue insns and a NOTE_INSN_PROLOGUE_END.  */
4578       emit_note_after (NOTE_INSN_PROLOGUE_END, f);
4579       seq = gen_prologue ();
4580       head = emit_insn_after (seq, f);
4581
4582       /* Include the new prologue insns in the first block.  Ignore them
4583          if they form a basic block unto themselves.  */
4584       if (basic_block_head && n_basic_blocks
4585           && GET_CODE (basic_block_head[0]) != CODE_LABEL)
4586         basic_block_head[0] = NEXT_INSN (f);
4587
4588       /* Retain a map of the prologue insns.  */
4589       prologue = record_insns (GET_CODE (seq) == SEQUENCE ? seq : head);
4590     }
4591   else
4592 #endif
4593     prologue = 0;
4594
4595 #ifdef HAVE_epilogue
4596   if (HAVE_epilogue)
4597     {
4598       rtx insn = get_last_insn ();
4599       rtx prev = prev_nonnote_insn (insn);
4600
4601       /* If we end with a BARRIER, we don't need an epilogue.  */
4602       if (! (prev && GET_CODE (prev) == BARRIER))
4603         {
4604           rtx tail, seq;
4605
4606           /* The last basic block ends with a NOTE_INSN_EPILOGUE_BEG,
4607              the epilogue insns (this must include the jump insn that
4608              returns), USE insns ad the end of a function, and a BARRIER.  */
4609
4610           emit_barrier_after (insn);
4611
4612           /* Place the epilogue before the USE insns at the end of a
4613              function.  */
4614           while (prev
4615                  && GET_CODE (prev) == INSN
4616                  && GET_CODE (PATTERN (prev)) == USE)
4617             {
4618               insn = PREV_INSN (prev);
4619               prev = prev_nonnote_insn (prev);
4620             }
4621
4622           seq = gen_epilogue ();
4623           tail = emit_jump_insn_after (seq, insn);
4624           emit_note_after (NOTE_INSN_EPILOGUE_BEG, insn);
4625
4626           /* Include the new epilogue insns in the last block.  Ignore
4627              them if they form a basic block unto themselves.  */
4628           if (basic_block_end && n_basic_blocks
4629               && GET_CODE (basic_block_end[n_basic_blocks - 1]) != JUMP_INSN)
4630             basic_block_end[n_basic_blocks - 1] = tail;
4631
4632           /* Retain a map of the epilogue insns.  */
4633           epilogue = record_insns (GET_CODE (seq) == SEQUENCE ? seq : tail);
4634           return;
4635         }
4636     }
4637 #endif
4638   epilogue = 0;
4639 }
4640
4641 /* Reposition the prologue-end and epilogue-begin notes after instruction
4642    scheduling and delayed branch scheduling.  */
4643
4644 void
4645 reposition_prologue_and_epilogue_notes (f)
4646      rtx f;
4647 {
4648 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
4649   /* Reposition the prologue and epilogue notes.  */
4650   if (n_basic_blocks)
4651     {
4652       rtx next, prev;
4653       int len;
4654
4655       if (prologue)
4656         {
4657           register rtx insn, note = 0;
4658
4659           /* Scan from the beginning until we reach the last prologue insn.
4660              We apparently can't depend on basic_block_{head,end} after
4661              reorg has run.  */
4662           for (len = 0; prologue[len]; len++)
4663             ;
4664           for (insn = f; insn; insn = NEXT_INSN (insn))
4665             if (GET_CODE (insn) == NOTE)
4666               {
4667                 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
4668                   note = insn;
4669               }
4670             else if ((len -= contains (insn, prologue)) == 0)
4671               {
4672                 /* Find the prologue-end note if we haven't already, and
4673                    move it to just after the last prologue insn.  */
4674                 if (note == 0)
4675                   for (note = insn; note = NEXT_INSN (note);)
4676                     if (GET_CODE (note) == NOTE
4677                         && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END)
4678                       break;
4679                 next = NEXT_INSN (note);
4680                 prev = PREV_INSN (note);
4681                 if (prev)
4682                   NEXT_INSN (prev) = next;
4683                 if (next)
4684                   PREV_INSN (next) = prev;
4685                 add_insn_after (note, insn);
4686                 break;
4687               }
4688         }
4689
4690       if (epilogue)
4691         {
4692           register rtx insn, note = 0;
4693
4694           /* Scan from the end until we reach the first epilogue insn.
4695              We apparently can't depend on basic_block_{head,end} after
4696              reorg has run.  */
4697           for (len = 0; epilogue[len]; len++)
4698             ;
4699           for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
4700             if (GET_CODE (insn) == NOTE)
4701               {
4702                 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
4703                   note = insn;
4704               }
4705             else if ((len -= contains (insn, epilogue)) == 0)
4706               {
4707                 /* Find the epilogue-begin note if we haven't already, and
4708                    move it to just before the first epilogue insn.  */
4709                 if (note == 0)
4710                   for (note = insn; note = PREV_INSN (note);)
4711                     if (GET_CODE (note) == NOTE
4712                         && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG)
4713                       break;
4714                 next = NEXT_INSN (note);
4715                 prev = PREV_INSN (note);
4716                 if (prev)
4717                   NEXT_INSN (prev) = next;
4718                 if (next)
4719                   PREV_INSN (next) = prev;
4720                 add_insn_after (note, PREV_INSN (insn));
4721                 break;
4722               }
4723         }
4724     }
4725 #endif /* HAVE_prologue or HAVE_epilogue */
4726 }