simplify-rtx.c (simplify_unary_operation_1): Extend the handling of SUBREG_PROMOTED_V...
[official-gcc.git] / gcc / function.c
blob275b70264cc387868da29d29127f17251acd8f96
1 /* Expands front end tree to back end RTL for GCC.
2 Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 Free Software Foundation, Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 /* This file handles the generation of rtl code from tree structure
23 at the level of the function as a whole.
24 It creates the rtl expressions for parameters and auto variables
25 and has full responsibility for allocating stack slots.
27 `expand_function_start' is called at the beginning of a function,
28 before the function body is parsed, and `expand_function_end' is
29 called after parsing the body.
31 Call `assign_stack_local' to allocate a stack slot for a local variable.
32 This is usually done during the RTL generation for the function body,
33 but it can also be done in the reload pass when a pseudo-register does
34 not get a hard register. */
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "rtl.h"
41 #include "tree.h"
42 #include "flags.h"
43 #include "except.h"
44 #include "function.h"
45 #include "expr.h"
46 #include "optabs.h"
47 #include "libfuncs.h"
48 #include "regs.h"
49 #include "hard-reg-set.h"
50 #include "insn-config.h"
51 #include "recog.h"
52 #include "output.h"
53 #include "basic-block.h"
54 #include "toplev.h"
55 #include "hashtab.h"
56 #include "ggc.h"
57 #include "tm_p.h"
58 #include "integrate.h"
59 #include "langhooks.h"
60 #include "target.h"
61 #include "cfglayout.h"
62 #include "tree-gimple.h"
63 #include "tree-pass.h"
64 #include "predict.h"
65 #include "df.h"
66 #include "timevar.h"
67 #include "vecprim.h"
69 /* So we can assign to cfun in this file. */
70 #undef cfun
72 #ifndef LOCAL_ALIGNMENT
73 #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
74 #endif
76 #ifndef STACK_ALIGNMENT_NEEDED
77 #define STACK_ALIGNMENT_NEEDED 1
78 #endif
80 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
82 /* Some systems use __main in a way incompatible with its use in gcc, in these
83 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
84 give the same symbol without quotes for an alternative entry point. You
85 must define both, or neither. */
86 #ifndef NAME__MAIN
87 #define NAME__MAIN "__main"
88 #endif
90 /* Round a value to the lowest integer less than it that is a multiple of
91 the required alignment. Avoid using division in case the value is
92 negative. Assume the alignment is a power of two. */
93 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
95 /* Similar, but round to the next highest integer that meets the
96 alignment. */
97 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
99 /* Nonzero if function being compiled doesn't contain any calls
100 (ignoring the prologue and epilogue). This is set prior to
101 local register allocation and is valid for the remaining
102 compiler passes. */
103 int current_function_is_leaf;
105 /* Nonzero if function being compiled doesn't modify the stack pointer
106 (ignoring the prologue and epilogue). This is only valid after
107 pass_stack_ptr_mod has run. */
108 int current_function_sp_is_unchanging;
110 /* Nonzero if the function being compiled is a leaf function which only
111 uses leaf registers. This is valid after reload (specifically after
112 sched2) and is useful only if the port defines LEAF_REGISTERS. */
113 int current_function_uses_only_leaf_regs;
115 /* Nonzero once virtual register instantiation has been done.
116 assign_stack_local uses frame_pointer_rtx when this is nonzero.
117 calls.c:emit_library_call_value_1 uses it to set up
118 post-instantiation libcalls. */
119 int virtuals_instantiated;
121 /* Assign unique numbers to labels generated for profiling, debugging, etc. */
122 static GTY(()) int funcdef_no;
124 /* These variables hold pointers to functions to create and destroy
125 target specific, per-function data structures. */
126 struct machine_function * (*init_machine_status) (void);
128 /* The currently compiled function. */
129 struct function *cfun = 0;
131 /* These arrays record the INSN_UIDs of the prologue and epilogue insns. */
132 static VEC(int,heap) *prologue;
133 static VEC(int,heap) *epilogue;
135 /* Array of INSN_UIDs to hold the INSN_UIDs for each sibcall epilogue
136 in this function. */
137 static VEC(int,heap) *sibcall_epilogue;
139 /* In order to evaluate some expressions, such as function calls returning
140 structures in memory, we need to temporarily allocate stack locations.
141 We record each allocated temporary in the following structure.
143 Associated with each temporary slot is a nesting level. When we pop up
144 one level, all temporaries associated with the previous level are freed.
145 Normally, all temporaries are freed after the execution of the statement
146 in which they were created. However, if we are inside a ({...}) grouping,
147 the result may be in a temporary and hence must be preserved. If the
148 result could be in a temporary, we preserve it if we can determine which
149 one it is in. If we cannot determine which temporary may contain the
150 result, all temporaries are preserved. A temporary is preserved by
151 pretending it was allocated at the previous nesting level.
153 Automatic variables are also assigned temporary slots, at the nesting
154 level where they are defined. They are marked a "kept" so that
155 free_temp_slots will not free them. */
157 struct temp_slot GTY(())
159 /* Points to next temporary slot. */
160 struct temp_slot *next;
161 /* Points to previous temporary slot. */
162 struct temp_slot *prev;
164 /* The rtx to used to reference the slot. */
165 rtx slot;
166 /* The rtx used to represent the address if not the address of the
167 slot above. May be an EXPR_LIST if multiple addresses exist. */
168 rtx address;
169 /* The alignment (in bits) of the slot. */
170 unsigned int align;
171 /* The size, in units, of the slot. */
172 HOST_WIDE_INT size;
173 /* The type of the object in the slot, or zero if it doesn't correspond
174 to a type. We use this to determine whether a slot can be reused.
175 It can be reused if objects of the type of the new slot will always
176 conflict with objects of the type of the old slot. */
177 tree type;
178 /* Nonzero if this temporary is currently in use. */
179 char in_use;
180 /* Nonzero if this temporary has its address taken. */
181 char addr_taken;
182 /* Nesting level at which this slot is being used. */
183 int level;
184 /* Nonzero if this should survive a call to free_temp_slots. */
185 int keep;
186 /* The offset of the slot from the frame_pointer, including extra space
187 for alignment. This info is for combine_temp_slots. */
188 HOST_WIDE_INT base_offset;
189 /* The size of the slot, including extra space for alignment. This
190 info is for combine_temp_slots. */
191 HOST_WIDE_INT full_size;
194 /* Forward declarations. */
196 static rtx assign_stack_local_1 (enum machine_mode, HOST_WIDE_INT, int,
197 struct function *);
198 static struct temp_slot *find_temp_slot_from_address (rtx);
199 static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
200 static void pad_below (struct args_size *, enum machine_mode, tree);
201 static void reorder_blocks_1 (rtx, tree, VEC(tree,heap) **);
202 static int all_blocks (tree, tree *);
203 static tree *get_block_vector (tree, int *);
204 extern tree debug_find_var_in_block_tree (tree, tree);
205 /* We always define `record_insns' even if it's not used so that we
206 can always export `prologue_epilogue_contains'. */
207 static void record_insns (rtx, VEC(int,heap) **) ATTRIBUTE_UNUSED;
208 static int contains (const_rtx, VEC(int,heap) **);
209 #ifdef HAVE_return
210 static void emit_return_into_block (basic_block);
211 #endif
212 #if defined(HAVE_epilogue) && defined(INCOMING_RETURN_ADDR_RTX)
213 static rtx keep_stack_depressed (rtx);
214 #endif
215 static void prepare_function_start (void);
216 static void do_clobber_return_reg (rtx, void *);
217 static void do_use_return_reg (rtx, void *);
218 static void set_insn_locators (rtx, int) ATTRIBUTE_UNUSED;
220 /* Pointer to chain of `struct function' for containing functions. */
221 struct function *outer_function_chain;
223 /* Given a function decl for a containing function,
224 return the `struct function' for it. */
226 struct function *
227 find_function_data (tree decl)
229 struct function *p;
231 for (p = outer_function_chain; p; p = p->outer)
232 if (p->decl == decl)
233 return p;
235 gcc_unreachable ();
238 /* Save the current context for compilation of a nested function.
239 This is called from language-specific code. The caller should use
240 the enter_nested langhook to save any language-specific state,
241 since this function knows only about language-independent
242 variables. */
244 void
245 push_function_context_to (tree context ATTRIBUTE_UNUSED)
247 struct function *p;
249 if (cfun == 0)
250 allocate_struct_function (NULL, false);
251 p = cfun;
253 p->outer = outer_function_chain;
254 outer_function_chain = p;
256 lang_hooks.function.enter_nested (p);
258 set_cfun (NULL);
261 void
262 push_function_context (void)
264 push_function_context_to (current_function_decl);
267 /* Restore the last saved context, at the end of a nested function.
268 This function is called from language-specific code. */
270 void
271 pop_function_context_from (tree context ATTRIBUTE_UNUSED)
273 struct function *p = outer_function_chain;
275 set_cfun (p);
276 outer_function_chain = p->outer;
278 current_function_decl = p->decl;
280 lang_hooks.function.leave_nested (p);
282 /* Reset variables that have known state during rtx generation. */
283 virtuals_instantiated = 0;
284 generating_concat_p = 1;
287 void
288 pop_function_context (void)
290 pop_function_context_from (current_function_decl);
293 /* Clear out all parts of the state in F that can safely be discarded
294 after the function has been parsed, but not compiled, to let
295 garbage collection reclaim the memory. */
297 void
298 free_after_parsing (struct function *f)
300 /* f->expr->forced_labels is used by code generation. */
301 /* f->emit->regno_reg_rtx is used by code generation. */
302 /* f->varasm is used by code generation. */
303 /* f->eh->eh_return_stub_label is used by code generation. */
305 lang_hooks.function.final (f);
308 /* Clear out all parts of the state in F that can safely be discarded
309 after the function has been compiled, to let garbage collection
310 reclaim the memory. */
312 void
313 free_after_compilation (struct function *f)
315 VEC_free (int, heap, prologue);
316 VEC_free (int, heap, epilogue);
317 VEC_free (int, heap, sibcall_epilogue);
319 f->eh = NULL;
320 f->expr = NULL;
321 f->emit = NULL;
322 f->varasm = NULL;
323 f->machine = NULL;
324 f->cfg = NULL;
326 f->x_avail_temp_slots = NULL;
327 f->x_used_temp_slots = NULL;
328 f->arg_offset_rtx = NULL;
329 f->return_rtx = NULL;
330 f->internal_arg_pointer = NULL;
331 f->x_nonlocal_goto_handler_labels = NULL;
332 f->x_return_label = NULL;
333 f->x_naked_return_label = NULL;
334 f->x_stack_slot_list = NULL;
335 f->x_stack_check_probe_note = NULL;
336 f->x_arg_pointer_save_area = NULL;
337 f->x_parm_birth_insn = NULL;
338 f->epilogue_delay_list = NULL;
341 /* Allocate fixed slots in the stack frame of the current function. */
343 /* Return size needed for stack frame based on slots so far allocated in
344 function F.
345 This size counts from zero. It is not rounded to PREFERRED_STACK_BOUNDARY;
346 the caller may have to do that. */
348 static HOST_WIDE_INT
349 get_func_frame_size (struct function *f)
351 if (FRAME_GROWS_DOWNWARD)
352 return -f->x_frame_offset;
353 else
354 return f->x_frame_offset;
357 /* Return size needed for stack frame based on slots so far allocated.
358 This size counts from zero. It is not rounded to PREFERRED_STACK_BOUNDARY;
359 the caller may have to do that. */
361 HOST_WIDE_INT
362 get_frame_size (void)
364 return get_func_frame_size (cfun);
367 /* Issue an error message and return TRUE if frame OFFSET overflows in
368 the signed target pointer arithmetics for function FUNC. Otherwise
369 return FALSE. */
371 bool
372 frame_offset_overflow (HOST_WIDE_INT offset, tree func)
374 unsigned HOST_WIDE_INT size = FRAME_GROWS_DOWNWARD ? -offset : offset;
376 if (size > ((unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (Pmode) - 1))
377 /* Leave room for the fixed part of the frame. */
378 - 64 * UNITS_PER_WORD)
380 error ("%Jtotal size of local objects too large", func);
381 return TRUE;
384 return FALSE;
387 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
388 with machine mode MODE.
390 ALIGN controls the amount of alignment for the address of the slot:
391 0 means according to MODE,
392 -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
393 -2 means use BITS_PER_UNIT,
394 positive specifies alignment boundary in bits.
396 We do not round to stack_boundary here.
398 FUNCTION specifies the function to allocate in. */
400 static rtx
401 assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
402 struct function *function)
404 rtx x, addr;
405 int bigend_correction = 0;
406 unsigned int alignment;
407 int frame_off, frame_alignment, frame_phase;
409 if (align == 0)
411 tree type;
413 if (mode == BLKmode)
414 alignment = BIGGEST_ALIGNMENT;
415 else
416 alignment = GET_MODE_ALIGNMENT (mode);
418 /* Allow the target to (possibly) increase the alignment of this
419 stack slot. */
420 type = lang_hooks.types.type_for_mode (mode, 0);
421 if (type)
422 alignment = LOCAL_ALIGNMENT (type, alignment);
424 alignment /= BITS_PER_UNIT;
426 else if (align == -1)
428 alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
429 size = CEIL_ROUND (size, alignment);
431 else if (align == -2)
432 alignment = 1; /* BITS_PER_UNIT / BITS_PER_UNIT */
433 else
434 alignment = align / BITS_PER_UNIT;
436 if (FRAME_GROWS_DOWNWARD)
437 function->x_frame_offset -= size;
439 /* Ignore alignment we can't do with expected alignment of the boundary. */
440 if (alignment * BITS_PER_UNIT > PREFERRED_STACK_BOUNDARY)
441 alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
443 if (function->stack_alignment_needed < alignment * BITS_PER_UNIT)
444 function->stack_alignment_needed = alignment * BITS_PER_UNIT;
446 /* Calculate how many bytes the start of local variables is off from
447 stack alignment. */
448 frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
449 frame_off = STARTING_FRAME_OFFSET % frame_alignment;
450 frame_phase = frame_off ? frame_alignment - frame_off : 0;
452 /* Round the frame offset to the specified alignment. The default is
453 to always honor requests to align the stack but a port may choose to
454 do its own stack alignment by defining STACK_ALIGNMENT_NEEDED. */
455 if (STACK_ALIGNMENT_NEEDED
456 || mode != BLKmode
457 || size != 0)
459 /* We must be careful here, since FRAME_OFFSET might be negative and
460 division with a negative dividend isn't as well defined as we might
461 like. So we instead assume that ALIGNMENT is a power of two and
462 use logical operations which are unambiguous. */
463 if (FRAME_GROWS_DOWNWARD)
464 function->x_frame_offset
465 = (FLOOR_ROUND (function->x_frame_offset - frame_phase,
466 (unsigned HOST_WIDE_INT) alignment)
467 + frame_phase);
468 else
469 function->x_frame_offset
470 = (CEIL_ROUND (function->x_frame_offset - frame_phase,
471 (unsigned HOST_WIDE_INT) alignment)
472 + frame_phase);
475 /* On a big-endian machine, if we are allocating more space than we will use,
476 use the least significant bytes of those that are allocated. */
477 if (BYTES_BIG_ENDIAN && mode != BLKmode && GET_MODE_SIZE (mode) < size)
478 bigend_correction = size - GET_MODE_SIZE (mode);
480 /* If we have already instantiated virtual registers, return the actual
481 address relative to the frame pointer. */
482 if (function == cfun && virtuals_instantiated)
483 addr = plus_constant (frame_pointer_rtx,
484 trunc_int_for_mode
485 (frame_offset + bigend_correction
486 + STARTING_FRAME_OFFSET, Pmode));
487 else
488 addr = plus_constant (virtual_stack_vars_rtx,
489 trunc_int_for_mode
490 (function->x_frame_offset + bigend_correction,
491 Pmode));
493 if (!FRAME_GROWS_DOWNWARD)
494 function->x_frame_offset += size;
496 x = gen_rtx_MEM (mode, addr);
497 MEM_NOTRAP_P (x) = 1;
499 function->x_stack_slot_list
500 = gen_rtx_EXPR_LIST (VOIDmode, x, function->x_stack_slot_list);
502 if (frame_offset_overflow (function->x_frame_offset, function->decl))
503 function->x_frame_offset = 0;
505 return x;
508 /* Wrapper around assign_stack_local_1; assign a local stack slot for the
509 current function. */
512 assign_stack_local (enum machine_mode mode, HOST_WIDE_INT size, int align)
514 return assign_stack_local_1 (mode, size, align, cfun);
518 /* Removes temporary slot TEMP from LIST. */
520 static void
521 cut_slot_from_list (struct temp_slot *temp, struct temp_slot **list)
523 if (temp->next)
524 temp->next->prev = temp->prev;
525 if (temp->prev)
526 temp->prev->next = temp->next;
527 else
528 *list = temp->next;
530 temp->prev = temp->next = NULL;
533 /* Inserts temporary slot TEMP to LIST. */
535 static void
536 insert_slot_to_list (struct temp_slot *temp, struct temp_slot **list)
538 temp->next = *list;
539 if (*list)
540 (*list)->prev = temp;
541 temp->prev = NULL;
542 *list = temp;
545 /* Returns the list of used temp slots at LEVEL. */
547 static struct temp_slot **
548 temp_slots_at_level (int level)
550 if (level >= (int) VEC_length (temp_slot_p, used_temp_slots))
551 VEC_safe_grow_cleared (temp_slot_p, gc, used_temp_slots, level + 1);
553 return &(VEC_address (temp_slot_p, used_temp_slots)[level]);
556 /* Returns the maximal temporary slot level. */
558 static int
559 max_slot_level (void)
561 if (!used_temp_slots)
562 return -1;
564 return VEC_length (temp_slot_p, used_temp_slots) - 1;
567 /* Moves temporary slot TEMP to LEVEL. */
569 static void
570 move_slot_to_level (struct temp_slot *temp, int level)
572 cut_slot_from_list (temp, temp_slots_at_level (temp->level));
573 insert_slot_to_list (temp, temp_slots_at_level (level));
574 temp->level = level;
577 /* Make temporary slot TEMP available. */
579 static void
580 make_slot_available (struct temp_slot *temp)
582 cut_slot_from_list (temp, temp_slots_at_level (temp->level));
583 insert_slot_to_list (temp, &avail_temp_slots);
584 temp->in_use = 0;
585 temp->level = -1;
588 /* Allocate a temporary stack slot and record it for possible later
589 reuse.
591 MODE is the machine mode to be given to the returned rtx.
593 SIZE is the size in units of the space required. We do no rounding here
594 since assign_stack_local will do any required rounding.
596 KEEP is 1 if this slot is to be retained after a call to
597 free_temp_slots. Automatic variables for a block are allocated
598 with this flag. KEEP values of 2 or 3 were needed respectively
599 for variables whose lifetime is controlled by CLEANUP_POINT_EXPRs
600 or for SAVE_EXPRs, but they are now unused.
602 TYPE is the type that will be used for the stack slot. */
605 assign_stack_temp_for_type (enum machine_mode mode, HOST_WIDE_INT size,
606 int keep, tree type)
608 unsigned int align;
609 struct temp_slot *p, *best_p = 0, *selected = NULL, **pp;
610 rtx slot;
612 /* If SIZE is -1 it means that somebody tried to allocate a temporary
613 of a variable size. */
614 gcc_assert (size != -1);
616 /* These are now unused. */
617 gcc_assert (keep <= 1);
619 if (mode == BLKmode)
620 align = BIGGEST_ALIGNMENT;
621 else
622 align = GET_MODE_ALIGNMENT (mode);
624 if (! type)
625 type = lang_hooks.types.type_for_mode (mode, 0);
627 if (type)
628 align = LOCAL_ALIGNMENT (type, align);
630 /* Try to find an available, already-allocated temporary of the proper
631 mode which meets the size and alignment requirements. Choose the
632 smallest one with the closest alignment.
634 If assign_stack_temp is called outside of the tree->rtl expansion,
635 we cannot reuse the stack slots (that may still refer to
636 VIRTUAL_STACK_VARS_REGNUM). */
637 if (!virtuals_instantiated)
639 for (p = avail_temp_slots; p; p = p->next)
641 if (p->align >= align && p->size >= size
642 && GET_MODE (p->slot) == mode
643 && objects_must_conflict_p (p->type, type)
644 && (best_p == 0 || best_p->size > p->size
645 || (best_p->size == p->size && best_p->align > p->align)))
647 if (p->align == align && p->size == size)
649 selected = p;
650 cut_slot_from_list (selected, &avail_temp_slots);
651 best_p = 0;
652 break;
654 best_p = p;
659 /* Make our best, if any, the one to use. */
660 if (best_p)
662 selected = best_p;
663 cut_slot_from_list (selected, &avail_temp_slots);
665 /* If there are enough aligned bytes left over, make them into a new
666 temp_slot so that the extra bytes don't get wasted. Do this only
667 for BLKmode slots, so that we can be sure of the alignment. */
668 if (GET_MODE (best_p->slot) == BLKmode)
670 int alignment = best_p->align / BITS_PER_UNIT;
671 HOST_WIDE_INT rounded_size = CEIL_ROUND (size, alignment);
673 if (best_p->size - rounded_size >= alignment)
675 p = ggc_alloc (sizeof (struct temp_slot));
676 p->in_use = p->addr_taken = 0;
677 p->size = best_p->size - rounded_size;
678 p->base_offset = best_p->base_offset + rounded_size;
679 p->full_size = best_p->full_size - rounded_size;
680 p->slot = adjust_address_nv (best_p->slot, BLKmode, rounded_size);
681 p->align = best_p->align;
682 p->address = 0;
683 p->type = best_p->type;
684 insert_slot_to_list (p, &avail_temp_slots);
686 stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, p->slot,
687 stack_slot_list);
689 best_p->size = rounded_size;
690 best_p->full_size = rounded_size;
695 /* If we still didn't find one, make a new temporary. */
696 if (selected == 0)
698 HOST_WIDE_INT frame_offset_old = frame_offset;
700 p = ggc_alloc (sizeof (struct temp_slot));
702 /* We are passing an explicit alignment request to assign_stack_local.
703 One side effect of that is assign_stack_local will not round SIZE
704 to ensure the frame offset remains suitably aligned.
706 So for requests which depended on the rounding of SIZE, we go ahead
707 and round it now. We also make sure ALIGNMENT is at least
708 BIGGEST_ALIGNMENT. */
709 gcc_assert (mode != BLKmode || align == BIGGEST_ALIGNMENT);
710 p->slot = assign_stack_local (mode,
711 (mode == BLKmode
712 ? CEIL_ROUND (size, (int) align / BITS_PER_UNIT)
713 : size),
714 align);
716 p->align = align;
718 /* The following slot size computation is necessary because we don't
719 know the actual size of the temporary slot until assign_stack_local
720 has performed all the frame alignment and size rounding for the
721 requested temporary. Note that extra space added for alignment
722 can be either above or below this stack slot depending on which
723 way the frame grows. We include the extra space if and only if it
724 is above this slot. */
725 if (FRAME_GROWS_DOWNWARD)
726 p->size = frame_offset_old - frame_offset;
727 else
728 p->size = size;
730 /* Now define the fields used by combine_temp_slots. */
731 if (FRAME_GROWS_DOWNWARD)
733 p->base_offset = frame_offset;
734 p->full_size = frame_offset_old - frame_offset;
736 else
738 p->base_offset = frame_offset_old;
739 p->full_size = frame_offset - frame_offset_old;
741 p->address = 0;
743 selected = p;
746 p = selected;
747 p->in_use = 1;
748 p->addr_taken = 0;
749 p->type = type;
750 p->level = temp_slot_level;
751 p->keep = keep;
753 pp = temp_slots_at_level (p->level);
754 insert_slot_to_list (p, pp);
756 /* Create a new MEM rtx to avoid clobbering MEM flags of old slots. */
757 slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
758 stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
760 /* If we know the alias set for the memory that will be used, use
761 it. If there's no TYPE, then we don't know anything about the
762 alias set for the memory. */
763 set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
764 set_mem_align (slot, align);
766 /* If a type is specified, set the relevant flags. */
767 if (type != 0)
769 MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
770 MEM_SET_IN_STRUCT_P (slot, (AGGREGATE_TYPE_P (type)
771 || TREE_CODE (type) == COMPLEX_TYPE));
773 MEM_NOTRAP_P (slot) = 1;
775 return slot;
778 /* Allocate a temporary stack slot and record it for possible later
779 reuse. First three arguments are same as in preceding function. */
782 assign_stack_temp (enum machine_mode mode, HOST_WIDE_INT size, int keep)
784 return assign_stack_temp_for_type (mode, size, keep, NULL_TREE);
787 /* Assign a temporary.
788 If TYPE_OR_DECL is a decl, then we are doing it on behalf of the decl
789 and so that should be used in error messages. In either case, we
790 allocate of the given type.
791 KEEP is as for assign_stack_temp.
792 MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
793 it is 0 if a register is OK.
794 DONT_PROMOTE is 1 if we should not promote values in register
795 to wider modes. */
798 assign_temp (tree type_or_decl, int keep, int memory_required,
799 int dont_promote ATTRIBUTE_UNUSED)
801 tree type, decl;
802 enum machine_mode mode;
803 #ifdef PROMOTE_MODE
804 int unsignedp;
805 #endif
807 if (DECL_P (type_or_decl))
808 decl = type_or_decl, type = TREE_TYPE (decl);
809 else
810 decl = NULL, type = type_or_decl;
812 mode = TYPE_MODE (type);
813 #ifdef PROMOTE_MODE
814 unsignedp = TYPE_UNSIGNED (type);
815 #endif
817 if (mode == BLKmode || memory_required)
819 HOST_WIDE_INT size = int_size_in_bytes (type);
820 rtx tmp;
822 /* Zero sized arrays are GNU C extension. Set size to 1 to avoid
823 problems with allocating the stack space. */
824 if (size == 0)
825 size = 1;
827 /* Unfortunately, we don't yet know how to allocate variable-sized
828 temporaries. However, sometimes we can find a fixed upper limit on
829 the size, so try that instead. */
830 else if (size == -1)
831 size = max_int_size_in_bytes (type);
833 /* The size of the temporary may be too large to fit into an integer. */
834 /* ??? Not sure this should happen except for user silliness, so limit
835 this to things that aren't compiler-generated temporaries. The
836 rest of the time we'll die in assign_stack_temp_for_type. */
837 if (decl && size == -1
838 && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST)
840 error ("size of variable %q+D is too large", decl);
841 size = 1;
844 tmp = assign_stack_temp_for_type (mode, size, keep, type);
845 return tmp;
848 #ifdef PROMOTE_MODE
849 if (! dont_promote)
850 mode = promote_mode (type, mode, &unsignedp, 0);
851 #endif
853 return gen_reg_rtx (mode);
856 /* Combine temporary stack slots which are adjacent on the stack.
858 This allows for better use of already allocated stack space. This is only
859 done for BLKmode slots because we can be sure that we won't have alignment
860 problems in this case. */
862 static void
863 combine_temp_slots (void)
865 struct temp_slot *p, *q, *next, *next_q;
866 int num_slots;
868 /* We can't combine slots, because the information about which slot
869 is in which alias set will be lost. */
870 if (flag_strict_aliasing)
871 return;
873 /* If there are a lot of temp slots, don't do anything unless
874 high levels of optimization. */
875 if (! flag_expensive_optimizations)
876 for (p = avail_temp_slots, num_slots = 0; p; p = p->next, num_slots++)
877 if (num_slots > 100 || (num_slots > 10 && optimize == 0))
878 return;
880 for (p = avail_temp_slots; p; p = next)
882 int delete_p = 0;
884 next = p->next;
886 if (GET_MODE (p->slot) != BLKmode)
887 continue;
889 for (q = p->next; q; q = next_q)
891 int delete_q = 0;
893 next_q = q->next;
895 if (GET_MODE (q->slot) != BLKmode)
896 continue;
898 if (p->base_offset + p->full_size == q->base_offset)
900 /* Q comes after P; combine Q into P. */
901 p->size += q->size;
902 p->full_size += q->full_size;
903 delete_q = 1;
905 else if (q->base_offset + q->full_size == p->base_offset)
907 /* P comes after Q; combine P into Q. */
908 q->size += p->size;
909 q->full_size += p->full_size;
910 delete_p = 1;
911 break;
913 if (delete_q)
914 cut_slot_from_list (q, &avail_temp_slots);
917 /* Either delete P or advance past it. */
918 if (delete_p)
919 cut_slot_from_list (p, &avail_temp_slots);
923 /* Find the temp slot corresponding to the object at address X. */
925 static struct temp_slot *
926 find_temp_slot_from_address (rtx x)
928 struct temp_slot *p;
929 rtx next;
930 int i;
932 for (i = max_slot_level (); i >= 0; i--)
933 for (p = *temp_slots_at_level (i); p; p = p->next)
935 if (XEXP (p->slot, 0) == x
936 || p->address == x
937 || (GET_CODE (x) == PLUS
938 && XEXP (x, 0) == virtual_stack_vars_rtx
939 && GET_CODE (XEXP (x, 1)) == CONST_INT
940 && INTVAL (XEXP (x, 1)) >= p->base_offset
941 && INTVAL (XEXP (x, 1)) < p->base_offset + p->full_size))
942 return p;
944 else if (p->address != 0 && GET_CODE (p->address) == EXPR_LIST)
945 for (next = p->address; next; next = XEXP (next, 1))
946 if (XEXP (next, 0) == x)
947 return p;
950 /* If we have a sum involving a register, see if it points to a temp
951 slot. */
952 if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
953 && (p = find_temp_slot_from_address (XEXP (x, 0))) != 0)
954 return p;
955 else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 1))
956 && (p = find_temp_slot_from_address (XEXP (x, 1))) != 0)
957 return p;
959 return 0;
962 /* Indicate that NEW is an alternate way of referring to the temp slot
963 that previously was known by OLD. */
965 void
966 update_temp_slot_address (rtx old, rtx new)
968 struct temp_slot *p;
970 if (rtx_equal_p (old, new))
971 return;
973 p = find_temp_slot_from_address (old);
975 /* If we didn't find one, see if both OLD is a PLUS. If so, and NEW
976 is a register, see if one operand of the PLUS is a temporary
977 location. If so, NEW points into it. Otherwise, if both OLD and
978 NEW are a PLUS and if there is a register in common between them.
979 If so, try a recursive call on those values. */
980 if (p == 0)
982 if (GET_CODE (old) != PLUS)
983 return;
985 if (REG_P (new))
987 update_temp_slot_address (XEXP (old, 0), new);
988 update_temp_slot_address (XEXP (old, 1), new);
989 return;
991 else if (GET_CODE (new) != PLUS)
992 return;
994 if (rtx_equal_p (XEXP (old, 0), XEXP (new, 0)))
995 update_temp_slot_address (XEXP (old, 1), XEXP (new, 1));
996 else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 0)))
997 update_temp_slot_address (XEXP (old, 0), XEXP (new, 1));
998 else if (rtx_equal_p (XEXP (old, 0), XEXP (new, 1)))
999 update_temp_slot_address (XEXP (old, 1), XEXP (new, 0));
1000 else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 1)))
1001 update_temp_slot_address (XEXP (old, 0), XEXP (new, 0));
1003 return;
1006 /* Otherwise add an alias for the temp's address. */
1007 else if (p->address == 0)
1008 p->address = new;
1009 else
1011 if (GET_CODE (p->address) != EXPR_LIST)
1012 p->address = gen_rtx_EXPR_LIST (VOIDmode, p->address, NULL_RTX);
1014 p->address = gen_rtx_EXPR_LIST (VOIDmode, new, p->address);
1018 /* If X could be a reference to a temporary slot, mark the fact that its
1019 address was taken. */
1021 void
1022 mark_temp_addr_taken (rtx x)
1024 struct temp_slot *p;
1026 if (x == 0)
1027 return;
1029 /* If X is not in memory or is at a constant address, it cannot be in
1030 a temporary slot. */
1031 if (!MEM_P (x) || CONSTANT_P (XEXP (x, 0)))
1032 return;
1034 p = find_temp_slot_from_address (XEXP (x, 0));
1035 if (p != 0)
1036 p->addr_taken = 1;
1039 /* If X could be a reference to a temporary slot, mark that slot as
1040 belonging to the to one level higher than the current level. If X
1041 matched one of our slots, just mark that one. Otherwise, we can't
1042 easily predict which it is, so upgrade all of them. Kept slots
1043 need not be touched.
1045 This is called when an ({...}) construct occurs and a statement
1046 returns a value in memory. */
1048 void
1049 preserve_temp_slots (rtx x)
1051 struct temp_slot *p = 0, *next;
1053 /* If there is no result, we still might have some objects whose address
1054 were taken, so we need to make sure they stay around. */
1055 if (x == 0)
1057 for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1059 next = p->next;
1061 if (p->addr_taken)
1062 move_slot_to_level (p, temp_slot_level - 1);
1065 return;
1068 /* If X is a register that is being used as a pointer, see if we have
1069 a temporary slot we know it points to. To be consistent with
1070 the code below, we really should preserve all non-kept slots
1071 if we can't find a match, but that seems to be much too costly. */
1072 if (REG_P (x) && REG_POINTER (x))
1073 p = find_temp_slot_from_address (x);
1075 /* If X is not in memory or is at a constant address, it cannot be in
1076 a temporary slot, but it can contain something whose address was
1077 taken. */
1078 if (p == 0 && (!MEM_P (x) || CONSTANT_P (XEXP (x, 0))))
1080 for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1082 next = p->next;
1084 if (p->addr_taken)
1085 move_slot_to_level (p, temp_slot_level - 1);
1088 return;
1091 /* First see if we can find a match. */
1092 if (p == 0)
1093 p = find_temp_slot_from_address (XEXP (x, 0));
1095 if (p != 0)
1097 /* Move everything at our level whose address was taken to our new
1098 level in case we used its address. */
1099 struct temp_slot *q;
1101 if (p->level == temp_slot_level)
1103 for (q = *temp_slots_at_level (temp_slot_level); q; q = next)
1105 next = q->next;
1107 if (p != q && q->addr_taken)
1108 move_slot_to_level (q, temp_slot_level - 1);
1111 move_slot_to_level (p, temp_slot_level - 1);
1112 p->addr_taken = 0;
1114 return;
1117 /* Otherwise, preserve all non-kept slots at this level. */
1118 for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1120 next = p->next;
1122 if (!p->keep)
1123 move_slot_to_level (p, temp_slot_level - 1);
1127 /* Free all temporaries used so far. This is normally called at the
1128 end of generating code for a statement. */
1130 void
1131 free_temp_slots (void)
1133 struct temp_slot *p, *next;
1135 for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1137 next = p->next;
1139 if (!p->keep)
1140 make_slot_available (p);
1143 combine_temp_slots ();
1146 /* Push deeper into the nesting level for stack temporaries. */
1148 void
1149 push_temp_slots (void)
1151 temp_slot_level++;
1154 /* Pop a temporary nesting level. All slots in use in the current level
1155 are freed. */
1157 void
1158 pop_temp_slots (void)
1160 struct temp_slot *p, *next;
1162 for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1164 next = p->next;
1165 make_slot_available (p);
1168 combine_temp_slots ();
1170 temp_slot_level--;
1173 /* Initialize temporary slots. */
1175 void
1176 init_temp_slots (void)
1178 /* We have not allocated any temporaries yet. */
1179 avail_temp_slots = 0;
1180 used_temp_slots = 0;
1181 temp_slot_level = 0;
1184 /* These routines are responsible for converting virtual register references
1185 to the actual hard register references once RTL generation is complete.
1187 The following four variables are used for communication between the
1188 routines. They contain the offsets of the virtual registers from their
1189 respective hard registers. */
1191 static int in_arg_offset;
1192 static int var_offset;
1193 static int dynamic_offset;
1194 static int out_arg_offset;
1195 static int cfa_offset;
1197 /* In most machines, the stack pointer register is equivalent to the bottom
1198 of the stack. */
1200 #ifndef STACK_POINTER_OFFSET
1201 #define STACK_POINTER_OFFSET 0
1202 #endif
1204 /* If not defined, pick an appropriate default for the offset of dynamically
1205 allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1206 REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */
1208 #ifndef STACK_DYNAMIC_OFFSET
1210 /* The bottom of the stack points to the actual arguments. If
1211 REG_PARM_STACK_SPACE is defined, this includes the space for the register
1212 parameters. However, if OUTGOING_REG_PARM_STACK space is not defined,
1213 stack space for register parameters is not pushed by the caller, but
1214 rather part of the fixed stack areas and hence not included in
1215 `current_function_outgoing_args_size'. Nevertheless, we must allow
1216 for it when allocating stack dynamic objects. */
1218 #if defined(REG_PARM_STACK_SPACE)
1219 #define STACK_DYNAMIC_OFFSET(FNDECL) \
1220 ((ACCUMULATE_OUTGOING_ARGS \
1221 ? (current_function_outgoing_args_size \
1222 + (OUTGOING_REG_PARM_STACK_SPACE ? 0 : REG_PARM_STACK_SPACE (FNDECL))) \
1223 : 0) + (STACK_POINTER_OFFSET))
1224 #else
1225 #define STACK_DYNAMIC_OFFSET(FNDECL) \
1226 ((ACCUMULATE_OUTGOING_ARGS ? current_function_outgoing_args_size : 0) \
1227 + (STACK_POINTER_OFFSET))
1228 #endif
1229 #endif
1232 /* Given a piece of RTX and a pointer to a HOST_WIDE_INT, if the RTX
1233 is a virtual register, return the equivalent hard register and set the
1234 offset indirectly through the pointer. Otherwise, return 0. */
1236 static rtx
1237 instantiate_new_reg (rtx x, HOST_WIDE_INT *poffset)
1239 rtx new;
1240 HOST_WIDE_INT offset;
1242 if (x == virtual_incoming_args_rtx)
1243 new = arg_pointer_rtx, offset = in_arg_offset;
1244 else if (x == virtual_stack_vars_rtx)
1245 new = frame_pointer_rtx, offset = var_offset;
1246 else if (x == virtual_stack_dynamic_rtx)
1247 new = stack_pointer_rtx, offset = dynamic_offset;
1248 else if (x == virtual_outgoing_args_rtx)
1249 new = stack_pointer_rtx, offset = out_arg_offset;
1250 else if (x == virtual_cfa_rtx)
1252 #ifdef FRAME_POINTER_CFA_OFFSET
1253 new = frame_pointer_rtx;
1254 #else
1255 new = arg_pointer_rtx;
1256 #endif
1257 offset = cfa_offset;
1259 else
1260 return NULL_RTX;
1262 *poffset = offset;
1263 return new;
1266 /* A subroutine of instantiate_virtual_regs, called via for_each_rtx.
1267 Instantiate any virtual registers present inside of *LOC. The expression
1268 is simplified, as much as possible, but is not to be considered "valid"
1269 in any sense implied by the target. If any change is made, set CHANGED
1270 to true. */
1272 static int
1273 instantiate_virtual_regs_in_rtx (rtx *loc, void *data)
1275 HOST_WIDE_INT offset;
1276 bool *changed = (bool *) data;
1277 rtx x, new;
1279 x = *loc;
1280 if (x == 0)
1281 return 0;
1283 switch (GET_CODE (x))
1285 case REG:
1286 new = instantiate_new_reg (x, &offset);
1287 if (new)
1289 *loc = plus_constant (new, offset);
1290 if (changed)
1291 *changed = true;
1293 return -1;
1295 case PLUS:
1296 new = instantiate_new_reg (XEXP (x, 0), &offset);
1297 if (new)
1299 new = plus_constant (new, offset);
1300 *loc = simplify_gen_binary (PLUS, GET_MODE (x), new, XEXP (x, 1));
1301 if (changed)
1302 *changed = true;
1303 return -1;
1306 /* FIXME -- from old code */
1307 /* If we have (plus (subreg (virtual-reg)) (const_int)), we know
1308 we can commute the PLUS and SUBREG because pointers into the
1309 frame are well-behaved. */
1310 break;
1312 default:
1313 break;
1316 return 0;
1319 /* A subroutine of instantiate_virtual_regs_in_insn. Return true if X
1320 matches the predicate for insn CODE operand OPERAND. */
1322 static int
1323 safe_insn_predicate (int code, int operand, rtx x)
1325 const struct insn_operand_data *op_data;
1327 if (code < 0)
1328 return true;
1330 op_data = &insn_data[code].operand[operand];
1331 if (op_data->predicate == NULL)
1332 return true;
1334 return op_data->predicate (x, op_data->mode);
1337 /* A subroutine of instantiate_virtual_regs. Instantiate any virtual
1338 registers present inside of insn. The result will be a valid insn. */
1340 static void
1341 instantiate_virtual_regs_in_insn (rtx insn)
1343 HOST_WIDE_INT offset;
1344 int insn_code, i;
1345 bool any_change = false;
1346 rtx set, new, x, seq;
1348 /* There are some special cases to be handled first. */
1349 set = single_set (insn);
1350 if (set)
1352 /* We're allowed to assign to a virtual register. This is interpreted
1353 to mean that the underlying register gets assigned the inverse
1354 transformation. This is used, for example, in the handling of
1355 non-local gotos. */
1356 new = instantiate_new_reg (SET_DEST (set), &offset);
1357 if (new)
1359 start_sequence ();
1361 for_each_rtx (&SET_SRC (set), instantiate_virtual_regs_in_rtx, NULL);
1362 x = simplify_gen_binary (PLUS, GET_MODE (new), SET_SRC (set),
1363 GEN_INT (-offset));
1364 x = force_operand (x, new);
1365 if (x != new)
1366 emit_move_insn (new, x);
1368 seq = get_insns ();
1369 end_sequence ();
1371 emit_insn_before (seq, insn);
1372 delete_insn (insn);
1373 return;
1376 /* Handle a straight copy from a virtual register by generating a
1377 new add insn. The difference between this and falling through
1378 to the generic case is avoiding a new pseudo and eliminating a
1379 move insn in the initial rtl stream. */
1380 new = instantiate_new_reg (SET_SRC (set), &offset);
1381 if (new && offset != 0
1382 && REG_P (SET_DEST (set))
1383 && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1385 start_sequence ();
1387 x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS,
1388 new, GEN_INT (offset), SET_DEST (set),
1389 1, OPTAB_LIB_WIDEN);
1390 if (x != SET_DEST (set))
1391 emit_move_insn (SET_DEST (set), x);
1393 seq = get_insns ();
1394 end_sequence ();
1396 emit_insn_before (seq, insn);
1397 delete_insn (insn);
1398 return;
1401 extract_insn (insn);
1402 insn_code = INSN_CODE (insn);
1404 /* Handle a plus involving a virtual register by determining if the
1405 operands remain valid if they're modified in place. */
1406 if (GET_CODE (SET_SRC (set)) == PLUS
1407 && recog_data.n_operands >= 3
1408 && recog_data.operand_loc[1] == &XEXP (SET_SRC (set), 0)
1409 && recog_data.operand_loc[2] == &XEXP (SET_SRC (set), 1)
1410 && GET_CODE (recog_data.operand[2]) == CONST_INT
1411 && (new = instantiate_new_reg (recog_data.operand[1], &offset)))
1413 offset += INTVAL (recog_data.operand[2]);
1415 /* If the sum is zero, then replace with a plain move. */
1416 if (offset == 0
1417 && REG_P (SET_DEST (set))
1418 && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1420 start_sequence ();
1421 emit_move_insn (SET_DEST (set), new);
1422 seq = get_insns ();
1423 end_sequence ();
1425 emit_insn_before (seq, insn);
1426 delete_insn (insn);
1427 return;
1430 x = gen_int_mode (offset, recog_data.operand_mode[2]);
1432 /* Using validate_change and apply_change_group here leaves
1433 recog_data in an invalid state. Since we know exactly what
1434 we want to check, do those two by hand. */
1435 if (safe_insn_predicate (insn_code, 1, new)
1436 && safe_insn_predicate (insn_code, 2, x))
1438 *recog_data.operand_loc[1] = recog_data.operand[1] = new;
1439 *recog_data.operand_loc[2] = recog_data.operand[2] = x;
1440 any_change = true;
1442 /* Fall through into the regular operand fixup loop in
1443 order to take care of operands other than 1 and 2. */
1447 else
1449 extract_insn (insn);
1450 insn_code = INSN_CODE (insn);
1453 /* In the general case, we expect virtual registers to appear only in
1454 operands, and then only as either bare registers or inside memories. */
1455 for (i = 0; i < recog_data.n_operands; ++i)
1457 x = recog_data.operand[i];
1458 switch (GET_CODE (x))
1460 case MEM:
1462 rtx addr = XEXP (x, 0);
1463 bool changed = false;
1465 for_each_rtx (&addr, instantiate_virtual_regs_in_rtx, &changed);
1466 if (!changed)
1467 continue;
1469 start_sequence ();
1470 x = replace_equiv_address (x, addr);
1471 /* It may happen that the address with the virtual reg
1472 was valid (e.g. based on the virtual stack reg, which might
1473 be acceptable to the predicates with all offsets), whereas
1474 the address now isn't anymore, for instance when the address
1475 is still offsetted, but the base reg isn't virtual-stack-reg
1476 anymore. Below we would do a force_reg on the whole operand,
1477 but this insn might actually only accept memory. Hence,
1478 before doing that last resort, try to reload the address into
1479 a register, so this operand stays a MEM. */
1480 if (!safe_insn_predicate (insn_code, i, x))
1482 addr = force_reg (GET_MODE (addr), addr);
1483 x = replace_equiv_address (x, addr);
1485 seq = get_insns ();
1486 end_sequence ();
1487 if (seq)
1488 emit_insn_before (seq, insn);
1490 break;
1492 case REG:
1493 new = instantiate_new_reg (x, &offset);
1494 if (new == NULL)
1495 continue;
1496 if (offset == 0)
1497 x = new;
1498 else
1500 start_sequence ();
1502 /* Careful, special mode predicates may have stuff in
1503 insn_data[insn_code].operand[i].mode that isn't useful
1504 to us for computing a new value. */
1505 /* ??? Recognize address_operand and/or "p" constraints
1506 to see if (plus new offset) is a valid before we put
1507 this through expand_simple_binop. */
1508 x = expand_simple_binop (GET_MODE (x), PLUS, new,
1509 GEN_INT (offset), NULL_RTX,
1510 1, OPTAB_LIB_WIDEN);
1511 seq = get_insns ();
1512 end_sequence ();
1513 emit_insn_before (seq, insn);
1515 break;
1517 case SUBREG:
1518 new = instantiate_new_reg (SUBREG_REG (x), &offset);
1519 if (new == NULL)
1520 continue;
1521 if (offset != 0)
1523 start_sequence ();
1524 new = expand_simple_binop (GET_MODE (new), PLUS, new,
1525 GEN_INT (offset), NULL_RTX,
1526 1, OPTAB_LIB_WIDEN);
1527 seq = get_insns ();
1528 end_sequence ();
1529 emit_insn_before (seq, insn);
1531 x = simplify_gen_subreg (recog_data.operand_mode[i], new,
1532 GET_MODE (new), SUBREG_BYTE (x));
1533 break;
1535 default:
1536 continue;
1539 /* At this point, X contains the new value for the operand.
1540 Validate the new value vs the insn predicate. Note that
1541 asm insns will have insn_code -1 here. */
1542 if (!safe_insn_predicate (insn_code, i, x))
1544 start_sequence ();
1545 x = force_reg (insn_data[insn_code].operand[i].mode, x);
1546 seq = get_insns ();
1547 end_sequence ();
1548 if (seq)
1549 emit_insn_before (seq, insn);
1552 *recog_data.operand_loc[i] = recog_data.operand[i] = x;
1553 any_change = true;
1556 if (any_change)
1558 /* Propagate operand changes into the duplicates. */
1559 for (i = 0; i < recog_data.n_dups; ++i)
1560 *recog_data.dup_loc[i]
1561 = copy_rtx (recog_data.operand[(unsigned)recog_data.dup_num[i]]);
1563 /* Force re-recognition of the instruction for validation. */
1564 INSN_CODE (insn) = -1;
1567 if (asm_noperands (PATTERN (insn)) >= 0)
1569 if (!check_asm_operands (PATTERN (insn)))
1571 error_for_asm (insn, "impossible constraint in %<asm%>");
1572 delete_insn (insn);
1575 else
1577 if (recog_memoized (insn) < 0)
1578 fatal_insn_not_found (insn);
1582 /* Subroutine of instantiate_decls. Given RTL representing a decl,
1583 do any instantiation required. */
1585 void
1586 instantiate_decl_rtl (rtx x)
1588 rtx addr;
1590 if (x == 0)
1591 return;
1593 /* If this is a CONCAT, recurse for the pieces. */
1594 if (GET_CODE (x) == CONCAT)
1596 instantiate_decl_rtl (XEXP (x, 0));
1597 instantiate_decl_rtl (XEXP (x, 1));
1598 return;
1601 /* If this is not a MEM, no need to do anything. Similarly if the
1602 address is a constant or a register that is not a virtual register. */
1603 if (!MEM_P (x))
1604 return;
1606 addr = XEXP (x, 0);
1607 if (CONSTANT_P (addr)
1608 || (REG_P (addr)
1609 && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
1610 || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
1611 return;
1613 for_each_rtx (&XEXP (x, 0), instantiate_virtual_regs_in_rtx, NULL);
1616 /* Helper for instantiate_decls called via walk_tree: Process all decls
1617 in the given DECL_VALUE_EXPR. */
1619 static tree
1620 instantiate_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1622 tree t = *tp;
1623 if (! EXPR_P (t) && ! GIMPLE_STMT_P (t))
1625 *walk_subtrees = 0;
1626 if (DECL_P (t) && DECL_RTL_SET_P (t))
1627 instantiate_decl_rtl (DECL_RTL (t));
1629 return NULL;
1632 /* Subroutine of instantiate_decls: Process all decls in the given
1633 BLOCK node and all its subblocks. */
1635 static void
1636 instantiate_decls_1 (tree let)
1638 tree t;
1640 for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
1642 if (DECL_RTL_SET_P (t))
1643 instantiate_decl_rtl (DECL_RTL (t));
1644 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
1646 tree v = DECL_VALUE_EXPR (t);
1647 walk_tree (&v, instantiate_expr, NULL, NULL);
1651 /* Process all subblocks. */
1652 for (t = BLOCK_SUBBLOCKS (let); t; t = BLOCK_CHAIN (t))
1653 instantiate_decls_1 (t);
1656 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1657 all virtual registers in their DECL_RTL's. */
1659 static void
1660 instantiate_decls (tree fndecl)
1662 tree decl;
1664 /* Process all parameters of the function. */
1665 for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
1667 instantiate_decl_rtl (DECL_RTL (decl));
1668 instantiate_decl_rtl (DECL_INCOMING_RTL (decl));
1669 if (DECL_HAS_VALUE_EXPR_P (decl))
1671 tree v = DECL_VALUE_EXPR (decl);
1672 walk_tree (&v, instantiate_expr, NULL, NULL);
1676 /* Now process all variables defined in the function or its subblocks. */
1677 instantiate_decls_1 (DECL_INITIAL (fndecl));
1680 /* Pass through the INSNS of function FNDECL and convert virtual register
1681 references to hard register references. */
1683 static unsigned int
1684 instantiate_virtual_regs (void)
1686 rtx insn;
1688 /* Compute the offsets to use for this function. */
1689 in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
1690 var_offset = STARTING_FRAME_OFFSET;
1691 dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
1692 out_arg_offset = STACK_POINTER_OFFSET;
1693 #ifdef FRAME_POINTER_CFA_OFFSET
1694 cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
1695 #else
1696 cfa_offset = ARG_POINTER_CFA_OFFSET (current_function_decl);
1697 #endif
1699 /* Initialize recognition, indicating that volatile is OK. */
1700 init_recog ();
1702 /* Scan through all the insns, instantiating every virtual register still
1703 present. */
1704 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1705 if (INSN_P (insn))
1707 /* These patterns in the instruction stream can never be recognized.
1708 Fortunately, they shouldn't contain virtual registers either. */
1709 if (GET_CODE (PATTERN (insn)) == USE
1710 || GET_CODE (PATTERN (insn)) == CLOBBER
1711 || GET_CODE (PATTERN (insn)) == ADDR_VEC
1712 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
1713 || GET_CODE (PATTERN (insn)) == ASM_INPUT)
1714 continue;
1716 instantiate_virtual_regs_in_insn (insn);
1718 if (INSN_DELETED_P (insn))
1719 continue;
1721 for_each_rtx (&REG_NOTES (insn), instantiate_virtual_regs_in_rtx, NULL);
1723 /* Instantiate any virtual registers in CALL_INSN_FUNCTION_USAGE. */
1724 if (GET_CODE (insn) == CALL_INSN)
1725 for_each_rtx (&CALL_INSN_FUNCTION_USAGE (insn),
1726 instantiate_virtual_regs_in_rtx, NULL);
1729 /* Instantiate the virtual registers in the DECLs for debugging purposes. */
1730 instantiate_decls (current_function_decl);
1732 targetm.instantiate_decls ();
1734 /* Indicate that, from now on, assign_stack_local should use
1735 frame_pointer_rtx. */
1736 virtuals_instantiated = 1;
1737 return 0;
1740 struct tree_opt_pass pass_instantiate_virtual_regs =
1742 "vregs", /* name */
1743 NULL, /* gate */
1744 instantiate_virtual_regs, /* execute */
1745 NULL, /* sub */
1746 NULL, /* next */
1747 0, /* static_pass_number */
1748 0, /* tv_id */
1749 0, /* properties_required */
1750 0, /* properties_provided */
1751 0, /* properties_destroyed */
1752 0, /* todo_flags_start */
1753 TODO_dump_func, /* todo_flags_finish */
1754 0 /* letter */
1758 /* Return 1 if EXP is an aggregate type (or a value with aggregate type).
1759 This means a type for which function calls must pass an address to the
1760 function or get an address back from the function.
1761 EXP may be a type node or an expression (whose type is tested). */
1764 aggregate_value_p (const_tree exp, const_tree fntype)
1766 int i, regno, nregs;
1767 rtx reg;
1769 const_tree type = (TYPE_P (exp)) ? exp : TREE_TYPE (exp);
1771 /* DECL node associated with FNTYPE when relevant, which we might need to
1772 check for by-invisible-reference returns, typically for CALL_EXPR input
1773 EXPressions. */
1774 const_tree fndecl = NULL_TREE;
1776 if (fntype)
1777 switch (TREE_CODE (fntype))
1779 case CALL_EXPR:
1780 fndecl = get_callee_fndecl (fntype);
1781 fntype = fndecl ? TREE_TYPE (fndecl) : 0;
1782 break;
1783 case FUNCTION_DECL:
1784 fndecl = fntype;
1785 fntype = TREE_TYPE (fndecl);
1786 break;
1787 case FUNCTION_TYPE:
1788 case METHOD_TYPE:
1789 break;
1790 case IDENTIFIER_NODE:
1791 fntype = 0;
1792 break;
1793 default:
1794 /* We don't expect other rtl types here. */
1795 gcc_unreachable ();
1798 if (TREE_CODE (type) == VOID_TYPE)
1799 return 0;
1801 /* If the front end has decided that this needs to be passed by
1802 reference, do so. */
1803 if ((TREE_CODE (exp) == PARM_DECL || TREE_CODE (exp) == RESULT_DECL)
1804 && DECL_BY_REFERENCE (exp))
1805 return 1;
1807 /* If the EXPression is a CALL_EXPR, honor DECL_BY_REFERENCE set on the
1808 called function RESULT_DECL, meaning the function returns in memory by
1809 invisible reference. This check lets front-ends not set TREE_ADDRESSABLE
1810 on the function type, which used to be the way to request such a return
1811 mechanism but might now be causing troubles at gimplification time if
1812 temporaries with the function type need to be created. */
1813 if (TREE_CODE (exp) == CALL_EXPR && fndecl && DECL_RESULT (fndecl)
1814 && DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
1815 return 1;
1817 if (targetm.calls.return_in_memory (type, fntype))
1818 return 1;
1819 /* Types that are TREE_ADDRESSABLE must be constructed in memory,
1820 and thus can't be returned in registers. */
1821 if (TREE_ADDRESSABLE (type))
1822 return 1;
1823 if (flag_pcc_struct_return && AGGREGATE_TYPE_P (type))
1824 return 1;
1825 /* Make sure we have suitable call-clobbered regs to return
1826 the value in; if not, we must return it in memory. */
1827 reg = hard_function_value (type, 0, fntype, 0);
1829 /* If we have something other than a REG (e.g. a PARALLEL), then assume
1830 it is OK. */
1831 if (!REG_P (reg))
1832 return 0;
1834 regno = REGNO (reg);
1835 nregs = hard_regno_nregs[regno][TYPE_MODE (type)];
1836 for (i = 0; i < nregs; i++)
1837 if (! call_used_regs[regno + i])
1838 return 1;
1839 return 0;
1842 /* Return true if we should assign DECL a pseudo register; false if it
1843 should live on the local stack. */
1845 bool
1846 use_register_for_decl (const_tree decl)
1848 /* Honor volatile. */
1849 if (TREE_SIDE_EFFECTS (decl))
1850 return false;
1852 /* Honor addressability. */
1853 if (TREE_ADDRESSABLE (decl))
1854 return false;
1856 /* Only register-like things go in registers. */
1857 if (DECL_MODE (decl) == BLKmode)
1858 return false;
1860 /* If -ffloat-store specified, don't put explicit float variables
1861 into registers. */
1862 /* ??? This should be checked after DECL_ARTIFICIAL, but tree-ssa
1863 propagates values across these stores, and it probably shouldn't. */
1864 if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)))
1865 return false;
1867 /* If we're not interested in tracking debugging information for
1868 this decl, then we can certainly put it in a register. */
1869 if (DECL_IGNORED_P (decl))
1870 return true;
1872 return (optimize || DECL_REGISTER (decl));
1875 /* Return true if TYPE should be passed by invisible reference. */
1877 bool
1878 pass_by_reference (CUMULATIVE_ARGS *ca, enum machine_mode mode,
1879 tree type, bool named_arg)
1881 if (type)
1883 /* If this type contains non-trivial constructors, then it is
1884 forbidden for the middle-end to create any new copies. */
1885 if (TREE_ADDRESSABLE (type))
1886 return true;
1888 /* GCC post 3.4 passes *all* variable sized types by reference. */
1889 if (!TYPE_SIZE (type) || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1890 return true;
1893 return targetm.calls.pass_by_reference (ca, mode, type, named_arg);
1896 /* Return true if TYPE, which is passed by reference, should be callee
1897 copied instead of caller copied. */
1899 bool
1900 reference_callee_copied (CUMULATIVE_ARGS *ca, enum machine_mode mode,
1901 tree type, bool named_arg)
1903 if (type && TREE_ADDRESSABLE (type))
1904 return false;
1905 return targetm.calls.callee_copies (ca, mode, type, named_arg);
1908 /* Structures to communicate between the subroutines of assign_parms.
1909 The first holds data persistent across all parameters, the second
1910 is cleared out for each parameter. */
1912 struct assign_parm_data_all
1914 CUMULATIVE_ARGS args_so_far;
1915 struct args_size stack_args_size;
1916 tree function_result_decl;
1917 tree orig_fnargs;
1918 rtx first_conversion_insn;
1919 rtx last_conversion_insn;
1920 HOST_WIDE_INT pretend_args_size;
1921 HOST_WIDE_INT extra_pretend_bytes;
1922 int reg_parm_stack_space;
1925 struct assign_parm_data_one
1927 tree nominal_type;
1928 tree passed_type;
1929 rtx entry_parm;
1930 rtx stack_parm;
1931 enum machine_mode nominal_mode;
1932 enum machine_mode passed_mode;
1933 enum machine_mode promoted_mode;
1934 struct locate_and_pad_arg_data locate;
1935 int partial;
1936 BOOL_BITFIELD named_arg : 1;
1937 BOOL_BITFIELD passed_pointer : 1;
1938 BOOL_BITFIELD on_stack : 1;
1939 BOOL_BITFIELD loaded_in_reg : 1;
1942 /* A subroutine of assign_parms. Initialize ALL. */
1944 static void
1945 assign_parms_initialize_all (struct assign_parm_data_all *all)
1947 tree fntype;
1949 memset (all, 0, sizeof (*all));
1951 fntype = TREE_TYPE (current_function_decl);
1953 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
1954 INIT_CUMULATIVE_INCOMING_ARGS (all->args_so_far, fntype, NULL_RTX);
1955 #else
1956 INIT_CUMULATIVE_ARGS (all->args_so_far, fntype, NULL_RTX,
1957 current_function_decl, -1);
1958 #endif
1960 #ifdef REG_PARM_STACK_SPACE
1961 all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl);
1962 #endif
1965 /* If ARGS contains entries with complex types, split the entry into two
1966 entries of the component type. Return a new list of substitutions are
1967 needed, else the old list. */
1969 static tree
1970 split_complex_args (tree args)
1972 tree p;
1974 /* Before allocating memory, check for the common case of no complex. */
1975 for (p = args; p; p = TREE_CHAIN (p))
1977 tree type = TREE_TYPE (p);
1978 if (TREE_CODE (type) == COMPLEX_TYPE
1979 && targetm.calls.split_complex_arg (type))
1980 goto found;
1982 return args;
1984 found:
1985 args = copy_list (args);
1987 for (p = args; p; p = TREE_CHAIN (p))
1989 tree type = TREE_TYPE (p);
1990 if (TREE_CODE (type) == COMPLEX_TYPE
1991 && targetm.calls.split_complex_arg (type))
1993 tree decl;
1994 tree subtype = TREE_TYPE (type);
1995 bool addressable = TREE_ADDRESSABLE (p);
1997 /* Rewrite the PARM_DECL's type with its component. */
1998 TREE_TYPE (p) = subtype;
1999 DECL_ARG_TYPE (p) = TREE_TYPE (DECL_ARG_TYPE (p));
2000 DECL_MODE (p) = VOIDmode;
2001 DECL_SIZE (p) = NULL;
2002 DECL_SIZE_UNIT (p) = NULL;
2003 /* If this arg must go in memory, put it in a pseudo here.
2004 We can't allow it to go in memory as per normal parms,
2005 because the usual place might not have the imag part
2006 adjacent to the real part. */
2007 DECL_ARTIFICIAL (p) = addressable;
2008 DECL_IGNORED_P (p) = addressable;
2009 TREE_ADDRESSABLE (p) = 0;
2010 layout_decl (p, 0);
2012 /* Build a second synthetic decl. */
2013 decl = build_decl (PARM_DECL, NULL_TREE, subtype);
2014 DECL_ARG_TYPE (decl) = DECL_ARG_TYPE (p);
2015 DECL_ARTIFICIAL (decl) = addressable;
2016 DECL_IGNORED_P (decl) = addressable;
2017 layout_decl (decl, 0);
2019 /* Splice it in; skip the new decl. */
2020 TREE_CHAIN (decl) = TREE_CHAIN (p);
2021 TREE_CHAIN (p) = decl;
2022 p = decl;
2026 return args;
2029 /* A subroutine of assign_parms. Adjust the parameter list to incorporate
2030 the hidden struct return argument, and (abi willing) complex args.
2031 Return the new parameter list. */
2033 static tree
2034 assign_parms_augmented_arg_list (struct assign_parm_data_all *all)
2036 tree fndecl = current_function_decl;
2037 tree fntype = TREE_TYPE (fndecl);
2038 tree fnargs = DECL_ARGUMENTS (fndecl);
2040 /* If struct value address is treated as the first argument, make it so. */
2041 if (aggregate_value_p (DECL_RESULT (fndecl), fndecl)
2042 && ! current_function_returns_pcc_struct
2043 && targetm.calls.struct_value_rtx (TREE_TYPE (fndecl), 1) == 0)
2045 tree type = build_pointer_type (TREE_TYPE (fntype));
2046 tree decl;
2048 decl = build_decl (PARM_DECL, NULL_TREE, type);
2049 DECL_ARG_TYPE (decl) = type;
2050 DECL_ARTIFICIAL (decl) = 1;
2051 DECL_IGNORED_P (decl) = 1;
2053 TREE_CHAIN (decl) = fnargs;
2054 fnargs = decl;
2055 all->function_result_decl = decl;
2058 all->orig_fnargs = fnargs;
2060 /* If the target wants to split complex arguments into scalars, do so. */
2061 if (targetm.calls.split_complex_arg)
2062 fnargs = split_complex_args (fnargs);
2064 return fnargs;
2067 /* A subroutine of assign_parms. Examine PARM and pull out type and mode
2068 data for the parameter. Incorporate ABI specifics such as pass-by-
2069 reference and type promotion. */
2071 static void
2072 assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
2073 struct assign_parm_data_one *data)
2075 tree nominal_type, passed_type;
2076 enum machine_mode nominal_mode, passed_mode, promoted_mode;
2078 memset (data, 0, sizeof (*data));
2080 /* NAMED_ARG is a mis-nomer. We really mean 'non-varadic'. */
2081 if (!current_function_stdarg)
2082 data->named_arg = 1; /* No varadic parms. */
2083 else if (TREE_CHAIN (parm))
2084 data->named_arg = 1; /* Not the last non-varadic parm. */
2085 else if (targetm.calls.strict_argument_naming (&all->args_so_far))
2086 data->named_arg = 1; /* Only varadic ones are unnamed. */
2087 else
2088 data->named_arg = 0; /* Treat as varadic. */
2090 nominal_type = TREE_TYPE (parm);
2091 passed_type = DECL_ARG_TYPE (parm);
2093 /* Look out for errors propagating this far. Also, if the parameter's
2094 type is void then its value doesn't matter. */
2095 if (TREE_TYPE (parm) == error_mark_node
2096 /* This can happen after weird syntax errors
2097 or if an enum type is defined among the parms. */
2098 || TREE_CODE (parm) != PARM_DECL
2099 || passed_type == NULL
2100 || VOID_TYPE_P (nominal_type))
2102 nominal_type = passed_type = void_type_node;
2103 nominal_mode = passed_mode = promoted_mode = VOIDmode;
2104 goto egress;
2107 /* Find mode of arg as it is passed, and mode of arg as it should be
2108 during execution of this function. */
2109 passed_mode = TYPE_MODE (passed_type);
2110 nominal_mode = TYPE_MODE (nominal_type);
2112 /* If the parm is to be passed as a transparent union, use the type of
2113 the first field for the tests below. We have already verified that
2114 the modes are the same. */
2115 if (TREE_CODE (passed_type) == UNION_TYPE
2116 && TYPE_TRANSPARENT_UNION (passed_type))
2117 passed_type = TREE_TYPE (TYPE_FIELDS (passed_type));
2119 /* See if this arg was passed by invisible reference. */
2120 if (pass_by_reference (&all->args_so_far, passed_mode,
2121 passed_type, data->named_arg))
2123 passed_type = nominal_type = build_pointer_type (passed_type);
2124 data->passed_pointer = true;
2125 passed_mode = nominal_mode = Pmode;
2128 /* Find mode as it is passed by the ABI. */
2129 promoted_mode = passed_mode;
2130 if (targetm.calls.promote_function_args (TREE_TYPE (current_function_decl)))
2132 int unsignedp = TYPE_UNSIGNED (passed_type);
2133 promoted_mode = promote_mode (passed_type, promoted_mode,
2134 &unsignedp, 1);
2137 egress:
2138 data->nominal_type = nominal_type;
2139 data->passed_type = passed_type;
2140 data->nominal_mode = nominal_mode;
2141 data->passed_mode = passed_mode;
2142 data->promoted_mode = promoted_mode;
2145 /* A subroutine of assign_parms. Invoke setup_incoming_varargs. */
2147 static void
2148 assign_parms_setup_varargs (struct assign_parm_data_all *all,
2149 struct assign_parm_data_one *data, bool no_rtl)
2151 int varargs_pretend_bytes = 0;
2153 targetm.calls.setup_incoming_varargs (&all->args_so_far,
2154 data->promoted_mode,
2155 data->passed_type,
2156 &varargs_pretend_bytes, no_rtl);
2158 /* If the back-end has requested extra stack space, record how much is
2159 needed. Do not change pretend_args_size otherwise since it may be
2160 nonzero from an earlier partial argument. */
2161 if (varargs_pretend_bytes > 0)
2162 all->pretend_args_size = varargs_pretend_bytes;
2165 /* A subroutine of assign_parms. Set DATA->ENTRY_PARM corresponding to
2166 the incoming location of the current parameter. */
2168 static void
2169 assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
2170 struct assign_parm_data_one *data)
2172 HOST_WIDE_INT pretend_bytes = 0;
2173 rtx entry_parm;
2174 bool in_regs;
2176 if (data->promoted_mode == VOIDmode)
2178 data->entry_parm = data->stack_parm = const0_rtx;
2179 return;
2182 #ifdef FUNCTION_INCOMING_ARG
2183 entry_parm = FUNCTION_INCOMING_ARG (all->args_so_far, data->promoted_mode,
2184 data->passed_type, data->named_arg);
2185 #else
2186 entry_parm = FUNCTION_ARG (all->args_so_far, data->promoted_mode,
2187 data->passed_type, data->named_arg);
2188 #endif
2190 if (entry_parm == 0)
2191 data->promoted_mode = data->passed_mode;
2193 /* Determine parm's home in the stack, in case it arrives in the stack
2194 or we should pretend it did. Compute the stack position and rtx where
2195 the argument arrives and its size.
2197 There is one complexity here: If this was a parameter that would
2198 have been passed in registers, but wasn't only because it is
2199 __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2200 it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2201 In this case, we call FUNCTION_ARG with NAMED set to 1 instead of 0
2202 as it was the previous time. */
2203 in_regs = entry_parm != 0;
2204 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2205 in_regs = true;
2206 #endif
2207 if (!in_regs && !data->named_arg)
2209 if (targetm.calls.pretend_outgoing_varargs_named (&all->args_so_far))
2211 rtx tem;
2212 #ifdef FUNCTION_INCOMING_ARG
2213 tem = FUNCTION_INCOMING_ARG (all->args_so_far, data->promoted_mode,
2214 data->passed_type, true);
2215 #else
2216 tem = FUNCTION_ARG (all->args_so_far, data->promoted_mode,
2217 data->passed_type, true);
2218 #endif
2219 in_regs = tem != NULL;
2223 /* If this parameter was passed both in registers and in the stack, use
2224 the copy on the stack. */
2225 if (targetm.calls.must_pass_in_stack (data->promoted_mode,
2226 data->passed_type))
2227 entry_parm = 0;
2229 if (entry_parm)
2231 int partial;
2233 partial = targetm.calls.arg_partial_bytes (&all->args_so_far,
2234 data->promoted_mode,
2235 data->passed_type,
2236 data->named_arg);
2237 data->partial = partial;
2239 /* The caller might already have allocated stack space for the
2240 register parameters. */
2241 if (partial != 0 && all->reg_parm_stack_space == 0)
2243 /* Part of this argument is passed in registers and part
2244 is passed on the stack. Ask the prologue code to extend
2245 the stack part so that we can recreate the full value.
2247 PRETEND_BYTES is the size of the registers we need to store.
2248 CURRENT_FUNCTION_PRETEND_ARGS_SIZE is the amount of extra
2249 stack space that the prologue should allocate.
2251 Internally, gcc assumes that the argument pointer is aligned
2252 to STACK_BOUNDARY bits. This is used both for alignment
2253 optimizations (see init_emit) and to locate arguments that are
2254 aligned to more than PARM_BOUNDARY bits. We must preserve this
2255 invariant by rounding CURRENT_FUNCTION_PRETEND_ARGS_SIZE up to
2256 a stack boundary. */
2258 /* We assume at most one partial arg, and it must be the first
2259 argument on the stack. */
2260 gcc_assert (!all->extra_pretend_bytes && !all->pretend_args_size);
2262 pretend_bytes = partial;
2263 all->pretend_args_size = CEIL_ROUND (pretend_bytes, STACK_BYTES);
2265 /* We want to align relative to the actual stack pointer, so
2266 don't include this in the stack size until later. */
2267 all->extra_pretend_bytes = all->pretend_args_size;
2271 locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs,
2272 entry_parm ? data->partial : 0, current_function_decl,
2273 &all->stack_args_size, &data->locate);
2275 /* Adjust offsets to include the pretend args. */
2276 pretend_bytes = all->extra_pretend_bytes - pretend_bytes;
2277 data->locate.slot_offset.constant += pretend_bytes;
2278 data->locate.offset.constant += pretend_bytes;
2280 data->entry_parm = entry_parm;
2283 /* A subroutine of assign_parms. If there is actually space on the stack
2284 for this parm, count it in stack_args_size and return true. */
2286 static bool
2287 assign_parm_is_stack_parm (struct assign_parm_data_all *all,
2288 struct assign_parm_data_one *data)
2290 /* Trivially true if we've no incoming register. */
2291 if (data->entry_parm == NULL)
2293 /* Also true if we're partially in registers and partially not,
2294 since we've arranged to drop the entire argument on the stack. */
2295 else if (data->partial != 0)
2297 /* Also true if the target says that it's passed in both registers
2298 and on the stack. */
2299 else if (GET_CODE (data->entry_parm) == PARALLEL
2300 && XEXP (XVECEXP (data->entry_parm, 0, 0), 0) == NULL_RTX)
2302 /* Also true if the target says that there's stack allocated for
2303 all register parameters. */
2304 else if (all->reg_parm_stack_space > 0)
2306 /* Otherwise, no, this parameter has no ABI defined stack slot. */
2307 else
2308 return false;
2310 all->stack_args_size.constant += data->locate.size.constant;
2311 if (data->locate.size.var)
2312 ADD_PARM_SIZE (all->stack_args_size, data->locate.size.var);
2314 return true;
2317 /* A subroutine of assign_parms. Given that this parameter is allocated
2318 stack space by the ABI, find it. */
2320 static void
2321 assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
2323 rtx offset_rtx, stack_parm;
2324 unsigned int align, boundary;
2326 /* If we're passing this arg using a reg, make its stack home the
2327 aligned stack slot. */
2328 if (data->entry_parm)
2329 offset_rtx = ARGS_SIZE_RTX (data->locate.slot_offset);
2330 else
2331 offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
2333 stack_parm = current_function_internal_arg_pointer;
2334 if (offset_rtx != const0_rtx)
2335 stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
2336 stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
2338 set_mem_attributes (stack_parm, parm, 1);
2340 boundary = data->locate.boundary;
2341 align = BITS_PER_UNIT;
2343 /* If we're padding upward, we know that the alignment of the slot
2344 is FUNCTION_ARG_BOUNDARY. If we're using slot_offset, we're
2345 intentionally forcing upward padding. Otherwise we have to come
2346 up with a guess at the alignment based on OFFSET_RTX. */
2347 if (data->locate.where_pad != downward || data->entry_parm)
2348 align = boundary;
2349 else if (GET_CODE (offset_rtx) == CONST_INT)
2351 align = INTVAL (offset_rtx) * BITS_PER_UNIT | boundary;
2352 align = align & -align;
2354 set_mem_align (stack_parm, align);
2356 if (data->entry_parm)
2357 set_reg_attrs_for_parm (data->entry_parm, stack_parm);
2359 data->stack_parm = stack_parm;
2362 /* A subroutine of assign_parms. Adjust DATA->ENTRY_RTL such that it's
2363 always valid and contiguous. */
2365 static void
2366 assign_parm_adjust_entry_rtl (struct assign_parm_data_one *data)
2368 rtx entry_parm = data->entry_parm;
2369 rtx stack_parm = data->stack_parm;
2371 /* If this parm was passed part in regs and part in memory, pretend it
2372 arrived entirely in memory by pushing the register-part onto the stack.
2373 In the special case of a DImode or DFmode that is split, we could put
2374 it together in a pseudoreg directly, but for now that's not worth
2375 bothering with. */
2376 if (data->partial != 0)
2378 /* Handle calls that pass values in multiple non-contiguous
2379 locations. The Irix 6 ABI has examples of this. */
2380 if (GET_CODE (entry_parm) == PARALLEL)
2381 emit_group_store (validize_mem (stack_parm), entry_parm,
2382 data->passed_type,
2383 int_size_in_bytes (data->passed_type));
2384 else
2386 gcc_assert (data->partial % UNITS_PER_WORD == 0);
2387 move_block_from_reg (REGNO (entry_parm), validize_mem (stack_parm),
2388 data->partial / UNITS_PER_WORD);
2391 entry_parm = stack_parm;
2394 /* If we didn't decide this parm came in a register, by default it came
2395 on the stack. */
2396 else if (entry_parm == NULL)
2397 entry_parm = stack_parm;
2399 /* When an argument is passed in multiple locations, we can't make use
2400 of this information, but we can save some copying if the whole argument
2401 is passed in a single register. */
2402 else if (GET_CODE (entry_parm) == PARALLEL
2403 && data->nominal_mode != BLKmode
2404 && data->passed_mode != BLKmode)
2406 size_t i, len = XVECLEN (entry_parm, 0);
2408 for (i = 0; i < len; i++)
2409 if (XEXP (XVECEXP (entry_parm, 0, i), 0) != NULL_RTX
2410 && REG_P (XEXP (XVECEXP (entry_parm, 0, i), 0))
2411 && (GET_MODE (XEXP (XVECEXP (entry_parm, 0, i), 0))
2412 == data->passed_mode)
2413 && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
2415 entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
2416 break;
2420 data->entry_parm = entry_parm;
2423 /* A subroutine of assign_parms. Adjust DATA->STACK_RTL such that it's
2424 always valid and properly aligned. */
2426 static void
2427 assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)
2429 rtx stack_parm = data->stack_parm;
2431 /* If we can't trust the parm stack slot to be aligned enough for its
2432 ultimate type, don't use that slot after entry. We'll make another
2433 stack slot, if we need one. */
2434 if (stack_parm
2435 && ((STRICT_ALIGNMENT
2436 && GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN (stack_parm))
2437 || (data->nominal_type
2438 && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)
2439 && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
2440 stack_parm = NULL;
2442 /* If parm was passed in memory, and we need to convert it on entry,
2443 don't store it back in that same slot. */
2444 else if (data->entry_parm == stack_parm
2445 && data->nominal_mode != BLKmode
2446 && data->nominal_mode != data->passed_mode)
2447 stack_parm = NULL;
2449 /* If stack protection is in effect for this function, don't leave any
2450 pointers in their passed stack slots. */
2451 else if (cfun->stack_protect_guard
2452 && (flag_stack_protect == 2
2453 || data->passed_pointer
2454 || POINTER_TYPE_P (data->nominal_type)))
2455 stack_parm = NULL;
2457 data->stack_parm = stack_parm;
2460 /* A subroutine of assign_parms. Return true if the current parameter
2461 should be stored as a BLKmode in the current frame. */
2463 static bool
2464 assign_parm_setup_block_p (struct assign_parm_data_one *data)
2466 if (data->nominal_mode == BLKmode)
2467 return true;
2468 if (GET_CODE (data->entry_parm) == PARALLEL)
2469 return true;
2471 #ifdef BLOCK_REG_PADDING
2472 /* Only assign_parm_setup_block knows how to deal with register arguments
2473 that are padded at the least significant end. */
2474 if (REG_P (data->entry_parm)
2475 && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD
2476 && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1)
2477 == (BYTES_BIG_ENDIAN ? upward : downward)))
2478 return true;
2479 #endif
2481 return false;
2484 /* A subroutine of assign_parms. Arrange for the parameter to be
2485 present and valid in DATA->STACK_RTL. */
2487 static void
2488 assign_parm_setup_block (struct assign_parm_data_all *all,
2489 tree parm, struct assign_parm_data_one *data)
2491 rtx entry_parm = data->entry_parm;
2492 rtx stack_parm = data->stack_parm;
2493 HOST_WIDE_INT size;
2494 HOST_WIDE_INT size_stored;
2495 rtx orig_entry_parm = entry_parm;
2497 if (GET_CODE (entry_parm) == PARALLEL)
2498 entry_parm = emit_group_move_into_temps (entry_parm);
2500 /* If we've a non-block object that's nevertheless passed in parts,
2501 reconstitute it in register operations rather than on the stack. */
2502 if (GET_CODE (entry_parm) == PARALLEL
2503 && data->nominal_mode != BLKmode)
2505 rtx elt0 = XEXP (XVECEXP (orig_entry_parm, 0, 0), 0);
2507 if ((XVECLEN (entry_parm, 0) > 1
2508 || hard_regno_nregs[REGNO (elt0)][GET_MODE (elt0)] > 1)
2509 && use_register_for_decl (parm))
2511 rtx parmreg = gen_reg_rtx (data->nominal_mode);
2513 push_to_sequence2 (all->first_conversion_insn,
2514 all->last_conversion_insn);
2516 /* For values returned in multiple registers, handle possible
2517 incompatible calls to emit_group_store.
2519 For example, the following would be invalid, and would have to
2520 be fixed by the conditional below:
2522 emit_group_store ((reg:SF), (parallel:DF))
2523 emit_group_store ((reg:SI), (parallel:DI))
2525 An example of this are doubles in e500 v2:
2526 (parallel:DF (expr_list (reg:SI) (const_int 0))
2527 (expr_list (reg:SI) (const_int 4))). */
2528 if (data->nominal_mode != data->passed_mode)
2530 rtx t = gen_reg_rtx (GET_MODE (entry_parm));
2531 emit_group_store (t, entry_parm, NULL_TREE,
2532 GET_MODE_SIZE (GET_MODE (entry_parm)));
2533 convert_move (parmreg, t, 0);
2535 else
2536 emit_group_store (parmreg, entry_parm, data->nominal_type,
2537 int_size_in_bytes (data->nominal_type));
2539 all->first_conversion_insn = get_insns ();
2540 all->last_conversion_insn = get_last_insn ();
2541 end_sequence ();
2543 SET_DECL_RTL (parm, parmreg);
2544 return;
2548 size = int_size_in_bytes (data->passed_type);
2549 size_stored = CEIL_ROUND (size, UNITS_PER_WORD);
2550 if (stack_parm == 0)
2552 DECL_ALIGN (parm) = MAX (DECL_ALIGN (parm), BITS_PER_WORD);
2553 stack_parm = assign_stack_local (BLKmode, size_stored,
2554 DECL_ALIGN (parm));
2555 if (GET_MODE_SIZE (GET_MODE (entry_parm)) == size)
2556 PUT_MODE (stack_parm, GET_MODE (entry_parm));
2557 set_mem_attributes (stack_parm, parm, 1);
2560 /* If a BLKmode arrives in registers, copy it to a stack slot. Handle
2561 calls that pass values in multiple non-contiguous locations. */
2562 if (REG_P (entry_parm) || GET_CODE (entry_parm) == PARALLEL)
2564 rtx mem;
2566 /* Note that we will be storing an integral number of words.
2567 So we have to be careful to ensure that we allocate an
2568 integral number of words. We do this above when we call
2569 assign_stack_local if space was not allocated in the argument
2570 list. If it was, this will not work if PARM_BOUNDARY is not
2571 a multiple of BITS_PER_WORD. It isn't clear how to fix this
2572 if it becomes a problem. Exception is when BLKmode arrives
2573 with arguments not conforming to word_mode. */
2575 if (data->stack_parm == 0)
2577 else if (GET_CODE (entry_parm) == PARALLEL)
2579 else
2580 gcc_assert (!size || !(PARM_BOUNDARY % BITS_PER_WORD));
2582 mem = validize_mem (stack_parm);
2584 /* Handle values in multiple non-contiguous locations. */
2585 if (GET_CODE (entry_parm) == PARALLEL)
2587 push_to_sequence2 (all->first_conversion_insn,
2588 all->last_conversion_insn);
2589 emit_group_store (mem, entry_parm, data->passed_type, size);
2590 all->first_conversion_insn = get_insns ();
2591 all->last_conversion_insn = get_last_insn ();
2592 end_sequence ();
2595 else if (size == 0)
2598 /* If SIZE is that of a mode no bigger than a word, just use
2599 that mode's store operation. */
2600 else if (size <= UNITS_PER_WORD)
2602 enum machine_mode mode
2603 = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2605 if (mode != BLKmode
2606 #ifdef BLOCK_REG_PADDING
2607 && (size == UNITS_PER_WORD
2608 || (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2609 != (BYTES_BIG_ENDIAN ? upward : downward)))
2610 #endif
2613 rtx reg;
2615 /* We are really truncating a word_mode value containing
2616 SIZE bytes into a value of mode MODE. If such an
2617 operation requires no actual instructions, we can refer
2618 to the value directly in mode MODE, otherwise we must
2619 start with the register in word_mode and explicitly
2620 convert it. */
2621 if (TRULY_NOOP_TRUNCATION (size * BITS_PER_UNIT, BITS_PER_WORD))
2622 reg = gen_rtx_REG (mode, REGNO (entry_parm));
2623 else
2625 reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2626 reg = convert_to_mode (mode, copy_to_reg (reg), 1);
2628 emit_move_insn (change_address (mem, mode, 0), reg);
2631 /* Blocks smaller than a word on a BYTES_BIG_ENDIAN
2632 machine must be aligned to the left before storing
2633 to memory. Note that the previous test doesn't
2634 handle all cases (e.g. SIZE == 3). */
2635 else if (size != UNITS_PER_WORD
2636 #ifdef BLOCK_REG_PADDING
2637 && (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2638 == downward)
2639 #else
2640 && BYTES_BIG_ENDIAN
2641 #endif
2644 rtx tem, x;
2645 int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
2646 rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2648 x = expand_shift (LSHIFT_EXPR, word_mode, reg,
2649 build_int_cst (NULL_TREE, by),
2650 NULL_RTX, 1);
2651 tem = change_address (mem, word_mode, 0);
2652 emit_move_insn (tem, x);
2654 else
2655 move_block_from_reg (REGNO (entry_parm), mem,
2656 size_stored / UNITS_PER_WORD);
2658 else
2659 move_block_from_reg (REGNO (entry_parm), mem,
2660 size_stored / UNITS_PER_WORD);
2662 else if (data->stack_parm == 0)
2664 push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2665 emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
2666 BLOCK_OP_NORMAL);
2667 all->first_conversion_insn = get_insns ();
2668 all->last_conversion_insn = get_last_insn ();
2669 end_sequence ();
2672 data->stack_parm = stack_parm;
2673 SET_DECL_RTL (parm, stack_parm);
2676 /* A subroutine of assign_parms. Allocate a pseudo to hold the current
2677 parameter. Get it there. Perform all ABI specified conversions. */
2679 static void
2680 assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
2681 struct assign_parm_data_one *data)
2683 rtx parmreg;
2684 enum machine_mode promoted_nominal_mode;
2685 int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
2686 bool did_conversion = false;
2688 /* Store the parm in a pseudoregister during the function, but we may
2689 need to do it in a wider mode. */
2691 /* This is not really promoting for a call. However we need to be
2692 consistent with assign_parm_find_data_types and expand_expr_real_1. */
2693 promoted_nominal_mode
2694 = promote_mode (data->nominal_type, data->nominal_mode, &unsignedp, 1);
2696 parmreg = gen_reg_rtx (promoted_nominal_mode);
2698 if (!DECL_ARTIFICIAL (parm))
2699 mark_user_reg (parmreg);
2701 /* If this was an item that we received a pointer to,
2702 set DECL_RTL appropriately. */
2703 if (data->passed_pointer)
2705 rtx x = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data->passed_type)), parmreg);
2706 set_mem_attributes (x, parm, 1);
2707 SET_DECL_RTL (parm, x);
2709 else
2710 SET_DECL_RTL (parm, parmreg);
2712 /* Copy the value into the register. */
2713 if (data->nominal_mode != data->passed_mode
2714 || promoted_nominal_mode != data->promoted_mode)
2716 int save_tree_used;
2718 /* ENTRY_PARM has been converted to PROMOTED_MODE, its
2719 mode, by the caller. We now have to convert it to
2720 NOMINAL_MODE, if different. However, PARMREG may be in
2721 a different mode than NOMINAL_MODE if it is being stored
2722 promoted.
2724 If ENTRY_PARM is a hard register, it might be in a register
2725 not valid for operating in its mode (e.g., an odd-numbered
2726 register for a DFmode). In that case, moves are the only
2727 thing valid, so we can't do a convert from there. This
2728 occurs when the calling sequence allow such misaligned
2729 usages.
2731 In addition, the conversion may involve a call, which could
2732 clobber parameters which haven't been copied to pseudo
2733 registers yet. Therefore, we must first copy the parm to
2734 a pseudo reg here, and save the conversion until after all
2735 parameters have been moved. */
2737 rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2739 emit_move_insn (tempreg, validize_mem (data->entry_parm));
2741 push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2742 tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
2744 if (GET_CODE (tempreg) == SUBREG
2745 && GET_MODE (tempreg) == data->nominal_mode
2746 && REG_P (SUBREG_REG (tempreg))
2747 && data->nominal_mode == data->passed_mode
2748 && GET_MODE (SUBREG_REG (tempreg)) == GET_MODE (data->entry_parm)
2749 && GET_MODE_SIZE (GET_MODE (tempreg))
2750 < GET_MODE_SIZE (GET_MODE (data->entry_parm)))
2752 /* The argument is already sign/zero extended, so note it
2753 into the subreg. */
2754 SUBREG_PROMOTED_VAR_P (tempreg) = 1;
2755 SUBREG_PROMOTED_UNSIGNED_SET (tempreg, unsignedp);
2758 /* TREE_USED gets set erroneously during expand_assignment. */
2759 save_tree_used = TREE_USED (parm);
2760 expand_assignment (parm, make_tree (data->nominal_type, tempreg), false);
2761 TREE_USED (parm) = save_tree_used;
2762 all->first_conversion_insn = get_insns ();
2763 all->last_conversion_insn = get_last_insn ();
2764 end_sequence ();
2766 did_conversion = true;
2768 else
2769 emit_move_insn (parmreg, validize_mem (data->entry_parm));
2771 /* If we were passed a pointer but the actual value can safely live
2772 in a register, put it in one. */
2773 if (data->passed_pointer
2774 && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
2775 /* If by-reference argument was promoted, demote it. */
2776 && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
2777 || use_register_for_decl (parm)))
2779 /* We can't use nominal_mode, because it will have been set to
2780 Pmode above. We must use the actual mode of the parm. */
2781 parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
2782 mark_user_reg (parmreg);
2784 if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm)))
2786 rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm)));
2787 int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
2789 push_to_sequence2 (all->first_conversion_insn,
2790 all->last_conversion_insn);
2791 emit_move_insn (tempreg, DECL_RTL (parm));
2792 tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
2793 emit_move_insn (parmreg, tempreg);
2794 all->first_conversion_insn = get_insns ();
2795 all->last_conversion_insn = get_last_insn ();
2796 end_sequence ();
2798 did_conversion = true;
2800 else
2801 emit_move_insn (parmreg, DECL_RTL (parm));
2803 SET_DECL_RTL (parm, parmreg);
2805 /* STACK_PARM is the pointer, not the parm, and PARMREG is
2806 now the parm. */
2807 data->stack_parm = NULL;
2810 /* Mark the register as eliminable if we did no conversion and it was
2811 copied from memory at a fixed offset, and the arg pointer was not
2812 copied to a pseudo-reg. If the arg pointer is a pseudo reg or the
2813 offset formed an invalid address, such memory-equivalences as we
2814 make here would screw up life analysis for it. */
2815 if (data->nominal_mode == data->passed_mode
2816 && !did_conversion
2817 && data->stack_parm != 0
2818 && MEM_P (data->stack_parm)
2819 && data->locate.offset.var == 0
2820 && reg_mentioned_p (virtual_incoming_args_rtx,
2821 XEXP (data->stack_parm, 0)))
2823 rtx linsn = get_last_insn ();
2824 rtx sinsn, set;
2826 /* Mark complex types separately. */
2827 if (GET_CODE (parmreg) == CONCAT)
2829 enum machine_mode submode
2830 = GET_MODE_INNER (GET_MODE (parmreg));
2831 int regnor = REGNO (XEXP (parmreg, 0));
2832 int regnoi = REGNO (XEXP (parmreg, 1));
2833 rtx stackr = adjust_address_nv (data->stack_parm, submode, 0);
2834 rtx stacki = adjust_address_nv (data->stack_parm, submode,
2835 GET_MODE_SIZE (submode));
2837 /* Scan backwards for the set of the real and
2838 imaginary parts. */
2839 for (sinsn = linsn; sinsn != 0;
2840 sinsn = prev_nonnote_insn (sinsn))
2842 set = single_set (sinsn);
2843 if (set == 0)
2844 continue;
2846 if (SET_DEST (set) == regno_reg_rtx [regnoi])
2847 set_unique_reg_note (sinsn, REG_EQUIV, stacki);
2848 else if (SET_DEST (set) == regno_reg_rtx [regnor])
2849 set_unique_reg_note (sinsn, REG_EQUIV, stackr);
2852 else if ((set = single_set (linsn)) != 0
2853 && SET_DEST (set) == parmreg)
2854 set_unique_reg_note (linsn, REG_EQUIV, data->stack_parm);
2857 /* For pointer data type, suggest pointer register. */
2858 if (POINTER_TYPE_P (TREE_TYPE (parm)))
2859 mark_reg_pointer (parmreg,
2860 TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
2863 /* A subroutine of assign_parms. Allocate stack space to hold the current
2864 parameter. Get it there. Perform all ABI specified conversions. */
2866 static void
2867 assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
2868 struct assign_parm_data_one *data)
2870 /* Value must be stored in the stack slot STACK_PARM during function
2871 execution. */
2872 bool to_conversion = false;
2874 if (data->promoted_mode != data->nominal_mode)
2876 /* Conversion is required. */
2877 rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
2879 emit_move_insn (tempreg, validize_mem (data->entry_parm));
2881 push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2882 to_conversion = true;
2884 data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
2885 TYPE_UNSIGNED (TREE_TYPE (parm)));
2887 if (data->stack_parm)
2888 /* ??? This may need a big-endian conversion on sparc64. */
2889 data->stack_parm
2890 = adjust_address (data->stack_parm, data->nominal_mode, 0);
2893 if (data->entry_parm != data->stack_parm)
2895 rtx src, dest;
2897 if (data->stack_parm == 0)
2899 data->stack_parm
2900 = assign_stack_local (GET_MODE (data->entry_parm),
2901 GET_MODE_SIZE (GET_MODE (data->entry_parm)),
2902 TYPE_ALIGN (data->passed_type));
2903 set_mem_attributes (data->stack_parm, parm, 1);
2906 dest = validize_mem (data->stack_parm);
2907 src = validize_mem (data->entry_parm);
2909 if (MEM_P (src))
2911 /* Use a block move to handle potentially misaligned entry_parm. */
2912 if (!to_conversion)
2913 push_to_sequence2 (all->first_conversion_insn,
2914 all->last_conversion_insn);
2915 to_conversion = true;
2917 emit_block_move (dest, src,
2918 GEN_INT (int_size_in_bytes (data->passed_type)),
2919 BLOCK_OP_NORMAL);
2921 else
2922 emit_move_insn (dest, src);
2925 if (to_conversion)
2927 all->first_conversion_insn = get_insns ();
2928 all->last_conversion_insn = get_last_insn ();
2929 end_sequence ();
2932 SET_DECL_RTL (parm, data->stack_parm);
2935 /* A subroutine of assign_parms. If the ABI splits complex arguments, then
2936 undo the frobbing that we did in assign_parms_augmented_arg_list. */
2938 static void
2939 assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs)
2941 tree parm;
2942 tree orig_fnargs = all->orig_fnargs;
2944 for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm))
2946 if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
2947 && targetm.calls.split_complex_arg (TREE_TYPE (parm)))
2949 rtx tmp, real, imag;
2950 enum machine_mode inner = GET_MODE_INNER (DECL_MODE (parm));
2952 real = DECL_RTL (fnargs);
2953 imag = DECL_RTL (TREE_CHAIN (fnargs));
2954 if (inner != GET_MODE (real))
2956 real = gen_lowpart_SUBREG (inner, real);
2957 imag = gen_lowpart_SUBREG (inner, imag);
2960 if (TREE_ADDRESSABLE (parm))
2962 rtx rmem, imem;
2963 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (parm));
2965 /* split_complex_arg put the real and imag parts in
2966 pseudos. Move them to memory. */
2967 tmp = assign_stack_local (DECL_MODE (parm), size,
2968 TYPE_ALIGN (TREE_TYPE (parm)));
2969 set_mem_attributes (tmp, parm, 1);
2970 rmem = adjust_address_nv (tmp, inner, 0);
2971 imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
2972 push_to_sequence2 (all->first_conversion_insn,
2973 all->last_conversion_insn);
2974 emit_move_insn (rmem, real);
2975 emit_move_insn (imem, imag);
2976 all->first_conversion_insn = get_insns ();
2977 all->last_conversion_insn = get_last_insn ();
2978 end_sequence ();
2980 else
2981 tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2982 SET_DECL_RTL (parm, tmp);
2984 real = DECL_INCOMING_RTL (fnargs);
2985 imag = DECL_INCOMING_RTL (TREE_CHAIN (fnargs));
2986 if (inner != GET_MODE (real))
2988 real = gen_lowpart_SUBREG (inner, real);
2989 imag = gen_lowpart_SUBREG (inner, imag);
2991 tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
2992 set_decl_incoming_rtl (parm, tmp, false);
2993 fnargs = TREE_CHAIN (fnargs);
2995 else
2997 SET_DECL_RTL (parm, DECL_RTL (fnargs));
2998 set_decl_incoming_rtl (parm, DECL_INCOMING_RTL (fnargs), false);
3000 /* Set MEM_EXPR to the original decl, i.e. to PARM,
3001 instead of the copy of decl, i.e. FNARGS. */
3002 if (DECL_INCOMING_RTL (parm) && MEM_P (DECL_INCOMING_RTL (parm)))
3003 set_mem_expr (DECL_INCOMING_RTL (parm), parm);
3006 fnargs = TREE_CHAIN (fnargs);
3010 /* Assign RTL expressions to the function's parameters. This may involve
3011 copying them into registers and using those registers as the DECL_RTL. */
3013 static void
3014 assign_parms (tree fndecl)
3016 struct assign_parm_data_all all;
3017 tree fnargs, parm;
3019 current_function_internal_arg_pointer
3020 = targetm.calls.internal_arg_pointer ();
3022 assign_parms_initialize_all (&all);
3023 fnargs = assign_parms_augmented_arg_list (&all);
3025 for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
3027 struct assign_parm_data_one data;
3029 /* Extract the type of PARM; adjust it according to ABI. */
3030 assign_parm_find_data_types (&all, parm, &data);
3032 /* Early out for errors and void parameters. */
3033 if (data.passed_mode == VOIDmode)
3035 SET_DECL_RTL (parm, const0_rtx);
3036 DECL_INCOMING_RTL (parm) = DECL_RTL (parm);
3037 continue;
3040 if (current_function_stdarg && !TREE_CHAIN (parm))
3041 assign_parms_setup_varargs (&all, &data, false);
3043 /* Find out where the parameter arrives in this function. */
3044 assign_parm_find_entry_rtl (&all, &data);
3046 /* Find out where stack space for this parameter might be. */
3047 if (assign_parm_is_stack_parm (&all, &data))
3049 assign_parm_find_stack_rtl (parm, &data);
3050 assign_parm_adjust_entry_rtl (&data);
3053 /* Record permanently how this parm was passed. */
3054 set_decl_incoming_rtl (parm, data.entry_parm, data.passed_pointer);
3056 /* Update info on where next arg arrives in registers. */
3057 FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
3058 data.passed_type, data.named_arg);
3060 assign_parm_adjust_stack_rtl (&data);
3062 if (assign_parm_setup_block_p (&data))
3063 assign_parm_setup_block (&all, parm, &data);
3064 else if (data.passed_pointer || use_register_for_decl (parm))
3065 assign_parm_setup_reg (&all, parm, &data);
3066 else
3067 assign_parm_setup_stack (&all, parm, &data);
3070 if (targetm.calls.split_complex_arg && fnargs != all.orig_fnargs)
3071 assign_parms_unsplit_complex (&all, fnargs);
3073 /* Output all parameter conversion instructions (possibly including calls)
3074 now that all parameters have been copied out of hard registers. */
3075 emit_insn (all.first_conversion_insn);
3077 /* If we are receiving a struct value address as the first argument, set up
3078 the RTL for the function result. As this might require code to convert
3079 the transmitted address to Pmode, we do this here to ensure that possible
3080 preliminary conversions of the address have been emitted already. */
3081 if (all.function_result_decl)
3083 tree result = DECL_RESULT (current_function_decl);
3084 rtx addr = DECL_RTL (all.function_result_decl);
3085 rtx x;
3087 if (DECL_BY_REFERENCE (result))
3088 x = addr;
3089 else
3091 addr = convert_memory_address (Pmode, addr);
3092 x = gen_rtx_MEM (DECL_MODE (result), addr);
3093 set_mem_attributes (x, result, 1);
3095 SET_DECL_RTL (result, x);
3098 /* We have aligned all the args, so add space for the pretend args. */
3099 current_function_pretend_args_size = all.pretend_args_size;
3100 all.stack_args_size.constant += all.extra_pretend_bytes;
3101 current_function_args_size = all.stack_args_size.constant;
3103 /* Adjust function incoming argument size for alignment and
3104 minimum length. */
3106 #ifdef REG_PARM_STACK_SPACE
3107 current_function_args_size = MAX (current_function_args_size,
3108 REG_PARM_STACK_SPACE (fndecl));
3109 #endif
3111 current_function_args_size = CEIL_ROUND (current_function_args_size,
3112 PARM_BOUNDARY / BITS_PER_UNIT);
3114 #ifdef ARGS_GROW_DOWNWARD
3115 current_function_arg_offset_rtx
3116 = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
3117 : expand_expr (size_diffop (all.stack_args_size.var,
3118 size_int (-all.stack_args_size.constant)),
3119 NULL_RTX, VOIDmode, 0));
3120 #else
3121 current_function_arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
3122 #endif
3124 /* See how many bytes, if any, of its args a function should try to pop
3125 on return. */
3127 current_function_pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
3128 current_function_args_size);
3130 /* For stdarg.h function, save info about
3131 regs and stack space used by the named args. */
3133 current_function_args_info = all.args_so_far;
3135 /* Set the rtx used for the function return value. Put this in its
3136 own variable so any optimizers that need this information don't have
3137 to include tree.h. Do this here so it gets done when an inlined
3138 function gets output. */
3140 current_function_return_rtx
3141 = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
3142 ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
3144 /* If scalar return value was computed in a pseudo-reg, or was a named
3145 return value that got dumped to the stack, copy that to the hard
3146 return register. */
3147 if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
3149 tree decl_result = DECL_RESULT (fndecl);
3150 rtx decl_rtl = DECL_RTL (decl_result);
3152 if (REG_P (decl_rtl)
3153 ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
3154 : DECL_REGISTER (decl_result))
3156 rtx real_decl_rtl;
3158 real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
3159 fndecl, true);
3160 REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
3161 /* The delay slot scheduler assumes that current_function_return_rtx
3162 holds the hard register containing the return value, not a
3163 temporary pseudo. */
3164 current_function_return_rtx = real_decl_rtl;
3169 /* A subroutine of gimplify_parameters, invoked via walk_tree.
3170 For all seen types, gimplify their sizes. */
3172 static tree
3173 gimplify_parm_type (tree *tp, int *walk_subtrees, void *data)
3175 tree t = *tp;
3177 *walk_subtrees = 0;
3178 if (TYPE_P (t))
3180 if (POINTER_TYPE_P (t))
3181 *walk_subtrees = 1;
3182 else if (TYPE_SIZE (t) && !TREE_CONSTANT (TYPE_SIZE (t))
3183 && !TYPE_SIZES_GIMPLIFIED (t))
3185 gimplify_type_sizes (t, (tree *) data);
3186 *walk_subtrees = 1;
3190 return NULL;
3193 /* Gimplify the parameter list for current_function_decl. This involves
3194 evaluating SAVE_EXPRs of variable sized parameters and generating code
3195 to implement callee-copies reference parameters. Returns a list of
3196 statements to add to the beginning of the function, or NULL if nothing
3197 to do. */
3199 tree
3200 gimplify_parameters (void)
3202 struct assign_parm_data_all all;
3203 tree fnargs, parm, stmts = NULL;
3205 assign_parms_initialize_all (&all);
3206 fnargs = assign_parms_augmented_arg_list (&all);
3208 for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
3210 struct assign_parm_data_one data;
3212 /* Extract the type of PARM; adjust it according to ABI. */
3213 assign_parm_find_data_types (&all, parm, &data);
3215 /* Early out for errors and void parameters. */
3216 if (data.passed_mode == VOIDmode || DECL_SIZE (parm) == NULL)
3217 continue;
3219 /* Update info on where next arg arrives in registers. */
3220 FUNCTION_ARG_ADVANCE (all.args_so_far, data.promoted_mode,
3221 data.passed_type, data.named_arg);
3223 /* ??? Once upon a time variable_size stuffed parameter list
3224 SAVE_EXPRs (amongst others) onto a pending sizes list. This
3225 turned out to be less than manageable in the gimple world.
3226 Now we have to hunt them down ourselves. */
3227 walk_tree_without_duplicates (&data.passed_type,
3228 gimplify_parm_type, &stmts);
3230 if (!TREE_CONSTANT (DECL_SIZE (parm)))
3232 gimplify_one_sizepos (&DECL_SIZE (parm), &stmts);
3233 gimplify_one_sizepos (&DECL_SIZE_UNIT (parm), &stmts);
3236 if (data.passed_pointer)
3238 tree type = TREE_TYPE (data.passed_type);
3239 if (reference_callee_copied (&all.args_so_far, TYPE_MODE (type),
3240 type, data.named_arg))
3242 tree local, t;
3244 /* For constant sized objects, this is trivial; for
3245 variable-sized objects, we have to play games. */
3246 if (TREE_CONSTANT (DECL_SIZE (parm)))
3248 local = create_tmp_var (type, get_name (parm));
3249 DECL_IGNORED_P (local) = 0;
3251 else
3253 tree ptr_type, addr;
3255 ptr_type = build_pointer_type (type);
3256 addr = create_tmp_var (ptr_type, get_name (parm));
3257 DECL_IGNORED_P (addr) = 0;
3258 local = build_fold_indirect_ref (addr);
3260 t = built_in_decls[BUILT_IN_ALLOCA];
3261 t = build_call_expr (t, 1, DECL_SIZE_UNIT (parm));
3262 t = fold_convert (ptr_type, t);
3263 t = build_gimple_modify_stmt (addr, t);
3264 gimplify_and_add (t, &stmts);
3267 t = build_gimple_modify_stmt (local, parm);
3268 gimplify_and_add (t, &stmts);
3270 SET_DECL_VALUE_EXPR (parm, local);
3271 DECL_HAS_VALUE_EXPR_P (parm) = 1;
3276 return stmts;
3279 /* Compute the size and offset from the start of the stacked arguments for a
3280 parm passed in mode PASSED_MODE and with type TYPE.
3282 INITIAL_OFFSET_PTR points to the current offset into the stacked
3283 arguments.
3285 The starting offset and size for this parm are returned in
3286 LOCATE->OFFSET and LOCATE->SIZE, respectively. When IN_REGS is
3287 nonzero, the offset is that of stack slot, which is returned in
3288 LOCATE->SLOT_OFFSET. LOCATE->ALIGNMENT_PAD is the amount of
3289 padding required from the initial offset ptr to the stack slot.
3291 IN_REGS is nonzero if the argument will be passed in registers. It will
3292 never be set if REG_PARM_STACK_SPACE is not defined.
3294 FNDECL is the function in which the argument was defined.
3296 There are two types of rounding that are done. The first, controlled by
3297 FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
3298 list to be aligned to the specific boundary (in bits). This rounding
3299 affects the initial and starting offsets, but not the argument size.
3301 The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3302 optionally rounds the size of the parm to PARM_BOUNDARY. The
3303 initial offset is not affected by this rounding, while the size always
3304 is and the starting offset may be. */
3306 /* LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
3307 INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
3308 callers pass in the total size of args so far as
3309 INITIAL_OFFSET_PTR. LOCATE->SIZE is always positive. */
3311 void
3312 locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
3313 int partial, tree fndecl ATTRIBUTE_UNUSED,
3314 struct args_size *initial_offset_ptr,
3315 struct locate_and_pad_arg_data *locate)
3317 tree sizetree;
3318 enum direction where_pad;
3319 unsigned int boundary;
3320 int reg_parm_stack_space = 0;
3321 int part_size_in_regs;
3323 #ifdef REG_PARM_STACK_SPACE
3324 reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3326 /* If we have found a stack parm before we reach the end of the
3327 area reserved for registers, skip that area. */
3328 if (! in_regs)
3330 if (reg_parm_stack_space > 0)
3332 if (initial_offset_ptr->var)
3334 initial_offset_ptr->var
3335 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3336 ssize_int (reg_parm_stack_space));
3337 initial_offset_ptr->constant = 0;
3339 else if (initial_offset_ptr->constant < reg_parm_stack_space)
3340 initial_offset_ptr->constant = reg_parm_stack_space;
3343 #endif /* REG_PARM_STACK_SPACE */
3345 part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
3347 sizetree
3348 = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3349 where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3350 boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
3351 locate->where_pad = where_pad;
3352 locate->boundary = boundary;
3354 /* Remember if the outgoing parameter requires extra alignment on the
3355 calling function side. */
3356 if (boundary > PREFERRED_STACK_BOUNDARY)
3357 boundary = PREFERRED_STACK_BOUNDARY;
3358 if (cfun->stack_alignment_needed < boundary)
3359 cfun->stack_alignment_needed = boundary;
3361 #ifdef ARGS_GROW_DOWNWARD
3362 locate->slot_offset.constant = -initial_offset_ptr->constant;
3363 if (initial_offset_ptr->var)
3364 locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int (0),
3365 initial_offset_ptr->var);
3368 tree s2 = sizetree;
3369 if (where_pad != none
3370 && (!host_integerp (sizetree, 1)
3371 || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3372 s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
3373 SUB_PARM_SIZE (locate->slot_offset, s2);
3376 locate->slot_offset.constant += part_size_in_regs;
3378 if (!in_regs
3379 #ifdef REG_PARM_STACK_SPACE
3380 || REG_PARM_STACK_SPACE (fndecl) > 0
3381 #endif
3383 pad_to_arg_alignment (&locate->slot_offset, boundary,
3384 &locate->alignment_pad);
3386 locate->size.constant = (-initial_offset_ptr->constant
3387 - locate->slot_offset.constant);
3388 if (initial_offset_ptr->var)
3389 locate->size.var = size_binop (MINUS_EXPR,
3390 size_binop (MINUS_EXPR,
3391 ssize_int (0),
3392 initial_offset_ptr->var),
3393 locate->slot_offset.var);
3395 /* Pad_below needs the pre-rounded size to know how much to pad
3396 below. */
3397 locate->offset = locate->slot_offset;
3398 if (where_pad == downward)
3399 pad_below (&locate->offset, passed_mode, sizetree);
3401 #else /* !ARGS_GROW_DOWNWARD */
3402 if (!in_regs
3403 #ifdef REG_PARM_STACK_SPACE
3404 || REG_PARM_STACK_SPACE (fndecl) > 0
3405 #endif
3407 pad_to_arg_alignment (initial_offset_ptr, boundary,
3408 &locate->alignment_pad);
3409 locate->slot_offset = *initial_offset_ptr;
3411 #ifdef PUSH_ROUNDING
3412 if (passed_mode != BLKmode)
3413 sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3414 #endif
3416 /* Pad_below needs the pre-rounded size to know how much to pad below
3417 so this must be done before rounding up. */
3418 locate->offset = locate->slot_offset;
3419 if (where_pad == downward)
3420 pad_below (&locate->offset, passed_mode, sizetree);
3422 if (where_pad != none
3423 && (!host_integerp (sizetree, 1)
3424 || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
3425 sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3427 ADD_PARM_SIZE (locate->size, sizetree);
3429 locate->size.constant -= part_size_in_regs;
3430 #endif /* ARGS_GROW_DOWNWARD */
3433 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3434 BOUNDARY is measured in bits, but must be a multiple of a storage unit. */
3436 static void
3437 pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
3438 struct args_size *alignment_pad)
3440 tree save_var = NULL_TREE;
3441 HOST_WIDE_INT save_constant = 0;
3442 int boundary_in_bytes = boundary / BITS_PER_UNIT;
3443 HOST_WIDE_INT sp_offset = STACK_POINTER_OFFSET;
3445 #ifdef SPARC_STACK_BOUNDARY_HACK
3446 /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
3447 the real alignment of %sp. However, when it does this, the
3448 alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY. */
3449 if (SPARC_STACK_BOUNDARY_HACK)
3450 sp_offset = 0;
3451 #endif
3453 if (boundary > PARM_BOUNDARY)
3455 save_var = offset_ptr->var;
3456 save_constant = offset_ptr->constant;
3459 alignment_pad->var = NULL_TREE;
3460 alignment_pad->constant = 0;
3462 if (boundary > BITS_PER_UNIT)
3464 if (offset_ptr->var)
3466 tree sp_offset_tree = ssize_int (sp_offset);
3467 tree offset = size_binop (PLUS_EXPR,
3468 ARGS_SIZE_TREE (*offset_ptr),
3469 sp_offset_tree);
3470 #ifdef ARGS_GROW_DOWNWARD
3471 tree rounded = round_down (offset, boundary / BITS_PER_UNIT);
3472 #else
3473 tree rounded = round_up (offset, boundary / BITS_PER_UNIT);
3474 #endif
3476 offset_ptr->var = size_binop (MINUS_EXPR, rounded, sp_offset_tree);
3477 /* ARGS_SIZE_TREE includes constant term. */
3478 offset_ptr->constant = 0;
3479 if (boundary > PARM_BOUNDARY)
3480 alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
3481 save_var);
3483 else
3485 offset_ptr->constant = -sp_offset +
3486 #ifdef ARGS_GROW_DOWNWARD
3487 FLOOR_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3488 #else
3489 CEIL_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3490 #endif
3491 if (boundary > PARM_BOUNDARY)
3492 alignment_pad->constant = offset_ptr->constant - save_constant;
3497 static void
3498 pad_below (struct args_size *offset_ptr, enum machine_mode passed_mode, tree sizetree)
3500 if (passed_mode != BLKmode)
3502 if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3503 offset_ptr->constant
3504 += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3505 / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3506 - GET_MODE_SIZE (passed_mode));
3508 else
3510 if (TREE_CODE (sizetree) != INTEGER_CST
3511 || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3513 /* Round the size up to multiple of PARM_BOUNDARY bits. */
3514 tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3515 /* Add it in. */
3516 ADD_PARM_SIZE (*offset_ptr, s2);
3517 SUB_PARM_SIZE (*offset_ptr, sizetree);
3523 /* True if register REGNO was alive at a place where `setjmp' was
3524 called and was set more than once or is an argument. Such regs may
3525 be clobbered by `longjmp'. */
3527 static bool
3528 regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)
3530 /* There appear to be cases where some local vars never reach the
3531 backend but have bogus regnos. */
3532 if (regno >= max_reg_num ())
3533 return false;
3535 return ((REG_N_SETS (regno) > 1
3536 || REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), regno))
3537 && REGNO_REG_SET_P (setjmp_crosses, regno));
3540 /* Walk the tree of blocks describing the binding levels within a
3541 function and warn about variables the might be killed by setjmp or
3542 vfork. This is done after calling flow_analysis before register
3543 allocation since that will clobber the pseudo-regs to hard
3544 regs. */
3546 static void
3547 setjmp_vars_warning (bitmap setjmp_crosses, tree block)
3549 tree decl, sub;
3551 for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3553 if (TREE_CODE (decl) == VAR_DECL
3554 && DECL_RTL_SET_P (decl)
3555 && REG_P (DECL_RTL (decl))
3556 && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
3557 warning (OPT_Wclobbered, "variable %q+D might be clobbered by"
3558 " %<longjmp%> or %<vfork%>", decl);
3561 for (sub = BLOCK_SUBBLOCKS (block); sub; sub = BLOCK_CHAIN (sub))
3562 setjmp_vars_warning (setjmp_crosses, sub);
3565 /* Do the appropriate part of setjmp_vars_warning
3566 but for arguments instead of local variables. */
3568 static void
3569 setjmp_args_warning (bitmap setjmp_crosses)
3571 tree decl;
3572 for (decl = DECL_ARGUMENTS (current_function_decl);
3573 decl; decl = TREE_CHAIN (decl))
3574 if (DECL_RTL (decl) != 0
3575 && REG_P (DECL_RTL (decl))
3576 && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
3577 warning (OPT_Wclobbered,
3578 "argument %q+D might be clobbered by %<longjmp%> or %<vfork%>",
3579 decl);
3582 /* Generate warning messages for variables live across setjmp. */
3584 void
3585 generate_setjmp_warnings (void)
3587 bitmap setjmp_crosses = regstat_get_setjmp_crosses ();
3589 if (n_basic_blocks == NUM_FIXED_BLOCKS
3590 || bitmap_empty_p (setjmp_crosses))
3591 return;
3593 setjmp_vars_warning (setjmp_crosses, DECL_INITIAL (current_function_decl));
3594 setjmp_args_warning (setjmp_crosses);
3598 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
3599 and create duplicate blocks. */
3600 /* ??? Need an option to either create block fragments or to create
3601 abstract origin duplicates of a source block. It really depends
3602 on what optimization has been performed. */
3604 void
3605 reorder_blocks (void)
3607 tree block = DECL_INITIAL (current_function_decl);
3608 VEC(tree,heap) *block_stack;
3610 if (block == NULL_TREE)
3611 return;
3613 block_stack = VEC_alloc (tree, heap, 10);
3615 /* Reset the TREE_ASM_WRITTEN bit for all blocks. */
3616 clear_block_marks (block);
3618 /* Prune the old trees away, so that they don't get in the way. */
3619 BLOCK_SUBBLOCKS (block) = NULL_TREE;
3620 BLOCK_CHAIN (block) = NULL_TREE;
3622 /* Recreate the block tree from the note nesting. */
3623 reorder_blocks_1 (get_insns (), block, &block_stack);
3624 BLOCK_SUBBLOCKS (block) = blocks_nreverse (BLOCK_SUBBLOCKS (block));
3626 VEC_free (tree, heap, block_stack);
3629 /* Helper function for reorder_blocks. Reset TREE_ASM_WRITTEN. */
3631 void
3632 clear_block_marks (tree block)
3634 while (block)
3636 TREE_ASM_WRITTEN (block) = 0;
3637 clear_block_marks (BLOCK_SUBBLOCKS (block));
3638 block = BLOCK_CHAIN (block);
3642 static void
3643 reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
3645 rtx insn;
3647 for (insn = insns; insn; insn = NEXT_INSN (insn))
3649 if (NOTE_P (insn))
3651 if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_BEG)
3653 tree block = NOTE_BLOCK (insn);
3654 tree origin;
3656 origin = (BLOCK_FRAGMENT_ORIGIN (block)
3657 ? BLOCK_FRAGMENT_ORIGIN (block)
3658 : block);
3660 /* If we have seen this block before, that means it now
3661 spans multiple address regions. Create a new fragment. */
3662 if (TREE_ASM_WRITTEN (block))
3664 tree new_block = copy_node (block);
3666 BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
3667 BLOCK_FRAGMENT_CHAIN (new_block)
3668 = BLOCK_FRAGMENT_CHAIN (origin);
3669 BLOCK_FRAGMENT_CHAIN (origin) = new_block;
3671 NOTE_BLOCK (insn) = new_block;
3672 block = new_block;
3675 BLOCK_SUBBLOCKS (block) = 0;
3676 TREE_ASM_WRITTEN (block) = 1;
3677 /* When there's only one block for the entire function,
3678 current_block == block and we mustn't do this, it
3679 will cause infinite recursion. */
3680 if (block != current_block)
3682 if (block != origin)
3683 gcc_assert (BLOCK_SUPERCONTEXT (origin) == current_block);
3685 BLOCK_SUPERCONTEXT (block) = current_block;
3686 BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
3687 BLOCK_SUBBLOCKS (current_block) = block;
3688 current_block = origin;
3690 VEC_safe_push (tree, heap, *p_block_stack, block);
3692 else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END)
3694 NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack);
3695 BLOCK_SUBBLOCKS (current_block)
3696 = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
3697 current_block = BLOCK_SUPERCONTEXT (current_block);
3703 /* Reverse the order of elements in the chain T of blocks,
3704 and return the new head of the chain (old last element). */
3706 tree
3707 blocks_nreverse (tree t)
3709 tree prev = 0, decl, next;
3710 for (decl = t; decl; decl = next)
3712 next = BLOCK_CHAIN (decl);
3713 BLOCK_CHAIN (decl) = prev;
3714 prev = decl;
3716 return prev;
3719 /* Count the subblocks of the list starting with BLOCK. If VECTOR is
3720 non-NULL, list them all into VECTOR, in a depth-first preorder
3721 traversal of the block tree. Also clear TREE_ASM_WRITTEN in all
3722 blocks. */
3724 static int
3725 all_blocks (tree block, tree *vector)
3727 int n_blocks = 0;
3729 while (block)
3731 TREE_ASM_WRITTEN (block) = 0;
3733 /* Record this block. */
3734 if (vector)
3735 vector[n_blocks] = block;
3737 ++n_blocks;
3739 /* Record the subblocks, and their subblocks... */
3740 n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
3741 vector ? vector + n_blocks : 0);
3742 block = BLOCK_CHAIN (block);
3745 return n_blocks;
3748 /* Return a vector containing all the blocks rooted at BLOCK. The
3749 number of elements in the vector is stored in N_BLOCKS_P. The
3750 vector is dynamically allocated; it is the caller's responsibility
3751 to call `free' on the pointer returned. */
3753 static tree *
3754 get_block_vector (tree block, int *n_blocks_p)
3756 tree *block_vector;
3758 *n_blocks_p = all_blocks (block, NULL);
3759 block_vector = XNEWVEC (tree, *n_blocks_p);
3760 all_blocks (block, block_vector);
3762 return block_vector;
3765 static GTY(()) int next_block_index = 2;
3767 /* Set BLOCK_NUMBER for all the blocks in FN. */
3769 void
3770 number_blocks (tree fn)
3772 int i;
3773 int n_blocks;
3774 tree *block_vector;
3776 /* For SDB and XCOFF debugging output, we start numbering the blocks
3777 from 1 within each function, rather than keeping a running
3778 count. */
3779 #if defined (SDB_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3780 if (write_symbols == SDB_DEBUG || write_symbols == XCOFF_DEBUG)
3781 next_block_index = 1;
3782 #endif
3784 block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
3786 /* The top-level BLOCK isn't numbered at all. */
3787 for (i = 1; i < n_blocks; ++i)
3788 /* We number the blocks from two. */
3789 BLOCK_NUMBER (block_vector[i]) = next_block_index++;
3791 free (block_vector);
3793 return;
3796 /* If VAR is present in a subblock of BLOCK, return the subblock. */
3798 tree
3799 debug_find_var_in_block_tree (tree var, tree block)
3801 tree t;
3803 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
3804 if (t == var)
3805 return block;
3807 for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
3809 tree ret = debug_find_var_in_block_tree (var, t);
3810 if (ret)
3811 return ret;
3814 return NULL_TREE;
3817 /* Keep track of whether we're in a dummy function context. If we are,
3818 we don't want to invoke the set_current_function hook, because we'll
3819 get into trouble if the hook calls target_reinit () recursively or
3820 when the initial initialization is not yet complete. */
3822 static bool in_dummy_function;
3824 /* Invoke the target hook when setting cfun. */
3826 static void
3827 invoke_set_current_function_hook (tree fndecl)
3829 if (!in_dummy_function)
3830 targetm.set_current_function (fndecl);
3833 /* cfun should never be set directly; use this function. */
3835 void
3836 set_cfun (struct function *new_cfun)
3838 if (cfun != new_cfun)
3840 cfun = new_cfun;
3841 invoke_set_current_function_hook (new_cfun ? new_cfun->decl : NULL_TREE);
3845 /* Keep track of the cfun stack. */
3847 typedef struct function *function_p;
3849 DEF_VEC_P(function_p);
3850 DEF_VEC_ALLOC_P(function_p,heap);
3852 /* Initialized with NOGC, making this poisonous to the garbage collector. */
3854 static VEC(function_p,heap) *cfun_stack;
3856 /* We save the value of in_system_header here when pushing the first
3857 function on the cfun stack, and we restore it from here when
3858 popping the last function. */
3860 static bool saved_in_system_header;
3862 /* Push the current cfun onto the stack, and set cfun to new_cfun. */
3864 void
3865 push_cfun (struct function *new_cfun)
3867 if (cfun == NULL)
3868 saved_in_system_header = in_system_header;
3869 VEC_safe_push (function_p, heap, cfun_stack, cfun);
3870 if (new_cfun)
3871 in_system_header = DECL_IN_SYSTEM_HEADER (new_cfun->decl);
3872 set_cfun (new_cfun);
3875 /* Pop cfun from the stack. */
3877 void
3878 pop_cfun (void)
3880 struct function *new_cfun = VEC_pop (function_p, cfun_stack);
3881 in_system_header = ((new_cfun == NULL) ? saved_in_system_header
3882 : DECL_IN_SYSTEM_HEADER (new_cfun->decl));
3883 set_cfun (new_cfun);
3886 /* Return value of funcdef and increase it. */
3888 get_next_funcdef_no (void)
3890 return funcdef_no++;
3893 /* Allocate a function structure for FNDECL and set its contents
3894 to the defaults. Set cfun to the newly-allocated object.
3895 Some of the helper functions invoked during initialization assume
3896 that cfun has already been set. Therefore, assign the new object
3897 directly into cfun and invoke the back end hook explicitly at the
3898 very end, rather than initializing a temporary and calling set_cfun
3899 on it.
3901 ABSTRACT_P is true if this is a function that will never be seen by
3902 the middle-end. Such functions are front-end concepts (like C++
3903 function templates) that do not correspond directly to functions
3904 placed in object files. */
3906 void
3907 allocate_struct_function (tree fndecl, bool abstract_p)
3909 tree result;
3910 tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;
3912 cfun = ggc_alloc_cleared (sizeof (struct function));
3914 cfun->stack_alignment_needed = STACK_BOUNDARY;
3915 cfun->preferred_stack_boundary = STACK_BOUNDARY;
3917 current_function_funcdef_no = get_next_funcdef_no ();
3919 cfun->function_frequency = FUNCTION_FREQUENCY_NORMAL;
3921 init_eh_for_function ();
3923 lang_hooks.function.init (cfun);
3924 if (init_machine_status)
3925 cfun->machine = (*init_machine_status) ();
3927 if (fndecl != NULL)
3929 DECL_STRUCT_FUNCTION (fndecl) = cfun;
3930 cfun->decl = fndecl;
3932 result = DECL_RESULT (fndecl);
3933 if (!abstract_p && aggregate_value_p (result, fndecl))
3935 #ifdef PCC_STATIC_STRUCT_RETURN
3936 current_function_returns_pcc_struct = 1;
3937 #endif
3938 current_function_returns_struct = 1;
3941 current_function_stdarg
3942 = (fntype
3943 && TYPE_ARG_TYPES (fntype) != 0
3944 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
3945 != void_type_node));
3947 /* Assume all registers in stdarg functions need to be saved. */
3948 cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
3949 cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
3952 invoke_set_current_function_hook (fndecl);
3955 /* This is like allocate_struct_function, but pushes a new cfun for FNDECL
3956 instead of just setting it. */
3958 void
3959 push_struct_function (tree fndecl)
3961 if (cfun == NULL)
3962 saved_in_system_header = in_system_header;
3963 VEC_safe_push (function_p, heap, cfun_stack, cfun);
3964 if (fndecl)
3965 in_system_header = DECL_IN_SYSTEM_HEADER (fndecl);
3966 allocate_struct_function (fndecl, false);
3969 /* Reset cfun, and other non-struct-function variables to defaults as
3970 appropriate for emitting rtl at the start of a function. */
3972 static void
3973 prepare_function_start (void)
3975 init_emit ();
3976 init_varasm_status (cfun);
3977 init_expr ();
3979 cse_not_expected = ! optimize;
3981 /* Caller save not needed yet. */
3982 caller_save_needed = 0;
3984 /* We haven't done register allocation yet. */
3985 reg_renumber = 0;
3987 /* Indicate that we have not instantiated virtual registers yet. */
3988 virtuals_instantiated = 0;
3990 /* Indicate that we want CONCATs now. */
3991 generating_concat_p = 1;
3993 /* Indicate we have no need of a frame pointer yet. */
3994 frame_pointer_needed = 0;
3997 /* Initialize the rtl expansion mechanism so that we can do simple things
3998 like generate sequences. This is used to provide a context during global
3999 initialization of some passes. You must call expand_dummy_function_end
4000 to exit this context. */
4002 void
4003 init_dummy_function_start (void)
4005 gcc_assert (!in_dummy_function);
4006 in_dummy_function = true;
4007 push_struct_function (NULL_TREE);
4008 prepare_function_start ();
4011 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
4012 and initialize static variables for generating RTL for the statements
4013 of the function. */
4015 void
4016 init_function_start (tree subr)
4018 if (subr && DECL_STRUCT_FUNCTION (subr))
4019 set_cfun (DECL_STRUCT_FUNCTION (subr));
4020 else
4021 allocate_struct_function (subr, false);
4022 prepare_function_start ();
4024 /* Warn if this value is an aggregate type,
4025 regardless of which calling convention we are using for it. */
4026 if (AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
4027 warning (OPT_Waggregate_return, "function returns an aggregate");
4030 /* Make sure all values used by the optimization passes have sane
4031 defaults. */
4032 unsigned int
4033 init_function_for_compilation (void)
4035 reg_renumber = 0;
4037 /* No prologue/epilogue insns yet. Make sure that these vectors are
4038 empty. */
4039 gcc_assert (VEC_length (int, prologue) == 0);
4040 gcc_assert (VEC_length (int, epilogue) == 0);
4041 gcc_assert (VEC_length (int, sibcall_epilogue) == 0);
4042 return 0;
4045 struct tree_opt_pass pass_init_function =
4047 NULL, /* name */
4048 NULL, /* gate */
4049 init_function_for_compilation, /* execute */
4050 NULL, /* sub */
4051 NULL, /* next */
4052 0, /* static_pass_number */
4053 0, /* tv_id */
4054 0, /* properties_required */
4055 0, /* properties_provided */
4056 0, /* properties_destroyed */
4057 0, /* todo_flags_start */
4058 0, /* todo_flags_finish */
4059 0 /* letter */
4063 void
4064 expand_main_function (void)
4066 #if (defined(INVOKE__main) \
4067 || (!defined(HAS_INIT_SECTION) \
4068 && !defined(INIT_SECTION_ASM_OP) \
4069 && !defined(INIT_ARRAY_SECTION_ASM_OP)))
4070 emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
4071 #endif
4074 /* Expand code to initialize the stack_protect_guard. This is invoked at
4075 the beginning of a function to be protected. */
4077 #ifndef HAVE_stack_protect_set
4078 # define HAVE_stack_protect_set 0
4079 # define gen_stack_protect_set(x,y) (gcc_unreachable (), NULL_RTX)
4080 #endif
4082 void
4083 stack_protect_prologue (void)
4085 tree guard_decl = targetm.stack_protect_guard ();
4086 rtx x, y;
4088 /* Avoid expand_expr here, because we don't want guard_decl pulled
4089 into registers unless absolutely necessary. And we know that
4090 cfun->stack_protect_guard is a local stack slot, so this skips
4091 all the fluff. */
4092 x = validize_mem (DECL_RTL (cfun->stack_protect_guard));
4093 y = validize_mem (DECL_RTL (guard_decl));
4095 /* Allow the target to copy from Y to X without leaking Y into a
4096 register. */
4097 if (HAVE_stack_protect_set)
4099 rtx insn = gen_stack_protect_set (x, y);
4100 if (insn)
4102 emit_insn (insn);
4103 return;
4107 /* Otherwise do a straight move. */
4108 emit_move_insn (x, y);
4111 /* Expand code to verify the stack_protect_guard. This is invoked at
4112 the end of a function to be protected. */
4114 #ifndef HAVE_stack_protect_test
4115 # define HAVE_stack_protect_test 0
4116 # define gen_stack_protect_test(x, y, z) (gcc_unreachable (), NULL_RTX)
4117 #endif
4119 void
4120 stack_protect_epilogue (void)
4122 tree guard_decl = targetm.stack_protect_guard ();
4123 rtx label = gen_label_rtx ();
4124 rtx x, y, tmp;
4126 /* Avoid expand_expr here, because we don't want guard_decl pulled
4127 into registers unless absolutely necessary. And we know that
4128 cfun->stack_protect_guard is a local stack slot, so this skips
4129 all the fluff. */
4130 x = validize_mem (DECL_RTL (cfun->stack_protect_guard));
4131 y = validize_mem (DECL_RTL (guard_decl));
4133 /* Allow the target to compare Y with X without leaking either into
4134 a register. */
4135 switch (HAVE_stack_protect_test != 0)
4137 case 1:
4138 tmp = gen_stack_protect_test (x, y, label);
4139 if (tmp)
4141 emit_insn (tmp);
4142 break;
4144 /* FALLTHRU */
4146 default:
4147 emit_cmp_and_jump_insns (x, y, EQ, NULL_RTX, ptr_mode, 1, label);
4148 break;
4151 /* The noreturn predictor has been moved to the tree level. The rtl-level
4152 predictors estimate this branch about 20%, which isn't enough to get
4153 things moved out of line. Since this is the only extant case of adding
4154 a noreturn function at the rtl level, it doesn't seem worth doing ought
4155 except adding the prediction by hand. */
4156 tmp = get_last_insn ();
4157 if (JUMP_P (tmp))
4158 predict_insn_def (tmp, PRED_NORETURN, TAKEN);
4160 expand_expr_stmt (targetm.stack_protect_fail ());
4161 emit_label (label);
4164 /* Start the RTL for a new function, and set variables used for
4165 emitting RTL.
4166 SUBR is the FUNCTION_DECL node.
4167 PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
4168 the function's parameters, which must be run at any return statement. */
4170 void
4171 expand_function_start (tree subr)
4173 /* Make sure volatile mem refs aren't considered
4174 valid operands of arithmetic insns. */
4175 init_recog_no_volatile ();
4177 current_function_profile
4178 = (profile_flag
4179 && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
4181 current_function_limit_stack
4182 = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
4184 /* Make the label for return statements to jump to. Do not special
4185 case machines with special return instructions -- they will be
4186 handled later during jump, ifcvt, or epilogue creation. */
4187 return_label = gen_label_rtx ();
4189 /* Initialize rtx used to return the value. */
4190 /* Do this before assign_parms so that we copy the struct value address
4191 before any library calls that assign parms might generate. */
4193 /* Decide whether to return the value in memory or in a register. */
4194 if (aggregate_value_p (DECL_RESULT (subr), subr))
4196 /* Returning something that won't go in a register. */
4197 rtx value_address = 0;
4199 #ifdef PCC_STATIC_STRUCT_RETURN
4200 if (current_function_returns_pcc_struct)
4202 int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
4203 value_address = assemble_static_space (size);
4205 else
4206 #endif
4208 rtx sv = targetm.calls.struct_value_rtx (TREE_TYPE (subr), 2);
4209 /* Expect to be passed the address of a place to store the value.
4210 If it is passed as an argument, assign_parms will take care of
4211 it. */
4212 if (sv)
4214 value_address = gen_reg_rtx (Pmode);
4215 emit_move_insn (value_address, sv);
4218 if (value_address)
4220 rtx x = value_address;
4221 if (!DECL_BY_REFERENCE (DECL_RESULT (subr)))
4223 x = gen_rtx_MEM (DECL_MODE (DECL_RESULT (subr)), x);
4224 set_mem_attributes (x, DECL_RESULT (subr), 1);
4226 SET_DECL_RTL (DECL_RESULT (subr), x);
4229 else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
4230 /* If return mode is void, this decl rtl should not be used. */
4231 SET_DECL_RTL (DECL_RESULT (subr), NULL_RTX);
4232 else
4234 /* Compute the return values into a pseudo reg, which we will copy
4235 into the true return register after the cleanups are done. */
4236 tree return_type = TREE_TYPE (DECL_RESULT (subr));
4237 if (TYPE_MODE (return_type) != BLKmode
4238 && targetm.calls.return_in_msb (return_type))
4239 /* expand_function_end will insert the appropriate padding in
4240 this case. Use the return value's natural (unpadded) mode
4241 within the function proper. */
4242 SET_DECL_RTL (DECL_RESULT (subr),
4243 gen_reg_rtx (TYPE_MODE (return_type)));
4244 else
4246 /* In order to figure out what mode to use for the pseudo, we
4247 figure out what the mode of the eventual return register will
4248 actually be, and use that. */
4249 rtx hard_reg = hard_function_value (return_type, subr, 0, 1);
4251 /* Structures that are returned in registers are not
4252 aggregate_value_p, so we may see a PARALLEL or a REG. */
4253 if (REG_P (hard_reg))
4254 SET_DECL_RTL (DECL_RESULT (subr),
4255 gen_reg_rtx (GET_MODE (hard_reg)));
4256 else
4258 gcc_assert (GET_CODE (hard_reg) == PARALLEL);
4259 SET_DECL_RTL (DECL_RESULT (subr), gen_group_rtx (hard_reg));
4263 /* Set DECL_REGISTER flag so that expand_function_end will copy the
4264 result to the real return register(s). */
4265 DECL_REGISTER (DECL_RESULT (subr)) = 1;
4268 /* Initialize rtx for parameters and local variables.
4269 In some cases this requires emitting insns. */
4270 assign_parms (subr);
4272 /* If function gets a static chain arg, store it. */
4273 if (cfun->static_chain_decl)
4275 tree parm = cfun->static_chain_decl;
4276 rtx local = gen_reg_rtx (Pmode);
4278 set_decl_incoming_rtl (parm, static_chain_incoming_rtx, false);
4279 SET_DECL_RTL (parm, local);
4280 mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
4282 emit_move_insn (local, static_chain_incoming_rtx);
4285 /* If the function receives a non-local goto, then store the
4286 bits we need to restore the frame pointer. */
4287 if (cfun->nonlocal_goto_save_area)
4289 tree t_save;
4290 rtx r_save;
4292 /* ??? We need to do this save early. Unfortunately here is
4293 before the frame variable gets declared. Help out... */
4294 expand_var (TREE_OPERAND (cfun->nonlocal_goto_save_area, 0));
4296 t_save = build4 (ARRAY_REF, ptr_type_node,
4297 cfun->nonlocal_goto_save_area,
4298 integer_zero_node, NULL_TREE, NULL_TREE);
4299 r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
4300 r_save = convert_memory_address (Pmode, r_save);
4302 emit_move_insn (r_save, virtual_stack_vars_rtx);
4303 update_nonlocal_goto_save_area ();
4306 /* The following was moved from init_function_start.
4307 The move is supposed to make sdb output more accurate. */
4308 /* Indicate the beginning of the function body,
4309 as opposed to parm setup. */
4310 emit_note (NOTE_INSN_FUNCTION_BEG);
4312 gcc_assert (NOTE_P (get_last_insn ()));
4314 parm_birth_insn = get_last_insn ();
4316 if (current_function_profile)
4318 #ifdef PROFILE_HOOK
4319 PROFILE_HOOK (current_function_funcdef_no);
4320 #endif
4323 /* After the display initializations is where the stack checking
4324 probe should go. */
4325 if(flag_stack_check)
4326 stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
4328 /* Make sure there is a line number after the function entry setup code. */
4329 force_next_line_note ();
4332 /* Undo the effects of init_dummy_function_start. */
4333 void
4334 expand_dummy_function_end (void)
4336 gcc_assert (in_dummy_function);
4338 /* End any sequences that failed to be closed due to syntax errors. */
4339 while (in_sequence_p ())
4340 end_sequence ();
4342 /* Outside function body, can't compute type's actual size
4343 until next function's body starts. */
4345 free_after_parsing (cfun);
4346 free_after_compilation (cfun);
4347 pop_cfun ();
4348 in_dummy_function = false;
4351 /* Call DOIT for each hard register used as a return value from
4352 the current function. */
4354 void
4355 diddle_return_value (void (*doit) (rtx, void *), void *arg)
4357 rtx outgoing = current_function_return_rtx;
4359 if (! outgoing)
4360 return;
4362 if (REG_P (outgoing))
4363 (*doit) (outgoing, arg);
4364 else if (GET_CODE (outgoing) == PARALLEL)
4366 int i;
4368 for (i = 0; i < XVECLEN (outgoing, 0); i++)
4370 rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
4372 if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
4373 (*doit) (x, arg);
4378 static void
4379 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4381 emit_insn (gen_rtx_CLOBBER (VOIDmode, reg));
4384 void
4385 clobber_return_register (void)
4387 diddle_return_value (do_clobber_return_reg, NULL);
4389 /* In case we do use pseudo to return value, clobber it too. */
4390 if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4392 tree decl_result = DECL_RESULT (current_function_decl);
4393 rtx decl_rtl = DECL_RTL (decl_result);
4394 if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
4396 do_clobber_return_reg (decl_rtl, NULL);
4401 static void
4402 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4404 emit_insn (gen_rtx_USE (VOIDmode, reg));
4407 static void
4408 use_return_register (void)
4410 diddle_return_value (do_use_return_reg, NULL);
4413 /* Possibly warn about unused parameters. */
4414 void
4415 do_warn_unused_parameter (tree fn)
4417 tree decl;
4419 for (decl = DECL_ARGUMENTS (fn);
4420 decl; decl = TREE_CHAIN (decl))
4421 if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
4422 && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)
4423 && !TREE_NO_WARNING (decl))
4424 warning (OPT_Wunused_parameter, "unused parameter %q+D", decl);
4427 static GTY(()) rtx initial_trampoline;
4429 /* Generate RTL for the end of the current function. */
4431 void
4432 expand_function_end (void)
4434 rtx clobber_after;
4436 /* If arg_pointer_save_area was referenced only from a nested
4437 function, we will not have initialized it yet. Do that now. */
4438 if (arg_pointer_save_area && ! cfun->arg_pointer_save_area_init)
4439 get_arg_pointer_save_area (cfun);
4441 /* If we are doing stack checking and this function makes calls,
4442 do a stack probe at the start of the function to ensure we have enough
4443 space for another stack frame. */
4444 if (flag_stack_check && ! STACK_CHECK_BUILTIN)
4446 rtx insn, seq;
4448 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4449 if (CALL_P (insn))
4451 start_sequence ();
4452 probe_stack_range (STACK_CHECK_PROTECT,
4453 GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
4454 seq = get_insns ();
4455 end_sequence ();
4456 emit_insn_before (seq, stack_check_probe_note);
4457 break;
4461 /* End any sequences that failed to be closed due to syntax errors. */
4462 while (in_sequence_p ())
4463 end_sequence ();
4465 clear_pending_stack_adjust ();
4466 do_pending_stack_adjust ();
4468 /* Output a linenumber for the end of the function.
4469 SDB depends on this. */
4470 force_next_line_note ();
4471 set_curr_insn_source_location (input_location);
4473 /* Before the return label (if any), clobber the return
4474 registers so that they are not propagated live to the rest of
4475 the function. This can only happen with functions that drop
4476 through; if there had been a return statement, there would
4477 have either been a return rtx, or a jump to the return label.
4479 We delay actual code generation after the current_function_value_rtx
4480 is computed. */
4481 clobber_after = get_last_insn ();
4483 /* Output the label for the actual return from the function. */
4484 emit_label (return_label);
4486 if (USING_SJLJ_EXCEPTIONS)
4488 /* Let except.c know where it should emit the call to unregister
4489 the function context for sjlj exceptions. */
4490 if (flag_exceptions)
4491 sjlj_emit_function_exit_after (get_last_insn ());
4493 else
4495 /* We want to ensure that instructions that may trap are not
4496 moved into the epilogue by scheduling, because we don't
4497 always emit unwind information for the epilogue. */
4498 if (flag_non_call_exceptions)
4499 emit_insn (gen_blockage ());
4502 /* If this is an implementation of throw, do what's necessary to
4503 communicate between __builtin_eh_return and the epilogue. */
4504 expand_eh_return ();
4506 /* If scalar return value was computed in a pseudo-reg, or was a named
4507 return value that got dumped to the stack, copy that to the hard
4508 return register. */
4509 if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4511 tree decl_result = DECL_RESULT (current_function_decl);
4512 rtx decl_rtl = DECL_RTL (decl_result);
4514 if (REG_P (decl_rtl)
4515 ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
4516 : DECL_REGISTER (decl_result))
4518 rtx real_decl_rtl = current_function_return_rtx;
4520 /* This should be set in assign_parms. */
4521 gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
4523 /* If this is a BLKmode structure being returned in registers,
4524 then use the mode computed in expand_return. Note that if
4525 decl_rtl is memory, then its mode may have been changed,
4526 but that current_function_return_rtx has not. */
4527 if (GET_MODE (real_decl_rtl) == BLKmode)
4528 PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
4530 /* If a non-BLKmode return value should be padded at the least
4531 significant end of the register, shift it left by the appropriate
4532 amount. BLKmode results are handled using the group load/store
4533 machinery. */
4534 if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
4535 && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
4537 emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),
4538 REGNO (real_decl_rtl)),
4539 decl_rtl);
4540 shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
4542 /* If a named return value dumped decl_return to memory, then
4543 we may need to re-do the PROMOTE_MODE signed/unsigned
4544 extension. */
4545 else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
4547 int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
4549 if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
4550 promote_mode (TREE_TYPE (decl_result), GET_MODE (decl_rtl),
4551 &unsignedp, 1);
4553 convert_move (real_decl_rtl, decl_rtl, unsignedp);
4555 else if (GET_CODE (real_decl_rtl) == PARALLEL)
4557 /* If expand_function_start has created a PARALLEL for decl_rtl,
4558 move the result to the real return registers. Otherwise, do
4559 a group load from decl_rtl for a named return. */
4560 if (GET_CODE (decl_rtl) == PARALLEL)
4561 emit_group_move (real_decl_rtl, decl_rtl);
4562 else
4563 emit_group_load (real_decl_rtl, decl_rtl,
4564 TREE_TYPE (decl_result),
4565 int_size_in_bytes (TREE_TYPE (decl_result)));
4567 /* In the case of complex integer modes smaller than a word, we'll
4568 need to generate some non-trivial bitfield insertions. Do that
4569 on a pseudo and not the hard register. */
4570 else if (GET_CODE (decl_rtl) == CONCAT
4571 && GET_MODE_CLASS (GET_MODE (decl_rtl)) == MODE_COMPLEX_INT
4572 && GET_MODE_BITSIZE (GET_MODE (decl_rtl)) <= BITS_PER_WORD)
4574 int old_generating_concat_p;
4575 rtx tmp;
4577 old_generating_concat_p = generating_concat_p;
4578 generating_concat_p = 0;
4579 tmp = gen_reg_rtx (GET_MODE (decl_rtl));
4580 generating_concat_p = old_generating_concat_p;
4582 emit_move_insn (tmp, decl_rtl);
4583 emit_move_insn (real_decl_rtl, tmp);
4585 else
4586 emit_move_insn (real_decl_rtl, decl_rtl);
4590 /* If returning a structure, arrange to return the address of the value
4591 in a place where debuggers expect to find it.
4593 If returning a structure PCC style,
4594 the caller also depends on this value.
4595 And current_function_returns_pcc_struct is not necessarily set. */
4596 if (current_function_returns_struct
4597 || current_function_returns_pcc_struct)
4599 rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
4600 tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
4601 rtx outgoing;
4603 if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
4604 type = TREE_TYPE (type);
4605 else
4606 value_address = XEXP (value_address, 0);
4608 outgoing = targetm.calls.function_value (build_pointer_type (type),
4609 current_function_decl, true);
4611 /* Mark this as a function return value so integrate will delete the
4612 assignment and USE below when inlining this function. */
4613 REG_FUNCTION_VALUE_P (outgoing) = 1;
4615 /* The address may be ptr_mode and OUTGOING may be Pmode. */
4616 value_address = convert_memory_address (GET_MODE (outgoing),
4617 value_address);
4619 emit_move_insn (outgoing, value_address);
4621 /* Show return register used to hold result (in this case the address
4622 of the result. */
4623 current_function_return_rtx = outgoing;
4626 /* Emit the actual code to clobber return register. */
4628 rtx seq;
4630 start_sequence ();
4631 clobber_return_register ();
4632 expand_naked_return ();
4633 seq = get_insns ();
4634 end_sequence ();
4636 emit_insn_after (seq, clobber_after);
4639 /* Output the label for the naked return from the function. */
4640 emit_label (naked_return_label);
4642 /* @@@ This is a kludge. We want to ensure that instructions that
4643 may trap are not moved into the epilogue by scheduling, because
4644 we don't always emit unwind information for the epilogue. */
4645 if (! USING_SJLJ_EXCEPTIONS && flag_non_call_exceptions)
4646 emit_insn (gen_blockage ());
4648 /* If stack protection is enabled for this function, check the guard. */
4649 if (cfun->stack_protect_guard)
4650 stack_protect_epilogue ();
4652 /* If we had calls to alloca, and this machine needs
4653 an accurate stack pointer to exit the function,
4654 insert some code to save and restore the stack pointer. */
4655 if (! EXIT_IGNORE_STACK
4656 && current_function_calls_alloca)
4658 rtx tem = 0;
4660 emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
4661 emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
4664 /* ??? This should no longer be necessary since stupid is no longer with
4665 us, but there are some parts of the compiler (eg reload_combine, and
4666 sh mach_dep_reorg) that still try and compute their own lifetime info
4667 instead of using the general framework. */
4668 use_return_register ();
4672 get_arg_pointer_save_area (struct function *f)
4674 rtx ret = f->x_arg_pointer_save_area;
4676 if (! ret)
4678 ret = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, f);
4679 f->x_arg_pointer_save_area = ret;
4682 if (f == cfun && ! f->arg_pointer_save_area_init)
4684 rtx seq;
4686 /* Save the arg pointer at the beginning of the function. The
4687 generated stack slot may not be a valid memory address, so we
4688 have to check it and fix it if necessary. */
4689 start_sequence ();
4690 emit_move_insn (validize_mem (ret), virtual_incoming_args_rtx);
4691 seq = get_insns ();
4692 end_sequence ();
4694 push_topmost_sequence ();
4695 emit_insn_after (seq, entry_of_function ());
4696 pop_topmost_sequence ();
4699 return ret;
4702 /* Extend a vector that records the INSN_UIDs of INSNS
4703 (a list of one or more insns). */
4705 static void
4706 record_insns (rtx insns, VEC(int,heap) **vecp)
4708 rtx tmp;
4710 for (tmp = insns; tmp != NULL_RTX; tmp = NEXT_INSN (tmp))
4711 VEC_safe_push (int, heap, *vecp, INSN_UID (tmp));
4714 /* Set the locator of the insn chain starting at INSN to LOC. */
4715 static void
4716 set_insn_locators (rtx insn, int loc)
4718 while (insn != NULL_RTX)
4720 if (INSN_P (insn))
4721 INSN_LOCATOR (insn) = loc;
4722 insn = NEXT_INSN (insn);
4726 /* Determine how many INSN_UIDs in VEC are part of INSN. Because we can
4727 be running after reorg, SEQUENCE rtl is possible. */
4729 static int
4730 contains (const_rtx insn, VEC(int,heap) **vec)
4732 int i, j;
4734 if (NONJUMP_INSN_P (insn)
4735 && GET_CODE (PATTERN (insn)) == SEQUENCE)
4737 int count = 0;
4738 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
4739 for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
4740 if (INSN_UID (XVECEXP (PATTERN (insn), 0, i))
4741 == VEC_index (int, *vec, j))
4742 count++;
4743 return count;
4745 else
4747 for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
4748 if (INSN_UID (insn) == VEC_index (int, *vec, j))
4749 return 1;
4751 return 0;
4755 prologue_epilogue_contains (const_rtx insn)
4757 if (contains (insn, &prologue))
4758 return 1;
4759 if (contains (insn, &epilogue))
4760 return 1;
4761 return 0;
4765 sibcall_epilogue_contains (const_rtx insn)
4767 if (sibcall_epilogue)
4768 return contains (insn, &sibcall_epilogue);
4769 return 0;
4772 #ifdef HAVE_return
4773 /* Insert gen_return at the end of block BB. This also means updating
4774 block_for_insn appropriately. */
4776 static void
4777 emit_return_into_block (basic_block bb)
4779 emit_jump_insn_after (gen_return (), BB_END (bb));
4781 #endif /* HAVE_return */
4783 #if defined(HAVE_epilogue) && defined(INCOMING_RETURN_ADDR_RTX)
4785 /* These functions convert the epilogue into a variant that does not
4786 modify the stack pointer. This is used in cases where a function
4787 returns an object whose size is not known until it is computed.
4788 The called function leaves the object on the stack, leaves the
4789 stack depressed, and returns a pointer to the object.
4791 What we need to do is track all modifications and references to the
4792 stack pointer, deleting the modifications and changing the
4793 references to point to the location the stack pointer would have
4794 pointed to had the modifications taken place.
4796 These functions need to be portable so we need to make as few
4797 assumptions about the epilogue as we can. However, the epilogue
4798 basically contains three things: instructions to reset the stack
4799 pointer, instructions to reload registers, possibly including the
4800 frame pointer, and an instruction to return to the caller.
4802 We must be sure of what a relevant epilogue insn is doing. We also
4803 make no attempt to validate the insns we make since if they are
4804 invalid, we probably can't do anything valid. The intent is that
4805 these routines get "smarter" as more and more machines start to use
4806 them and they try operating on different epilogues.
4808 We use the following structure to track what the part of the
4809 epilogue that we've already processed has done. We keep two copies
4810 of the SP equivalence, one for use during the insn we are
4811 processing and one for use in the next insn. The difference is
4812 because one part of a PARALLEL may adjust SP and the other may use
4813 it. */
4815 struct epi_info
4817 rtx sp_equiv_reg; /* REG that SP is set from, perhaps SP. */
4818 HOST_WIDE_INT sp_offset; /* Offset from SP_EQUIV_REG of present SP. */
4819 rtx new_sp_equiv_reg; /* REG to be used at end of insn. */
4820 HOST_WIDE_INT new_sp_offset; /* Offset to be used at end of insn. */
4821 rtx equiv_reg_src; /* If nonzero, the value that SP_EQUIV_REG
4822 should be set to once we no longer need
4823 its value. */
4824 rtx const_equiv[FIRST_PSEUDO_REGISTER]; /* Any known constant equivalences
4825 for registers. */
4828 static void handle_epilogue_set (rtx, struct epi_info *);
4829 static void update_epilogue_consts (rtx, const_rtx, void *);
4830 static void emit_equiv_load (struct epi_info *);
4832 /* Modify INSN, a list of one or more insns that is part of the epilogue, to
4833 no modifications to the stack pointer. Return the new list of insns. */
4835 static rtx
4836 keep_stack_depressed (rtx insns)
4838 int j;
4839 struct epi_info info;
4840 rtx insn, next;
4842 /* If the epilogue is just a single instruction, it must be OK as is. */
4843 if (NEXT_INSN (insns) == NULL_RTX)
4844 return insns;
4846 /* Otherwise, start a sequence, initialize the information we have, and
4847 process all the insns we were given. */
4848 start_sequence ();
4850 info.sp_equiv_reg = stack_pointer_rtx;
4851 info.sp_offset = 0;
4852 info.equiv_reg_src = 0;
4854 for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
4855 info.const_equiv[j] = 0;
4857 insn = insns;
4858 next = NULL_RTX;
4859 while (insn != NULL_RTX)
4861 next = NEXT_INSN (insn);
4863 if (!INSN_P (insn))
4865 add_insn (insn);
4866 insn = next;
4867 continue;
4870 /* If this insn references the register that SP is equivalent to and
4871 we have a pending load to that register, we must force out the load
4872 first and then indicate we no longer know what SP's equivalent is. */
4873 if (info.equiv_reg_src != 0
4874 && reg_referenced_p (info.sp_equiv_reg, PATTERN (insn)))
4876 emit_equiv_load (&info);
4877 info.sp_equiv_reg = 0;
4880 info.new_sp_equiv_reg = info.sp_equiv_reg;
4881 info.new_sp_offset = info.sp_offset;
4883 /* If this is a (RETURN) and the return address is on the stack,
4884 update the address and change to an indirect jump. */
4885 if (GET_CODE (PATTERN (insn)) == RETURN
4886 || (GET_CODE (PATTERN (insn)) == PARALLEL
4887 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == RETURN))
4889 rtx retaddr = INCOMING_RETURN_ADDR_RTX;
4890 rtx base = 0;
4891 HOST_WIDE_INT offset = 0;
4892 rtx jump_insn, jump_set;
4894 /* If the return address is in a register, we can emit the insn
4895 unchanged. Otherwise, it must be a MEM and we see what the
4896 base register and offset are. In any case, we have to emit any
4897 pending load to the equivalent reg of SP, if any. */
4898 if (REG_P (retaddr))
4900 emit_equiv_load (&info);
4901 add_insn (insn);
4902 insn = next;
4903 continue;
4905 else
4907 rtx ret_ptr;
4908 gcc_assert (MEM_P (retaddr));
4910 ret_ptr = XEXP (retaddr, 0);
4912 if (REG_P (ret_ptr))
4914 base = gen_rtx_REG (Pmode, REGNO (ret_ptr));
4915 offset = 0;
4917 else
4919 gcc_assert (GET_CODE (ret_ptr) == PLUS
4920 && REG_P (XEXP (ret_ptr, 0))
4921 && GET_CODE (XEXP (ret_ptr, 1)) == CONST_INT);
4922 base = gen_rtx_REG (Pmode, REGNO (XEXP (ret_ptr, 0)));
4923 offset = INTVAL (XEXP (ret_ptr, 1));
4927 /* If the base of the location containing the return pointer
4928 is SP, we must update it with the replacement address. Otherwise,
4929 just build the necessary MEM. */
4930 retaddr = plus_constant (base, offset);
4931 if (base == stack_pointer_rtx)
4932 retaddr = simplify_replace_rtx (retaddr, stack_pointer_rtx,
4933 plus_constant (info.sp_equiv_reg,
4934 info.sp_offset));
4936 retaddr = gen_rtx_MEM (Pmode, retaddr);
4937 MEM_NOTRAP_P (retaddr) = 1;
4939 /* If there is a pending load to the equivalent register for SP
4940 and we reference that register, we must load our address into
4941 a scratch register and then do that load. */
4942 if (info.equiv_reg_src
4943 && reg_overlap_mentioned_p (info.equiv_reg_src, retaddr))
4945 unsigned int regno;
4946 rtx reg;
4948 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
4949 if (HARD_REGNO_MODE_OK (regno, Pmode)
4950 && !fixed_regs[regno]
4951 && TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
4952 && !REGNO_REG_SET_P
4953 (DF_LR_IN (EXIT_BLOCK_PTR), regno)
4954 && !refers_to_regno_p (regno,
4955 end_hard_regno (Pmode, regno),
4956 info.equiv_reg_src, NULL)
4957 && info.const_equiv[regno] == 0)
4958 break;
4960 gcc_assert (regno < FIRST_PSEUDO_REGISTER);
4962 reg = gen_rtx_REG (Pmode, regno);
4963 emit_move_insn (reg, retaddr);
4964 retaddr = reg;
4967 emit_equiv_load (&info);
4968 jump_insn = emit_jump_insn (gen_indirect_jump (retaddr));
4970 /* Show the SET in the above insn is a RETURN. */
4971 jump_set = single_set (jump_insn);
4972 gcc_assert (jump_set);
4973 SET_IS_RETURN_P (jump_set) = 1;
4976 /* If SP is not mentioned in the pattern and its equivalent register, if
4977 any, is not modified, just emit it. Otherwise, if neither is set,
4978 replace the reference to SP and emit the insn. If none of those are
4979 true, handle each SET individually. */
4980 else if (!reg_mentioned_p (stack_pointer_rtx, PATTERN (insn))
4981 && (info.sp_equiv_reg == stack_pointer_rtx
4982 || !reg_set_p (info.sp_equiv_reg, insn)))
4983 add_insn (insn);
4984 else if (! reg_set_p (stack_pointer_rtx, insn)
4985 && (info.sp_equiv_reg == stack_pointer_rtx
4986 || !reg_set_p (info.sp_equiv_reg, insn)))
4988 int changed;
4990 changed = validate_replace_rtx (stack_pointer_rtx,
4991 plus_constant (info.sp_equiv_reg,
4992 info.sp_offset),
4993 insn);
4994 gcc_assert (changed);
4996 add_insn (insn);
4998 else if (GET_CODE (PATTERN (insn)) == SET)
4999 handle_epilogue_set (PATTERN (insn), &info);
5000 else if (GET_CODE (PATTERN (insn)) == PARALLEL)
5002 for (j = 0; j < XVECLEN (PATTERN (insn), 0); j++)
5003 if (GET_CODE (XVECEXP (PATTERN (insn), 0, j)) == SET)
5004 handle_epilogue_set (XVECEXP (PATTERN (insn), 0, j), &info);
5006 else
5007 add_insn (insn);
5009 info.sp_equiv_reg = info.new_sp_equiv_reg;
5010 info.sp_offset = info.new_sp_offset;
5012 /* Now update any constants this insn sets. */
5013 note_stores (PATTERN (insn), update_epilogue_consts, &info);
5014 insn = next;
5017 insns = get_insns ();
5018 end_sequence ();
5019 return insns;
5022 /* SET is a SET from an insn in the epilogue. P is a pointer to the epi_info
5023 structure that contains information about what we've seen so far. We
5024 process this SET by either updating that data or by emitting one or
5025 more insns. */
5027 static void
5028 handle_epilogue_set (rtx set, struct epi_info *p)
5030 /* First handle the case where we are setting SP. Record what it is being
5031 set from, which we must be able to determine */
5032 if (reg_set_p (stack_pointer_rtx, set))
5034 gcc_assert (SET_DEST (set) == stack_pointer_rtx);
5036 if (GET_CODE (SET_SRC (set)) == PLUS)
5038 p->new_sp_equiv_reg = XEXP (SET_SRC (set), 0);
5039 if (GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
5040 p->new_sp_offset = INTVAL (XEXP (SET_SRC (set), 1));
5041 else
5043 gcc_assert (REG_P (XEXP (SET_SRC (set), 1))
5044 && (REGNO (XEXP (SET_SRC (set), 1))
5045 < FIRST_PSEUDO_REGISTER)
5046 && p->const_equiv[REGNO (XEXP (SET_SRC (set), 1))]);
5047 p->new_sp_offset
5048 = INTVAL (p->const_equiv[REGNO (XEXP (SET_SRC (set), 1))]);
5051 else
5052 p->new_sp_equiv_reg = SET_SRC (set), p->new_sp_offset = 0;
5054 /* If we are adjusting SP, we adjust from the old data. */
5055 if (p->new_sp_equiv_reg == stack_pointer_rtx)
5057 p->new_sp_equiv_reg = p->sp_equiv_reg;
5058 p->new_sp_offset += p->sp_offset;
5061 gcc_assert (p->new_sp_equiv_reg && REG_P (p->new_sp_equiv_reg));
5063 return;
5066 /* Next handle the case where we are setting SP's equivalent
5067 register. We must not already have a value to set it to. We
5068 could update, but there seems little point in handling that case.
5069 Note that we have to allow for the case where we are setting the
5070 register set in the previous part of a PARALLEL inside a single
5071 insn. But use the old offset for any updates within this insn.
5072 We must allow for the case where the register is being set in a
5073 different (usually wider) mode than Pmode). */
5074 else if (p->new_sp_equiv_reg != 0 && reg_set_p (p->new_sp_equiv_reg, set))
5076 gcc_assert (!p->equiv_reg_src
5077 && REG_P (p->new_sp_equiv_reg)
5078 && REG_P (SET_DEST (set))
5079 && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (set)))
5080 <= BITS_PER_WORD)
5081 && REGNO (p->new_sp_equiv_reg) == REGNO (SET_DEST (set)));
5082 p->equiv_reg_src
5083 = simplify_replace_rtx (SET_SRC (set), stack_pointer_rtx,
5084 plus_constant (p->sp_equiv_reg,
5085 p->sp_offset));
5088 /* Otherwise, replace any references to SP in the insn to its new value
5089 and emit the insn. */
5090 else
5092 SET_SRC (set) = simplify_replace_rtx (SET_SRC (set), stack_pointer_rtx,
5093 plus_constant (p->sp_equiv_reg,
5094 p->sp_offset));
5095 SET_DEST (set) = simplify_replace_rtx (SET_DEST (set), stack_pointer_rtx,
5096 plus_constant (p->sp_equiv_reg,
5097 p->sp_offset));
5098 emit_insn (set);
5102 /* Update the tracking information for registers set to constants. */
5104 static void
5105 update_epilogue_consts (rtx dest, const_rtx x, void *data)
5107 struct epi_info *p = (struct epi_info *) data;
5108 rtx new;
5110 if (!REG_P (dest) || REGNO (dest) >= FIRST_PSEUDO_REGISTER)
5111 return;
5113 /* If we are either clobbering a register or doing a partial set,
5114 show we don't know the value. */
5115 else if (GET_CODE (x) == CLOBBER || ! rtx_equal_p (dest, SET_DEST (x)))
5116 p->const_equiv[REGNO (dest)] = 0;
5118 /* If we are setting it to a constant, record that constant. */
5119 else if (GET_CODE (SET_SRC (x)) == CONST_INT)
5120 p->const_equiv[REGNO (dest)] = SET_SRC (x);
5122 /* If this is a binary operation between a register we have been tracking
5123 and a constant, see if we can compute a new constant value. */
5124 else if (ARITHMETIC_P (SET_SRC (x))
5125 && REG_P (XEXP (SET_SRC (x), 0))
5126 && REGNO (XEXP (SET_SRC (x), 0)) < FIRST_PSEUDO_REGISTER
5127 && p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))] != 0
5128 && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
5129 && 0 != (new = simplify_binary_operation
5130 (GET_CODE (SET_SRC (x)), GET_MODE (dest),
5131 p->const_equiv[REGNO (XEXP (SET_SRC (x), 0))],
5132 XEXP (SET_SRC (x), 1)))
5133 && GET_CODE (new) == CONST_INT)
5134 p->const_equiv[REGNO (dest)] = new;
5136 /* Otherwise, we can't do anything with this value. */
5137 else
5138 p->const_equiv[REGNO (dest)] = 0;
5141 /* Emit an insn to do the load shown in p->equiv_reg_src, if needed. */
5143 static void
5144 emit_equiv_load (struct epi_info *p)
5146 if (p->equiv_reg_src != 0)
5148 rtx dest = p->sp_equiv_reg;
5150 if (GET_MODE (p->equiv_reg_src) != GET_MODE (dest))
5151 dest = gen_rtx_REG (GET_MODE (p->equiv_reg_src),
5152 REGNO (p->sp_equiv_reg));
5154 emit_move_insn (dest, p->equiv_reg_src);
5155 p->equiv_reg_src = 0;
5158 #endif
5160 /* Generate the prologue and epilogue RTL if the machine supports it. Thread
5161 this into place with notes indicating where the prologue ends and where
5162 the epilogue begins. Update the basic block information when possible. */
5164 static void
5165 thread_prologue_and_epilogue_insns (void)
5167 int inserted = 0;
5168 edge e;
5169 #if defined (HAVE_sibcall_epilogue) || defined (HAVE_epilogue) || defined (HAVE_return) || defined (HAVE_prologue)
5170 rtx seq;
5171 #endif
5172 #if defined (HAVE_epilogue) || defined(HAVE_return)
5173 rtx epilogue_end = NULL_RTX;
5174 #endif
5175 edge_iterator ei;
5177 #ifdef HAVE_prologue
5178 if (HAVE_prologue)
5180 start_sequence ();
5181 seq = gen_prologue ();
5182 emit_insn (seq);
5184 /* Insert an explicit USE for the frame pointer
5185 if the profiling is on and the frame pointer is required. */
5186 if (current_function_profile && frame_pointer_needed)
5187 emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
5189 /* Retain a map of the prologue insns. */
5190 record_insns (seq, &prologue);
5191 emit_note (NOTE_INSN_PROLOGUE_END);
5193 #ifndef PROFILE_BEFORE_PROLOGUE
5194 /* Ensure that instructions are not moved into the prologue when
5195 profiling is on. The call to the profiling routine can be
5196 emitted within the live range of a call-clobbered register. */
5197 if (current_function_profile)
5198 emit_insn (gen_blockage ());
5199 #endif
5201 seq = get_insns ();
5202 end_sequence ();
5203 set_insn_locators (seq, prologue_locator);
5205 /* Can't deal with multiple successors of the entry block
5206 at the moment. Function should always have at least one
5207 entry point. */
5208 gcc_assert (single_succ_p (ENTRY_BLOCK_PTR));
5210 insert_insn_on_edge (seq, single_succ_edge (ENTRY_BLOCK_PTR));
5211 inserted = 1;
5213 #endif
5215 /* If the exit block has no non-fake predecessors, we don't need
5216 an epilogue. */
5217 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5218 if ((e->flags & EDGE_FAKE) == 0)
5219 break;
5220 if (e == NULL)
5221 goto epilogue_done;
5223 #ifdef HAVE_return
5224 if (optimize && HAVE_return)
5226 /* If we're allowed to generate a simple return instruction,
5227 then by definition we don't need a full epilogue. Examine
5228 the block that falls through to EXIT. If it does not
5229 contain any code, examine its predecessors and try to
5230 emit (conditional) return instructions. */
5232 basic_block last;
5233 rtx label;
5235 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5236 if (e->flags & EDGE_FALLTHRU)
5237 break;
5238 if (e == NULL)
5239 goto epilogue_done;
5240 last = e->src;
5242 /* Verify that there are no active instructions in the last block. */
5243 label = BB_END (last);
5244 while (label && !LABEL_P (label))
5246 if (active_insn_p (label))
5247 break;
5248 label = PREV_INSN (label);
5251 if (BB_HEAD (last) == label && LABEL_P (label))
5253 edge_iterator ei2;
5255 for (ei2 = ei_start (last->preds); (e = ei_safe_edge (ei2)); )
5257 basic_block bb = e->src;
5258 rtx jump;
5260 if (bb == ENTRY_BLOCK_PTR)
5262 ei_next (&ei2);
5263 continue;
5266 jump = BB_END (bb);
5267 if (!JUMP_P (jump) || JUMP_LABEL (jump) != label)
5269 ei_next (&ei2);
5270 continue;
5273 /* If we have an unconditional jump, we can replace that
5274 with a simple return instruction. */
5275 if (simplejump_p (jump))
5277 emit_return_into_block (bb);
5278 delete_insn (jump);
5281 /* If we have a conditional jump, we can try to replace
5282 that with a conditional return instruction. */
5283 else if (condjump_p (jump))
5285 if (! redirect_jump (jump, 0, 0))
5287 ei_next (&ei2);
5288 continue;
5291 /* If this block has only one successor, it both jumps
5292 and falls through to the fallthru block, so we can't
5293 delete the edge. */
5294 if (single_succ_p (bb))
5296 ei_next (&ei2);
5297 continue;
5300 else
5302 ei_next (&ei2);
5303 continue;
5306 /* Fix up the CFG for the successful change we just made. */
5307 redirect_edge_succ (e, EXIT_BLOCK_PTR);
5310 /* Emit a return insn for the exit fallthru block. Whether
5311 this is still reachable will be determined later. */
5313 emit_barrier_after (BB_END (last));
5314 emit_return_into_block (last);
5315 epilogue_end = BB_END (last);
5316 single_succ_edge (last)->flags &= ~EDGE_FALLTHRU;
5317 goto epilogue_done;
5320 #endif
5321 /* Find the edge that falls through to EXIT. Other edges may exist
5322 due to RETURN instructions, but those don't need epilogues.
5323 There really shouldn't be a mixture -- either all should have
5324 been converted or none, however... */
5326 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5327 if (e->flags & EDGE_FALLTHRU)
5328 break;
5329 if (e == NULL)
5330 goto epilogue_done;
5332 #ifdef HAVE_epilogue
5333 if (HAVE_epilogue)
5335 start_sequence ();
5336 epilogue_end = emit_note (NOTE_INSN_EPILOGUE_BEG);
5338 seq = gen_epilogue ();
5340 #ifdef INCOMING_RETURN_ADDR_RTX
5341 /* If this function returns with the stack depressed and we can support
5342 it, massage the epilogue to actually do that. */
5343 if (TREE_CODE (TREE_TYPE (current_function_decl)) == FUNCTION_TYPE
5344 && TYPE_RETURNS_STACK_DEPRESSED (TREE_TYPE (current_function_decl)))
5345 seq = keep_stack_depressed (seq);
5346 #endif
5348 emit_jump_insn (seq);
5350 /* Retain a map of the epilogue insns. */
5351 record_insns (seq, &epilogue);
5352 set_insn_locators (seq, epilogue_locator);
5354 seq = get_insns ();
5355 end_sequence ();
5357 insert_insn_on_edge (seq, e);
5358 inserted = 1;
5360 else
5361 #endif
5363 basic_block cur_bb;
5365 if (! next_active_insn (BB_END (e->src)))
5366 goto epilogue_done;
5367 /* We have a fall-through edge to the exit block, the source is not
5368 at the end of the function, and there will be an assembler epilogue
5369 at the end of the function.
5370 We can't use force_nonfallthru here, because that would try to
5371 use return. Inserting a jump 'by hand' is extremely messy, so
5372 we take advantage of cfg_layout_finalize using
5373 fixup_fallthru_exit_predecessor. */
5374 cfg_layout_initialize (0);
5375 FOR_EACH_BB (cur_bb)
5376 if (cur_bb->index >= NUM_FIXED_BLOCKS
5377 && cur_bb->next_bb->index >= NUM_FIXED_BLOCKS)
5378 cur_bb->aux = cur_bb->next_bb;
5379 cfg_layout_finalize ();
5381 epilogue_done:
5383 if (inserted)
5385 commit_edge_insertions ();
5387 /* The epilogue insns we inserted may cause the exit edge to no longer
5388 be fallthru. */
5389 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
5391 if (((e->flags & EDGE_FALLTHRU) != 0)
5392 && returnjump_p (BB_END (e->src)))
5393 e->flags &= ~EDGE_FALLTHRU;
5397 #ifdef HAVE_sibcall_epilogue
5398 /* Emit sibling epilogues before any sibling call sites. */
5399 for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
5401 basic_block bb = e->src;
5402 rtx insn = BB_END (bb);
5404 if (!CALL_P (insn)
5405 || ! SIBLING_CALL_P (insn))
5407 ei_next (&ei);
5408 continue;
5411 start_sequence ();
5412 emit_insn (gen_sibcall_epilogue ());
5413 seq = get_insns ();
5414 end_sequence ();
5416 /* Retain a map of the epilogue insns. Used in life analysis to
5417 avoid getting rid of sibcall epilogue insns. Do this before we
5418 actually emit the sequence. */
5419 record_insns (seq, &sibcall_epilogue);
5420 set_insn_locators (seq, epilogue_locator);
5422 emit_insn_before (seq, insn);
5423 ei_next (&ei);
5425 #endif
5427 #ifdef HAVE_epilogue
5428 if (epilogue_end)
5430 rtx insn, next;
5432 /* Similarly, move any line notes that appear after the epilogue.
5433 There is no need, however, to be quite so anal about the existence
5434 of such a note. Also possibly move
5435 NOTE_INSN_FUNCTION_BEG notes, as those can be relevant for debug
5436 info generation. */
5437 for (insn = epilogue_end; insn; insn = next)
5439 next = NEXT_INSN (insn);
5440 if (NOTE_P (insn)
5441 && (NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG))
5442 reorder_insns (insn, insn, PREV_INSN (epilogue_end));
5445 #endif
5447 /* Threading the prologue and epilogue changes the artificial refs
5448 in the entry and exit blocks. */
5449 epilogue_completed = 1;
5450 df_update_entry_exit_and_calls ();
5453 /* Reposition the prologue-end and epilogue-begin notes after instruction
5454 scheduling and delayed branch scheduling. */
5456 void
5457 reposition_prologue_and_epilogue_notes (void)
5459 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
5460 rtx insn, last, note;
5461 int len;
5463 if ((len = VEC_length (int, prologue)) > 0)
5465 last = 0, note = 0;
5467 /* Scan from the beginning until we reach the last prologue insn.
5468 We apparently can't depend on basic_block_{head,end} after
5469 reorg has run. */
5470 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5472 if (NOTE_P (insn))
5474 if (NOTE_KIND (insn) == NOTE_INSN_PROLOGUE_END)
5475 note = insn;
5477 else if (contains (insn, &prologue))
5479 last = insn;
5480 if (--len == 0)
5481 break;
5485 if (last)
5487 /* Find the prologue-end note if we haven't already, and
5488 move it to just after the last prologue insn. */
5489 if (note == 0)
5491 for (note = last; (note = NEXT_INSN (note));)
5492 if (NOTE_P (note)
5493 && NOTE_KIND (note) == NOTE_INSN_PROLOGUE_END)
5494 break;
5497 /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note. */
5498 if (LABEL_P (last))
5499 last = NEXT_INSN (last);
5500 reorder_insns (note, note, last);
5504 if ((len = VEC_length (int, epilogue)) > 0)
5506 last = 0, note = 0;
5508 /* Scan from the end until we reach the first epilogue insn.
5509 We apparently can't depend on basic_block_{head,end} after
5510 reorg has run. */
5511 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
5513 if (NOTE_P (insn))
5515 if (NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
5516 note = insn;
5518 else if (contains (insn, &epilogue))
5520 last = insn;
5521 if (--len == 0)
5522 break;
5526 if (last)
5528 /* Find the epilogue-begin note if we haven't already, and
5529 move it to just before the first epilogue insn. */
5530 if (note == 0)
5532 for (note = insn; (note = PREV_INSN (note));)
5533 if (NOTE_P (note)
5534 && NOTE_KIND (note) == NOTE_INSN_EPILOGUE_BEG)
5535 break;
5538 if (PREV_INSN (last) != note)
5539 reorder_insns (note, note, PREV_INSN (last));
5542 #endif /* HAVE_prologue or HAVE_epilogue */
5545 /* Returns the name of the current function. */
5546 const char *
5547 current_function_name (void)
5549 return lang_hooks.decl_printable_name (cfun->decl, 2);
5552 /* Returns the raw (mangled) name of the current function. */
5553 const char *
5554 current_function_assembler_name (void)
5556 return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (cfun->decl));
5560 static unsigned int
5561 rest_of_handle_check_leaf_regs (void)
5563 #ifdef LEAF_REGISTERS
5564 current_function_uses_only_leaf_regs
5565 = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
5566 #endif
5567 return 0;
5570 /* Insert a TYPE into the used types hash table of CFUN. */
5571 static void
5572 used_types_insert_helper (tree type, struct function *func)
5574 if (type != NULL && func != NULL)
5576 void **slot;
5578 if (func->used_types_hash == NULL)
5579 func->used_types_hash = htab_create_ggc (37, htab_hash_pointer,
5580 htab_eq_pointer, NULL);
5581 slot = htab_find_slot (func->used_types_hash, type, INSERT);
5582 if (*slot == NULL)
5583 *slot = type;
5587 /* Given a type, insert it into the used hash table in cfun. */
5588 void
5589 used_types_insert (tree t)
5591 while (POINTER_TYPE_P (t) || TREE_CODE (t) == ARRAY_TYPE)
5592 t = TREE_TYPE (t);
5593 t = TYPE_MAIN_VARIANT (t);
5594 if (debug_info_level > DINFO_LEVEL_NONE)
5595 used_types_insert_helper (t, cfun);
5598 struct tree_opt_pass pass_leaf_regs =
5600 NULL, /* name */
5601 NULL, /* gate */
5602 rest_of_handle_check_leaf_regs, /* execute */
5603 NULL, /* sub */
5604 NULL, /* next */
5605 0, /* static_pass_number */
5606 0, /* tv_id */
5607 0, /* properties_required */
5608 0, /* properties_provided */
5609 0, /* properties_destroyed */
5610 0, /* todo_flags_start */
5611 0, /* todo_flags_finish */
5612 0 /* letter */
5615 static unsigned int
5616 rest_of_handle_thread_prologue_and_epilogue (void)
5618 if (optimize)
5619 cleanup_cfg (CLEANUP_EXPENSIVE);
5620 /* On some machines, the prologue and epilogue code, or parts thereof,
5621 can be represented as RTL. Doing so lets us schedule insns between
5622 it and the rest of the code and also allows delayed branch
5623 scheduling to operate in the epilogue. */
5625 thread_prologue_and_epilogue_insns ();
5626 return 0;
5629 struct tree_opt_pass pass_thread_prologue_and_epilogue =
5631 "pro_and_epilogue", /* name */
5632 NULL, /* gate */
5633 rest_of_handle_thread_prologue_and_epilogue, /* execute */
5634 NULL, /* sub */
5635 NULL, /* next */
5636 0, /* static_pass_number */
5637 TV_THREAD_PROLOGUE_AND_EPILOGUE, /* tv_id */
5638 0, /* properties_required */
5639 0, /* properties_provided */
5640 0, /* properties_destroyed */
5641 TODO_verify_flow, /* todo_flags_start */
5642 TODO_dump_func |
5643 TODO_df_verify |
5644 TODO_df_finish | TODO_verify_rtl_sharing |
5645 TODO_ggc_collect, /* todo_flags_finish */
5646 'w' /* letter */
5650 /* This mini-pass fixes fall-out from SSA in asm statements that have
5651 in-out constraints. Say you start with
5653 orig = inout;
5654 asm ("": "+mr" (inout));
5655 use (orig);
5657 which is transformed very early to use explicit output and match operands:
5659 orig = inout;
5660 asm ("": "=mr" (inout) : "0" (inout));
5661 use (orig);
5663 Or, after SSA and copyprop,
5665 asm ("": "=mr" (inout_2) : "0" (inout_1));
5666 use (inout_1);
5668 Clearly inout_2 and inout_1 can't be coalesced easily anymore, as
5669 they represent two separate values, so they will get different pseudo
5670 registers during expansion. Then, since the two operands need to match
5671 per the constraints, but use different pseudo registers, reload can
5672 only register a reload for these operands. But reloads can only be
5673 satisfied by hardregs, not by memory, so we need a register for this
5674 reload, just because we are presented with non-matching operands.
5675 So, even though we allow memory for this operand, no memory can be
5676 used for it, just because the two operands don't match. This can
5677 cause reload failures on register-starved targets.
5679 So it's a symptom of reload not being able to use memory for reloads
5680 or, alternatively it's also a symptom of both operands not coming into
5681 reload as matching (in which case the pseudo could go to memory just
5682 fine, as the alternative allows it, and no reload would be necessary).
5683 We fix the latter problem here, by transforming
5685 asm ("": "=mr" (inout_2) : "0" (inout_1));
5687 back to
5689 inout_2 = inout_1;
5690 asm ("": "=mr" (inout_2) : "0" (inout_2)); */
5692 static void
5693 match_asm_constraints_1 (rtx insn, rtx *p_sets, int noutputs)
5695 int i;
5696 bool changed = false;
5697 rtx op = SET_SRC (p_sets[0]);
5698 int ninputs = ASM_OPERANDS_INPUT_LENGTH (op);
5699 rtvec inputs = ASM_OPERANDS_INPUT_VEC (op);
5700 bool *output_matched = alloca (noutputs * sizeof (bool));
5702 memset (output_matched, 0, noutputs * sizeof (bool));
5703 for (i = 0; i < ninputs; i++)
5705 rtx input, output, insns;
5706 const char *constraint = ASM_OPERANDS_INPUT_CONSTRAINT (op, i);
5707 char *end;
5708 int match, j;
5710 match = strtoul (constraint, &end, 10);
5711 if (end == constraint)
5712 continue;
5714 gcc_assert (match < noutputs);
5715 output = SET_DEST (p_sets[match]);
5716 input = RTVEC_ELT (inputs, i);
5717 /* Only do the transformation for pseudos. */
5718 if (! REG_P (output)
5719 || rtx_equal_p (output, input)
5720 || (GET_MODE (input) != VOIDmode
5721 && GET_MODE (input) != GET_MODE (output)))
5722 continue;
5724 /* We can't do anything if the output is also used as input,
5725 as we're going to overwrite it. */
5726 for (j = 0; j < ninputs; j++)
5727 if (reg_overlap_mentioned_p (output, RTVEC_ELT (inputs, j)))
5728 break;
5729 if (j != ninputs)
5730 continue;
5732 /* Avoid changing the same input several times. For
5733 asm ("" : "=mr" (out1), "=mr" (out2) : "0" (in), "1" (in));
5734 only change in once (to out1), rather than changing it
5735 first to out1 and afterwards to out2. */
5736 if (i > 0)
5738 for (j = 0; j < noutputs; j++)
5739 if (output_matched[j] && input == SET_DEST (p_sets[j]))
5740 break;
5741 if (j != noutputs)
5742 continue;
5744 output_matched[match] = true;
5746 start_sequence ();
5747 emit_move_insn (output, input);
5748 insns = get_insns ();
5749 end_sequence ();
5750 emit_insn_before (insns, insn);
5752 /* Now replace all mentions of the input with output. We can't
5753 just replace the occurence in inputs[i], as the register might
5754 also be used in some other input (or even in an address of an
5755 output), which would mean possibly increasing the number of
5756 inputs by one (namely 'output' in addition), which might pose
5757 a too complicated problem for reload to solve. E.g. this situation:
5759 asm ("" : "=r" (output), "=m" (input) : "0" (input))
5761 Here 'input' is used in two occurrences as input (once for the
5762 input operand, once for the address in the second output operand).
5763 If we would replace only the occurence of the input operand (to
5764 make the matching) we would be left with this:
5766 output = input
5767 asm ("" : "=r" (output), "=m" (input) : "0" (output))
5769 Now we suddenly have two different input values (containing the same
5770 value, but different pseudos) where we formerly had only one.
5771 With more complicated asms this might lead to reload failures
5772 which wouldn't have happen without this pass. So, iterate over
5773 all operands and replace all occurrences of the register used. */
5774 for (j = 0; j < noutputs; j++)
5775 if (!rtx_equal_p (SET_DEST (p_sets[j]), input)
5776 && reg_overlap_mentioned_p (input, SET_DEST (p_sets[j])))
5777 SET_DEST (p_sets[j]) = replace_rtx (SET_DEST (p_sets[j]),
5778 input, output);
5779 for (j = 0; j < ninputs; j++)
5780 if (reg_overlap_mentioned_p (input, RTVEC_ELT (inputs, j)))
5781 RTVEC_ELT (inputs, j) = replace_rtx (RTVEC_ELT (inputs, j),
5782 input, output);
5784 changed = true;
5787 if (changed)
5788 df_insn_rescan (insn);
5791 static unsigned
5792 rest_of_match_asm_constraints (void)
5794 basic_block bb;
5795 rtx insn, pat, *p_sets;
5796 int noutputs;
5798 if (!cfun->has_asm_statement)
5799 return 0;
5801 df_set_flags (DF_DEFER_INSN_RESCAN);
5802 FOR_EACH_BB (bb)
5804 FOR_BB_INSNS (bb, insn)
5806 if (!INSN_P (insn))
5807 continue;
5809 pat = PATTERN (insn);
5810 if (GET_CODE (pat) == PARALLEL)
5811 p_sets = &XVECEXP (pat, 0, 0), noutputs = XVECLEN (pat, 0);
5812 else if (GET_CODE (pat) == SET)
5813 p_sets = &PATTERN (insn), noutputs = 1;
5814 else
5815 continue;
5817 if (GET_CODE (*p_sets) == SET
5818 && GET_CODE (SET_SRC (*p_sets)) == ASM_OPERANDS)
5819 match_asm_constraints_1 (insn, p_sets, noutputs);
5823 return TODO_df_finish;
5826 struct tree_opt_pass pass_match_asm_constraints =
5828 "asmcons", /* name */
5829 NULL, /* gate */
5830 rest_of_match_asm_constraints, /* execute */
5831 NULL, /* sub */
5832 NULL, /* next */
5833 0, /* static_pass_number */
5834 0, /* tv_id */
5835 0, /* properties_required */
5836 0, /* properties_provided */
5837 0, /* properties_destroyed */
5838 0, /* todo_flags_start */
5839 TODO_dump_func, /* todo_flags_finish */
5840 0 /* letter */
5844 #include "gt-function.h"