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