xref: /netbsd/external/gpl3/gcc.old/dist/gcc/function.c (revision 840b4d17)
1 /* Expands front end tree to back end RTL for GCC.
2    Copyright (C) 1987-2020 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 /* This file handles the generation of rtl code from tree structure
21    at the level of the function as a whole.
22    It creates the rtl expressions for parameters and auto variables
23    and has full responsibility for allocating stack slots.
24 
25    `expand_function_start' is called at the beginning of a function,
26    before the function body is parsed, and `expand_function_end' is
27    called after parsing the body.
28 
29    Call `assign_stack_local' to allocate a stack slot for a local variable.
30    This is usually done during the RTL generation for the function body,
31    but it can also be done in the reload pass when a pseudo-register does
32    not get a hard register.  */
33 
34 #include "config.h"
35 #include "system.h"
36 #include "coretypes.h"
37 #include "backend.h"
38 #include "target.h"
39 #include "rtl.h"
40 #include "tree.h"
41 #include "gimple-expr.h"
42 #include "cfghooks.h"
43 #include "df.h"
44 #include "memmodel.h"
45 #include "tm_p.h"
46 #include "stringpool.h"
47 #include "expmed.h"
48 #include "optabs.h"
49 #include "regs.h"
50 #include "emit-rtl.h"
51 #include "recog.h"
52 #include "rtl-error.h"
53 #include "alias.h"
54 #include "fold-const.h"
55 #include "stor-layout.h"
56 #include "varasm.h"
57 #include "except.h"
58 #include "dojump.h"
59 #include "explow.h"
60 #include "calls.h"
61 #include "expr.h"
62 #include "optabs-tree.h"
63 #include "output.h"
64 #include "langhooks.h"
65 #include "common/common-target.h"
66 #include "gimplify.h"
67 #include "tree-pass.h"
68 #include "cfgrtl.h"
69 #include "cfganal.h"
70 #include "cfgbuild.h"
71 #include "cfgcleanup.h"
72 #include "cfgexpand.h"
73 #include "shrink-wrap.h"
74 #include "toplev.h"
75 #include "rtl-iter.h"
76 #include "tree-dfa.h"
77 #include "tree-ssa.h"
78 #include "stringpool.h"
79 #include "attribs.h"
80 #include "gimple.h"
81 #include "options.h"
82 #include "function-abi.h"
83 
84 /* So we can assign to cfun in this file.  */
85 #undef cfun
86 
87 #ifndef STACK_ALIGNMENT_NEEDED
88 #define STACK_ALIGNMENT_NEEDED 1
89 #endif
90 
91 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
92 
93 /* Round a value to the lowest integer less than it that is a multiple of
94    the required alignment.  Avoid using division in case the value is
95    negative.  Assume the alignment is a power of two.  */
96 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
97 
98 /* Similar, but round to the next highest integer that meets the
99    alignment.  */
100 #define CEIL_ROUND(VALUE,ALIGN)	(((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
101 
102 /* Nonzero once virtual register instantiation has been done.
103    assign_stack_local uses frame_pointer_rtx when this is nonzero.
104    calls.c:emit_library_call_value_1 uses it to set up
105    post-instantiation libcalls.  */
106 int virtuals_instantiated;
107 
108 /* Assign unique numbers to labels generated for profiling, debugging, etc.  */
109 static GTY(()) int funcdef_no;
110 
111 /* These variables hold pointers to functions to create and destroy
112    target specific, per-function data structures.  */
113 struct machine_function * (*init_machine_status) (void);
114 
115 /* The currently compiled function.  */
116 struct function *cfun = 0;
117 
118 /* These hashes record the prologue and epilogue insns.  */
119 
120 struct insn_cache_hasher : ggc_cache_ptr_hash<rtx_def>
121 {
hashinsn_cache_hasher122   static hashval_t hash (rtx x) { return htab_hash_pointer (x); }
equalinsn_cache_hasher123   static bool equal (rtx a, rtx b) { return a == b; }
124 };
125 
126 static GTY((cache))
127   hash_table<insn_cache_hasher> *prologue_insn_hash;
128 static GTY((cache))
129   hash_table<insn_cache_hasher> *epilogue_insn_hash;
130 
131 
132 hash_table<used_type_hasher> *types_used_by_vars_hash = NULL;
133 vec<tree, va_gc> *types_used_by_cur_var_decl;
134 
135 /* Forward declarations.  */
136 
137 static class temp_slot *find_temp_slot_from_address (rtx);
138 static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
139 static void pad_below (struct args_size *, machine_mode, tree);
140 static void reorder_blocks_1 (rtx_insn *, tree, vec<tree> *);
141 static int all_blocks (tree, tree *);
142 static tree *get_block_vector (tree, int *);
143 extern tree debug_find_var_in_block_tree (tree, tree);
144 /* We always define `record_insns' even if it's not used so that we
145    can always export `prologue_epilogue_contains'.  */
146 static void record_insns (rtx_insn *, rtx, hash_table<insn_cache_hasher> **)
147      ATTRIBUTE_UNUSED;
148 static bool contains (const rtx_insn *, hash_table<insn_cache_hasher> *);
149 static void prepare_function_start (void);
150 static void do_clobber_return_reg (rtx, void *);
151 static void do_use_return_reg (rtx, void *);
152 
153 
154 /* Stack of nested functions.  */
155 /* Keep track of the cfun stack.  */
156 
157 static vec<function *> function_context_stack;
158 
159 /* Save the current context for compilation of a nested function.
160    This is called from language-specific code.  */
161 
162 void
push_function_context(void)163 push_function_context (void)
164 {
165   if (cfun == 0)
166     allocate_struct_function (NULL, false);
167 
168   function_context_stack.safe_push (cfun);
169   set_cfun (NULL);
170 }
171 
172 /* Restore the last saved context, at the end of a nested function.
173    This function is called from language-specific code.  */
174 
175 void
pop_function_context(void)176 pop_function_context (void)
177 {
178   struct function *p = function_context_stack.pop ();
179   set_cfun (p);
180   current_function_decl = p->decl;
181 
182   /* Reset variables that have known state during rtx generation.  */
183   virtuals_instantiated = 0;
184   generating_concat_p = 1;
185 }
186 
187 /* Clear out all parts of the state in F that can safely be discarded
188    after the function has been parsed, but not compiled, to let
189    garbage collection reclaim the memory.  */
190 
191 void
free_after_parsing(struct function * f)192 free_after_parsing (struct function *f)
193 {
194   f->language = 0;
195 }
196 
197 /* Clear out all parts of the state in F that can safely be discarded
198    after the function has been compiled, to let garbage collection
199    reclaim the memory.  */
200 
201 void
free_after_compilation(struct function * f)202 free_after_compilation (struct function *f)
203 {
204   prologue_insn_hash = NULL;
205   epilogue_insn_hash = NULL;
206 
207   free (crtl->emit.regno_pointer_align);
208 
209   memset (crtl, 0, sizeof (struct rtl_data));
210   f->eh = NULL;
211   f->machine = NULL;
212   f->cfg = NULL;
213   f->curr_properties &= ~PROP_cfg;
214 
215   regno_reg_rtx = NULL;
216 }
217 
218 /* Return size needed for stack frame based on slots so far allocated.
219    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
220    the caller may have to do that.  */
221 
222 poly_int64
get_frame_size(void)223 get_frame_size (void)
224 {
225   if (FRAME_GROWS_DOWNWARD)
226     return -frame_offset;
227   else
228     return frame_offset;
229 }
230 
231 /* Issue an error message and return TRUE if frame OFFSET overflows in
232    the signed target pointer arithmetics for function FUNC.  Otherwise
233    return FALSE.  */
234 
235 bool
frame_offset_overflow(poly_int64 offset,tree func)236 frame_offset_overflow (poly_int64 offset, tree func)
237 {
238   poly_uint64 size = FRAME_GROWS_DOWNWARD ? -offset : offset;
239   unsigned HOST_WIDE_INT limit
240     = ((HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (Pmode) - 1))
241        /* Leave room for the fixed part of the frame.  */
242        - 64 * UNITS_PER_WORD);
243 
244   if (!coeffs_in_range_p (size, 0U, limit))
245     {
246       unsigned HOST_WIDE_INT hwisize;
247       if (size.is_constant (&hwisize))
248 	error_at (DECL_SOURCE_LOCATION (func),
249 		  "total size of local objects %wu exceeds maximum %wu",
250 		  hwisize, limit);
251       else
252 	error_at (DECL_SOURCE_LOCATION (func),
253 		  "total size of local objects exceeds maximum %wu",
254 		  limit);
255       return true;
256     }
257 
258   return false;
259 }
260 
261 /* Return the minimum spill slot alignment for a register of mode MODE.  */
262 
263 unsigned int
spill_slot_alignment(machine_mode mode ATTRIBUTE_UNUSED)264 spill_slot_alignment (machine_mode mode ATTRIBUTE_UNUSED)
265 {
266   return STACK_SLOT_ALIGNMENT (NULL_TREE, mode, GET_MODE_ALIGNMENT (mode));
267 }
268 
269 /* Return stack slot alignment in bits for TYPE and MODE.  */
270 
271 static unsigned int
get_stack_local_alignment(tree type,machine_mode mode)272 get_stack_local_alignment (tree type, machine_mode mode)
273 {
274   unsigned int alignment;
275 
276   if (mode == BLKmode)
277     alignment = BIGGEST_ALIGNMENT;
278   else
279     alignment = GET_MODE_ALIGNMENT (mode);
280 
281   /* Allow the frond-end to (possibly) increase the alignment of this
282      stack slot.  */
283   if (! type)
284     type = lang_hooks.types.type_for_mode (mode, 0);
285 
286   return STACK_SLOT_ALIGNMENT (type, mode, alignment);
287 }
288 
289 /* Determine whether it is possible to fit a stack slot of size SIZE and
290    alignment ALIGNMENT into an area in the stack frame that starts at
291    frame offset START and has a length of LENGTH.  If so, store the frame
292    offset to be used for the stack slot in *POFFSET and return true;
293    return false otherwise.  This function will extend the frame size when
294    given a start/length pair that lies at the end of the frame.  */
295 
296 static bool
try_fit_stack_local(poly_int64 start,poly_int64 length,poly_int64 size,unsigned int alignment,poly_int64_pod * poffset)297 try_fit_stack_local (poly_int64 start, poly_int64 length,
298 		     poly_int64 size, unsigned int alignment,
299 		     poly_int64_pod *poffset)
300 {
301   poly_int64 this_frame_offset;
302   int frame_off, frame_alignment, frame_phase;
303 
304   /* Calculate how many bytes the start of local variables is off from
305      stack alignment.  */
306   frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
307   frame_off = targetm.starting_frame_offset () % frame_alignment;
308   frame_phase = frame_off ? frame_alignment - frame_off : 0;
309 
310   /* Round the frame offset to the specified alignment.  */
311 
312   if (FRAME_GROWS_DOWNWARD)
313     this_frame_offset
314       = (aligned_lower_bound (start + length - size - frame_phase, alignment)
315 	 + frame_phase);
316   else
317     this_frame_offset
318       = aligned_upper_bound (start - frame_phase, alignment) + frame_phase;
319 
320   /* See if it fits.  If this space is at the edge of the frame,
321      consider extending the frame to make it fit.  Our caller relies on
322      this when allocating a new slot.  */
323   if (maybe_lt (this_frame_offset, start))
324     {
325       if (known_eq (frame_offset, start))
326 	frame_offset = this_frame_offset;
327       else
328 	return false;
329     }
330   else if (maybe_gt (this_frame_offset + size, start + length))
331     {
332       if (known_eq (frame_offset, start + length))
333 	frame_offset = this_frame_offset + size;
334       else
335 	return false;
336     }
337 
338   *poffset = this_frame_offset;
339   return true;
340 }
341 
342 /* Create a new frame_space structure describing free space in the stack
343    frame beginning at START and ending at END, and chain it into the
344    function's frame_space_list.  */
345 
346 static void
add_frame_space(poly_int64 start,poly_int64 end)347 add_frame_space (poly_int64 start, poly_int64 end)
348 {
349   class frame_space *space = ggc_alloc<frame_space> ();
350   space->next = crtl->frame_space_list;
351   crtl->frame_space_list = space;
352   space->start = start;
353   space->length = end - start;
354 }
355 
356 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
357    with machine mode MODE.
358 
359    ALIGN controls the amount of alignment for the address of the slot:
360    0 means according to MODE,
361    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
362    -2 means use BITS_PER_UNIT,
363    positive specifies alignment boundary in bits.
364 
365    KIND has ASLK_REDUCE_ALIGN bit set if it is OK to reduce
366    alignment and ASLK_RECORD_PAD bit set if we should remember
367    extra space we allocated for alignment purposes.  When we are
368    called from assign_stack_temp_for_type, it is not set so we don't
369    track the same stack slot in two independent lists.
370 
371    We do not round to stack_boundary here.  */
372 
373 rtx
assign_stack_local_1(machine_mode mode,poly_int64 size,int align,int kind)374 assign_stack_local_1 (machine_mode mode, poly_int64 size,
375 		      int align, int kind)
376 {
377   rtx x, addr;
378   poly_int64 bigend_correction = 0;
379   poly_int64 slot_offset = 0, old_frame_offset;
380   unsigned int alignment, alignment_in_bits;
381 
382   if (align == 0)
383     {
384       alignment = get_stack_local_alignment (NULL, mode);
385       alignment /= BITS_PER_UNIT;
386     }
387   else if (align == -1)
388     {
389       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
390       size = aligned_upper_bound (size, alignment);
391     }
392   else if (align == -2)
393     alignment = 1; /* BITS_PER_UNIT / BITS_PER_UNIT */
394   else
395     alignment = align / BITS_PER_UNIT;
396 
397   alignment_in_bits = alignment * BITS_PER_UNIT;
398 
399   /* Ignore alignment if it exceeds MAX_SUPPORTED_STACK_ALIGNMENT.  */
400   if (alignment_in_bits > MAX_SUPPORTED_STACK_ALIGNMENT)
401     {
402       alignment_in_bits = MAX_SUPPORTED_STACK_ALIGNMENT;
403       alignment = MAX_SUPPORTED_STACK_ALIGNMENT / BITS_PER_UNIT;
404     }
405 
406   if (SUPPORTS_STACK_ALIGNMENT)
407     {
408       if (crtl->stack_alignment_estimated < alignment_in_bits)
409 	{
410           if (!crtl->stack_realign_processed)
411 	    crtl->stack_alignment_estimated = alignment_in_bits;
412           else
413 	    {
414 	      /* If stack is realigned and stack alignment value
415 		 hasn't been finalized, it is OK not to increase
416 		 stack_alignment_estimated.  The bigger alignment
417 		 requirement is recorded in stack_alignment_needed
418 		 below.  */
419 	      gcc_assert (!crtl->stack_realign_finalized);
420 	      if (!crtl->stack_realign_needed)
421 		{
422 		  /* It is OK to reduce the alignment as long as the
423 		     requested size is 0 or the estimated stack
424 		     alignment >= mode alignment.  */
425 		  gcc_assert ((kind & ASLK_REDUCE_ALIGN)
426 			      || known_eq (size, 0)
427 			      || (crtl->stack_alignment_estimated
428 				  >= GET_MODE_ALIGNMENT (mode)));
429 		  alignment_in_bits = crtl->stack_alignment_estimated;
430 		  alignment = alignment_in_bits / BITS_PER_UNIT;
431 		}
432 	    }
433 	}
434     }
435 
436   if (crtl->stack_alignment_needed < alignment_in_bits)
437     crtl->stack_alignment_needed = alignment_in_bits;
438   if (crtl->max_used_stack_slot_alignment < alignment_in_bits)
439     crtl->max_used_stack_slot_alignment = alignment_in_bits;
440 
441   if (mode != BLKmode || maybe_ne (size, 0))
442     {
443       if (kind & ASLK_RECORD_PAD)
444 	{
445 	  class frame_space **psp;
446 
447 	  for (psp = &crtl->frame_space_list; *psp; psp = &(*psp)->next)
448 	    {
449 	      class frame_space *space = *psp;
450 	      if (!try_fit_stack_local (space->start, space->length, size,
451 					alignment, &slot_offset))
452 		continue;
453 	      *psp = space->next;
454 	      if (known_gt (slot_offset, space->start))
455 		add_frame_space (space->start, slot_offset);
456 	      if (known_lt (slot_offset + size, space->start + space->length))
457 		add_frame_space (slot_offset + size,
458 				 space->start + space->length);
459 	      goto found_space;
460 	    }
461 	}
462     }
463   else if (!STACK_ALIGNMENT_NEEDED)
464     {
465       slot_offset = frame_offset;
466       goto found_space;
467     }
468 
469   old_frame_offset = frame_offset;
470 
471   if (FRAME_GROWS_DOWNWARD)
472     {
473       frame_offset -= size;
474       try_fit_stack_local (frame_offset, size, size, alignment, &slot_offset);
475 
476       if (kind & ASLK_RECORD_PAD)
477 	{
478 	  if (known_gt (slot_offset, frame_offset))
479 	    add_frame_space (frame_offset, slot_offset);
480 	  if (known_lt (slot_offset + size, old_frame_offset))
481 	    add_frame_space (slot_offset + size, old_frame_offset);
482 	}
483     }
484   else
485     {
486       frame_offset += size;
487       try_fit_stack_local (old_frame_offset, size, size, alignment, &slot_offset);
488 
489       if (kind & ASLK_RECORD_PAD)
490 	{
491 	  if (known_gt (slot_offset, old_frame_offset))
492 	    add_frame_space (old_frame_offset, slot_offset);
493 	  if (known_lt (slot_offset + size, frame_offset))
494 	    add_frame_space (slot_offset + size, frame_offset);
495 	}
496     }
497 
498  found_space:
499   /* On a big-endian machine, if we are allocating more space than we will use,
500      use the least significant bytes of those that are allocated.  */
501   if (mode != BLKmode)
502     {
503       /* The slot size can sometimes be smaller than the mode size;
504 	 e.g. the rs6000 port allocates slots with a vector mode
505 	 that have the size of only one element.  However, the slot
506 	 size must always be ordered wrt to the mode size, in the
507 	 same way as for a subreg.  */
508       gcc_checking_assert (ordered_p (GET_MODE_SIZE (mode), size));
509       if (BYTES_BIG_ENDIAN && maybe_lt (GET_MODE_SIZE (mode), size))
510 	bigend_correction = size - GET_MODE_SIZE (mode);
511     }
512 
513   /* If we have already instantiated virtual registers, return the actual
514      address relative to the frame pointer.  */
515   if (virtuals_instantiated)
516     addr = plus_constant (Pmode, frame_pointer_rtx,
517 			  trunc_int_for_mode
518 			  (slot_offset + bigend_correction
519 			   + targetm.starting_frame_offset (), Pmode));
520   else
521     addr = plus_constant (Pmode, virtual_stack_vars_rtx,
522 			  trunc_int_for_mode
523 			  (slot_offset + bigend_correction,
524 			   Pmode));
525 
526   x = gen_rtx_MEM (mode, addr);
527   set_mem_align (x, alignment_in_bits);
528   MEM_NOTRAP_P (x) = 1;
529 
530   vec_safe_push (stack_slot_list, x);
531 
532   if (frame_offset_overflow (frame_offset, current_function_decl))
533     frame_offset = 0;
534 
535   return x;
536 }
537 
538 /* Wrap up assign_stack_local_1 with last parameter as false.  */
539 
540 rtx
assign_stack_local(machine_mode mode,poly_int64 size,int align)541 assign_stack_local (machine_mode mode, poly_int64 size, int align)
542 {
543   return assign_stack_local_1 (mode, size, align, ASLK_RECORD_PAD);
544 }
545 
546 /* In order to evaluate some expressions, such as function calls returning
547    structures in memory, we need to temporarily allocate stack locations.
548    We record each allocated temporary in the following structure.
549 
550    Associated with each temporary slot is a nesting level.  When we pop up
551    one level, all temporaries associated with the previous level are freed.
552    Normally, all temporaries are freed after the execution of the statement
553    in which they were created.  However, if we are inside a ({...}) grouping,
554    the result may be in a temporary and hence must be preserved.  If the
555    result could be in a temporary, we preserve it if we can determine which
556    one it is in.  If we cannot determine which temporary may contain the
557    result, all temporaries are preserved.  A temporary is preserved by
558    pretending it was allocated at the previous nesting level.  */
559 
class()560 class GTY(()) temp_slot {
561 public:
562   /* Points to next temporary slot.  */
563   class temp_slot *next;
564   /* Points to previous temporary slot.  */
565   class temp_slot *prev;
566   /* The rtx to used to reference the slot.  */
567   rtx slot;
568   /* The size, in units, of the slot.  */
569   poly_int64 size;
570   /* The type of the object in the slot, or zero if it doesn't correspond
571      to a type.  We use this to determine whether a slot can be reused.
572      It can be reused if objects of the type of the new slot will always
573      conflict with objects of the type of the old slot.  */
574   tree type;
575   /* The alignment (in bits) of the slot.  */
576   unsigned int align;
577   /* Nonzero if this temporary is currently in use.  */
578   char in_use;
579   /* Nesting level at which this slot is being used.  */
580   int level;
581   /* The offset of the slot from the frame_pointer, including extra space
582      for alignment.  This info is for combine_temp_slots.  */
583   poly_int64 base_offset;
584   /* The size of the slot, including extra space for alignment.  This
585      info is for combine_temp_slots.  */
586   poly_int64 full_size;
587 };
588 
589 /* Entry for the below hash table.  */
590 struct GTY((for_user)) temp_slot_address_entry {
591   hashval_t hash;
592   rtx address;
593   class temp_slot *temp_slot;
594 };
595 
596 struct temp_address_hasher : ggc_ptr_hash<temp_slot_address_entry>
597 {
598   static hashval_t hash (temp_slot_address_entry *);
599   static bool equal (temp_slot_address_entry *, temp_slot_address_entry *);
600 };
601 
602 /* A table of addresses that represent a stack slot.  The table is a mapping
603    from address RTXen to a temp slot.  */
604 static GTY(()) hash_table<temp_address_hasher> *temp_slot_address_table;
605 static size_t n_temp_slots_in_use;
606 
607 /* Removes temporary slot TEMP from LIST.  */
608 
609 static void
cut_slot_from_list(class temp_slot * temp,class temp_slot ** list)610 cut_slot_from_list (class temp_slot *temp, class temp_slot **list)
611 {
612   if (temp->next)
613     temp->next->prev = temp->prev;
614   if (temp->prev)
615     temp->prev->next = temp->next;
616   else
617     *list = temp->next;
618 
619   temp->prev = temp->next = NULL;
620 }
621 
622 /* Inserts temporary slot TEMP to LIST.  */
623 
624 static void
insert_slot_to_list(class temp_slot * temp,class temp_slot ** list)625 insert_slot_to_list (class temp_slot *temp, class temp_slot **list)
626 {
627   temp->next = *list;
628   if (*list)
629     (*list)->prev = temp;
630   temp->prev = NULL;
631   *list = temp;
632 }
633 
634 /* Returns the list of used temp slots at LEVEL.  */
635 
636 static class temp_slot **
temp_slots_at_level(int level)637 temp_slots_at_level (int level)
638 {
639   if (level >= (int) vec_safe_length (used_temp_slots))
640     vec_safe_grow_cleared (used_temp_slots, level + 1);
641 
642   return &(*used_temp_slots)[level];
643 }
644 
645 /* Returns the maximal temporary slot level.  */
646 
647 static int
max_slot_level(void)648 max_slot_level (void)
649 {
650   if (!used_temp_slots)
651     return -1;
652 
653   return used_temp_slots->length () - 1;
654 }
655 
656 /* Moves temporary slot TEMP to LEVEL.  */
657 
658 static void
move_slot_to_level(class temp_slot * temp,int level)659 move_slot_to_level (class temp_slot *temp, int level)
660 {
661   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
662   insert_slot_to_list (temp, temp_slots_at_level (level));
663   temp->level = level;
664 }
665 
666 /* Make temporary slot TEMP available.  */
667 
668 static void
make_slot_available(class temp_slot * temp)669 make_slot_available (class temp_slot *temp)
670 {
671   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
672   insert_slot_to_list (temp, &avail_temp_slots);
673   temp->in_use = 0;
674   temp->level = -1;
675   n_temp_slots_in_use--;
676 }
677 
678 /* Compute the hash value for an address -> temp slot mapping.
679    The value is cached on the mapping entry.  */
680 static hashval_t
temp_slot_address_compute_hash(struct temp_slot_address_entry * t)681 temp_slot_address_compute_hash (struct temp_slot_address_entry *t)
682 {
683   int do_not_record = 0;
684   return hash_rtx (t->address, GET_MODE (t->address),
685 		   &do_not_record, NULL, false);
686 }
687 
688 /* Return the hash value for an address -> temp slot mapping.  */
689 hashval_t
hash(temp_slot_address_entry * t)690 temp_address_hasher::hash (temp_slot_address_entry *t)
691 {
692   return t->hash;
693 }
694 
695 /* Compare two address -> temp slot mapping entries.  */
696 bool
equal(temp_slot_address_entry * t1,temp_slot_address_entry * t2)697 temp_address_hasher::equal (temp_slot_address_entry *t1,
698 			    temp_slot_address_entry *t2)
699 {
700   return exp_equiv_p (t1->address, t2->address, 0, true);
701 }
702 
703 /* Add ADDRESS as an alias of TEMP_SLOT to the addess -> temp slot mapping.  */
704 static void
insert_temp_slot_address(rtx address,class temp_slot * temp_slot)705 insert_temp_slot_address (rtx address, class temp_slot *temp_slot)
706 {
707   struct temp_slot_address_entry *t = ggc_alloc<temp_slot_address_entry> ();
708   t->address = copy_rtx (address);
709   t->temp_slot = temp_slot;
710   t->hash = temp_slot_address_compute_hash (t);
711   *temp_slot_address_table->find_slot_with_hash (t, t->hash, INSERT) = t;
712 }
713 
714 /* Remove an address -> temp slot mapping entry if the temp slot is
715    not in use anymore.  Callback for remove_unused_temp_slot_addresses.  */
716 int
remove_unused_temp_slot_addresses_1(temp_slot_address_entry ** slot,void *)717 remove_unused_temp_slot_addresses_1 (temp_slot_address_entry **slot, void *)
718 {
719   const struct temp_slot_address_entry *t = *slot;
720   if (! t->temp_slot->in_use)
721     temp_slot_address_table->clear_slot (slot);
722   return 1;
723 }
724 
725 /* Remove all mappings of addresses to unused temp slots.  */
726 static void
remove_unused_temp_slot_addresses(void)727 remove_unused_temp_slot_addresses (void)
728 {
729   /* Use quicker clearing if there aren't any active temp slots.  */
730   if (n_temp_slots_in_use)
731     temp_slot_address_table->traverse
732       <void *, remove_unused_temp_slot_addresses_1> (NULL);
733   else
734     temp_slot_address_table->empty ();
735 }
736 
737 /* Find the temp slot corresponding to the object at address X.  */
738 
739 static class temp_slot *
find_temp_slot_from_address(rtx x)740 find_temp_slot_from_address (rtx x)
741 {
742   class temp_slot *p;
743   struct temp_slot_address_entry tmp, *t;
744 
745   /* First try the easy way:
746      See if X exists in the address -> temp slot mapping.  */
747   tmp.address = x;
748   tmp.temp_slot = NULL;
749   tmp.hash = temp_slot_address_compute_hash (&tmp);
750   t = temp_slot_address_table->find_with_hash (&tmp, tmp.hash);
751   if (t)
752     return t->temp_slot;
753 
754   /* If we have a sum involving a register, see if it points to a temp
755      slot.  */
756   if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
757       && (p = find_temp_slot_from_address (XEXP (x, 0))) != 0)
758     return p;
759   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 1))
760 	   && (p = find_temp_slot_from_address (XEXP (x, 1))) != 0)
761     return p;
762 
763   /* Last resort: Address is a virtual stack var address.  */
764   poly_int64 offset;
765   if (strip_offset (x, &offset) == virtual_stack_vars_rtx)
766     {
767       int i;
768       for (i = max_slot_level (); i >= 0; i--)
769 	for (p = *temp_slots_at_level (i); p; p = p->next)
770 	  if (known_in_range_p (offset, p->base_offset, p->full_size))
771 	    return p;
772     }
773 
774   return NULL;
775 }
776 
777 /* Allocate a temporary stack slot and record it for possible later
778    reuse.
779 
780    MODE is the machine mode to be given to the returned rtx.
781 
782    SIZE is the size in units of the space required.  We do no rounding here
783    since assign_stack_local will do any required rounding.
784 
785    TYPE is the type that will be used for the stack slot.  */
786 
787 rtx
assign_stack_temp_for_type(machine_mode mode,poly_int64 size,tree type)788 assign_stack_temp_for_type (machine_mode mode, poly_int64 size, tree type)
789 {
790   unsigned int align;
791   class temp_slot *p, *best_p = 0, *selected = NULL, **pp;
792   rtx slot;
793 
794   gcc_assert (known_size_p (size));
795 
796   align = get_stack_local_alignment (type, mode);
797 
798   /* Try to find an available, already-allocated temporary of the proper
799      mode which meets the size and alignment requirements.  Choose the
800      smallest one with the closest alignment.
801 
802      If assign_stack_temp is called outside of the tree->rtl expansion,
803      we cannot reuse the stack slots (that may still refer to
804      VIRTUAL_STACK_VARS_REGNUM).  */
805   if (!virtuals_instantiated)
806     {
807       for (p = avail_temp_slots; p; p = p->next)
808 	{
809 	  if (p->align >= align
810 	      && known_ge (p->size, size)
811 	      && GET_MODE (p->slot) == mode
812 	      && objects_must_conflict_p (p->type, type)
813 	      && (best_p == 0
814 		  || (known_eq (best_p->size, p->size)
815 		      ? best_p->align > p->align
816 		      : known_ge (best_p->size, p->size))))
817 	    {
818 	      if (p->align == align && known_eq (p->size, size))
819 		{
820 		  selected = p;
821 		  cut_slot_from_list (selected, &avail_temp_slots);
822 		  best_p = 0;
823 		  break;
824 		}
825 	      best_p = p;
826 	    }
827 	}
828     }
829 
830   /* Make our best, if any, the one to use.  */
831   if (best_p)
832     {
833       selected = best_p;
834       cut_slot_from_list (selected, &avail_temp_slots);
835 
836       /* If there are enough aligned bytes left over, make them into a new
837 	 temp_slot so that the extra bytes don't get wasted.  Do this only
838 	 for BLKmode slots, so that we can be sure of the alignment.  */
839       if (GET_MODE (best_p->slot) == BLKmode)
840 	{
841 	  int alignment = best_p->align / BITS_PER_UNIT;
842 	  poly_int64 rounded_size = aligned_upper_bound (size, alignment);
843 
844 	  if (known_ge (best_p->size - rounded_size, alignment))
845 	    {
846 	      p = ggc_alloc<temp_slot> ();
847 	      p->in_use = 0;
848 	      p->size = best_p->size - rounded_size;
849 	      p->base_offset = best_p->base_offset + rounded_size;
850 	      p->full_size = best_p->full_size - rounded_size;
851 	      p->slot = adjust_address_nv (best_p->slot, BLKmode, rounded_size);
852 	      p->align = best_p->align;
853 	      p->type = best_p->type;
854 	      insert_slot_to_list (p, &avail_temp_slots);
855 
856 	      vec_safe_push (stack_slot_list, p->slot);
857 
858 	      best_p->size = rounded_size;
859 	      best_p->full_size = rounded_size;
860 	    }
861 	}
862     }
863 
864   /* If we still didn't find one, make a new temporary.  */
865   if (selected == 0)
866     {
867       poly_int64 frame_offset_old = frame_offset;
868 
869       p = ggc_alloc<temp_slot> ();
870 
871       /* We are passing an explicit alignment request to assign_stack_local.
872 	 One side effect of that is assign_stack_local will not round SIZE
873 	 to ensure the frame offset remains suitably aligned.
874 
875 	 So for requests which depended on the rounding of SIZE, we go ahead
876 	 and round it now.  We also make sure ALIGNMENT is at least
877 	 BIGGEST_ALIGNMENT.  */
878       gcc_assert (mode != BLKmode || align == BIGGEST_ALIGNMENT);
879       p->slot = assign_stack_local_1 (mode,
880 				      (mode == BLKmode
881 				       ? aligned_upper_bound (size,
882 							      (int) align
883 							      / BITS_PER_UNIT)
884 				       : size),
885 				      align, 0);
886 
887       p->align = align;
888 
889       /* The following slot size computation is necessary because we don't
890 	 know the actual size of the temporary slot until assign_stack_local
891 	 has performed all the frame alignment and size rounding for the
892 	 requested temporary.  Note that extra space added for alignment
893 	 can be either above or below this stack slot depending on which
894 	 way the frame grows.  We include the extra space if and only if it
895 	 is above this slot.  */
896       if (FRAME_GROWS_DOWNWARD)
897 	p->size = frame_offset_old - frame_offset;
898       else
899 	p->size = size;
900 
901       /* Now define the fields used by combine_temp_slots.  */
902       if (FRAME_GROWS_DOWNWARD)
903 	{
904 	  p->base_offset = frame_offset;
905 	  p->full_size = frame_offset_old - frame_offset;
906 	}
907       else
908 	{
909 	  p->base_offset = frame_offset_old;
910 	  p->full_size = frame_offset - frame_offset_old;
911 	}
912 
913       selected = p;
914     }
915 
916   p = selected;
917   p->in_use = 1;
918   p->type = type;
919   p->level = temp_slot_level;
920   n_temp_slots_in_use++;
921 
922   pp = temp_slots_at_level (p->level);
923   insert_slot_to_list (p, pp);
924   insert_temp_slot_address (XEXP (p->slot, 0), p);
925 
926   /* Create a new MEM rtx to avoid clobbering MEM flags of old slots.  */
927   slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
928   vec_safe_push (stack_slot_list, slot);
929 
930   /* If we know the alias set for the memory that will be used, use
931      it.  If there's no TYPE, then we don't know anything about the
932      alias set for the memory.  */
933   set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
934   set_mem_align (slot, align);
935 
936   /* If a type is specified, set the relevant flags.  */
937   if (type != 0)
938     MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
939   MEM_NOTRAP_P (slot) = 1;
940 
941   return slot;
942 }
943 
944 /* Allocate a temporary stack slot and record it for possible later
945    reuse.  First two arguments are same as in preceding function.  */
946 
947 rtx
assign_stack_temp(machine_mode mode,poly_int64 size)948 assign_stack_temp (machine_mode mode, poly_int64 size)
949 {
950   return assign_stack_temp_for_type (mode, size, NULL_TREE);
951 }
952 
953 /* Assign a temporary.
954    If TYPE_OR_DECL is a decl, then we are doing it on behalf of the decl
955    and so that should be used in error messages.  In either case, we
956    allocate of the given type.
957    MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
958    it is 0 if a register is OK.
959    DONT_PROMOTE is 1 if we should not promote values in register
960    to wider modes.  */
961 
962 rtx
assign_temp(tree type_or_decl,int memory_required,int dont_promote ATTRIBUTE_UNUSED)963 assign_temp (tree type_or_decl, int memory_required,
964 	     int dont_promote ATTRIBUTE_UNUSED)
965 {
966   tree type, decl;
967   machine_mode mode;
968 #ifdef PROMOTE_MODE
969   int unsignedp;
970 #endif
971 
972   if (DECL_P (type_or_decl))
973     decl = type_or_decl, type = TREE_TYPE (decl);
974   else
975     decl = NULL, type = type_or_decl;
976 
977   mode = TYPE_MODE (type);
978 #ifdef PROMOTE_MODE
979   unsignedp = TYPE_UNSIGNED (type);
980 #endif
981 
982   /* Allocating temporaries of TREE_ADDRESSABLE type must be done in the front
983      end.  See also create_tmp_var for the gimplification-time check.  */
984   gcc_assert (!TREE_ADDRESSABLE (type) && COMPLETE_TYPE_P (type));
985 
986   if (mode == BLKmode || memory_required)
987     {
988       poly_int64 size;
989       rtx tmp;
990 
991       /* Unfortunately, we don't yet know how to allocate variable-sized
992 	 temporaries.  However, sometimes we can find a fixed upper limit on
993 	 the size, so try that instead.  */
994       if (!poly_int_tree_p (TYPE_SIZE_UNIT (type), &size))
995 	size = max_int_size_in_bytes (type);
996 
997       /* Zero sized arrays are a GNU C extension.  Set size to 1 to avoid
998 	 problems with allocating the stack space.  */
999       if (known_eq (size, 0))
1000 	size = 1;
1001 
1002       /* The size of the temporary may be too large to fit into an integer.  */
1003       /* ??? Not sure this should happen except for user silliness, so limit
1004 	 this to things that aren't compiler-generated temporaries.  The
1005 	 rest of the time we'll die in assign_stack_temp_for_type.  */
1006       if (decl
1007 	  && !known_size_p (size)
1008 	  && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST)
1009 	{
1010 	  error ("size of variable %q+D is too large", decl);
1011 	  size = 1;
1012 	}
1013 
1014       tmp = assign_stack_temp_for_type (mode, size, type);
1015       return tmp;
1016     }
1017 
1018 #ifdef PROMOTE_MODE
1019   if (! dont_promote)
1020     mode = promote_mode (type, mode, &unsignedp);
1021 #endif
1022 
1023   return gen_reg_rtx (mode);
1024 }
1025 
1026 /* Combine temporary stack slots which are adjacent on the stack.
1027 
1028    This allows for better use of already allocated stack space.  This is only
1029    done for BLKmode slots because we can be sure that we won't have alignment
1030    problems in this case.  */
1031 
1032 static void
combine_temp_slots(void)1033 combine_temp_slots (void)
1034 {
1035   class temp_slot *p, *q, *next, *next_q;
1036   int num_slots;
1037 
1038   /* We can't combine slots, because the information about which slot
1039      is in which alias set will be lost.  */
1040   if (flag_strict_aliasing)
1041     return;
1042 
1043   /* If there are a lot of temp slots, don't do anything unless
1044      high levels of optimization.  */
1045   if (! flag_expensive_optimizations)
1046     for (p = avail_temp_slots, num_slots = 0; p; p = p->next, num_slots++)
1047       if (num_slots > 100 || (num_slots > 10 && optimize == 0))
1048 	return;
1049 
1050   for (p = avail_temp_slots; p; p = next)
1051     {
1052       int delete_p = 0;
1053 
1054       next = p->next;
1055 
1056       if (GET_MODE (p->slot) != BLKmode)
1057 	continue;
1058 
1059       for (q = p->next; q; q = next_q)
1060 	{
1061        	  int delete_q = 0;
1062 
1063 	  next_q = q->next;
1064 
1065 	  if (GET_MODE (q->slot) != BLKmode)
1066 	    continue;
1067 
1068 	  if (known_eq (p->base_offset + p->full_size, q->base_offset))
1069 	    {
1070 	      /* Q comes after P; combine Q into P.  */
1071 	      p->size += q->size;
1072 	      p->full_size += q->full_size;
1073 	      delete_q = 1;
1074 	    }
1075 	  else if (known_eq (q->base_offset + q->full_size, p->base_offset))
1076 	    {
1077 	      /* P comes after Q; combine P into Q.  */
1078 	      q->size += p->size;
1079 	      q->full_size += p->full_size;
1080 	      delete_p = 1;
1081 	      break;
1082 	    }
1083 	  if (delete_q)
1084 	    cut_slot_from_list (q, &avail_temp_slots);
1085 	}
1086 
1087       /* Either delete P or advance past it.  */
1088       if (delete_p)
1089 	cut_slot_from_list (p, &avail_temp_slots);
1090     }
1091 }
1092 
1093 /* Indicate that NEW_RTX is an alternate way of referring to the temp
1094    slot that previously was known by OLD_RTX.  */
1095 
1096 void
update_temp_slot_address(rtx old_rtx,rtx new_rtx)1097 update_temp_slot_address (rtx old_rtx, rtx new_rtx)
1098 {
1099   class temp_slot *p;
1100 
1101   if (rtx_equal_p (old_rtx, new_rtx))
1102     return;
1103 
1104   p = find_temp_slot_from_address (old_rtx);
1105 
1106   /* If we didn't find one, see if both OLD_RTX is a PLUS.  If so, and
1107      NEW_RTX is a register, see if one operand of the PLUS is a
1108      temporary location.  If so, NEW_RTX points into it.  Otherwise,
1109      if both OLD_RTX and NEW_RTX are a PLUS and if there is a register
1110      in common between them.  If so, try a recursive call on those
1111      values.  */
1112   if (p == 0)
1113     {
1114       if (GET_CODE (old_rtx) != PLUS)
1115 	return;
1116 
1117       if (REG_P (new_rtx))
1118 	{
1119 	  update_temp_slot_address (XEXP (old_rtx, 0), new_rtx);
1120 	  update_temp_slot_address (XEXP (old_rtx, 1), new_rtx);
1121 	  return;
1122 	}
1123       else if (GET_CODE (new_rtx) != PLUS)
1124 	return;
1125 
1126       if (rtx_equal_p (XEXP (old_rtx, 0), XEXP (new_rtx, 0)))
1127 	update_temp_slot_address (XEXP (old_rtx, 1), XEXP (new_rtx, 1));
1128       else if (rtx_equal_p (XEXP (old_rtx, 1), XEXP (new_rtx, 0)))
1129 	update_temp_slot_address (XEXP (old_rtx, 0), XEXP (new_rtx, 1));
1130       else if (rtx_equal_p (XEXP (old_rtx, 0), XEXP (new_rtx, 1)))
1131 	update_temp_slot_address (XEXP (old_rtx, 1), XEXP (new_rtx, 0));
1132       else if (rtx_equal_p (XEXP (old_rtx, 1), XEXP (new_rtx, 1)))
1133 	update_temp_slot_address (XEXP (old_rtx, 0), XEXP (new_rtx, 0));
1134 
1135       return;
1136     }
1137 
1138   /* Otherwise add an alias for the temp's address.  */
1139   insert_temp_slot_address (new_rtx, p);
1140 }
1141 
1142 /* If X could be a reference to a temporary slot, mark that slot as
1143    belonging to the to one level higher than the current level.  If X
1144    matched one of our slots, just mark that one.  Otherwise, we can't
1145    easily predict which it is, so upgrade all of them.
1146 
1147    This is called when an ({...}) construct occurs and a statement
1148    returns a value in memory.  */
1149 
1150 void
preserve_temp_slots(rtx x)1151 preserve_temp_slots (rtx x)
1152 {
1153   class temp_slot *p = 0, *next;
1154 
1155   if (x == 0)
1156     return;
1157 
1158   /* If X is a register that is being used as a pointer, see if we have
1159      a temporary slot we know it points to.  */
1160   if (REG_P (x) && REG_POINTER (x))
1161     p = find_temp_slot_from_address (x);
1162 
1163   /* If X is not in memory or is at a constant address, it cannot be in
1164      a temporary slot.  */
1165   if (p == 0 && (!MEM_P (x) || CONSTANT_P (XEXP (x, 0))))
1166     return;
1167 
1168   /* First see if we can find a match.  */
1169   if (p == 0)
1170     p = find_temp_slot_from_address (XEXP (x, 0));
1171 
1172   if (p != 0)
1173     {
1174       if (p->level == temp_slot_level)
1175 	move_slot_to_level (p, temp_slot_level - 1);
1176       return;
1177     }
1178 
1179   /* Otherwise, preserve all non-kept slots at this level.  */
1180   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1181     {
1182       next = p->next;
1183       move_slot_to_level (p, temp_slot_level - 1);
1184     }
1185 }
1186 
1187 /* Free all temporaries used so far.  This is normally called at the
1188    end of generating code for a statement.  */
1189 
1190 void
free_temp_slots(void)1191 free_temp_slots (void)
1192 {
1193   class temp_slot *p, *next;
1194   bool some_available = false;
1195 
1196   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1197     {
1198       next = p->next;
1199       make_slot_available (p);
1200       some_available = true;
1201     }
1202 
1203   if (some_available)
1204     {
1205       remove_unused_temp_slot_addresses ();
1206       combine_temp_slots ();
1207     }
1208 }
1209 
1210 /* Push deeper into the nesting level for stack temporaries.  */
1211 
1212 void
push_temp_slots(void)1213 push_temp_slots (void)
1214 {
1215   temp_slot_level++;
1216 }
1217 
1218 /* Pop a temporary nesting level.  All slots in use in the current level
1219    are freed.  */
1220 
1221 void
pop_temp_slots(void)1222 pop_temp_slots (void)
1223 {
1224   free_temp_slots ();
1225   temp_slot_level--;
1226 }
1227 
1228 /* Initialize temporary slots.  */
1229 
1230 void
init_temp_slots(void)1231 init_temp_slots (void)
1232 {
1233   /* We have not allocated any temporaries yet.  */
1234   avail_temp_slots = 0;
1235   vec_alloc (used_temp_slots, 0);
1236   temp_slot_level = 0;
1237   n_temp_slots_in_use = 0;
1238 
1239   /* Set up the table to map addresses to temp slots.  */
1240   if (! temp_slot_address_table)
1241     temp_slot_address_table = hash_table<temp_address_hasher>::create_ggc (32);
1242   else
1243     temp_slot_address_table->empty ();
1244 }
1245 
1246 /* Functions and data structures to keep track of the values hard regs
1247    had at the start of the function.  */
1248 
1249 /* Private type used by get_hard_reg_initial_reg, get_hard_reg_initial_val,
1250    and has_hard_reg_initial_val..  */
1251 struct GTY(()) initial_value_pair {
1252   rtx hard_reg;
1253   rtx pseudo;
1254 };
1255 /* ???  This could be a VEC but there is currently no way to define an
1256    opaque VEC type.  This could be worked around by defining struct
1257    initial_value_pair in function.h.  */
1258 struct GTY(()) initial_value_struct {
1259   int num_entries;
1260   int max_entries;
1261   initial_value_pair * GTY ((length ("%h.num_entries"))) entries;
1262 };
1263 
1264 /* If a pseudo represents an initial hard reg (or expression), return
1265    it, else return NULL_RTX.  */
1266 
1267 rtx
get_hard_reg_initial_reg(rtx reg)1268 get_hard_reg_initial_reg (rtx reg)
1269 {
1270   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1271   int i;
1272 
1273   if (ivs == 0)
1274     return NULL_RTX;
1275 
1276   for (i = 0; i < ivs->num_entries; i++)
1277     if (rtx_equal_p (ivs->entries[i].pseudo, reg))
1278       return ivs->entries[i].hard_reg;
1279 
1280   return NULL_RTX;
1281 }
1282 
1283 /* Make sure that there's a pseudo register of mode MODE that stores the
1284    initial value of hard register REGNO.  Return an rtx for such a pseudo.  */
1285 
1286 rtx
get_hard_reg_initial_val(machine_mode mode,unsigned int regno)1287 get_hard_reg_initial_val (machine_mode mode, unsigned int regno)
1288 {
1289   struct initial_value_struct *ivs;
1290   rtx rv;
1291 
1292   rv = has_hard_reg_initial_val (mode, regno);
1293   if (rv)
1294     return rv;
1295 
1296   ivs = crtl->hard_reg_initial_vals;
1297   if (ivs == 0)
1298     {
1299       ivs = ggc_alloc<initial_value_struct> ();
1300       ivs->num_entries = 0;
1301       ivs->max_entries = 5;
1302       ivs->entries = ggc_vec_alloc<initial_value_pair> (5);
1303       crtl->hard_reg_initial_vals = ivs;
1304     }
1305 
1306   if (ivs->num_entries >= ivs->max_entries)
1307     {
1308       ivs->max_entries += 5;
1309       ivs->entries = GGC_RESIZEVEC (initial_value_pair, ivs->entries,
1310 				    ivs->max_entries);
1311     }
1312 
1313   ivs->entries[ivs->num_entries].hard_reg = gen_rtx_REG (mode, regno);
1314   ivs->entries[ivs->num_entries].pseudo = gen_reg_rtx (mode);
1315 
1316   return ivs->entries[ivs->num_entries++].pseudo;
1317 }
1318 
1319 /* See if get_hard_reg_initial_val has been used to create a pseudo
1320    for the initial value of hard register REGNO in mode MODE.  Return
1321    the associated pseudo if so, otherwise return NULL.  */
1322 
1323 rtx
has_hard_reg_initial_val(machine_mode mode,unsigned int regno)1324 has_hard_reg_initial_val (machine_mode mode, unsigned int regno)
1325 {
1326   struct initial_value_struct *ivs;
1327   int i;
1328 
1329   ivs = crtl->hard_reg_initial_vals;
1330   if (ivs != 0)
1331     for (i = 0; i < ivs->num_entries; i++)
1332       if (GET_MODE (ivs->entries[i].hard_reg) == mode
1333 	  && REGNO (ivs->entries[i].hard_reg) == regno)
1334 	return ivs->entries[i].pseudo;
1335 
1336   return NULL_RTX;
1337 }
1338 
1339 unsigned int
emit_initial_value_sets(void)1340 emit_initial_value_sets (void)
1341 {
1342   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1343   int i;
1344   rtx_insn *seq;
1345 
1346   if (ivs == 0)
1347     return 0;
1348 
1349   start_sequence ();
1350   for (i = 0; i < ivs->num_entries; i++)
1351     emit_move_insn (ivs->entries[i].pseudo, ivs->entries[i].hard_reg);
1352   seq = get_insns ();
1353   end_sequence ();
1354 
1355   emit_insn_at_entry (seq);
1356   return 0;
1357 }
1358 
1359 /* Return the hardreg-pseudoreg initial values pair entry I and
1360    TRUE if I is a valid entry, or FALSE if I is not a valid entry.  */
1361 bool
initial_value_entry(int i,rtx * hreg,rtx * preg)1362 initial_value_entry (int i, rtx *hreg, rtx *preg)
1363 {
1364   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1365   if (!ivs || i >= ivs->num_entries)
1366     return false;
1367 
1368   *hreg = ivs->entries[i].hard_reg;
1369   *preg = ivs->entries[i].pseudo;
1370   return true;
1371 }
1372 
1373 /* These routines are responsible for converting virtual register references
1374    to the actual hard register references once RTL generation is complete.
1375 
1376    The following four variables are used for communication between the
1377    routines.  They contain the offsets of the virtual registers from their
1378    respective hard registers.  */
1379 
1380 static poly_int64 in_arg_offset;
1381 static poly_int64 var_offset;
1382 static poly_int64 dynamic_offset;
1383 static poly_int64 out_arg_offset;
1384 static poly_int64 cfa_offset;
1385 
1386 /* In most machines, the stack pointer register is equivalent to the bottom
1387    of the stack.  */
1388 
1389 #ifndef STACK_POINTER_OFFSET
1390 #define STACK_POINTER_OFFSET	0
1391 #endif
1392 
1393 #if defined (REG_PARM_STACK_SPACE) && !defined (INCOMING_REG_PARM_STACK_SPACE)
1394 #define INCOMING_REG_PARM_STACK_SPACE REG_PARM_STACK_SPACE
1395 #endif
1396 
1397 /* If not defined, pick an appropriate default for the offset of dynamically
1398    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1399    INCOMING_REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
1400 
1401 #ifndef STACK_DYNAMIC_OFFSET
1402 
1403 /* The bottom of the stack points to the actual arguments.  If
1404    REG_PARM_STACK_SPACE is defined, this includes the space for the register
1405    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
1406    stack space for register parameters is not pushed by the caller, but
1407    rather part of the fixed stack areas and hence not included in
1408    `crtl->outgoing_args_size'.  Nevertheless, we must allow
1409    for it when allocating stack dynamic objects.  */
1410 
1411 #ifdef INCOMING_REG_PARM_STACK_SPACE
1412 #define STACK_DYNAMIC_OFFSET(FNDECL)	\
1413 ((ACCUMULATE_OUTGOING_ARGS						      \
1414   ? (crtl->outgoing_args_size				      \
1415      + (OUTGOING_REG_PARM_STACK_SPACE ((!(FNDECL) ? NULL_TREE : TREE_TYPE (FNDECL))) ? 0 \
1416 					       : INCOMING_REG_PARM_STACK_SPACE (FNDECL))) \
1417   : 0) + (STACK_POINTER_OFFSET))
1418 #else
1419 #define STACK_DYNAMIC_OFFSET(FNDECL)	\
1420   ((ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : poly_int64 (0)) \
1421  + (STACK_POINTER_OFFSET))
1422 #endif
1423 #endif
1424 
1425 
1426 /* Given a piece of RTX and a pointer to a HOST_WIDE_INT, if the RTX
1427    is a virtual register, return the equivalent hard register and set the
1428    offset indirectly through the pointer.  Otherwise, return 0.  */
1429 
1430 static rtx
instantiate_new_reg(rtx x,poly_int64_pod * poffset)1431 instantiate_new_reg (rtx x, poly_int64_pod *poffset)
1432 {
1433   rtx new_rtx;
1434   poly_int64 offset;
1435 
1436   if (x == virtual_incoming_args_rtx)
1437     {
1438       if (stack_realign_drap)
1439         {
1440 	  /* Replace virtual_incoming_args_rtx with internal arg
1441 	     pointer if DRAP is used to realign stack.  */
1442           new_rtx = crtl->args.internal_arg_pointer;
1443           offset = 0;
1444         }
1445       else
1446         new_rtx = arg_pointer_rtx, offset = in_arg_offset;
1447     }
1448   else if (x == virtual_stack_vars_rtx)
1449     new_rtx = frame_pointer_rtx, offset = var_offset;
1450   else if (x == virtual_stack_dynamic_rtx)
1451     new_rtx = stack_pointer_rtx, offset = dynamic_offset;
1452   else if (x == virtual_outgoing_args_rtx)
1453     new_rtx = stack_pointer_rtx, offset = out_arg_offset;
1454   else if (x == virtual_cfa_rtx)
1455     {
1456 #ifdef FRAME_POINTER_CFA_OFFSET
1457       new_rtx = frame_pointer_rtx;
1458 #else
1459       new_rtx = arg_pointer_rtx;
1460 #endif
1461       offset = cfa_offset;
1462     }
1463   else if (x == virtual_preferred_stack_boundary_rtx)
1464     {
1465       new_rtx = GEN_INT (crtl->preferred_stack_boundary / BITS_PER_UNIT);
1466       offset = 0;
1467     }
1468   else
1469     return NULL_RTX;
1470 
1471   *poffset = offset;
1472   return new_rtx;
1473 }
1474 
1475 /* A subroutine of instantiate_virtual_regs.  Instantiate any virtual
1476    registers present inside of *LOC.  The expression is simplified,
1477    as much as possible, but is not to be considered "valid" in any sense
1478    implied by the target.  Return true if any change is made.  */
1479 
1480 static bool
instantiate_virtual_regs_in_rtx(rtx * loc)1481 instantiate_virtual_regs_in_rtx (rtx *loc)
1482 {
1483   if (!*loc)
1484     return false;
1485   bool changed = false;
1486   subrtx_ptr_iterator::array_type array;
1487   FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST)
1488     {
1489       rtx *loc = *iter;
1490       if (rtx x = *loc)
1491 	{
1492 	  rtx new_rtx;
1493 	  poly_int64 offset;
1494 	  switch (GET_CODE (x))
1495 	    {
1496 	    case REG:
1497 	      new_rtx = instantiate_new_reg (x, &offset);
1498 	      if (new_rtx)
1499 		{
1500 		  *loc = plus_constant (GET_MODE (x), new_rtx, offset);
1501 		  changed = true;
1502 		}
1503 	      iter.skip_subrtxes ();
1504 	      break;
1505 
1506 	    case PLUS:
1507 	      new_rtx = instantiate_new_reg (XEXP (x, 0), &offset);
1508 	      if (new_rtx)
1509 		{
1510 		  XEXP (x, 0) = new_rtx;
1511 		  *loc = plus_constant (GET_MODE (x), x, offset, true);
1512 		  changed = true;
1513 		  iter.skip_subrtxes ();
1514 		  break;
1515 		}
1516 
1517 	      /* FIXME -- from old code */
1518 	      /* If we have (plus (subreg (virtual-reg)) (const_int)), we know
1519 		 we can commute the PLUS and SUBREG because pointers into the
1520 		 frame are well-behaved.  */
1521 	      break;
1522 
1523 	    default:
1524 	      break;
1525 	    }
1526 	}
1527     }
1528   return changed;
1529 }
1530 
1531 /* A subroutine of instantiate_virtual_regs_in_insn.  Return true if X
1532    matches the predicate for insn CODE operand OPERAND.  */
1533 
1534 static int
safe_insn_predicate(int code,int operand,rtx x)1535 safe_insn_predicate (int code, int operand, rtx x)
1536 {
1537   return code < 0 || insn_operand_matches ((enum insn_code) code, operand, x);
1538 }
1539 
1540 /* A subroutine of instantiate_virtual_regs.  Instantiate any virtual
1541    registers present inside of insn.  The result will be a valid insn.  */
1542 
1543 static void
instantiate_virtual_regs_in_insn(rtx_insn * insn)1544 instantiate_virtual_regs_in_insn (rtx_insn *insn)
1545 {
1546   poly_int64 offset;
1547   int insn_code, i;
1548   bool any_change = false;
1549   rtx set, new_rtx, x;
1550   rtx_insn *seq;
1551 
1552   /* There are some special cases to be handled first.  */
1553   set = single_set (insn);
1554   if (set)
1555     {
1556       /* We're allowed to assign to a virtual register.  This is interpreted
1557 	 to mean that the underlying register gets assigned the inverse
1558 	 transformation.  This is used, for example, in the handling of
1559 	 non-local gotos.  */
1560       new_rtx = instantiate_new_reg (SET_DEST (set), &offset);
1561       if (new_rtx)
1562 	{
1563 	  start_sequence ();
1564 
1565 	  instantiate_virtual_regs_in_rtx (&SET_SRC (set));
1566 	  x = simplify_gen_binary (PLUS, GET_MODE (new_rtx), SET_SRC (set),
1567 				   gen_int_mode (-offset, GET_MODE (new_rtx)));
1568 	  x = force_operand (x, new_rtx);
1569 	  if (x != new_rtx)
1570 	    emit_move_insn (new_rtx, x);
1571 
1572 	  seq = get_insns ();
1573 	  end_sequence ();
1574 
1575 	  emit_insn_before (seq, insn);
1576 	  delete_insn (insn);
1577 	  return;
1578 	}
1579 
1580       /* Handle a straight copy from a virtual register by generating a
1581 	 new add insn.  The difference between this and falling through
1582 	 to the generic case is avoiding a new pseudo and eliminating a
1583 	 move insn in the initial rtl stream.  */
1584       new_rtx = instantiate_new_reg (SET_SRC (set), &offset);
1585       if (new_rtx
1586 	  && maybe_ne (offset, 0)
1587 	  && REG_P (SET_DEST (set))
1588 	  && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1589 	{
1590 	  start_sequence ();
1591 
1592 	  x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS, new_rtx,
1593 				   gen_int_mode (offset,
1594 						 GET_MODE (SET_DEST (set))),
1595 				   SET_DEST (set), 1, OPTAB_LIB_WIDEN);
1596 	  if (x != SET_DEST (set))
1597 	    emit_move_insn (SET_DEST (set), x);
1598 
1599 	  seq = get_insns ();
1600 	  end_sequence ();
1601 
1602 	  emit_insn_before (seq, insn);
1603 	  delete_insn (insn);
1604 	  return;
1605 	}
1606 
1607       extract_insn (insn);
1608       insn_code = INSN_CODE (insn);
1609 
1610       /* Handle a plus involving a virtual register by determining if the
1611 	 operands remain valid if they're modified in place.  */
1612       poly_int64 delta;
1613       if (GET_CODE (SET_SRC (set)) == PLUS
1614 	  && recog_data.n_operands >= 3
1615 	  && recog_data.operand_loc[1] == &XEXP (SET_SRC (set), 0)
1616 	  && recog_data.operand_loc[2] == &XEXP (SET_SRC (set), 1)
1617 	  && poly_int_rtx_p (recog_data.operand[2], &delta)
1618 	  && (new_rtx = instantiate_new_reg (recog_data.operand[1], &offset)))
1619 	{
1620 	  offset += delta;
1621 
1622 	  /* If the sum is zero, then replace with a plain move.  */
1623 	  if (known_eq (offset, 0)
1624 	      && REG_P (SET_DEST (set))
1625 	      && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1626 	    {
1627 	      start_sequence ();
1628 	      emit_move_insn (SET_DEST (set), new_rtx);
1629 	      seq = get_insns ();
1630 	      end_sequence ();
1631 
1632 	      emit_insn_before (seq, insn);
1633 	      delete_insn (insn);
1634 	      return;
1635 	    }
1636 
1637 	  x = gen_int_mode (offset, recog_data.operand_mode[2]);
1638 
1639 	  /* Using validate_change and apply_change_group here leaves
1640 	     recog_data in an invalid state.  Since we know exactly what
1641 	     we want to check, do those two by hand.  */
1642 	  if (safe_insn_predicate (insn_code, 1, new_rtx)
1643 	      && safe_insn_predicate (insn_code, 2, x))
1644 	    {
1645 	      *recog_data.operand_loc[1] = recog_data.operand[1] = new_rtx;
1646 	      *recog_data.operand_loc[2] = recog_data.operand[2] = x;
1647 	      any_change = true;
1648 
1649 	      /* Fall through into the regular operand fixup loop in
1650 		 order to take care of operands other than 1 and 2.  */
1651 	    }
1652 	}
1653     }
1654   else
1655     {
1656       extract_insn (insn);
1657       insn_code = INSN_CODE (insn);
1658     }
1659 
1660   /* In the general case, we expect virtual registers to appear only in
1661      operands, and then only as either bare registers or inside memories.  */
1662   for (i = 0; i < recog_data.n_operands; ++i)
1663     {
1664       x = recog_data.operand[i];
1665       switch (GET_CODE (x))
1666 	{
1667 	case MEM:
1668 	  {
1669 	    rtx addr = XEXP (x, 0);
1670 
1671 	    if (!instantiate_virtual_regs_in_rtx (&addr))
1672 	      continue;
1673 
1674 	    start_sequence ();
1675 	    x = replace_equiv_address (x, addr, true);
1676 	    /* It may happen that the address with the virtual reg
1677 	       was valid (e.g. based on the virtual stack reg, which might
1678 	       be acceptable to the predicates with all offsets), whereas
1679 	       the address now isn't anymore, for instance when the address
1680 	       is still offsetted, but the base reg isn't virtual-stack-reg
1681 	       anymore.  Below we would do a force_reg on the whole operand,
1682 	       but this insn might actually only accept memory.  Hence,
1683 	       before doing that last resort, try to reload the address into
1684 	       a register, so this operand stays a MEM.  */
1685 	    if (!safe_insn_predicate (insn_code, i, x))
1686 	      {
1687 		addr = force_reg (GET_MODE (addr), addr);
1688 		x = replace_equiv_address (x, addr, true);
1689 	      }
1690 	    seq = get_insns ();
1691 	    end_sequence ();
1692 	    if (seq)
1693 	      emit_insn_before (seq, insn);
1694 	  }
1695 	  break;
1696 
1697 	case REG:
1698 	  new_rtx = instantiate_new_reg (x, &offset);
1699 	  if (new_rtx == NULL)
1700 	    continue;
1701 	  if (known_eq (offset, 0))
1702 	    x = new_rtx;
1703 	  else
1704 	    {
1705 	      start_sequence ();
1706 
1707 	      /* Careful, special mode predicates may have stuff in
1708 		 insn_data[insn_code].operand[i].mode that isn't useful
1709 		 to us for computing a new value.  */
1710 	      /* ??? Recognize address_operand and/or "p" constraints
1711 		 to see if (plus new offset) is a valid before we put
1712 		 this through expand_simple_binop.  */
1713 	      x = expand_simple_binop (GET_MODE (x), PLUS, new_rtx,
1714 				       gen_int_mode (offset, GET_MODE (x)),
1715 				       NULL_RTX, 1, OPTAB_LIB_WIDEN);
1716 	      seq = get_insns ();
1717 	      end_sequence ();
1718 	      emit_insn_before (seq, insn);
1719 	    }
1720 	  break;
1721 
1722 	case SUBREG:
1723 	  new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
1724 	  if (new_rtx == NULL)
1725 	    continue;
1726 	  if (maybe_ne (offset, 0))
1727 	    {
1728 	      start_sequence ();
1729 	      new_rtx = expand_simple_binop
1730 		(GET_MODE (new_rtx), PLUS, new_rtx,
1731 		 gen_int_mode (offset, GET_MODE (new_rtx)),
1732 		 NULL_RTX, 1, OPTAB_LIB_WIDEN);
1733 	      seq = get_insns ();
1734 	      end_sequence ();
1735 	      emit_insn_before (seq, insn);
1736 	    }
1737 	  x = simplify_gen_subreg (recog_data.operand_mode[i], new_rtx,
1738 				   GET_MODE (new_rtx), SUBREG_BYTE (x));
1739 	  gcc_assert (x);
1740 	  break;
1741 
1742 	default:
1743 	  continue;
1744 	}
1745 
1746       /* At this point, X contains the new value for the operand.
1747 	 Validate the new value vs the insn predicate.  Note that
1748 	 asm insns will have insn_code -1 here.  */
1749       if (!safe_insn_predicate (insn_code, i, x))
1750 	{
1751 	  start_sequence ();
1752 	  if (REG_P (x))
1753 	    {
1754 	      gcc_assert (REGNO (x) <= LAST_VIRTUAL_REGISTER);
1755 	      x = copy_to_reg (x);
1756 	    }
1757 	  else
1758 	    x = force_reg (insn_data[insn_code].operand[i].mode, x);
1759 	  seq = get_insns ();
1760 	  end_sequence ();
1761 	  if (seq)
1762 	    emit_insn_before (seq, insn);
1763 	}
1764 
1765       *recog_data.operand_loc[i] = recog_data.operand[i] = x;
1766       any_change = true;
1767     }
1768 
1769   if (any_change)
1770     {
1771       /* Propagate operand changes into the duplicates.  */
1772       for (i = 0; i < recog_data.n_dups; ++i)
1773 	*recog_data.dup_loc[i]
1774 	  = copy_rtx (recog_data.operand[(unsigned)recog_data.dup_num[i]]);
1775 
1776       /* Force re-recognition of the instruction for validation.  */
1777       INSN_CODE (insn) = -1;
1778     }
1779 
1780   if (asm_noperands (PATTERN (insn)) >= 0)
1781     {
1782       if (!check_asm_operands (PATTERN (insn)))
1783 	{
1784 	  error_for_asm (insn, "impossible constraint in %<asm%>");
1785 	  /* For asm goto, instead of fixing up all the edges
1786 	     just clear the template and clear input operands
1787 	     (asm goto doesn't have any output operands).  */
1788 	  if (JUMP_P (insn))
1789 	    {
1790 	      rtx asm_op = extract_asm_operands (PATTERN (insn));
1791 	      ASM_OPERANDS_TEMPLATE (asm_op) = ggc_strdup ("");
1792 	      ASM_OPERANDS_INPUT_VEC (asm_op) = rtvec_alloc (0);
1793 	      ASM_OPERANDS_INPUT_CONSTRAINT_VEC (asm_op) = rtvec_alloc (0);
1794 	    }
1795 	  else
1796 	    delete_insn (insn);
1797 	}
1798     }
1799   else
1800     {
1801       if (recog_memoized (insn) < 0)
1802 	fatal_insn_not_found (insn);
1803     }
1804 }
1805 
1806 /* Subroutine of instantiate_decls.  Given RTL representing a decl,
1807    do any instantiation required.  */
1808 
1809 void
instantiate_decl_rtl(rtx x)1810 instantiate_decl_rtl (rtx x)
1811 {
1812   rtx addr;
1813 
1814   if (x == 0)
1815     return;
1816 
1817   /* If this is a CONCAT, recurse for the pieces.  */
1818   if (GET_CODE (x) == CONCAT)
1819     {
1820       instantiate_decl_rtl (XEXP (x, 0));
1821       instantiate_decl_rtl (XEXP (x, 1));
1822       return;
1823     }
1824 
1825   /* If this is not a MEM, no need to do anything.  Similarly if the
1826      address is a constant or a register that is not a virtual register.  */
1827   if (!MEM_P (x))
1828     return;
1829 
1830   addr = XEXP (x, 0);
1831   if (CONSTANT_P (addr)
1832       || (REG_P (addr)
1833 	  && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
1834 	      || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
1835     return;
1836 
1837   instantiate_virtual_regs_in_rtx (&XEXP (x, 0));
1838 }
1839 
1840 /* Helper for instantiate_decls called via walk_tree: Process all decls
1841    in the given DECL_VALUE_EXPR.  */
1842 
1843 static tree
instantiate_expr(tree * tp,int * walk_subtrees,void * data ATTRIBUTE_UNUSED)1844 instantiate_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1845 {
1846   tree t = *tp;
1847   if (! EXPR_P (t))
1848     {
1849       *walk_subtrees = 0;
1850       if (DECL_P (t))
1851 	{
1852 	  if (DECL_RTL_SET_P (t))
1853 	    instantiate_decl_rtl (DECL_RTL (t));
1854 	  if (TREE_CODE (t) == PARM_DECL && DECL_NAMELESS (t)
1855 	      && DECL_INCOMING_RTL (t))
1856 	    instantiate_decl_rtl (DECL_INCOMING_RTL (t));
1857 	  if ((VAR_P (t) || TREE_CODE (t) == RESULT_DECL)
1858 	      && DECL_HAS_VALUE_EXPR_P (t))
1859 	    {
1860 	      tree v = DECL_VALUE_EXPR (t);
1861 	      walk_tree (&v, instantiate_expr, NULL, NULL);
1862 	    }
1863 	}
1864     }
1865   return NULL;
1866 }
1867 
1868 /* Subroutine of instantiate_decls: Process all decls in the given
1869    BLOCK node and all its subblocks.  */
1870 
1871 static void
instantiate_decls_1(tree let)1872 instantiate_decls_1 (tree let)
1873 {
1874   tree t;
1875 
1876   for (t = BLOCK_VARS (let); t; t = DECL_CHAIN (t))
1877     {
1878       if (DECL_RTL_SET_P (t))
1879 	instantiate_decl_rtl (DECL_RTL (t));
1880       if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
1881 	{
1882 	  tree v = DECL_VALUE_EXPR (t);
1883 	  walk_tree (&v, instantiate_expr, NULL, NULL);
1884 	}
1885     }
1886 
1887   /* Process all subblocks.  */
1888   for (t = BLOCK_SUBBLOCKS (let); t; t = BLOCK_CHAIN (t))
1889     instantiate_decls_1 (t);
1890 }
1891 
1892 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1893    all virtual registers in their DECL_RTL's.  */
1894 
1895 static void
instantiate_decls(tree fndecl)1896 instantiate_decls (tree fndecl)
1897 {
1898   tree decl;
1899   unsigned ix;
1900 
1901   /* Process all parameters of the function.  */
1902   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = DECL_CHAIN (decl))
1903     {
1904       instantiate_decl_rtl (DECL_RTL (decl));
1905       instantiate_decl_rtl (DECL_INCOMING_RTL (decl));
1906       if (DECL_HAS_VALUE_EXPR_P (decl))
1907 	{
1908 	  tree v = DECL_VALUE_EXPR (decl);
1909 	  walk_tree (&v, instantiate_expr, NULL, NULL);
1910 	}
1911     }
1912 
1913   if ((decl = DECL_RESULT (fndecl))
1914       && TREE_CODE (decl) == RESULT_DECL)
1915     {
1916       if (DECL_RTL_SET_P (decl))
1917 	instantiate_decl_rtl (DECL_RTL (decl));
1918       if (DECL_HAS_VALUE_EXPR_P (decl))
1919 	{
1920 	  tree v = DECL_VALUE_EXPR (decl);
1921 	  walk_tree (&v, instantiate_expr, NULL, NULL);
1922 	}
1923     }
1924 
1925   /* Process the saved static chain if it exists.  */
1926   decl = DECL_STRUCT_FUNCTION (fndecl)->static_chain_decl;
1927   if (decl && DECL_HAS_VALUE_EXPR_P (decl))
1928     instantiate_decl_rtl (DECL_RTL (DECL_VALUE_EXPR (decl)));
1929 
1930   /* Now process all variables defined in the function or its subblocks.  */
1931   if (DECL_INITIAL (fndecl))
1932     instantiate_decls_1 (DECL_INITIAL (fndecl));
1933 
1934   FOR_EACH_LOCAL_DECL (cfun, ix, decl)
1935     if (DECL_RTL_SET_P (decl))
1936       instantiate_decl_rtl (DECL_RTL (decl));
1937   vec_free (cfun->local_decls);
1938 }
1939 
1940 /* Pass through the INSNS of function FNDECL and convert virtual register
1941    references to hard register references.  */
1942 
1943 static unsigned int
instantiate_virtual_regs(void)1944 instantiate_virtual_regs (void)
1945 {
1946   rtx_insn *insn;
1947 
1948   /* Compute the offsets to use for this function.  */
1949   in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
1950   var_offset = targetm.starting_frame_offset ();
1951   dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
1952   out_arg_offset = STACK_POINTER_OFFSET;
1953 #ifdef FRAME_POINTER_CFA_OFFSET
1954   cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
1955 #else
1956   cfa_offset = ARG_POINTER_CFA_OFFSET (current_function_decl);
1957 #endif
1958 
1959   /* Initialize recognition, indicating that volatile is OK.  */
1960   init_recog ();
1961 
1962   /* Scan through all the insns, instantiating every virtual register still
1963      present.  */
1964   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1965     if (INSN_P (insn))
1966       {
1967 	/* These patterns in the instruction stream can never be recognized.
1968 	   Fortunately, they shouldn't contain virtual registers either.  */
1969         if (GET_CODE (PATTERN (insn)) == USE
1970 	    || GET_CODE (PATTERN (insn)) == CLOBBER
1971 	    || GET_CODE (PATTERN (insn)) == ASM_INPUT
1972 	    || DEBUG_MARKER_INSN_P (insn))
1973 	  continue;
1974 	else if (DEBUG_BIND_INSN_P (insn))
1975 	  instantiate_virtual_regs_in_rtx (INSN_VAR_LOCATION_PTR (insn));
1976 	else
1977 	  instantiate_virtual_regs_in_insn (insn);
1978 
1979 	if (insn->deleted ())
1980 	  continue;
1981 
1982 	instantiate_virtual_regs_in_rtx (&REG_NOTES (insn));
1983 
1984 	/* Instantiate any virtual registers in CALL_INSN_FUNCTION_USAGE.  */
1985 	if (CALL_P (insn))
1986 	  instantiate_virtual_regs_in_rtx (&CALL_INSN_FUNCTION_USAGE (insn));
1987       }
1988 
1989   /* Instantiate the virtual registers in the DECLs for debugging purposes.  */
1990   instantiate_decls (current_function_decl);
1991 
1992   targetm.instantiate_decls ();
1993 
1994   /* Indicate that, from now on, assign_stack_local should use
1995      frame_pointer_rtx.  */
1996   virtuals_instantiated = 1;
1997 
1998   return 0;
1999 }
2000 
2001 namespace {
2002 
2003 const pass_data pass_data_instantiate_virtual_regs =
2004 {
2005   RTL_PASS, /* type */
2006   "vregs", /* name */
2007   OPTGROUP_NONE, /* optinfo_flags */
2008   TV_NONE, /* tv_id */
2009   0, /* properties_required */
2010   0, /* properties_provided */
2011   0, /* properties_destroyed */
2012   0, /* todo_flags_start */
2013   0, /* todo_flags_finish */
2014 };
2015 
2016 class pass_instantiate_virtual_regs : public rtl_opt_pass
2017 {
2018 public:
pass_instantiate_virtual_regs(gcc::context * ctxt)2019   pass_instantiate_virtual_regs (gcc::context *ctxt)
2020     : rtl_opt_pass (pass_data_instantiate_virtual_regs, ctxt)
2021   {}
2022 
2023   /* opt_pass methods: */
execute(function *)2024   virtual unsigned int execute (function *)
2025     {
2026       return instantiate_virtual_regs ();
2027     }
2028 
2029 }; // class pass_instantiate_virtual_regs
2030 
2031 } // anon namespace
2032 
2033 rtl_opt_pass *
make_pass_instantiate_virtual_regs(gcc::context * ctxt)2034 make_pass_instantiate_virtual_regs (gcc::context *ctxt)
2035 {
2036   return new pass_instantiate_virtual_regs (ctxt);
2037 }
2038 
2039 
2040 /* Return 1 if EXP is an aggregate type (or a value with aggregate type).
2041    This means a type for which function calls must pass an address to the
2042    function or get an address back from the function.
2043    EXP may be a type node or an expression (whose type is tested).  */
2044 
2045 int
aggregate_value_p(const_tree exp,const_tree fntype)2046 aggregate_value_p (const_tree exp, const_tree fntype)
2047 {
2048   const_tree type = (TYPE_P (exp)) ? exp : TREE_TYPE (exp);
2049   int i, regno, nregs;
2050   rtx reg;
2051 
2052   if (fntype)
2053     switch (TREE_CODE (fntype))
2054       {
2055       case CALL_EXPR:
2056 	{
2057 	  tree fndecl = get_callee_fndecl (fntype);
2058 	  if (fndecl)
2059 	    fntype = TREE_TYPE (fndecl);
2060 	  else if (CALL_EXPR_FN (fntype))
2061 	    fntype = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (fntype)));
2062 	  else
2063 	    /* For internal functions, assume nothing needs to be
2064 	       returned in memory.  */
2065 	    return 0;
2066 	}
2067 	break;
2068       case FUNCTION_DECL:
2069 	fntype = TREE_TYPE (fntype);
2070 	break;
2071       case FUNCTION_TYPE:
2072       case METHOD_TYPE:
2073         break;
2074       case IDENTIFIER_NODE:
2075 	fntype = NULL_TREE;
2076 	break;
2077       default:
2078 	/* We don't expect other tree types here.  */
2079 	gcc_unreachable ();
2080       }
2081 
2082   if (VOID_TYPE_P (type))
2083     return 0;
2084 
2085   /* If a record should be passed the same as its first (and only) member
2086      don't pass it as an aggregate.  */
2087   if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
2088     return aggregate_value_p (first_field (type), fntype);
2089 
2090   /* If the front end has decided that this needs to be passed by
2091      reference, do so.  */
2092   if ((TREE_CODE (exp) == PARM_DECL || TREE_CODE (exp) == RESULT_DECL)
2093       && DECL_BY_REFERENCE (exp))
2094     return 1;
2095 
2096   /* Function types that are TREE_ADDRESSABLE force return in memory.  */
2097   if (fntype && TREE_ADDRESSABLE (fntype))
2098     return 1;
2099 
2100   /* Types that are TREE_ADDRESSABLE must be constructed in memory,
2101      and thus can't be returned in registers.  */
2102   if (TREE_ADDRESSABLE (type))
2103     return 1;
2104 
2105   if (TYPE_EMPTY_P (type))
2106     return 0;
2107 
2108   if (flag_pcc_struct_return && AGGREGATE_TYPE_P (type))
2109     return 1;
2110 
2111   if (targetm.calls.return_in_memory (type, fntype))
2112     return 1;
2113 
2114   /* Make sure we have suitable call-clobbered regs to return
2115      the value in; if not, we must return it in memory.  */
2116   reg = hard_function_value (type, 0, fntype, 0);
2117 
2118   /* If we have something other than a REG (e.g. a PARALLEL), then assume
2119      it is OK.  */
2120   if (!REG_P (reg))
2121     return 0;
2122 
2123   /* Use the default ABI if the type of the function isn't known.
2124      The scheme for handling interoperability between different ABIs
2125      requires us to be able to tell when we're calling a function with
2126      a nondefault ABI.  */
2127   const predefined_function_abi &abi = (fntype
2128 					? fntype_abi (fntype)
2129 					: default_function_abi);
2130   regno = REGNO (reg);
2131   nregs = hard_regno_nregs (regno, TYPE_MODE (type));
2132   for (i = 0; i < nregs; i++)
2133     if (!fixed_regs[regno + i] && !abi.clobbers_full_reg_p (regno + i))
2134       return 1;
2135 
2136   return 0;
2137 }
2138 
2139 /* Return true if we should assign DECL a pseudo register; false if it
2140    should live on the local stack.  */
2141 
2142 bool
use_register_for_decl(const_tree decl)2143 use_register_for_decl (const_tree decl)
2144 {
2145   if (TREE_CODE (decl) == SSA_NAME)
2146     {
2147       /* We often try to use the SSA_NAME, instead of its underlying
2148 	 decl, to get type information and guide decisions, to avoid
2149 	 differences of behavior between anonymous and named
2150 	 variables, but in this one case we have to go for the actual
2151 	 variable if there is one.  The main reason is that, at least
2152 	 at -O0, we want to place user variables on the stack, but we
2153 	 don't mind using pseudos for anonymous or ignored temps.
2154 	 Should we take the SSA_NAME, we'd conclude all SSA_NAMEs
2155 	 should go in pseudos, whereas their corresponding variables
2156 	 might have to go on the stack.  So, disregarding the decl
2157 	 here would negatively impact debug info at -O0, enable
2158 	 coalescing between SSA_NAMEs that ought to get different
2159 	 stack/pseudo assignments, and get the incoming argument
2160 	 processing thoroughly confused by PARM_DECLs expected to live
2161 	 in stack slots but assigned to pseudos.  */
2162       if (!SSA_NAME_VAR (decl))
2163 	return TYPE_MODE (TREE_TYPE (decl)) != BLKmode
2164 	  && !(flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)));
2165 
2166       decl = SSA_NAME_VAR (decl);
2167     }
2168 
2169   /* Honor volatile.  */
2170   if (TREE_SIDE_EFFECTS (decl))
2171     return false;
2172 
2173   /* Honor addressability.  */
2174   if (TREE_ADDRESSABLE (decl))
2175     return false;
2176 
2177   /* RESULT_DECLs are a bit special in that they're assigned without
2178      regard to use_register_for_decl, but we generally only store in
2179      them.  If we coalesce their SSA NAMEs, we'd better return a
2180      result that matches the assignment in expand_function_start.  */
2181   if (TREE_CODE (decl) == RESULT_DECL)
2182     {
2183       /* If it's not an aggregate, we're going to use a REG or a
2184 	 PARALLEL containing a REG.  */
2185       if (!aggregate_value_p (decl, current_function_decl))
2186 	return true;
2187 
2188       /* If expand_function_start determines the return value, we'll
2189 	 use MEM if it's not by reference.  */
2190       if (cfun->returns_pcc_struct
2191 	  || (targetm.calls.struct_value_rtx
2192 	      (TREE_TYPE (current_function_decl), 1)))
2193 	return DECL_BY_REFERENCE (decl);
2194 
2195       /* Otherwise, we're taking an extra all.function_result_decl
2196 	 argument.  It's set up in assign_parms_augmented_arg_list,
2197 	 under the (negated) conditions above, and then it's used to
2198 	 set up the RESULT_DECL rtl in assign_params, after looping
2199 	 over all parameters.  Now, if the RESULT_DECL is not by
2200 	 reference, we'll use a MEM either way.  */
2201       if (!DECL_BY_REFERENCE (decl))
2202 	return false;
2203 
2204       /* Otherwise, if RESULT_DECL is DECL_BY_REFERENCE, it will take
2205 	 the function_result_decl's assignment.  Since it's a pointer,
2206 	 we can short-circuit a number of the tests below, and we must
2207 	 duplicat e them because we don't have the
2208 	 function_result_decl to test.  */
2209       if (!targetm.calls.allocate_stack_slots_for_args ())
2210 	return true;
2211       /* We don't set DECL_IGNORED_P for the function_result_decl.  */
2212       if (optimize)
2213 	return true;
2214       /* We don't set DECL_REGISTER for the function_result_decl.  */
2215       return false;
2216     }
2217 
2218   /* Only register-like things go in registers.  */
2219   if (DECL_MODE (decl) == BLKmode)
2220     return false;
2221 
2222   /* If -ffloat-store specified, don't put explicit float variables
2223      into registers.  */
2224   /* ??? This should be checked after DECL_ARTIFICIAL, but tree-ssa
2225      propagates values across these stores, and it probably shouldn't.  */
2226   if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)))
2227     return false;
2228 
2229   if (!targetm.calls.allocate_stack_slots_for_args ())
2230     return true;
2231 
2232   /* If we're not interested in tracking debugging information for
2233      this decl, then we can certainly put it in a register.  */
2234   if (DECL_IGNORED_P (decl))
2235     return true;
2236 
2237   if (optimize)
2238     return true;
2239 
2240   if (!DECL_REGISTER (decl))
2241     return false;
2242 
2243   /* When not optimizing, disregard register keyword for types that
2244      could have methods, otherwise the methods won't be callable from
2245      the debugger.  */
2246   if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl)))
2247     return false;
2248 
2249   return true;
2250 }
2251 
2252 /* Structures to communicate between the subroutines of assign_parms.
2253    The first holds data persistent across all parameters, the second
2254    is cleared out for each parameter.  */
2255 
2256 struct assign_parm_data_all
2257 {
2258   /* When INIT_CUMULATIVE_ARGS gets revamped, allocating CUMULATIVE_ARGS
2259      should become a job of the target or otherwise encapsulated.  */
2260   CUMULATIVE_ARGS args_so_far_v;
2261   cumulative_args_t args_so_far;
2262   struct args_size stack_args_size;
2263   tree function_result_decl;
2264   tree orig_fnargs;
2265   rtx_insn *first_conversion_insn;
2266   rtx_insn *last_conversion_insn;
2267   HOST_WIDE_INT pretend_args_size;
2268   HOST_WIDE_INT extra_pretend_bytes;
2269   int reg_parm_stack_space;
2270 };
2271 
2272 struct assign_parm_data_one
2273 {
2274   tree nominal_type;
2275   function_arg_info arg;
2276   rtx entry_parm;
2277   rtx stack_parm;
2278   machine_mode nominal_mode;
2279   machine_mode passed_mode;
2280   struct locate_and_pad_arg_data locate;
2281   int partial;
2282 };
2283 
2284 /* A subroutine of assign_parms.  Initialize ALL.  */
2285 
2286 static void
assign_parms_initialize_all(struct assign_parm_data_all * all)2287 assign_parms_initialize_all (struct assign_parm_data_all *all)
2288 {
2289   tree fntype ATTRIBUTE_UNUSED;
2290 
2291   memset (all, 0, sizeof (*all));
2292 
2293   fntype = TREE_TYPE (current_function_decl);
2294 
2295 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
2296   INIT_CUMULATIVE_INCOMING_ARGS (all->args_so_far_v, fntype, NULL_RTX);
2297 #else
2298   INIT_CUMULATIVE_ARGS (all->args_so_far_v, fntype, NULL_RTX,
2299 			current_function_decl, -1);
2300 #endif
2301   all->args_so_far = pack_cumulative_args (&all->args_so_far_v);
2302 
2303 #ifdef INCOMING_REG_PARM_STACK_SPACE
2304   all->reg_parm_stack_space
2305     = INCOMING_REG_PARM_STACK_SPACE (current_function_decl);
2306 #endif
2307 }
2308 
2309 /* If ARGS contains entries with complex types, split the entry into two
2310    entries of the component type.  Return a new list of substitutions are
2311    needed, else the old list.  */
2312 
2313 static void
split_complex_args(vec<tree> * args)2314 split_complex_args (vec<tree> *args)
2315 {
2316   unsigned i;
2317   tree p;
2318 
2319   FOR_EACH_VEC_ELT (*args, i, p)
2320     {
2321       tree type = TREE_TYPE (p);
2322       if (TREE_CODE (type) == COMPLEX_TYPE
2323 	  && targetm.calls.split_complex_arg (type))
2324 	{
2325 	  tree decl;
2326 	  tree subtype = TREE_TYPE (type);
2327 	  bool addressable = TREE_ADDRESSABLE (p);
2328 
2329 	  /* Rewrite the PARM_DECL's type with its component.  */
2330 	  p = copy_node (p);
2331 	  TREE_TYPE (p) = subtype;
2332 	  DECL_ARG_TYPE (p) = TREE_TYPE (DECL_ARG_TYPE (p));
2333 	  SET_DECL_MODE (p, VOIDmode);
2334 	  DECL_SIZE (p) = NULL;
2335 	  DECL_SIZE_UNIT (p) = NULL;
2336 	  /* If this arg must go in memory, put it in a pseudo here.
2337 	     We can't allow it to go in memory as per normal parms,
2338 	     because the usual place might not have the imag part
2339 	     adjacent to the real part.  */
2340 	  DECL_ARTIFICIAL (p) = addressable;
2341 	  DECL_IGNORED_P (p) = addressable;
2342 	  TREE_ADDRESSABLE (p) = 0;
2343 	  layout_decl (p, 0);
2344 	  (*args)[i] = p;
2345 
2346 	  /* Build a second synthetic decl.  */
2347 	  decl = build_decl (EXPR_LOCATION (p),
2348 			     PARM_DECL, NULL_TREE, subtype);
2349 	  DECL_ARG_TYPE (decl) = DECL_ARG_TYPE (p);
2350 	  DECL_ARTIFICIAL (decl) = addressable;
2351 	  DECL_IGNORED_P (decl) = addressable;
2352 	  layout_decl (decl, 0);
2353 	  args->safe_insert (++i, decl);
2354 	}
2355     }
2356 }
2357 
2358 /* A subroutine of assign_parms.  Adjust the parameter list to incorporate
2359    the hidden struct return argument, and (abi willing) complex args.
2360    Return the new parameter list.  */
2361 
2362 static vec<tree>
assign_parms_augmented_arg_list(struct assign_parm_data_all * all)2363 assign_parms_augmented_arg_list (struct assign_parm_data_all *all)
2364 {
2365   tree fndecl = current_function_decl;
2366   tree fntype = TREE_TYPE (fndecl);
2367   vec<tree> fnargs = vNULL;
2368   tree arg;
2369 
2370   for (arg = DECL_ARGUMENTS (fndecl); arg; arg = DECL_CHAIN (arg))
2371     fnargs.safe_push (arg);
2372 
2373   all->orig_fnargs = DECL_ARGUMENTS (fndecl);
2374 
2375   /* If struct value address is treated as the first argument, make it so.  */
2376   if (aggregate_value_p (DECL_RESULT (fndecl), fndecl)
2377       && ! cfun->returns_pcc_struct
2378       && targetm.calls.struct_value_rtx (TREE_TYPE (fndecl), 1) == 0)
2379     {
2380       tree type = build_pointer_type (TREE_TYPE (fntype));
2381       tree decl;
2382 
2383       decl = build_decl (DECL_SOURCE_LOCATION (fndecl),
2384 			 PARM_DECL, get_identifier (".result_ptr"), type);
2385       DECL_ARG_TYPE (decl) = type;
2386       DECL_ARTIFICIAL (decl) = 1;
2387       DECL_NAMELESS (decl) = 1;
2388       TREE_CONSTANT (decl) = 1;
2389       /* We don't set DECL_IGNORED_P or DECL_REGISTER here.  If this
2390 	 changes, the end of the RESULT_DECL handling block in
2391 	 use_register_for_decl must be adjusted to match.  */
2392 
2393       DECL_CHAIN (decl) = all->orig_fnargs;
2394       all->orig_fnargs = decl;
2395       fnargs.safe_insert (0, decl);
2396 
2397       all->function_result_decl = decl;
2398     }
2399 
2400   /* If the target wants to split complex arguments into scalars, do so.  */
2401   if (targetm.calls.split_complex_arg)
2402     split_complex_args (&fnargs);
2403 
2404   return fnargs;
2405 }
2406 
2407 /* A subroutine of assign_parms.  Examine PARM and pull out type and mode
2408    data for the parameter.  Incorporate ABI specifics such as pass-by-
2409    reference and type promotion.  */
2410 
2411 static void
assign_parm_find_data_types(struct assign_parm_data_all * all,tree parm,struct assign_parm_data_one * data)2412 assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
2413 			     struct assign_parm_data_one *data)
2414 {
2415   int unsignedp;
2416 
2417 #ifndef BROKEN_VALUE_INITIALIZATION
2418   *data = assign_parm_data_one ();
2419 #else
2420   /* Old versions of GCC used to miscompile the above by only initializing
2421      the members with explicit constructors and copying garbage
2422      to the other members.  */
2423   assign_parm_data_one zero_data = {};
2424   *data = zero_data;
2425 #endif
2426 
2427   /* NAMED_ARG is a misnomer.  We really mean 'non-variadic'. */
2428   if (!cfun->stdarg)
2429     data->arg.named = 1;  /* No variadic parms.  */
2430   else if (DECL_CHAIN (parm))
2431     data->arg.named = 1;  /* Not the last non-variadic parm. */
2432   else if (targetm.calls.strict_argument_naming (all->args_so_far))
2433     data->arg.named = 1;  /* Only variadic ones are unnamed.  */
2434   else
2435     data->arg.named = 0;  /* Treat as variadic.  */
2436 
2437   data->nominal_type = TREE_TYPE (parm);
2438   data->arg.type = DECL_ARG_TYPE (parm);
2439 
2440   /* Look out for errors propagating this far.  Also, if the parameter's
2441      type is void then its value doesn't matter.  */
2442   if (TREE_TYPE (parm) == error_mark_node
2443       /* This can happen after weird syntax errors
2444 	 or if an enum type is defined among the parms.  */
2445       || TREE_CODE (parm) != PARM_DECL
2446       || data->arg.type == NULL
2447       || VOID_TYPE_P (data->nominal_type))
2448     {
2449       data->nominal_type = data->arg.type = void_type_node;
2450       data->nominal_mode = data->passed_mode = data->arg.mode = VOIDmode;
2451       return;
2452     }
2453 
2454   /* Find mode of arg as it is passed, and mode of arg as it should be
2455      during execution of this function.  */
2456   data->passed_mode = data->arg.mode = TYPE_MODE (data->arg.type);
2457   data->nominal_mode = TYPE_MODE (data->nominal_type);
2458 
2459   /* If the parm is to be passed as a transparent union or record, use the
2460      type of the first field for the tests below.  We have already verified
2461      that the modes are the same.  */
2462   if (RECORD_OR_UNION_TYPE_P (data->arg.type)
2463       && TYPE_TRANSPARENT_AGGR (data->arg.type))
2464     data->arg.type = TREE_TYPE (first_field (data->arg.type));
2465 
2466   /* See if this arg was passed by invisible reference.  */
2467   if (apply_pass_by_reference_rules (&all->args_so_far_v, data->arg))
2468     {
2469       data->nominal_type = data->arg.type;
2470       data->passed_mode = data->nominal_mode = data->arg.mode;
2471     }
2472 
2473   /* Find mode as it is passed by the ABI.  */
2474   unsignedp = TYPE_UNSIGNED (data->arg.type);
2475   data->arg.mode
2476     = promote_function_mode (data->arg.type, data->arg.mode, &unsignedp,
2477 			     TREE_TYPE (current_function_decl), 0);
2478 }
2479 
2480 /* A subroutine of assign_parms.  Invoke setup_incoming_varargs.  */
2481 
2482 static void
assign_parms_setup_varargs(struct assign_parm_data_all * all,struct assign_parm_data_one * data,bool no_rtl)2483 assign_parms_setup_varargs (struct assign_parm_data_all *all,
2484 			    struct assign_parm_data_one *data, bool no_rtl)
2485 {
2486   int varargs_pretend_bytes = 0;
2487 
2488   function_arg_info last_named_arg = data->arg;
2489   last_named_arg.named = true;
2490   targetm.calls.setup_incoming_varargs (all->args_so_far, last_named_arg,
2491 					&varargs_pretend_bytes, no_rtl);
2492 
2493   /* If the back-end has requested extra stack space, record how much is
2494      needed.  Do not change pretend_args_size otherwise since it may be
2495      nonzero from an earlier partial argument.  */
2496   if (varargs_pretend_bytes > 0)
2497     all->pretend_args_size = varargs_pretend_bytes;
2498 }
2499 
2500 /* A subroutine of assign_parms.  Set DATA->ENTRY_PARM corresponding to
2501    the incoming location of the current parameter.  */
2502 
2503 static void
assign_parm_find_entry_rtl(struct assign_parm_data_all * all,struct assign_parm_data_one * data)2504 assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
2505 			    struct assign_parm_data_one *data)
2506 {
2507   HOST_WIDE_INT pretend_bytes = 0;
2508   rtx entry_parm;
2509   bool in_regs;
2510 
2511   if (data->arg.mode == VOIDmode)
2512     {
2513       data->entry_parm = data->stack_parm = const0_rtx;
2514       return;
2515     }
2516 
2517   targetm.calls.warn_parameter_passing_abi (all->args_so_far,
2518 					    data->arg.type);
2519 
2520   entry_parm = targetm.calls.function_incoming_arg (all->args_so_far,
2521 						    data->arg);
2522   if (entry_parm == 0)
2523     data->arg.mode = data->passed_mode;
2524 
2525   /* Determine parm's home in the stack, in case it arrives in the stack
2526      or we should pretend it did.  Compute the stack position and rtx where
2527      the argument arrives and its size.
2528 
2529      There is one complexity here:  If this was a parameter that would
2530      have been passed in registers, but wasn't only because it is
2531      __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2532      it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2533      In this case, we call FUNCTION_ARG with NAMED set to 1 instead of 0
2534      as it was the previous time.  */
2535   in_regs = (entry_parm != 0);
2536 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2537   in_regs = true;
2538 #endif
2539   if (!in_regs && !data->arg.named)
2540     {
2541       if (targetm.calls.pretend_outgoing_varargs_named (all->args_so_far))
2542 	{
2543 	  rtx tem;
2544 	  function_arg_info named_arg = data->arg;
2545 	  named_arg.named = true;
2546 	  tem = targetm.calls.function_incoming_arg (all->args_so_far,
2547 						     named_arg);
2548 	  in_regs = tem != NULL;
2549 	}
2550     }
2551 
2552   /* If this parameter was passed both in registers and in the stack, use
2553      the copy on the stack.  */
2554   if (targetm.calls.must_pass_in_stack (data->arg))
2555     entry_parm = 0;
2556 
2557   if (entry_parm)
2558     {
2559       int partial;
2560 
2561       partial = targetm.calls.arg_partial_bytes (all->args_so_far, data->arg);
2562       data->partial = partial;
2563 
2564       /* The caller might already have allocated stack space for the
2565 	 register parameters.  */
2566       if (partial != 0 && all->reg_parm_stack_space == 0)
2567 	{
2568 	  /* Part of this argument is passed in registers and part
2569 	     is passed on the stack.  Ask the prologue code to extend
2570 	     the stack part so that we can recreate the full value.
2571 
2572 	     PRETEND_BYTES is the size of the registers we need to store.
2573 	     CURRENT_FUNCTION_PRETEND_ARGS_SIZE is the amount of extra
2574 	     stack space that the prologue should allocate.
2575 
2576 	     Internally, gcc assumes that the argument pointer is aligned
2577 	     to STACK_BOUNDARY bits.  This is used both for alignment
2578 	     optimizations (see init_emit) and to locate arguments that are
2579 	     aligned to more than PARM_BOUNDARY bits.  We must preserve this
2580 	     invariant by rounding CURRENT_FUNCTION_PRETEND_ARGS_SIZE up to
2581 	     a stack boundary.  */
2582 
2583 	  /* We assume at most one partial arg, and it must be the first
2584 	     argument on the stack.  */
2585 	  gcc_assert (!all->extra_pretend_bytes && !all->pretend_args_size);
2586 
2587 	  pretend_bytes = partial;
2588 	  all->pretend_args_size = CEIL_ROUND (pretend_bytes, STACK_BYTES);
2589 
2590 	  /* We want to align relative to the actual stack pointer, so
2591 	     don't include this in the stack size until later.  */
2592 	  all->extra_pretend_bytes = all->pretend_args_size;
2593 	}
2594     }
2595 
2596   locate_and_pad_parm (data->arg.mode, data->arg.type, in_regs,
2597 		       all->reg_parm_stack_space,
2598 		       entry_parm ? data->partial : 0, current_function_decl,
2599 		       &all->stack_args_size, &data->locate);
2600 
2601   /* Update parm_stack_boundary if this parameter is passed in the
2602      stack.  */
2603   if (!in_regs && crtl->parm_stack_boundary < data->locate.boundary)
2604     crtl->parm_stack_boundary = data->locate.boundary;
2605 
2606   /* Adjust offsets to include the pretend args.  */
2607   pretend_bytes = all->extra_pretend_bytes - pretend_bytes;
2608   data->locate.slot_offset.constant += pretend_bytes;
2609   data->locate.offset.constant += pretend_bytes;
2610 
2611   data->entry_parm = entry_parm;
2612 }
2613 
2614 /* A subroutine of assign_parms.  If there is actually space on the stack
2615    for this parm, count it in stack_args_size and return true.  */
2616 
2617 static bool
assign_parm_is_stack_parm(struct assign_parm_data_all * all,struct assign_parm_data_one * data)2618 assign_parm_is_stack_parm (struct assign_parm_data_all *all,
2619 			   struct assign_parm_data_one *data)
2620 {
2621   /* Trivially true if we've no incoming register.  */
2622   if (data->entry_parm == NULL)
2623     ;
2624   /* Also true if we're partially in registers and partially not,
2625      since we've arranged to drop the entire argument on the stack.  */
2626   else if (data->partial != 0)
2627     ;
2628   /* Also true if the target says that it's passed in both registers
2629      and on the stack.  */
2630   else if (GET_CODE (data->entry_parm) == PARALLEL
2631 	   && XEXP (XVECEXP (data->entry_parm, 0, 0), 0) == NULL_RTX)
2632     ;
2633   /* Also true if the target says that there's stack allocated for
2634      all register parameters.  */
2635   else if (all->reg_parm_stack_space > 0)
2636     ;
2637   /* Otherwise, no, this parameter has no ABI defined stack slot.  */
2638   else
2639     return false;
2640 
2641   all->stack_args_size.constant += data->locate.size.constant;
2642   if (data->locate.size.var)
2643     ADD_PARM_SIZE (all->stack_args_size, data->locate.size.var);
2644 
2645   return true;
2646 }
2647 
2648 /* A subroutine of assign_parms.  Given that this parameter is allocated
2649    stack space by the ABI, find it.  */
2650 
2651 static void
assign_parm_find_stack_rtl(tree parm,struct assign_parm_data_one * data)2652 assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
2653 {
2654   rtx offset_rtx, stack_parm;
2655   unsigned int align, boundary;
2656 
2657   /* If we're passing this arg using a reg, make its stack home the
2658      aligned stack slot.  */
2659   if (data->entry_parm)
2660     offset_rtx = ARGS_SIZE_RTX (data->locate.slot_offset);
2661   else
2662     offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
2663 
2664   stack_parm = crtl->args.internal_arg_pointer;
2665   if (offset_rtx != const0_rtx)
2666     stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
2667   stack_parm = gen_rtx_MEM (data->arg.mode, stack_parm);
2668 
2669   if (!data->arg.pass_by_reference)
2670     {
2671       set_mem_attributes (stack_parm, parm, 1);
2672       /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
2673 	 while promoted mode's size is needed.  */
2674       if (data->arg.mode != BLKmode
2675 	  && data->arg.mode != DECL_MODE (parm))
2676 	{
2677 	  set_mem_size (stack_parm, GET_MODE_SIZE (data->arg.mode));
2678 	  if (MEM_EXPR (stack_parm) && MEM_OFFSET_KNOWN_P (stack_parm))
2679 	    {
2680 	      poly_int64 offset = subreg_lowpart_offset (DECL_MODE (parm),
2681 							 data->arg.mode);
2682 	      if (maybe_ne (offset, 0))
2683 		set_mem_offset (stack_parm, MEM_OFFSET (stack_parm) - offset);
2684 	    }
2685 	}
2686     }
2687 
2688   boundary = data->locate.boundary;
2689   align = BITS_PER_UNIT;
2690 
2691   /* If we're padding upward, we know that the alignment of the slot
2692      is TARGET_FUNCTION_ARG_BOUNDARY.  If we're using slot_offset, we're
2693      intentionally forcing upward padding.  Otherwise we have to come
2694      up with a guess at the alignment based on OFFSET_RTX.  */
2695   poly_int64 offset;
2696   if (data->locate.where_pad == PAD_NONE || data->entry_parm)
2697     align = boundary;
2698   else if (data->locate.where_pad == PAD_UPWARD)
2699     {
2700       align = boundary;
2701       /* If the argument offset is actually more aligned than the nominal
2702 	 stack slot boundary, take advantage of that excess alignment.
2703 	 Don't make any assumptions if STACK_POINTER_OFFSET is in use.  */
2704       if (poly_int_rtx_p (offset_rtx, &offset)
2705 	  && known_eq (STACK_POINTER_OFFSET, 0))
2706 	{
2707 	  unsigned int offset_align = known_alignment (offset) * BITS_PER_UNIT;
2708 	  if (offset_align == 0 || offset_align > STACK_BOUNDARY)
2709 	    offset_align = STACK_BOUNDARY;
2710 	  align = MAX (align, offset_align);
2711 	}
2712     }
2713   else if (poly_int_rtx_p (offset_rtx, &offset))
2714     {
2715       align = least_bit_hwi (boundary);
2716       unsigned int offset_align = known_alignment (offset) * BITS_PER_UNIT;
2717       if (offset_align != 0)
2718 	align = MIN (align, offset_align);
2719     }
2720   set_mem_align (stack_parm, align);
2721 
2722   if (data->entry_parm)
2723     set_reg_attrs_for_parm (data->entry_parm, stack_parm);
2724 
2725   data->stack_parm = stack_parm;
2726 }
2727 
2728 /* A subroutine of assign_parms.  Adjust DATA->ENTRY_RTL such that it's
2729    always valid and contiguous.  */
2730 
2731 static void
assign_parm_adjust_entry_rtl(struct assign_parm_data_one * data)2732 assign_parm_adjust_entry_rtl (struct assign_parm_data_one *data)
2733 {
2734   rtx entry_parm = data->entry_parm;
2735   rtx stack_parm = data->stack_parm;
2736 
2737   /* If this parm was passed part in regs and part in memory, pretend it
2738      arrived entirely in memory by pushing the register-part onto the stack.
2739      In the special case of a DImode or DFmode that is split, we could put
2740      it together in a pseudoreg directly, but for now that's not worth
2741      bothering with.  */
2742   if (data->partial != 0)
2743     {
2744       /* Handle calls that pass values in multiple non-contiguous
2745 	 locations.  The Irix 6 ABI has examples of this.  */
2746       if (GET_CODE (entry_parm) == PARALLEL)
2747 	emit_group_store (validize_mem (copy_rtx (stack_parm)), entry_parm,
2748 			  data->arg.type, int_size_in_bytes (data->arg.type));
2749       else
2750 	{
2751 	  gcc_assert (data->partial % UNITS_PER_WORD == 0);
2752 	  move_block_from_reg (REGNO (entry_parm),
2753 			       validize_mem (copy_rtx (stack_parm)),
2754 			       data->partial / UNITS_PER_WORD);
2755 	}
2756 
2757       entry_parm = stack_parm;
2758     }
2759 
2760   /* If we didn't decide this parm came in a register, by default it came
2761      on the stack.  */
2762   else if (entry_parm == NULL)
2763     entry_parm = stack_parm;
2764 
2765   /* When an argument is passed in multiple locations, we can't make use
2766      of this information, but we can save some copying if the whole argument
2767      is passed in a single register.  */
2768   else if (GET_CODE (entry_parm) == PARALLEL
2769 	   && data->nominal_mode != BLKmode
2770 	   && data->passed_mode != BLKmode)
2771     {
2772       size_t i, len = XVECLEN (entry_parm, 0);
2773 
2774       for (i = 0; i < len; i++)
2775 	if (XEXP (XVECEXP (entry_parm, 0, i), 0) != NULL_RTX
2776 	    && REG_P (XEXP (XVECEXP (entry_parm, 0, i), 0))
2777 	    && (GET_MODE (XEXP (XVECEXP (entry_parm, 0, i), 0))
2778 		== data->passed_mode)
2779 	    && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
2780 	  {
2781 	    entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
2782 	    break;
2783 	  }
2784     }
2785 
2786   data->entry_parm = entry_parm;
2787 }
2788 
2789 /* A subroutine of assign_parms.  Reconstitute any values which were
2790    passed in multiple registers and would fit in a single register.  */
2791 
2792 static void
assign_parm_remove_parallels(struct assign_parm_data_one * data)2793 assign_parm_remove_parallels (struct assign_parm_data_one *data)
2794 {
2795   rtx entry_parm = data->entry_parm;
2796 
2797   /* Convert the PARALLEL to a REG of the same mode as the parallel.
2798      This can be done with register operations rather than on the
2799      stack, even if we will store the reconstituted parameter on the
2800      stack later.  */
2801   if (GET_CODE (entry_parm) == PARALLEL && GET_MODE (entry_parm) != BLKmode)
2802     {
2803       rtx parmreg = gen_reg_rtx (GET_MODE (entry_parm));
2804       emit_group_store (parmreg, entry_parm, data->arg.type,
2805 			GET_MODE_SIZE (GET_MODE (entry_parm)));
2806       entry_parm = parmreg;
2807     }
2808 
2809   data->entry_parm = entry_parm;
2810 }
2811 
2812 /* A subroutine of assign_parms.  Adjust DATA->STACK_RTL such that it's
2813    always valid and properly aligned.  */
2814 
2815 static void
assign_parm_adjust_stack_rtl(struct assign_parm_data_one * data)2816 assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)
2817 {
2818   rtx stack_parm = data->stack_parm;
2819 
2820   /* If we can't trust the parm stack slot to be aligned enough for its
2821      ultimate type, don't use that slot after entry.  We'll make another
2822      stack slot, if we need one.  */
2823   if (stack_parm
2824       && ((GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN (stack_parm)
2825 	   && ((optab_handler (movmisalign_optab, data->nominal_mode)
2826 		!= CODE_FOR_nothing)
2827 	       || targetm.slow_unaligned_access (data->nominal_mode,
2828 						 MEM_ALIGN (stack_parm))))
2829 	  || (data->nominal_type
2830 	      && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)
2831 	      && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
2832     stack_parm = NULL;
2833 
2834   /* If parm was passed in memory, and we need to convert it on entry,
2835      don't store it back in that same slot.  */
2836   else if (data->entry_parm == stack_parm
2837 	   && data->nominal_mode != BLKmode
2838 	   && data->nominal_mode != data->passed_mode)
2839     stack_parm = NULL;
2840 
2841   /* If stack protection is in effect for this function, don't leave any
2842      pointers in their passed stack slots.  */
2843   else if (crtl->stack_protect_guard
2844 	   && (flag_stack_protect == 2
2845 	       || data->arg.pass_by_reference
2846 	       || POINTER_TYPE_P (data->nominal_type)))
2847     stack_parm = NULL;
2848 
2849   data->stack_parm = stack_parm;
2850 }
2851 
2852 /* A subroutine of assign_parms.  Return true if the current parameter
2853    should be stored as a BLKmode in the current frame.  */
2854 
2855 static bool
assign_parm_setup_block_p(struct assign_parm_data_one * data)2856 assign_parm_setup_block_p (struct assign_parm_data_one *data)
2857 {
2858   if (data->nominal_mode == BLKmode)
2859     return true;
2860   if (GET_MODE (data->entry_parm) == BLKmode)
2861     return true;
2862 
2863 #ifdef BLOCK_REG_PADDING
2864   /* Only assign_parm_setup_block knows how to deal with register arguments
2865      that are padded at the least significant end.  */
2866   if (REG_P (data->entry_parm)
2867       && known_lt (GET_MODE_SIZE (data->arg.mode), UNITS_PER_WORD)
2868       && (BLOCK_REG_PADDING (data->passed_mode, data->arg.type, 1)
2869 	  == (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)))
2870     return true;
2871 #endif
2872 
2873   return false;
2874 }
2875 
2876 /* A subroutine of assign_parms.  Arrange for the parameter to be
2877    present and valid in DATA->STACK_RTL.  */
2878 
2879 static void
assign_parm_setup_block(struct assign_parm_data_all * all,tree parm,struct assign_parm_data_one * data)2880 assign_parm_setup_block (struct assign_parm_data_all *all,
2881 			 tree parm, struct assign_parm_data_one *data)
2882 {
2883   rtx entry_parm = data->entry_parm;
2884   rtx stack_parm = data->stack_parm;
2885   rtx target_reg = NULL_RTX;
2886   bool in_conversion_seq = false;
2887   HOST_WIDE_INT size;
2888   HOST_WIDE_INT size_stored;
2889 
2890   if (GET_CODE (entry_parm) == PARALLEL)
2891     entry_parm = emit_group_move_into_temps (entry_parm);
2892 
2893   /* If we want the parameter in a pseudo, don't use a stack slot.  */
2894   if (is_gimple_reg (parm) && use_register_for_decl (parm))
2895     {
2896       tree def = ssa_default_def (cfun, parm);
2897       gcc_assert (def);
2898       machine_mode mode = promote_ssa_mode (def, NULL);
2899       rtx reg = gen_reg_rtx (mode);
2900       if (GET_CODE (reg) != CONCAT)
2901 	stack_parm = reg;
2902       else
2903 	{
2904 	  target_reg = reg;
2905 	  /* Avoid allocating a stack slot, if there isn't one
2906 	     preallocated by the ABI.  It might seem like we should
2907 	     always prefer a pseudo, but converting between
2908 	     floating-point and integer modes goes through the stack
2909 	     on various machines, so it's better to use the reserved
2910 	     stack slot than to risk wasting it and allocating more
2911 	     for the conversion.  */
2912 	  if (stack_parm == NULL_RTX)
2913 	    {
2914 	      int save = generating_concat_p;
2915 	      generating_concat_p = 0;
2916 	      stack_parm = gen_reg_rtx (mode);
2917 	      generating_concat_p = save;
2918 	    }
2919 	}
2920       data->stack_parm = NULL;
2921     }
2922 
2923   size = int_size_in_bytes (data->arg.type);
2924   size_stored = CEIL_ROUND (size, UNITS_PER_WORD);
2925   if (stack_parm == 0)
2926     {
2927       HOST_WIDE_INT parm_align
2928 	= (STRICT_ALIGNMENT
2929 	   ? MAX (DECL_ALIGN (parm), BITS_PER_WORD) : DECL_ALIGN (parm));
2930 
2931       SET_DECL_ALIGN (parm, parm_align);
2932       if (DECL_ALIGN (parm) > MAX_SUPPORTED_STACK_ALIGNMENT)
2933 	{
2934 	  rtx allocsize = gen_int_mode (size_stored, Pmode);
2935 	  get_dynamic_stack_size (&allocsize, 0, DECL_ALIGN (parm), NULL);
2936 	  stack_parm = assign_stack_local (BLKmode, UINTVAL (allocsize),
2937 					   MAX_SUPPORTED_STACK_ALIGNMENT);
2938 	  rtx addr = align_dynamic_address (XEXP (stack_parm, 0),
2939 					    DECL_ALIGN (parm));
2940 	  mark_reg_pointer (addr, DECL_ALIGN (parm));
2941 	  stack_parm = gen_rtx_MEM (GET_MODE (stack_parm), addr);
2942 	  MEM_NOTRAP_P (stack_parm) = 1;
2943 	}
2944       else
2945 	stack_parm = assign_stack_local (BLKmode, size_stored,
2946 					 DECL_ALIGN (parm));
2947       if (known_eq (GET_MODE_SIZE (GET_MODE (entry_parm)), size))
2948 	PUT_MODE (stack_parm, GET_MODE (entry_parm));
2949       set_mem_attributes (stack_parm, parm, 1);
2950     }
2951 
2952   /* If a BLKmode arrives in registers, copy it to a stack slot.  Handle
2953      calls that pass values in multiple non-contiguous locations.  */
2954   if (REG_P (entry_parm) || GET_CODE (entry_parm) == PARALLEL)
2955     {
2956       rtx mem;
2957 
2958       /* Note that we will be storing an integral number of words.
2959 	 So we have to be careful to ensure that we allocate an
2960 	 integral number of words.  We do this above when we call
2961 	 assign_stack_local if space was not allocated in the argument
2962 	 list.  If it was, this will not work if PARM_BOUNDARY is not
2963 	 a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2964 	 if it becomes a problem.  Exception is when BLKmode arrives
2965 	 with arguments not conforming to word_mode.  */
2966 
2967       if (data->stack_parm == 0)
2968 	;
2969       else if (GET_CODE (entry_parm) == PARALLEL)
2970 	;
2971       else
2972 	gcc_assert (!size || !(PARM_BOUNDARY % BITS_PER_WORD));
2973 
2974       mem = validize_mem (copy_rtx (stack_parm));
2975 
2976       /* Handle values in multiple non-contiguous locations.  */
2977       if (GET_CODE (entry_parm) == PARALLEL && !MEM_P (mem))
2978 	emit_group_store (mem, entry_parm, data->arg.type, size);
2979       else if (GET_CODE (entry_parm) == PARALLEL)
2980 	{
2981 	  push_to_sequence2 (all->first_conversion_insn,
2982 			     all->last_conversion_insn);
2983 	  emit_group_store (mem, entry_parm, data->arg.type, size);
2984 	  all->first_conversion_insn = get_insns ();
2985 	  all->last_conversion_insn = get_last_insn ();
2986 	  end_sequence ();
2987 	  in_conversion_seq = true;
2988 	}
2989 
2990       else if (size == 0)
2991 	;
2992 
2993       /* If SIZE is that of a mode no bigger than a word, just use
2994 	 that mode's store operation.  */
2995       else if (size <= UNITS_PER_WORD)
2996 	{
2997 	  unsigned int bits = size * BITS_PER_UNIT;
2998 	  machine_mode mode = int_mode_for_size (bits, 0).else_blk ();
2999 
3000 	  if (mode != BLKmode
3001 #ifdef BLOCK_REG_PADDING
3002 	      && (size == UNITS_PER_WORD
3003 		  || (BLOCK_REG_PADDING (mode, data->arg.type, 1)
3004 		      != (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)))
3005 #endif
3006 	      )
3007 	    {
3008 	      rtx reg;
3009 
3010 	      /* We are really truncating a word_mode value containing
3011 		 SIZE bytes into a value of mode MODE.  If such an
3012 		 operation requires no actual instructions, we can refer
3013 		 to the value directly in mode MODE, otherwise we must
3014 		 start with the register in word_mode and explicitly
3015 		 convert it.  */
3016 	      if (targetm.truly_noop_truncation (size * BITS_PER_UNIT,
3017 						 BITS_PER_WORD))
3018 		reg = gen_rtx_REG (mode, REGNO (entry_parm));
3019 	      else
3020 		{
3021 		  reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
3022 		  reg = convert_to_mode (mode, copy_to_reg (reg), 1);
3023 		}
3024 	      emit_move_insn (change_address (mem, mode, 0), reg);
3025 	    }
3026 
3027 #ifdef BLOCK_REG_PADDING
3028 	  /* Storing the register in memory as a full word, as
3029 	     move_block_from_reg below would do, and then using the
3030 	     MEM in a smaller mode, has the effect of shifting right
3031 	     if BYTES_BIG_ENDIAN.  If we're bypassing memory, the
3032 	     shifting must be explicit.  */
3033 	  else if (!MEM_P (mem))
3034 	    {
3035 	      rtx x;
3036 
3037 	      /* If the assert below fails, we should have taken the
3038 		 mode != BLKmode path above, unless we have downward
3039 		 padding of smaller-than-word arguments on a machine
3040 		 with little-endian bytes, which would likely require
3041 		 additional changes to work correctly.  */
3042 	      gcc_checking_assert (BYTES_BIG_ENDIAN
3043 				   && (BLOCK_REG_PADDING (mode,
3044 							  data->arg.type, 1)
3045 				       == PAD_UPWARD));
3046 
3047 	      int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
3048 
3049 	      x = gen_rtx_REG (word_mode, REGNO (entry_parm));
3050 	      x = expand_shift (RSHIFT_EXPR, word_mode, x, by,
3051 				NULL_RTX, 1);
3052 	      x = force_reg (word_mode, x);
3053 	      x = gen_lowpart_SUBREG (GET_MODE (mem), x);
3054 
3055 	      emit_move_insn (mem, x);
3056 	    }
3057 #endif
3058 
3059 	  /* Blocks smaller than a word on a BYTES_BIG_ENDIAN
3060 	     machine must be aligned to the left before storing
3061 	     to memory.  Note that the previous test doesn't
3062 	     handle all cases (e.g. SIZE == 3).  */
3063 	  else if (size != UNITS_PER_WORD
3064 #ifdef BLOCK_REG_PADDING
3065 		   && (BLOCK_REG_PADDING (mode, data->arg.type, 1)
3066 		       == PAD_DOWNWARD)
3067 #else
3068 		   && BYTES_BIG_ENDIAN
3069 #endif
3070 		   )
3071 	    {
3072 	      rtx tem, x;
3073 	      int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
3074 	      rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
3075 
3076 	      x = expand_shift (LSHIFT_EXPR, word_mode, reg, by, NULL_RTX, 1);
3077 	      tem = change_address (mem, word_mode, 0);
3078 	      emit_move_insn (tem, x);
3079 	    }
3080 	  else
3081 	    move_block_from_reg (REGNO (entry_parm), mem,
3082 				 size_stored / UNITS_PER_WORD);
3083 	}
3084       else if (!MEM_P (mem))
3085 	{
3086 	  gcc_checking_assert (size > UNITS_PER_WORD);
3087 #ifdef BLOCK_REG_PADDING
3088 	  gcc_checking_assert (BLOCK_REG_PADDING (GET_MODE (mem),
3089 						  data->arg.type, 0)
3090 			       == PAD_UPWARD);
3091 #endif
3092 	  emit_move_insn (mem, entry_parm);
3093 	}
3094       else
3095 	move_block_from_reg (REGNO (entry_parm), mem,
3096 			     size_stored / UNITS_PER_WORD);
3097     }
3098   else if (data->stack_parm == 0 && !TYPE_EMPTY_P (data->arg.type))
3099     {
3100       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
3101       emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
3102 		       BLOCK_OP_NORMAL);
3103       all->first_conversion_insn = get_insns ();
3104       all->last_conversion_insn = get_last_insn ();
3105       end_sequence ();
3106       in_conversion_seq = true;
3107     }
3108 
3109   if (target_reg)
3110     {
3111       if (!in_conversion_seq)
3112 	emit_move_insn (target_reg, stack_parm);
3113       else
3114 	{
3115 	  push_to_sequence2 (all->first_conversion_insn,
3116 			     all->last_conversion_insn);
3117 	  emit_move_insn (target_reg, stack_parm);
3118 	  all->first_conversion_insn = get_insns ();
3119 	  all->last_conversion_insn = get_last_insn ();
3120 	  end_sequence ();
3121 	}
3122       stack_parm = target_reg;
3123     }
3124 
3125   data->stack_parm = stack_parm;
3126   set_parm_rtl (parm, stack_parm);
3127 }
3128 
3129 /* A subroutine of assign_parms.  Allocate a pseudo to hold the current
3130    parameter.  Get it there.  Perform all ABI specified conversions.  */
3131 
3132 static void
assign_parm_setup_reg(struct assign_parm_data_all * all,tree parm,struct assign_parm_data_one * data)3133 assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
3134 		       struct assign_parm_data_one *data)
3135 {
3136   rtx parmreg, validated_mem;
3137   rtx equiv_stack_parm;
3138   machine_mode promoted_nominal_mode;
3139   int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
3140   bool did_conversion = false;
3141   bool need_conversion, moved;
3142   enum insn_code icode;
3143   rtx rtl;
3144 
3145   /* Store the parm in a pseudoregister during the function, but we may
3146      need to do it in a wider mode.  Using 2 here makes the result
3147      consistent with promote_decl_mode and thus expand_expr_real_1.  */
3148   promoted_nominal_mode
3149     = promote_function_mode (data->nominal_type, data->nominal_mode, &unsignedp,
3150 			     TREE_TYPE (current_function_decl), 2);
3151 
3152   parmreg = gen_reg_rtx (promoted_nominal_mode);
3153   if (!DECL_ARTIFICIAL (parm))
3154     mark_user_reg (parmreg);
3155 
3156   /* If this was an item that we received a pointer to,
3157      set rtl appropriately.  */
3158   if (data->arg.pass_by_reference)
3159     {
3160       rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data->arg.type)), parmreg);
3161       set_mem_attributes (rtl, parm, 1);
3162     }
3163   else
3164     rtl = parmreg;
3165 
3166   assign_parm_remove_parallels (data);
3167 
3168   /* Copy the value into the register, thus bridging between
3169      assign_parm_find_data_types and expand_expr_real_1.  */
3170 
3171   equiv_stack_parm = data->stack_parm;
3172   validated_mem = validize_mem (copy_rtx (data->entry_parm));
3173 
3174   need_conversion = (data->nominal_mode != data->passed_mode
3175 		     || promoted_nominal_mode != data->arg.mode);
3176   moved = false;
3177 
3178   if (need_conversion
3179       && GET_MODE_CLASS (data->nominal_mode) == MODE_INT
3180       && data->nominal_mode == data->passed_mode
3181       && data->nominal_mode == GET_MODE (data->entry_parm))
3182     {
3183       /* ENTRY_PARM has been converted to PROMOTED_MODE, its
3184 	 mode, by the caller.  We now have to convert it to
3185 	 NOMINAL_MODE, if different.  However, PARMREG may be in
3186 	 a different mode than NOMINAL_MODE if it is being stored
3187 	 promoted.
3188 
3189 	 If ENTRY_PARM is a hard register, it might be in a register
3190 	 not valid for operating in its mode (e.g., an odd-numbered
3191 	 register for a DFmode).  In that case, moves are the only
3192 	 thing valid, so we can't do a convert from there.  This
3193 	 occurs when the calling sequence allow such misaligned
3194 	 usages.
3195 
3196 	 In addition, the conversion may involve a call, which could
3197 	 clobber parameters which haven't been copied to pseudo
3198 	 registers yet.
3199 
3200 	 First, we try to emit an insn which performs the necessary
3201 	 conversion.  We verify that this insn does not clobber any
3202 	 hard registers.  */
3203 
3204       rtx op0, op1;
3205 
3206       icode = can_extend_p (promoted_nominal_mode, data->passed_mode,
3207 			    unsignedp);
3208 
3209       op0 = parmreg;
3210       op1 = validated_mem;
3211       if (icode != CODE_FOR_nothing
3212 	  && insn_operand_matches (icode, 0, op0)
3213 	  && insn_operand_matches (icode, 1, op1))
3214 	{
3215 	  enum rtx_code code = unsignedp ? ZERO_EXTEND : SIGN_EXTEND;
3216 	  rtx_insn *insn, *insns;
3217 	  rtx t = op1;
3218 	  HARD_REG_SET hardregs;
3219 
3220 	  start_sequence ();
3221 	  /* If op1 is a hard register that is likely spilled, first
3222 	     force it into a pseudo, otherwise combiner might extend
3223 	     its lifetime too much.  */
3224 	  if (GET_CODE (t) == SUBREG)
3225 	    t = SUBREG_REG (t);
3226 	  if (REG_P (t)
3227 	      && HARD_REGISTER_P (t)
3228 	      && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (t))
3229 	      && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (t))))
3230 	    {
3231 	      t = gen_reg_rtx (GET_MODE (op1));
3232 	      emit_move_insn (t, op1);
3233 	    }
3234 	  else
3235 	    t = op1;
3236 	  rtx_insn *pat = gen_extend_insn (op0, t, promoted_nominal_mode,
3237 					   data->passed_mode, unsignedp);
3238 	  emit_insn (pat);
3239 	  insns = get_insns ();
3240 
3241 	  moved = true;
3242 	  CLEAR_HARD_REG_SET (hardregs);
3243 	  for (insn = insns; insn && moved; insn = NEXT_INSN (insn))
3244 	    {
3245 	      if (INSN_P (insn))
3246 		note_stores (insn, record_hard_reg_sets, &hardregs);
3247 	      if (!hard_reg_set_empty_p (hardregs))
3248 		moved = false;
3249 	    }
3250 
3251 	  end_sequence ();
3252 
3253 	  if (moved)
3254 	    {
3255 	      emit_insn (insns);
3256 	      if (equiv_stack_parm != NULL_RTX)
3257 		equiv_stack_parm = gen_rtx_fmt_e (code, GET_MODE (parmreg),
3258 						  equiv_stack_parm);
3259 	    }
3260 	}
3261     }
3262 
3263   if (moved)
3264     /* Nothing to do.  */
3265     ;
3266   else if (need_conversion)
3267     {
3268       /* We did not have an insn to convert directly, or the sequence
3269 	 generated appeared unsafe.  We must first copy the parm to a
3270 	 pseudo reg, and save the conversion until after all
3271 	 parameters have been moved.  */
3272 
3273       int save_tree_used;
3274       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
3275 
3276       emit_move_insn (tempreg, validated_mem);
3277 
3278       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
3279       tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
3280 
3281       if (partial_subreg_p (tempreg)
3282 	  && GET_MODE (tempreg) == data->nominal_mode
3283 	  && REG_P (SUBREG_REG (tempreg))
3284 	  && data->nominal_mode == data->passed_mode
3285 	  && GET_MODE (SUBREG_REG (tempreg)) == GET_MODE (data->entry_parm))
3286 	{
3287 	  /* The argument is already sign/zero extended, so note it
3288 	     into the subreg.  */
3289 	  SUBREG_PROMOTED_VAR_P (tempreg) = 1;
3290 	  SUBREG_PROMOTED_SET (tempreg, unsignedp);
3291 	}
3292 
3293       /* TREE_USED gets set erroneously during expand_assignment.  */
3294       save_tree_used = TREE_USED (parm);
3295       SET_DECL_RTL (parm, rtl);
3296       expand_assignment (parm, make_tree (data->nominal_type, tempreg), false);
3297       SET_DECL_RTL (parm, NULL_RTX);
3298       TREE_USED (parm) = save_tree_used;
3299       all->first_conversion_insn = get_insns ();
3300       all->last_conversion_insn = get_last_insn ();
3301       end_sequence ();
3302 
3303       did_conversion = true;
3304     }
3305   else if (MEM_P (data->entry_parm)
3306 	   && GET_MODE_ALIGNMENT (promoted_nominal_mode)
3307 	      > MEM_ALIGN (data->entry_parm)
3308 	   && (((icode = optab_handler (movmisalign_optab,
3309 					promoted_nominal_mode))
3310 		!= CODE_FOR_nothing)
3311 	       || targetm.slow_unaligned_access (promoted_nominal_mode,
3312 						 MEM_ALIGN (data->entry_parm))))
3313     {
3314       if (icode != CODE_FOR_nothing)
3315 	emit_insn (GEN_FCN (icode) (parmreg, validated_mem));
3316       else
3317 	rtl = parmreg = extract_bit_field (validated_mem,
3318 			GET_MODE_BITSIZE (promoted_nominal_mode), 0,
3319 			unsignedp, parmreg,
3320 			promoted_nominal_mode, VOIDmode, false, NULL);
3321     }
3322   else
3323     emit_move_insn (parmreg, validated_mem);
3324 
3325   /* If we were passed a pointer but the actual value can safely live
3326      in a register, retrieve it and use it directly.  */
3327   if (data->arg.pass_by_reference && TYPE_MODE (TREE_TYPE (parm)) != BLKmode)
3328     {
3329       /* We can't use nominal_mode, because it will have been set to
3330 	 Pmode above.  We must use the actual mode of the parm.  */
3331       if (use_register_for_decl (parm))
3332 	{
3333 	  parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
3334 	  mark_user_reg (parmreg);
3335 	}
3336       else
3337 	{
3338 	  int align = STACK_SLOT_ALIGNMENT (TREE_TYPE (parm),
3339 					    TYPE_MODE (TREE_TYPE (parm)),
3340 					    TYPE_ALIGN (TREE_TYPE (parm)));
3341 	  parmreg
3342 	    = assign_stack_local (TYPE_MODE (TREE_TYPE (parm)),
3343 				  GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parm))),
3344 				  align);
3345 	  set_mem_attributes (parmreg, parm, 1);
3346 	}
3347 
3348       /* We need to preserve an address based on VIRTUAL_STACK_VARS_REGNUM for
3349 	 the debug info in case it is not legitimate.  */
3350       if (GET_MODE (parmreg) != GET_MODE (rtl))
3351 	{
3352 	  rtx tempreg = gen_reg_rtx (GET_MODE (rtl));
3353 	  int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
3354 
3355 	  push_to_sequence2 (all->first_conversion_insn,
3356 			     all->last_conversion_insn);
3357 	  emit_move_insn (tempreg, rtl);
3358 	  tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
3359 	  emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg,
3360 			  tempreg);
3361 	  all->first_conversion_insn = get_insns ();
3362 	  all->last_conversion_insn = get_last_insn ();
3363 	  end_sequence ();
3364 
3365 	  did_conversion = true;
3366 	}
3367       else
3368 	emit_move_insn (MEM_P (parmreg) ? copy_rtx (parmreg) : parmreg, rtl);
3369 
3370       rtl = parmreg;
3371 
3372       /* STACK_PARM is the pointer, not the parm, and PARMREG is
3373 	 now the parm.  */
3374       data->stack_parm = NULL;
3375     }
3376 
3377   set_parm_rtl (parm, rtl);
3378 
3379   /* Mark the register as eliminable if we did no conversion and it was
3380      copied from memory at a fixed offset, and the arg pointer was not
3381      copied to a pseudo-reg.  If the arg pointer is a pseudo reg or the
3382      offset formed an invalid address, such memory-equivalences as we
3383      make here would screw up life analysis for it.  */
3384   if (data->nominal_mode == data->passed_mode
3385       && !did_conversion
3386       && data->stack_parm != 0
3387       && MEM_P (data->stack_parm)
3388       && data->locate.offset.var == 0
3389       && reg_mentioned_p (virtual_incoming_args_rtx,
3390 			  XEXP (data->stack_parm, 0)))
3391     {
3392       rtx_insn *linsn = get_last_insn ();
3393       rtx_insn *sinsn;
3394       rtx set;
3395 
3396       /* Mark complex types separately.  */
3397       if (GET_CODE (parmreg) == CONCAT)
3398 	{
3399 	  scalar_mode submode = GET_MODE_INNER (GET_MODE (parmreg));
3400 	  int regnor = REGNO (XEXP (parmreg, 0));
3401 	  int regnoi = REGNO (XEXP (parmreg, 1));
3402 	  rtx stackr = adjust_address_nv (data->stack_parm, submode, 0);
3403 	  rtx stacki = adjust_address_nv (data->stack_parm, submode,
3404 					  GET_MODE_SIZE (submode));
3405 
3406 	  /* Scan backwards for the set of the real and
3407 	     imaginary parts.  */
3408 	  for (sinsn = linsn; sinsn != 0;
3409 	       sinsn = prev_nonnote_insn (sinsn))
3410 	    {
3411 	      set = single_set (sinsn);
3412 	      if (set == 0)
3413 		continue;
3414 
3415 	      if (SET_DEST (set) == regno_reg_rtx [regnoi])
3416 		set_unique_reg_note (sinsn, REG_EQUIV, stacki);
3417 	      else if (SET_DEST (set) == regno_reg_rtx [regnor])
3418 		set_unique_reg_note (sinsn, REG_EQUIV, stackr);
3419 	    }
3420 	}
3421       else
3422 	set_dst_reg_note (linsn, REG_EQUIV, equiv_stack_parm, parmreg);
3423     }
3424 
3425   /* For pointer data type, suggest pointer register.  */
3426   if (POINTER_TYPE_P (TREE_TYPE (parm)))
3427     mark_reg_pointer (parmreg,
3428 		      TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
3429 }
3430 
3431 /* A subroutine of assign_parms.  Allocate stack space to hold the current
3432    parameter.  Get it there.  Perform all ABI specified conversions.  */
3433 
3434 static void
assign_parm_setup_stack(struct assign_parm_data_all * all,tree parm,struct assign_parm_data_one * data)3435 assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
3436 		         struct assign_parm_data_one *data)
3437 {
3438   /* Value must be stored in the stack slot STACK_PARM during function
3439      execution.  */
3440   bool to_conversion = false;
3441 
3442   assign_parm_remove_parallels (data);
3443 
3444   if (data->arg.mode != data->nominal_mode)
3445     {
3446       /* Conversion is required.  */
3447       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
3448 
3449       emit_move_insn (tempreg, validize_mem (copy_rtx (data->entry_parm)));
3450 
3451       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
3452       to_conversion = true;
3453 
3454       data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
3455 					  TYPE_UNSIGNED (TREE_TYPE (parm)));
3456 
3457       if (data->stack_parm)
3458 	{
3459 	  poly_int64 offset
3460 	    = subreg_lowpart_offset (data->nominal_mode,
3461 				     GET_MODE (data->stack_parm));
3462 	  /* ??? This may need a big-endian conversion on sparc64.  */
3463 	  data->stack_parm
3464 	    = adjust_address (data->stack_parm, data->nominal_mode, 0);
3465 	  if (maybe_ne (offset, 0) && MEM_OFFSET_KNOWN_P (data->stack_parm))
3466 	    set_mem_offset (data->stack_parm,
3467 			    MEM_OFFSET (data->stack_parm) + offset);
3468 	}
3469     }
3470 
3471   if (data->entry_parm != data->stack_parm)
3472     {
3473       rtx src, dest;
3474 
3475       if (data->stack_parm == 0)
3476 	{
3477 	  int align = STACK_SLOT_ALIGNMENT (data->arg.type,
3478 					    GET_MODE (data->entry_parm),
3479 					    TYPE_ALIGN (data->arg.type));
3480 	  if (align < (int)GET_MODE_ALIGNMENT (GET_MODE (data->entry_parm))
3481 	      && ((optab_handler (movmisalign_optab,
3482 				  GET_MODE (data->entry_parm))
3483 		   != CODE_FOR_nothing)
3484 		  || targetm.slow_unaligned_access (GET_MODE (data->entry_parm),
3485 						    align)))
3486 	    align = GET_MODE_ALIGNMENT (GET_MODE (data->entry_parm));
3487 	  data->stack_parm
3488 	    = assign_stack_local (GET_MODE (data->entry_parm),
3489 				  GET_MODE_SIZE (GET_MODE (data->entry_parm)),
3490 				  align);
3491 	  align = MEM_ALIGN (data->stack_parm);
3492 	  set_mem_attributes (data->stack_parm, parm, 1);
3493 	  set_mem_align (data->stack_parm, align);
3494 	}
3495 
3496       dest = validize_mem (copy_rtx (data->stack_parm));
3497       src = validize_mem (copy_rtx (data->entry_parm));
3498 
3499       if (TYPE_EMPTY_P (data->arg.type))
3500 	/* Empty types don't really need to be copied.  */;
3501       else if (MEM_P (src))
3502 	{
3503 	  /* Use a block move to handle potentially misaligned entry_parm.  */
3504 	  if (!to_conversion)
3505 	    push_to_sequence2 (all->first_conversion_insn,
3506 			       all->last_conversion_insn);
3507 	  to_conversion = true;
3508 
3509 	  emit_block_move (dest, src,
3510 			   GEN_INT (int_size_in_bytes (data->arg.type)),
3511 			   BLOCK_OP_NORMAL);
3512 	}
3513       else
3514 	{
3515 	  if (!REG_P (src))
3516 	    src = force_reg (GET_MODE (src), src);
3517 	  emit_move_insn (dest, src);
3518 	}
3519     }
3520 
3521   if (to_conversion)
3522     {
3523       all->first_conversion_insn = get_insns ();
3524       all->last_conversion_insn = get_last_insn ();
3525       end_sequence ();
3526     }
3527 
3528   set_parm_rtl (parm, data->stack_parm);
3529 }
3530 
3531 /* A subroutine of assign_parms.  If the ABI splits complex arguments, then
3532    undo the frobbing that we did in assign_parms_augmented_arg_list.  */
3533 
3534 static void
assign_parms_unsplit_complex(struct assign_parm_data_all * all,vec<tree> fnargs)3535 assign_parms_unsplit_complex (struct assign_parm_data_all *all,
3536 			      vec<tree> fnargs)
3537 {
3538   tree parm;
3539   tree orig_fnargs = all->orig_fnargs;
3540   unsigned i = 0;
3541 
3542   for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm), ++i)
3543     {
3544       if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
3545 	  && targetm.calls.split_complex_arg (TREE_TYPE (parm)))
3546 	{
3547 	  rtx tmp, real, imag;
3548 	  scalar_mode inner = GET_MODE_INNER (DECL_MODE (parm));
3549 
3550 	  real = DECL_RTL (fnargs[i]);
3551 	  imag = DECL_RTL (fnargs[i + 1]);
3552 	  if (inner != GET_MODE (real))
3553 	    {
3554 	      real = gen_lowpart_SUBREG (inner, real);
3555 	      imag = gen_lowpart_SUBREG (inner, imag);
3556 	    }
3557 
3558 	  if (TREE_ADDRESSABLE (parm))
3559 	    {
3560 	      rtx rmem, imem;
3561 	      HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (parm));
3562 	      int align = STACK_SLOT_ALIGNMENT (TREE_TYPE (parm),
3563 						DECL_MODE (parm),
3564 						TYPE_ALIGN (TREE_TYPE (parm)));
3565 
3566 	      /* split_complex_arg put the real and imag parts in
3567 		 pseudos.  Move them to memory.  */
3568 	      tmp = assign_stack_local (DECL_MODE (parm), size, align);
3569 	      set_mem_attributes (tmp, parm, 1);
3570 	      rmem = adjust_address_nv (tmp, inner, 0);
3571 	      imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
3572 	      push_to_sequence2 (all->first_conversion_insn,
3573 				 all->last_conversion_insn);
3574 	      emit_move_insn (rmem, real);
3575 	      emit_move_insn (imem, imag);
3576 	      all->first_conversion_insn = get_insns ();
3577 	      all->last_conversion_insn = get_last_insn ();
3578 	      end_sequence ();
3579 	    }
3580 	  else
3581 	    tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
3582 	  set_parm_rtl (parm, tmp);
3583 
3584 	  real = DECL_INCOMING_RTL (fnargs[i]);
3585 	  imag = DECL_INCOMING_RTL (fnargs[i + 1]);
3586 	  if (inner != GET_MODE (real))
3587 	    {
3588 	      real = gen_lowpart_SUBREG (inner, real);
3589 	      imag = gen_lowpart_SUBREG (inner, imag);
3590 	    }
3591 	  tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
3592 	  set_decl_incoming_rtl (parm, tmp, false);
3593 	  i++;
3594 	}
3595     }
3596 }
3597 
3598 /* Assign RTL expressions to the function's parameters.  This may involve
3599    copying them into registers and using those registers as the DECL_RTL.  */
3600 
3601 static void
assign_parms(tree fndecl)3602 assign_parms (tree fndecl)
3603 {
3604   struct assign_parm_data_all all;
3605   tree parm;
3606   vec<tree> fnargs;
3607   unsigned i;
3608 
3609   crtl->args.internal_arg_pointer
3610     = targetm.calls.internal_arg_pointer ();
3611 
3612   assign_parms_initialize_all (&all);
3613   fnargs = assign_parms_augmented_arg_list (&all);
3614 
3615   FOR_EACH_VEC_ELT (fnargs, i, parm)
3616     {
3617       struct assign_parm_data_one data;
3618 
3619       /* Extract the type of PARM; adjust it according to ABI.  */
3620       assign_parm_find_data_types (&all, parm, &data);
3621 
3622       /* Early out for errors and void parameters.  */
3623       if (data.passed_mode == VOIDmode)
3624 	{
3625 	  SET_DECL_RTL (parm, const0_rtx);
3626 	  DECL_INCOMING_RTL (parm) = DECL_RTL (parm);
3627 	  continue;
3628 	}
3629 
3630       /* Estimate stack alignment from parameter alignment.  */
3631       if (SUPPORTS_STACK_ALIGNMENT)
3632         {
3633           unsigned int align
3634 	    = targetm.calls.function_arg_boundary (data.arg.mode,
3635 						   data.arg.type);
3636 	  align = MINIMUM_ALIGNMENT (data.arg.type, data.arg.mode, align);
3637 	  if (TYPE_ALIGN (data.nominal_type) > align)
3638 	    align = MINIMUM_ALIGNMENT (data.nominal_type,
3639 				       TYPE_MODE (data.nominal_type),
3640 				       TYPE_ALIGN (data.nominal_type));
3641 	  if (crtl->stack_alignment_estimated < align)
3642 	    {
3643 	      gcc_assert (!crtl->stack_realign_processed);
3644 	      crtl->stack_alignment_estimated = align;
3645 	    }
3646 	}
3647 
3648       /* Find out where the parameter arrives in this function.  */
3649       assign_parm_find_entry_rtl (&all, &data);
3650 
3651       /* Find out where stack space for this parameter might be.  */
3652       if (assign_parm_is_stack_parm (&all, &data))
3653 	{
3654 	  assign_parm_find_stack_rtl (parm, &data);
3655 	  assign_parm_adjust_entry_rtl (&data);
3656 	  /* For arguments that occupy no space in the parameter
3657 	     passing area, have non-zero size and have address taken,
3658 	     force creation of a stack slot so that they have distinct
3659 	     address from other parameters.  */
3660 	  if (TYPE_EMPTY_P (data.arg.type)
3661 	      && TREE_ADDRESSABLE (parm)
3662 	      && data.entry_parm == data.stack_parm
3663 	      && MEM_P (data.entry_parm)
3664 	      && int_size_in_bytes (data.arg.type))
3665 	    data.stack_parm = NULL_RTX;
3666 	}
3667       /* Record permanently how this parm was passed.  */
3668       if (data.arg.pass_by_reference)
3669 	{
3670 	  rtx incoming_rtl
3671 	    = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data.arg.type)),
3672 			   data.entry_parm);
3673 	  set_decl_incoming_rtl (parm, incoming_rtl, true);
3674 	}
3675       else
3676 	set_decl_incoming_rtl (parm, data.entry_parm, false);
3677 
3678       assign_parm_adjust_stack_rtl (&data);
3679 
3680       if (assign_parm_setup_block_p (&data))
3681 	assign_parm_setup_block (&all, parm, &data);
3682       else if (data.arg.pass_by_reference || use_register_for_decl (parm))
3683 	assign_parm_setup_reg (&all, parm, &data);
3684       else
3685 	assign_parm_setup_stack (&all, parm, &data);
3686 
3687       if (cfun->stdarg && !DECL_CHAIN (parm))
3688 	assign_parms_setup_varargs (&all, &data, false);
3689 
3690       /* Update info on where next arg arrives in registers.  */
3691       targetm.calls.function_arg_advance (all.args_so_far, data.arg);
3692     }
3693 
3694   if (targetm.calls.split_complex_arg)
3695     assign_parms_unsplit_complex (&all, fnargs);
3696 
3697   fnargs.release ();
3698 
3699   /* Output all parameter conversion instructions (possibly including calls)
3700      now that all parameters have been copied out of hard registers.  */
3701   emit_insn (all.first_conversion_insn);
3702 
3703   /* Estimate reload stack alignment from scalar return mode.  */
3704   if (SUPPORTS_STACK_ALIGNMENT)
3705     {
3706       if (DECL_RESULT (fndecl))
3707 	{
3708 	  tree type = TREE_TYPE (DECL_RESULT (fndecl));
3709 	  machine_mode mode = TYPE_MODE (type);
3710 
3711 	  if (mode != BLKmode
3712 	      && mode != VOIDmode
3713 	      && !AGGREGATE_TYPE_P (type))
3714 	    {
3715 	      unsigned int align = GET_MODE_ALIGNMENT (mode);
3716 	      if (crtl->stack_alignment_estimated < align)
3717 		{
3718 		  gcc_assert (!crtl->stack_realign_processed);
3719 		  crtl->stack_alignment_estimated = align;
3720 		}
3721 	    }
3722 	}
3723     }
3724 
3725   /* If we are receiving a struct value address as the first argument, set up
3726      the RTL for the function result. As this might require code to convert
3727      the transmitted address to Pmode, we do this here to ensure that possible
3728      preliminary conversions of the address have been emitted already.  */
3729   if (all.function_result_decl)
3730     {
3731       tree result = DECL_RESULT (current_function_decl);
3732       rtx addr = DECL_RTL (all.function_result_decl);
3733       rtx x;
3734 
3735       if (DECL_BY_REFERENCE (result))
3736 	{
3737 	  SET_DECL_VALUE_EXPR (result, all.function_result_decl);
3738 	  x = addr;
3739 	}
3740       else
3741 	{
3742 	  SET_DECL_VALUE_EXPR (result,
3743 			       build1 (INDIRECT_REF, TREE_TYPE (result),
3744 				       all.function_result_decl));
3745 	  addr = convert_memory_address (Pmode, addr);
3746 	  x = gen_rtx_MEM (DECL_MODE (result), addr);
3747 	  set_mem_attributes (x, result, 1);
3748 	}
3749 
3750       DECL_HAS_VALUE_EXPR_P (result) = 1;
3751 
3752       set_parm_rtl (result, x);
3753     }
3754 
3755   /* We have aligned all the args, so add space for the pretend args.  */
3756   crtl->args.pretend_args_size = all.pretend_args_size;
3757   all.stack_args_size.constant += all.extra_pretend_bytes;
3758   crtl->args.size = all.stack_args_size.constant;
3759 
3760   /* Adjust function incoming argument size for alignment and
3761      minimum length.  */
3762 
3763   crtl->args.size = upper_bound (crtl->args.size, all.reg_parm_stack_space);
3764   crtl->args.size = aligned_upper_bound (crtl->args.size,
3765 					 PARM_BOUNDARY / BITS_PER_UNIT);
3766 
3767   if (ARGS_GROW_DOWNWARD)
3768     {
3769       crtl->args.arg_offset_rtx
3770 	= (all.stack_args_size.var == 0
3771 	   ? gen_int_mode (-all.stack_args_size.constant, Pmode)
3772 	   : expand_expr (size_diffop (all.stack_args_size.var,
3773 				       size_int (-all.stack_args_size.constant)),
3774 			  NULL_RTX, VOIDmode, EXPAND_NORMAL));
3775     }
3776   else
3777     crtl->args.arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
3778 
3779   /* See how many bytes, if any, of its args a function should try to pop
3780      on return.  */
3781 
3782   crtl->args.pops_args = targetm.calls.return_pops_args (fndecl,
3783 							 TREE_TYPE (fndecl),
3784 							 crtl->args.size);
3785 
3786   /* For stdarg.h function, save info about
3787      regs and stack space used by the named args.  */
3788 
3789   crtl->args.info = all.args_so_far_v;
3790 
3791   /* Set the rtx used for the function return value.  Put this in its
3792      own variable so any optimizers that need this information don't have
3793      to include tree.h.  Do this here so it gets done when an inlined
3794      function gets output.  */
3795 
3796   crtl->return_rtx
3797     = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
3798        ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
3799 
3800   /* If scalar return value was computed in a pseudo-reg, or was a named
3801      return value that got dumped to the stack, copy that to the hard
3802      return register.  */
3803   if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
3804     {
3805       tree decl_result = DECL_RESULT (fndecl);
3806       rtx decl_rtl = DECL_RTL (decl_result);
3807 
3808       if (REG_P (decl_rtl)
3809 	  ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
3810 	  : DECL_REGISTER (decl_result))
3811 	{
3812 	  rtx real_decl_rtl;
3813 
3814 	  real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
3815 							fndecl, true);
3816 	  REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
3817 	  /* The delay slot scheduler assumes that crtl->return_rtx
3818 	     holds the hard register containing the return value, not a
3819 	     temporary pseudo.  */
3820 	  crtl->return_rtx = real_decl_rtl;
3821 	}
3822     }
3823 }
3824 
3825 /* A subroutine of gimplify_parameters, invoked via walk_tree.
3826    For all seen types, gimplify their sizes.  */
3827 
3828 static tree
gimplify_parm_type(tree * tp,int * walk_subtrees,void * data)3829 gimplify_parm_type (tree *tp, int *walk_subtrees, void *data)
3830 {
3831   tree t = *tp;
3832 
3833   *walk_subtrees = 0;
3834   if (TYPE_P (t))
3835     {
3836       if (POINTER_TYPE_P (t))
3837 	*walk_subtrees = 1;
3838       else if (TYPE_SIZE (t) && !TREE_CONSTANT (TYPE_SIZE (t))
3839 	       && !TYPE_SIZES_GIMPLIFIED (t))
3840 	{
3841 	  gimplify_type_sizes (t, (gimple_seq *) data);
3842 	  *walk_subtrees = 1;
3843 	}
3844     }
3845 
3846   return NULL;
3847 }
3848 
3849 /* Gimplify the parameter list for current_function_decl.  This involves
3850    evaluating SAVE_EXPRs of variable sized parameters and generating code
3851    to implement callee-copies reference parameters.  Returns a sequence of
3852    statements to add to the beginning of the function.  */
3853 
3854 gimple_seq
gimplify_parameters(gimple_seq * cleanup)3855 gimplify_parameters (gimple_seq *cleanup)
3856 {
3857   struct assign_parm_data_all all;
3858   tree parm;
3859   gimple_seq stmts = NULL;
3860   vec<tree> fnargs;
3861   unsigned i;
3862 
3863   assign_parms_initialize_all (&all);
3864   fnargs = assign_parms_augmented_arg_list (&all);
3865 
3866   FOR_EACH_VEC_ELT (fnargs, i, parm)
3867     {
3868       struct assign_parm_data_one data;
3869 
3870       /* Extract the type of PARM; adjust it according to ABI.  */
3871       assign_parm_find_data_types (&all, parm, &data);
3872 
3873       /* Early out for errors and void parameters.  */
3874       if (data.passed_mode == VOIDmode || DECL_SIZE (parm) == NULL)
3875 	continue;
3876 
3877       /* Update info on where next arg arrives in registers.  */
3878       targetm.calls.function_arg_advance (all.args_so_far, data.arg);
3879 
3880       /* ??? Once upon a time variable_size stuffed parameter list
3881 	 SAVE_EXPRs (amongst others) onto a pending sizes list.  This
3882 	 turned out to be less than manageable in the gimple world.
3883 	 Now we have to hunt them down ourselves.  */
3884       walk_tree_without_duplicates (&data.arg.type,
3885 				    gimplify_parm_type, &stmts);
3886 
3887       if (TREE_CODE (DECL_SIZE_UNIT (parm)) != INTEGER_CST)
3888 	{
3889 	  gimplify_one_sizepos (&DECL_SIZE (parm), &stmts);
3890 	  gimplify_one_sizepos (&DECL_SIZE_UNIT (parm), &stmts);
3891 	}
3892 
3893       if (data.arg.pass_by_reference)
3894 	{
3895 	  tree type = TREE_TYPE (data.arg.type);
3896 	  function_arg_info orig_arg (type, data.arg.named);
3897 	  if (reference_callee_copied (&all.args_so_far_v, orig_arg))
3898 	    {
3899 	      tree local, t;
3900 
3901 	      /* For constant-sized objects, this is trivial; for
3902 		 variable-sized objects, we have to play games.  */
3903 	      if (TREE_CODE (DECL_SIZE_UNIT (parm)) == INTEGER_CST
3904 		  && !(flag_stack_check == GENERIC_STACK_CHECK
3905 		       && compare_tree_int (DECL_SIZE_UNIT (parm),
3906 					    STACK_CHECK_MAX_VAR_SIZE) > 0))
3907 		{
3908 		  local = create_tmp_var (type, get_name (parm));
3909 		  DECL_IGNORED_P (local) = 0;
3910 		  /* If PARM was addressable, move that flag over
3911 		     to the local copy, as its address will be taken,
3912 		     not the PARMs.  Keep the parms address taken
3913 		     as we'll query that flag during gimplification.  */
3914 		  if (TREE_ADDRESSABLE (parm))
3915 		    TREE_ADDRESSABLE (local) = 1;
3916 		  else if (TREE_CODE (type) == COMPLEX_TYPE
3917 			   || TREE_CODE (type) == VECTOR_TYPE)
3918 		    DECL_GIMPLE_REG_P (local) = 1;
3919 
3920 		  if (!is_gimple_reg (local)
3921 		      && flag_stack_reuse != SR_NONE)
3922 		    {
3923 		      tree clobber = build_clobber (type);
3924 		      gimple *clobber_stmt;
3925 		      clobber_stmt = gimple_build_assign (local, clobber);
3926 		      gimple_seq_add_stmt (cleanup, clobber_stmt);
3927 		    }
3928 		}
3929 	      else
3930 		{
3931 		  tree ptr_type, addr;
3932 
3933 		  ptr_type = build_pointer_type (type);
3934 		  addr = create_tmp_reg (ptr_type, get_name (parm));
3935 		  DECL_IGNORED_P (addr) = 0;
3936 		  local = build_fold_indirect_ref (addr);
3937 
3938 		  t = build_alloca_call_expr (DECL_SIZE_UNIT (parm),
3939 					      DECL_ALIGN (parm),
3940 					      max_int_size_in_bytes (type));
3941 		  /* The call has been built for a variable-sized object.  */
3942 		  CALL_ALLOCA_FOR_VAR_P (t) = 1;
3943 		  t = fold_convert (ptr_type, t);
3944 		  t = build2 (MODIFY_EXPR, TREE_TYPE (addr), addr, t);
3945 		  gimplify_and_add (t, &stmts);
3946 		}
3947 
3948 	      gimplify_assign (local, parm, &stmts);
3949 
3950 	      SET_DECL_VALUE_EXPR (parm, local);
3951 	      DECL_HAS_VALUE_EXPR_P (parm) = 1;
3952 	    }
3953 	}
3954     }
3955 
3956   fnargs.release ();
3957 
3958   return stmts;
3959 }
3960 
3961 /* Compute the size and offset from the start of the stacked arguments for a
3962    parm passed in mode PASSED_MODE and with type TYPE.
3963 
3964    INITIAL_OFFSET_PTR points to the current offset into the stacked
3965    arguments.
3966 
3967    The starting offset and size for this parm are returned in
3968    LOCATE->OFFSET and LOCATE->SIZE, respectively.  When IN_REGS is
3969    nonzero, the offset is that of stack slot, which is returned in
3970    LOCATE->SLOT_OFFSET.  LOCATE->ALIGNMENT_PAD is the amount of
3971    padding required from the initial offset ptr to the stack slot.
3972 
3973    IN_REGS is nonzero if the argument will be passed in registers.  It will
3974    never be set if REG_PARM_STACK_SPACE is not defined.
3975 
3976    REG_PARM_STACK_SPACE is the number of bytes of stack space reserved
3977    for arguments which are passed in registers.
3978 
3979    FNDECL is the function in which the argument was defined.
3980 
3981    There are two types of rounding that are done.  The first, controlled by
3982    TARGET_FUNCTION_ARG_BOUNDARY, forces the offset from the start of the
3983    argument list to be aligned to the specific boundary (in bits).  This
3984    rounding affects the initial and starting offsets, but not the argument
3985    size.
3986 
3987    The second, controlled by TARGET_FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3988    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3989    initial offset is not affected by this rounding, while the size always
3990    is and the starting offset may be.  */
3991 
3992 /*  LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
3993     INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
3994     callers pass in the total size of args so far as
3995     INITIAL_OFFSET_PTR.  LOCATE->SIZE is always positive.  */
3996 
3997 void
locate_and_pad_parm(machine_mode passed_mode,tree type,int in_regs,int reg_parm_stack_space,int partial,tree fndecl ATTRIBUTE_UNUSED,struct args_size * initial_offset_ptr,struct locate_and_pad_arg_data * locate)3998 locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs,
3999 		     int reg_parm_stack_space, int partial,
4000 		     tree fndecl ATTRIBUTE_UNUSED,
4001 		     struct args_size *initial_offset_ptr,
4002 		     struct locate_and_pad_arg_data *locate)
4003 {
4004   tree sizetree;
4005   pad_direction where_pad;
4006   unsigned int boundary, round_boundary;
4007   int part_size_in_regs;
4008 
4009   /* If we have found a stack parm before we reach the end of the
4010      area reserved for registers, skip that area.  */
4011   if (! in_regs)
4012     {
4013       if (reg_parm_stack_space > 0)
4014 	{
4015 	  if (initial_offset_ptr->var
4016 	      || !ordered_p (initial_offset_ptr->constant,
4017 			     reg_parm_stack_space))
4018 	    {
4019 	      initial_offset_ptr->var
4020 		= size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
4021 			      ssize_int (reg_parm_stack_space));
4022 	      initial_offset_ptr->constant = 0;
4023 	    }
4024 	  else
4025 	    initial_offset_ptr->constant
4026 	      = ordered_max (initial_offset_ptr->constant,
4027 			     reg_parm_stack_space);
4028 	}
4029     }
4030 
4031   part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
4032 
4033   sizetree = (type
4034 	      ? arg_size_in_bytes (type)
4035 	      : size_int (GET_MODE_SIZE (passed_mode)));
4036   where_pad = targetm.calls.function_arg_padding (passed_mode, type);
4037   boundary = targetm.calls.function_arg_boundary (passed_mode, type);
4038   round_boundary = targetm.calls.function_arg_round_boundary (passed_mode,
4039 							      type);
4040   locate->where_pad = where_pad;
4041 
4042   /* Alignment can't exceed MAX_SUPPORTED_STACK_ALIGNMENT.  */
4043   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
4044     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
4045 
4046   locate->boundary = boundary;
4047 
4048   if (SUPPORTS_STACK_ALIGNMENT)
4049     {
4050       /* stack_alignment_estimated can't change after stack has been
4051 	 realigned.  */
4052       if (crtl->stack_alignment_estimated < boundary)
4053         {
4054           if (!crtl->stack_realign_processed)
4055 	    crtl->stack_alignment_estimated = boundary;
4056 	  else
4057 	    {
4058 	      /* If stack is realigned and stack alignment value
4059 		 hasn't been finalized, it is OK not to increase
4060 		 stack_alignment_estimated.  The bigger alignment
4061 		 requirement is recorded in stack_alignment_needed
4062 		 below.  */
4063 	      gcc_assert (!crtl->stack_realign_finalized
4064 			  && crtl->stack_realign_needed);
4065 	    }
4066 	}
4067     }
4068 
4069   if (ARGS_GROW_DOWNWARD)
4070     {
4071       locate->slot_offset.constant = -initial_offset_ptr->constant;
4072       if (initial_offset_ptr->var)
4073 	locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int (0),
4074 					      initial_offset_ptr->var);
4075 
4076       {
4077 	tree s2 = sizetree;
4078 	if (where_pad != PAD_NONE
4079 	    && (!tree_fits_uhwi_p (sizetree)
4080 		|| (tree_to_uhwi (sizetree) * BITS_PER_UNIT) % round_boundary))
4081 	  s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
4082 	SUB_PARM_SIZE (locate->slot_offset, s2);
4083       }
4084 
4085       locate->slot_offset.constant += part_size_in_regs;
4086 
4087       if (!in_regs || reg_parm_stack_space > 0)
4088 	pad_to_arg_alignment (&locate->slot_offset, boundary,
4089 			      &locate->alignment_pad);
4090 
4091       locate->size.constant = (-initial_offset_ptr->constant
4092 			       - locate->slot_offset.constant);
4093       if (initial_offset_ptr->var)
4094 	locate->size.var = size_binop (MINUS_EXPR,
4095 				       size_binop (MINUS_EXPR,
4096 						   ssize_int (0),
4097 						   initial_offset_ptr->var),
4098 				       locate->slot_offset.var);
4099 
4100       /* Pad_below needs the pre-rounded size to know how much to pad
4101 	 below.  */
4102       locate->offset = locate->slot_offset;
4103       if (where_pad == PAD_DOWNWARD)
4104 	pad_below (&locate->offset, passed_mode, sizetree);
4105 
4106     }
4107   else
4108     {
4109       if (!in_regs || reg_parm_stack_space > 0)
4110 	pad_to_arg_alignment (initial_offset_ptr, boundary,
4111 			      &locate->alignment_pad);
4112       locate->slot_offset = *initial_offset_ptr;
4113 
4114 #ifdef PUSH_ROUNDING
4115       if (passed_mode != BLKmode)
4116 	sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
4117 #endif
4118 
4119       /* Pad_below needs the pre-rounded size to know how much to pad below
4120 	 so this must be done before rounding up.  */
4121       locate->offset = locate->slot_offset;
4122       if (where_pad == PAD_DOWNWARD)
4123 	pad_below (&locate->offset, passed_mode, sizetree);
4124 
4125       if (where_pad != PAD_NONE
4126 	  && (!tree_fits_uhwi_p (sizetree)
4127 	      || (tree_to_uhwi (sizetree) * BITS_PER_UNIT) % round_boundary))
4128 	sizetree = round_up (sizetree, round_boundary / BITS_PER_UNIT);
4129 
4130       ADD_PARM_SIZE (locate->size, sizetree);
4131 
4132       locate->size.constant -= part_size_in_regs;
4133     }
4134 
4135   locate->offset.constant
4136     += targetm.calls.function_arg_offset (passed_mode, type);
4137 }
4138 
4139 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
4140    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
4141 
4142 static void
pad_to_arg_alignment(struct args_size * offset_ptr,int boundary,struct args_size * alignment_pad)4143 pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
4144 		      struct args_size *alignment_pad)
4145 {
4146   tree save_var = NULL_TREE;
4147   poly_int64 save_constant = 0;
4148   int boundary_in_bytes = boundary / BITS_PER_UNIT;
4149   poly_int64 sp_offset = STACK_POINTER_OFFSET;
4150 
4151 #ifdef SPARC_STACK_BOUNDARY_HACK
4152   /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
4153      the real alignment of %sp.  However, when it does this, the
4154      alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY.  */
4155   if (SPARC_STACK_BOUNDARY_HACK)
4156     sp_offset = 0;
4157 #endif
4158 
4159   if (boundary > PARM_BOUNDARY)
4160     {
4161       save_var = offset_ptr->var;
4162       save_constant = offset_ptr->constant;
4163     }
4164 
4165   alignment_pad->var = NULL_TREE;
4166   alignment_pad->constant = 0;
4167 
4168   if (boundary > BITS_PER_UNIT)
4169     {
4170       int misalign;
4171       if (offset_ptr->var
4172 	  || !known_misalignment (offset_ptr->constant + sp_offset,
4173 				  boundary_in_bytes, &misalign))
4174 	{
4175 	  tree sp_offset_tree = ssize_int (sp_offset);
4176 	  tree offset = size_binop (PLUS_EXPR,
4177 				    ARGS_SIZE_TREE (*offset_ptr),
4178 				    sp_offset_tree);
4179 	  tree rounded;
4180 	  if (ARGS_GROW_DOWNWARD)
4181 	    rounded = round_down (offset, boundary / BITS_PER_UNIT);
4182 	  else
4183 	    rounded = round_up   (offset, boundary / BITS_PER_UNIT);
4184 
4185 	  offset_ptr->var = size_binop (MINUS_EXPR, rounded, sp_offset_tree);
4186 	  /* ARGS_SIZE_TREE includes constant term.  */
4187 	  offset_ptr->constant = 0;
4188 	  if (boundary > PARM_BOUNDARY)
4189 	    alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
4190 					     save_var);
4191 	}
4192       else
4193 	{
4194 	  if (ARGS_GROW_DOWNWARD)
4195 	    offset_ptr->constant -= misalign;
4196 	  else
4197 	    offset_ptr->constant += -misalign & (boundary_in_bytes - 1);
4198 
4199 	  if (boundary > PARM_BOUNDARY)
4200 	    alignment_pad->constant = offset_ptr->constant - save_constant;
4201 	}
4202     }
4203 }
4204 
4205 static void
pad_below(struct args_size * offset_ptr,machine_mode passed_mode,tree sizetree)4206 pad_below (struct args_size *offset_ptr, machine_mode passed_mode, tree sizetree)
4207 {
4208   unsigned int align = PARM_BOUNDARY / BITS_PER_UNIT;
4209   int misalign;
4210   if (passed_mode != BLKmode
4211       && known_misalignment (GET_MODE_SIZE (passed_mode), align, &misalign))
4212     offset_ptr->constant += -misalign & (align - 1);
4213   else
4214     {
4215       if (TREE_CODE (sizetree) != INTEGER_CST
4216 	  || (TREE_INT_CST_LOW (sizetree) & (align - 1)) != 0)
4217 	{
4218 	  /* Round the size up to multiple of PARM_BOUNDARY bits.  */
4219 	  tree s2 = round_up (sizetree, align);
4220 	  /* Add it in.  */
4221 	  ADD_PARM_SIZE (*offset_ptr, s2);
4222 	  SUB_PARM_SIZE (*offset_ptr, sizetree);
4223 	}
4224     }
4225 }
4226 
4227 
4228 /* True if register REGNO was alive at a place where `setjmp' was
4229    called and was set more than once or is an argument.  Such regs may
4230    be clobbered by `longjmp'.  */
4231 
4232 static bool
regno_clobbered_at_setjmp(bitmap setjmp_crosses,int regno)4233 regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)
4234 {
4235   /* There appear to be cases where some local vars never reach the
4236      backend but have bogus regnos.  */
4237   if (regno >= max_reg_num ())
4238     return false;
4239 
4240   return ((REG_N_SETS (regno) > 1
4241 	   || REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR_FOR_FN (cfun)),
4242 			       regno))
4243 	  && REGNO_REG_SET_P (setjmp_crosses, regno));
4244 }
4245 
4246 /* Walk the tree of blocks describing the binding levels within a
4247    function and warn about variables the might be killed by setjmp or
4248    vfork.  This is done after calling flow_analysis before register
4249    allocation since that will clobber the pseudo-regs to hard
4250    regs.  */
4251 
4252 static void
setjmp_vars_warning(bitmap setjmp_crosses,tree block)4253 setjmp_vars_warning (bitmap setjmp_crosses, tree block)
4254 {
4255   tree decl, sub;
4256 
4257   for (decl = BLOCK_VARS (block); decl; decl = DECL_CHAIN (decl))
4258     {
4259       if (VAR_P (decl)
4260 	  && DECL_RTL_SET_P (decl)
4261 	  && REG_P (DECL_RTL (decl))
4262 	  && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
4263 	warning (OPT_Wclobbered, "variable %q+D might be clobbered by"
4264                  " %<longjmp%> or %<vfork%>", decl);
4265     }
4266 
4267   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = BLOCK_CHAIN (sub))
4268     setjmp_vars_warning (setjmp_crosses, sub);
4269 }
4270 
4271 /* Do the appropriate part of setjmp_vars_warning
4272    but for arguments instead of local variables.  */
4273 
4274 static void
setjmp_args_warning(bitmap setjmp_crosses)4275 setjmp_args_warning (bitmap setjmp_crosses)
4276 {
4277   tree decl;
4278   for (decl = DECL_ARGUMENTS (current_function_decl);
4279        decl; decl = DECL_CHAIN (decl))
4280     if (DECL_RTL (decl) != 0
4281 	&& REG_P (DECL_RTL (decl))
4282 	&& regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
4283       warning (OPT_Wclobbered,
4284                "argument %q+D might be clobbered by %<longjmp%> or %<vfork%>",
4285 	       decl);
4286 }
4287 
4288 /* Generate warning messages for variables live across setjmp.  */
4289 
4290 void
generate_setjmp_warnings(void)4291 generate_setjmp_warnings (void)
4292 {
4293   bitmap setjmp_crosses = regstat_get_setjmp_crosses ();
4294 
4295   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS
4296       || bitmap_empty_p (setjmp_crosses))
4297     return;
4298 
4299   setjmp_vars_warning (setjmp_crosses, DECL_INITIAL (current_function_decl));
4300   setjmp_args_warning (setjmp_crosses);
4301 }
4302 
4303 
4304 /* Reverse the order of elements in the fragment chain T of blocks,
4305    and return the new head of the chain (old last element).
4306    In addition to that clear BLOCK_SAME_RANGE flags when needed
4307    and adjust BLOCK_SUPERCONTEXT from the super fragment to
4308    its super fragment origin.  */
4309 
4310 static tree
block_fragments_nreverse(tree t)4311 block_fragments_nreverse (tree t)
4312 {
4313   tree prev = 0, block, next, prev_super = 0;
4314   tree super = BLOCK_SUPERCONTEXT (t);
4315   if (BLOCK_FRAGMENT_ORIGIN (super))
4316     super = BLOCK_FRAGMENT_ORIGIN (super);
4317   for (block = t; block; block = next)
4318     {
4319       next = BLOCK_FRAGMENT_CHAIN (block);
4320       BLOCK_FRAGMENT_CHAIN (block) = prev;
4321       if ((prev && !BLOCK_SAME_RANGE (prev))
4322 	  || (BLOCK_FRAGMENT_CHAIN (BLOCK_SUPERCONTEXT (block))
4323 	      != prev_super))
4324 	BLOCK_SAME_RANGE (block) = 0;
4325       prev_super = BLOCK_SUPERCONTEXT (block);
4326       BLOCK_SUPERCONTEXT (block) = super;
4327       prev = block;
4328     }
4329   t = BLOCK_FRAGMENT_ORIGIN (t);
4330   if (BLOCK_FRAGMENT_CHAIN (BLOCK_SUPERCONTEXT (t))
4331       != prev_super)
4332     BLOCK_SAME_RANGE (t) = 0;
4333   BLOCK_SUPERCONTEXT (t) = super;
4334   return prev;
4335 }
4336 
4337 /* Reverse the order of elements in the chain T of blocks,
4338    and return the new head of the chain (old last element).
4339    Also do the same on subblocks and reverse the order of elements
4340    in BLOCK_FRAGMENT_CHAIN as well.  */
4341 
4342 static tree
blocks_nreverse_all(tree t)4343 blocks_nreverse_all (tree t)
4344 {
4345   tree prev = 0, block, next;
4346   for (block = t; block; block = next)
4347     {
4348       next = BLOCK_CHAIN (block);
4349       BLOCK_CHAIN (block) = prev;
4350       if (BLOCK_FRAGMENT_CHAIN (block)
4351 	  && BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE)
4352 	{
4353 	  BLOCK_FRAGMENT_CHAIN (block)
4354 	    = block_fragments_nreverse (BLOCK_FRAGMENT_CHAIN (block));
4355 	  if (!BLOCK_SAME_RANGE (BLOCK_FRAGMENT_CHAIN (block)))
4356 	    BLOCK_SAME_RANGE (block) = 0;
4357 	}
4358       BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
4359       prev = block;
4360     }
4361   return prev;
4362 }
4363 
4364 
4365 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
4366    and create duplicate blocks.  */
4367 /* ??? Need an option to either create block fragments or to create
4368    abstract origin duplicates of a source block.  It really depends
4369    on what optimization has been performed.  */
4370 
4371 void
reorder_blocks(void)4372 reorder_blocks (void)
4373 {
4374   tree block = DECL_INITIAL (current_function_decl);
4375 
4376   if (block == NULL_TREE)
4377     return;
4378 
4379   auto_vec<tree, 10> block_stack;
4380 
4381   /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
4382   clear_block_marks (block);
4383 
4384   /* Prune the old trees away, so that they don't get in the way.  */
4385   BLOCK_SUBBLOCKS (block) = NULL_TREE;
4386   BLOCK_CHAIN (block) = NULL_TREE;
4387 
4388   /* Recreate the block tree from the note nesting.  */
4389   reorder_blocks_1 (get_insns (), block, &block_stack);
4390   BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
4391 }
4392 
4393 /* Helper function for reorder_blocks.  Reset TREE_ASM_WRITTEN.  */
4394 
4395 void
clear_block_marks(tree block)4396 clear_block_marks (tree block)
4397 {
4398   while (block)
4399     {
4400       TREE_ASM_WRITTEN (block) = 0;
4401       clear_block_marks (BLOCK_SUBBLOCKS (block));
4402       block = BLOCK_CHAIN (block);
4403     }
4404 }
4405 
4406 static void
reorder_blocks_1(rtx_insn * insns,tree current_block,vec<tree> * p_block_stack)4407 reorder_blocks_1 (rtx_insn *insns, tree current_block,
4408 		  vec<tree> *p_block_stack)
4409 {
4410   rtx_insn *insn;
4411   tree prev_beg = NULL_TREE, prev_end = NULL_TREE;
4412 
4413   for (insn = insns; insn; insn = NEXT_INSN (insn))
4414     {
4415       if (NOTE_P (insn))
4416 	{
4417 	  if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_BEG)
4418 	    {
4419 	      tree block = NOTE_BLOCK (insn);
4420 	      tree origin;
4421 
4422 	      gcc_assert (BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE);
4423 	      origin = block;
4424 
4425 	      if (prev_end)
4426 		BLOCK_SAME_RANGE (prev_end) = 0;
4427 	      prev_end = NULL_TREE;
4428 
4429 	      /* If we have seen this block before, that means it now
4430 		 spans multiple address regions.  Create a new fragment.  */
4431 	      if (TREE_ASM_WRITTEN (block))
4432 		{
4433 		  tree new_block = copy_node (block);
4434 
4435 		  BLOCK_SAME_RANGE (new_block) = 0;
4436 		  BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
4437 		  BLOCK_FRAGMENT_CHAIN (new_block)
4438 		    = BLOCK_FRAGMENT_CHAIN (origin);
4439 		  BLOCK_FRAGMENT_CHAIN (origin) = new_block;
4440 
4441 		  NOTE_BLOCK (insn) = new_block;
4442 		  block = new_block;
4443 		}
4444 
4445 	      if (prev_beg == current_block && prev_beg)
4446 		BLOCK_SAME_RANGE (block) = 1;
4447 
4448 	      prev_beg = origin;
4449 
4450 	      BLOCK_SUBBLOCKS (block) = 0;
4451 	      TREE_ASM_WRITTEN (block) = 1;
4452 	      /* When there's only one block for the entire function,
4453 		 current_block == block and we mustn't do this, it
4454 		 will cause infinite recursion.  */
4455 	      if (block != current_block)
4456 		{
4457 		  tree super;
4458 		  if (block != origin)
4459 		    gcc_assert (BLOCK_SUPERCONTEXT (origin) == current_block
4460 				|| BLOCK_FRAGMENT_ORIGIN (BLOCK_SUPERCONTEXT
4461 								      (origin))
4462 				   == current_block);
4463 		  if (p_block_stack->is_empty ())
4464 		    super = current_block;
4465 		  else
4466 		    {
4467 		      super = p_block_stack->last ();
4468 		      gcc_assert (super == current_block
4469 				  || BLOCK_FRAGMENT_ORIGIN (super)
4470 				     == current_block);
4471 		    }
4472 		  BLOCK_SUPERCONTEXT (block) = super;
4473 		  BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
4474 		  BLOCK_SUBBLOCKS (current_block) = block;
4475 		  current_block = origin;
4476 		}
4477 	      p_block_stack->safe_push (block);
4478 	    }
4479 	  else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END)
4480 	    {
4481 	      NOTE_BLOCK (insn) = p_block_stack->pop ();
4482 	      current_block = BLOCK_SUPERCONTEXT (current_block);
4483 	      if (BLOCK_FRAGMENT_ORIGIN (current_block))
4484 		current_block = BLOCK_FRAGMENT_ORIGIN (current_block);
4485 	      prev_beg = NULL_TREE;
4486 	      prev_end = BLOCK_SAME_RANGE (NOTE_BLOCK (insn))
4487 			 ? NOTE_BLOCK (insn) : NULL_TREE;
4488 	    }
4489 	}
4490       else
4491 	{
4492 	  prev_beg = NULL_TREE;
4493 	  if (prev_end)
4494 	    BLOCK_SAME_RANGE (prev_end) = 0;
4495 	  prev_end = NULL_TREE;
4496 	}
4497     }
4498 }
4499 
4500 /* Reverse the order of elements in the chain T of blocks,
4501    and return the new head of the chain (old last element).  */
4502 
4503 tree
blocks_nreverse(tree t)4504 blocks_nreverse (tree t)
4505 {
4506   tree prev = 0, block, next;
4507   for (block = t; block; block = next)
4508     {
4509       next = BLOCK_CHAIN (block);
4510       BLOCK_CHAIN (block) = prev;
4511       prev = block;
4512     }
4513   return prev;
4514 }
4515 
4516 /* Concatenate two chains of blocks (chained through BLOCK_CHAIN)
4517    by modifying the last node in chain 1 to point to chain 2.  */
4518 
4519 tree
block_chainon(tree op1,tree op2)4520 block_chainon (tree op1, tree op2)
4521 {
4522   tree t1;
4523 
4524   if (!op1)
4525     return op2;
4526   if (!op2)
4527     return op1;
4528 
4529   for (t1 = op1; BLOCK_CHAIN (t1); t1 = BLOCK_CHAIN (t1))
4530     continue;
4531   BLOCK_CHAIN (t1) = op2;
4532 
4533 #ifdef ENABLE_TREE_CHECKING
4534   {
4535     tree t2;
4536     for (t2 = op2; t2; t2 = BLOCK_CHAIN (t2))
4537       gcc_assert (t2 != t1);
4538   }
4539 #endif
4540 
4541   return op1;
4542 }
4543 
4544 /* Count the subblocks of the list starting with BLOCK.  If VECTOR is
4545    non-NULL, list them all into VECTOR, in a depth-first preorder
4546    traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
4547    blocks.  */
4548 
4549 static int
all_blocks(tree block,tree * vector)4550 all_blocks (tree block, tree *vector)
4551 {
4552   int n_blocks = 0;
4553 
4554   while (block)
4555     {
4556       TREE_ASM_WRITTEN (block) = 0;
4557 
4558       /* Record this block.  */
4559       if (vector)
4560 	vector[n_blocks] = block;
4561 
4562       ++n_blocks;
4563 
4564       /* Record the subblocks, and their subblocks...  */
4565       n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
4566 			      vector ? vector + n_blocks : 0);
4567       block = BLOCK_CHAIN (block);
4568     }
4569 
4570   return n_blocks;
4571 }
4572 
4573 /* Return a vector containing all the blocks rooted at BLOCK.  The
4574    number of elements in the vector is stored in N_BLOCKS_P.  The
4575    vector is dynamically allocated; it is the caller's responsibility
4576    to call `free' on the pointer returned.  */
4577 
4578 static tree *
get_block_vector(tree block,int * n_blocks_p)4579 get_block_vector (tree block, int *n_blocks_p)
4580 {
4581   tree *block_vector;
4582 
4583   *n_blocks_p = all_blocks (block, NULL);
4584   block_vector = XNEWVEC (tree, *n_blocks_p);
4585   all_blocks (block, block_vector);
4586 
4587   return block_vector;
4588 }
4589 
4590 static GTY(()) int next_block_index = 2;
4591 
4592 /* Set BLOCK_NUMBER for all the blocks in FN.  */
4593 
4594 void
number_blocks(tree fn)4595 number_blocks (tree fn)
4596 {
4597   int i;
4598   int n_blocks;
4599   tree *block_vector;
4600 
4601   /* For XCOFF debugging output, we start numbering the blocks
4602      from 1 within each function, rather than keeping a running
4603      count.  */
4604 #if defined (XCOFF_DEBUGGING_INFO)
4605   if (write_symbols == XCOFF_DEBUG)
4606     next_block_index = 1;
4607 #endif
4608 
4609   block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
4610 
4611   /* The top-level BLOCK isn't numbered at all.  */
4612   for (i = 1; i < n_blocks; ++i)
4613     /* We number the blocks from two.  */
4614     BLOCK_NUMBER (block_vector[i]) = next_block_index++;
4615 
4616   free (block_vector);
4617 
4618   return;
4619 }
4620 
4621 /* If VAR is present in a subblock of BLOCK, return the subblock.  */
4622 
4623 DEBUG_FUNCTION tree
debug_find_var_in_block_tree(tree var,tree block)4624 debug_find_var_in_block_tree (tree var, tree block)
4625 {
4626   tree t;
4627 
4628   for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
4629     if (t == var)
4630       return block;
4631 
4632   for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
4633     {
4634       tree ret = debug_find_var_in_block_tree (var, t);
4635       if (ret)
4636 	return ret;
4637     }
4638 
4639   return NULL_TREE;
4640 }
4641 
4642 /* Keep track of whether we're in a dummy function context.  If we are,
4643    we don't want to invoke the set_current_function hook, because we'll
4644    get into trouble if the hook calls target_reinit () recursively or
4645    when the initial initialization is not yet complete.  */
4646 
4647 static bool in_dummy_function;
4648 
4649 /* Invoke the target hook when setting cfun.  Update the optimization options
4650    if the function uses different options than the default.  */
4651 
4652 static void
invoke_set_current_function_hook(tree fndecl)4653 invoke_set_current_function_hook (tree fndecl)
4654 {
4655   if (!in_dummy_function)
4656     {
4657       tree opts = ((fndecl)
4658 		   ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)
4659 		   : optimization_default_node);
4660 
4661       if (!opts)
4662 	opts = optimization_default_node;
4663 
4664       /* Change optimization options if needed.  */
4665       if (optimization_current_node != opts)
4666 	{
4667 	  optimization_current_node = opts;
4668 	  cl_optimization_restore (&global_options, TREE_OPTIMIZATION (opts));
4669 	}
4670 
4671       targetm.set_current_function (fndecl);
4672       this_fn_optabs = this_target_optabs;
4673 
4674       /* Initialize global alignment variables after op.  */
4675       parse_alignment_opts ();
4676 
4677       if (opts != optimization_default_node)
4678 	{
4679 	  init_tree_optimization_optabs (opts);
4680 	  if (TREE_OPTIMIZATION_OPTABS (opts))
4681 	    this_fn_optabs = (struct target_optabs *)
4682 	      TREE_OPTIMIZATION_OPTABS (opts);
4683 	}
4684     }
4685 }
4686 
4687 /* cfun should never be set directly; use this function.  */
4688 
4689 void
set_cfun(struct function * new_cfun,bool force)4690 set_cfun (struct function *new_cfun, bool force)
4691 {
4692   if (cfun != new_cfun || force)
4693     {
4694       cfun = new_cfun;
4695       invoke_set_current_function_hook (new_cfun ? new_cfun->decl : NULL_TREE);
4696       redirect_edge_var_map_empty ();
4697     }
4698 }
4699 
4700 /* Initialized with NOGC, making this poisonous to the garbage collector.  */
4701 
4702 static vec<function *> cfun_stack;
4703 
4704 /* Push the current cfun onto the stack, and set cfun to new_cfun.  Also set
4705    current_function_decl accordingly.  */
4706 
4707 void
push_cfun(struct function * new_cfun)4708 push_cfun (struct function *new_cfun)
4709 {
4710   gcc_assert ((!cfun && !current_function_decl)
4711 	      || (cfun && current_function_decl == cfun->decl));
4712   cfun_stack.safe_push (cfun);
4713   current_function_decl = new_cfun ? new_cfun->decl : NULL_TREE;
4714   set_cfun (new_cfun);
4715 }
4716 
4717 /* Pop cfun from the stack.  Also set current_function_decl accordingly.  */
4718 
4719 void
pop_cfun(void)4720 pop_cfun (void)
4721 {
4722   struct function *new_cfun = cfun_stack.pop ();
4723   /* When in_dummy_function, we do have a cfun but current_function_decl is
4724      NULL.  We also allow pushing NULL cfun and subsequently changing
4725      current_function_decl to something else and have both restored by
4726      pop_cfun.  */
4727   gcc_checking_assert (in_dummy_function
4728 		       || !cfun
4729 		       || current_function_decl == cfun->decl);
4730   set_cfun (new_cfun);
4731   current_function_decl = new_cfun ? new_cfun->decl : NULL_TREE;
4732 }
4733 
4734 /* Return value of funcdef and increase it.  */
4735 int
get_next_funcdef_no(void)4736 get_next_funcdef_no (void)
4737 {
4738   return funcdef_no++;
4739 }
4740 
4741 /* Return value of funcdef.  */
4742 int
get_last_funcdef_no(void)4743 get_last_funcdef_no (void)
4744 {
4745   return funcdef_no;
4746 }
4747 
4748 /* Allocate and initialize the stack usage info data structure for the
4749    current function.  */
4750 static void
allocate_stack_usage_info(void)4751 allocate_stack_usage_info (void)
4752 {
4753   gcc_assert (!cfun->su);
4754   cfun->su = ggc_cleared_alloc<stack_usage> ();
4755   cfun->su->static_stack_size = -1;
4756 }
4757 
4758 /* Allocate a function structure for FNDECL and set its contents
4759    to the defaults.  Set cfun to the newly-allocated object.
4760    Some of the helper functions invoked during initialization assume
4761    that cfun has already been set.  Therefore, assign the new object
4762    directly into cfun and invoke the back end hook explicitly at the
4763    very end, rather than initializing a temporary and calling set_cfun
4764    on it.
4765 
4766    ABSTRACT_P is true if this is a function that will never be seen by
4767    the middle-end.  Such functions are front-end concepts (like C++
4768    function templates) that do not correspond directly to functions
4769    placed in object files.  */
4770 
4771 void
allocate_struct_function(tree fndecl,bool abstract_p)4772 allocate_struct_function (tree fndecl, bool abstract_p)
4773 {
4774   tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;
4775 
4776   cfun = ggc_cleared_alloc<function> ();
4777 
4778   init_eh_for_function ();
4779 
4780   if (init_machine_status)
4781     cfun->machine = (*init_machine_status) ();
4782 
4783 #ifdef OVERRIDE_ABI_FORMAT
4784   OVERRIDE_ABI_FORMAT (fndecl);
4785 #endif
4786 
4787   if (fndecl != NULL_TREE)
4788     {
4789       DECL_STRUCT_FUNCTION (fndecl) = cfun;
4790       cfun->decl = fndecl;
4791       current_function_funcdef_no = get_next_funcdef_no ();
4792     }
4793 
4794   invoke_set_current_function_hook (fndecl);
4795 
4796   if (fndecl != NULL_TREE)
4797     {
4798       tree result = DECL_RESULT (fndecl);
4799 
4800       if (!abstract_p)
4801 	{
4802 	  /* Now that we have activated any function-specific attributes
4803 	     that might affect layout, particularly vector modes, relayout
4804 	     each of the parameters and the result.  */
4805 	  relayout_decl (result);
4806 	  for (tree parm = DECL_ARGUMENTS (fndecl); parm;
4807 	       parm = DECL_CHAIN (parm))
4808 	    relayout_decl (parm);
4809 
4810 	  /* Similarly relayout the function decl.  */
4811 	  targetm.target_option.relayout_function (fndecl);
4812 	}
4813 
4814       if (!abstract_p && aggregate_value_p (result, fndecl))
4815 	{
4816 #ifdef PCC_STATIC_STRUCT_RETURN
4817 	  cfun->returns_pcc_struct = 1;
4818 #endif
4819 	  cfun->returns_struct = 1;
4820 	}
4821 
4822       cfun->stdarg = stdarg_p (fntype);
4823 
4824       /* Assume all registers in stdarg functions need to be saved.  */
4825       cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
4826       cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
4827 
4828       /* ??? This could be set on a per-function basis by the front-end
4829          but is this worth the hassle?  */
4830       cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
4831       cfun->can_delete_dead_exceptions = flag_delete_dead_exceptions;
4832 
4833       if (!profile_flag && !flag_instrument_function_entry_exit)
4834 	DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl) = 1;
4835 
4836       if (flag_callgraph_info)
4837 	allocate_stack_usage_info ();
4838     }
4839 
4840   /* Don't enable begin stmt markers if var-tracking at assignments is
4841      disabled.  The markers make little sense without the variable
4842      binding annotations among them.  */
4843   cfun->debug_nonbind_markers = lang_hooks.emits_begin_stmt
4844     && MAY_HAVE_DEBUG_MARKER_STMTS;
4845 }
4846 
4847 /* This is like allocate_struct_function, but pushes a new cfun for FNDECL
4848    instead of just setting it.  */
4849 
4850 void
push_struct_function(tree fndecl,bool abstract_p)4851 push_struct_function (tree fndecl, bool abstract_p)
4852 {
4853   /* When in_dummy_function we might be in the middle of a pop_cfun and
4854      current_function_decl and cfun may not match.  */
4855   gcc_assert (in_dummy_function
4856 	      || (!cfun && !current_function_decl)
4857 	      || (cfun && current_function_decl == cfun->decl));
4858   cfun_stack.safe_push (cfun);
4859   current_function_decl = fndecl;
4860   allocate_struct_function (fndecl, abstract_p);
4861 }
4862 
4863 /* Reset crtl and other non-struct-function variables to defaults as
4864    appropriate for emitting rtl at the start of a function.  */
4865 
4866 static void
prepare_function_start(void)4867 prepare_function_start (void)
4868 {
4869   gcc_assert (!get_last_insn ());
4870 
4871   if (in_dummy_function)
4872     crtl->abi = &default_function_abi;
4873   else
4874     crtl->abi = &fndecl_abi (cfun->decl).base_abi ();
4875 
4876   init_temp_slots ();
4877   init_emit ();
4878   init_varasm_status ();
4879   init_expr ();
4880   default_rtl_profile ();
4881 
4882   if (flag_stack_usage_info && !flag_callgraph_info)
4883     allocate_stack_usage_info ();
4884 
4885   cse_not_expected = ! optimize;
4886 
4887   /* Caller save not needed yet.  */
4888   caller_save_needed = 0;
4889 
4890   /* We haven't done register allocation yet.  */
4891   reg_renumber = 0;
4892 
4893   /* Indicate that we have not instantiated virtual registers yet.  */
4894   virtuals_instantiated = 0;
4895 
4896   /* Indicate that we want CONCATs now.  */
4897   generating_concat_p = 1;
4898 
4899   /* Indicate we have no need of a frame pointer yet.  */
4900   frame_pointer_needed = 0;
4901 }
4902 
4903 void
push_dummy_function(bool with_decl)4904 push_dummy_function (bool with_decl)
4905 {
4906   tree fn_decl, fn_type, fn_result_decl;
4907 
4908   gcc_assert (!in_dummy_function);
4909   in_dummy_function = true;
4910 
4911   if (with_decl)
4912     {
4913       fn_type = build_function_type_list (void_type_node, NULL_TREE);
4914       fn_decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, NULL_TREE,
4915 			    fn_type);
4916       fn_result_decl = build_decl (UNKNOWN_LOCATION, RESULT_DECL,
4917 					 NULL_TREE, void_type_node);
4918       DECL_RESULT (fn_decl) = fn_result_decl;
4919       DECL_ARTIFICIAL (fn_decl) = 1;
4920       tree fn_name = get_identifier (" ");
4921       SET_DECL_ASSEMBLER_NAME (fn_decl, fn_name);
4922     }
4923   else
4924     fn_decl = NULL_TREE;
4925 
4926   push_struct_function (fn_decl);
4927 }
4928 
4929 /* Initialize the rtl expansion mechanism so that we can do simple things
4930    like generate sequences.  This is used to provide a context during global
4931    initialization of some passes.  You must call expand_dummy_function_end
4932    to exit this context.  */
4933 
4934 void
init_dummy_function_start(void)4935 init_dummy_function_start (void)
4936 {
4937   push_dummy_function (false);
4938   prepare_function_start ();
4939 }
4940 
4941 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
4942    and initialize static variables for generating RTL for the statements
4943    of the function.  */
4944 
4945 void
init_function_start(tree subr)4946 init_function_start (tree subr)
4947 {
4948   /* Initialize backend, if needed.  */
4949   initialize_rtl ();
4950 
4951   prepare_function_start ();
4952   decide_function_section (subr);
4953 
4954   /* Warn if this value is an aggregate type,
4955      regardless of which calling convention we are using for it.  */
4956   if (AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
4957     warning (OPT_Waggregate_return, "function returns an aggregate");
4958 }
4959 
4960 /* Expand code to verify the stack_protect_guard.  This is invoked at
4961    the end of a function to be protected.  */
4962 
4963 void
stack_protect_epilogue(void)4964 stack_protect_epilogue (void)
4965 {
4966   tree guard_decl = crtl->stack_protect_guard_decl;
4967   rtx_code_label *label = gen_label_rtx ();
4968   rtx x, y;
4969   rtx_insn *seq = NULL;
4970 
4971   x = expand_normal (crtl->stack_protect_guard);
4972 
4973   if (targetm.have_stack_protect_combined_test () && guard_decl)
4974     {
4975       gcc_assert (DECL_P (guard_decl));
4976       y = DECL_RTL (guard_decl);
4977       /* Allow the target to compute address of Y and compare it with X without
4978 	 leaking Y into a register.  This combined address + compare pattern
4979 	 allows the target to prevent spilling of any intermediate results by
4980 	 splitting it after register allocator.  */
4981       seq = targetm.gen_stack_protect_combined_test (x, y, label);
4982     }
4983   else
4984     {
4985       if (guard_decl)
4986 	y = expand_normal (guard_decl);
4987       else
4988 	y = const0_rtx;
4989 
4990       /* Allow the target to compare Y with X without leaking either into
4991 	 a register.  */
4992       if (targetm.have_stack_protect_test ())
4993 	seq = targetm.gen_stack_protect_test (x, y, label);
4994     }
4995 
4996   if (seq)
4997     emit_insn (seq);
4998   else
4999     emit_cmp_and_jump_insns (x, y, EQ, NULL_RTX, ptr_mode, 1, label);
5000 
5001   /* The noreturn predictor has been moved to the tree level.  The rtl-level
5002      predictors estimate this branch about 20%, which isn't enough to get
5003      things moved out of line.  Since this is the only extant case of adding
5004      a noreturn function at the rtl level, it doesn't seem worth doing ought
5005      except adding the prediction by hand.  */
5006   rtx_insn *tmp = get_last_insn ();
5007   if (JUMP_P (tmp))
5008     predict_insn_def (tmp, PRED_NORETURN, TAKEN);
5009 
5010   expand_call (targetm.stack_protect_fail (), NULL_RTX, /*ignore=*/true);
5011   free_temp_slots ();
5012   emit_label (label);
5013 }
5014 
5015 /* Start the RTL for a new function, and set variables used for
5016    emitting RTL.
5017    SUBR is the FUNCTION_DECL node.
5018    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
5019    the function's parameters, which must be run at any return statement.  */
5020 
5021 bool currently_expanding_function_start;
5022 void
expand_function_start(tree subr)5023 expand_function_start (tree subr)
5024 {
5025   currently_expanding_function_start = true;
5026 
5027   /* Make sure volatile mem refs aren't considered
5028      valid operands of arithmetic insns.  */
5029   init_recog_no_volatile ();
5030 
5031   crtl->profile
5032     = (profile_flag
5033        && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
5034 
5035   crtl->limit_stack
5036     = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
5037 
5038   /* Make the label for return statements to jump to.  Do not special
5039      case machines with special return instructions -- they will be
5040      handled later during jump, ifcvt, or epilogue creation.  */
5041   return_label = gen_label_rtx ();
5042 
5043   /* Initialize rtx used to return the value.  */
5044   /* Do this before assign_parms so that we copy the struct value address
5045      before any library calls that assign parms might generate.  */
5046 
5047   /* Decide whether to return the value in memory or in a register.  */
5048   tree res = DECL_RESULT (subr);
5049   if (aggregate_value_p (res, subr))
5050     {
5051       /* Returning something that won't go in a register.  */
5052       rtx value_address = 0;
5053 
5054 #ifdef PCC_STATIC_STRUCT_RETURN
5055       if (cfun->returns_pcc_struct)
5056 	{
5057 	  int size = int_size_in_bytes (TREE_TYPE (res));
5058 	  value_address = assemble_static_space (size);
5059 	}
5060       else
5061 #endif
5062 	{
5063 	  rtx sv = targetm.calls.struct_value_rtx (TREE_TYPE (subr), 2);
5064 	  /* Expect to be passed the address of a place to store the value.
5065 	     If it is passed as an argument, assign_parms will take care of
5066 	     it.  */
5067 	  if (sv)
5068 	    {
5069 	      value_address = gen_reg_rtx (Pmode);
5070 	      emit_move_insn (value_address, sv);
5071 	    }
5072 	}
5073       if (value_address)
5074 	{
5075 	  rtx x = value_address;
5076 	  if (!DECL_BY_REFERENCE (res))
5077 	    {
5078 	      x = gen_rtx_MEM (DECL_MODE (res), x);
5079 	      set_mem_attributes (x, res, 1);
5080 	    }
5081 	  set_parm_rtl (res, x);
5082 	}
5083     }
5084   else if (DECL_MODE (res) == VOIDmode)
5085     /* If return mode is void, this decl rtl should not be used.  */
5086     set_parm_rtl (res, NULL_RTX);
5087   else
5088     {
5089       /* Compute the return values into a pseudo reg, which we will copy
5090 	 into the true return register after the cleanups are done.  */
5091       tree return_type = TREE_TYPE (res);
5092 
5093       /* If we may coalesce this result, make sure it has the expected mode
5094 	 in case it was promoted.  But we need not bother about BLKmode.  */
5095       machine_mode promoted_mode
5096 	= flag_tree_coalesce_vars && is_gimple_reg (res)
5097 	  ? promote_ssa_mode (ssa_default_def (cfun, res), NULL)
5098 	  : BLKmode;
5099 
5100       if (promoted_mode != BLKmode)
5101 	set_parm_rtl (res, gen_reg_rtx (promoted_mode));
5102       else if (TYPE_MODE (return_type) != BLKmode
5103 	       && targetm.calls.return_in_msb (return_type))
5104 	/* expand_function_end will insert the appropriate padding in
5105 	   this case.  Use the return value's natural (unpadded) mode
5106 	   within the function proper.  */
5107 	set_parm_rtl (res, gen_reg_rtx (TYPE_MODE (return_type)));
5108       else
5109 	{
5110 	  /* In order to figure out what mode to use for the pseudo, we
5111 	     figure out what the mode of the eventual return register will
5112 	     actually be, and use that.  */
5113 	  rtx hard_reg = hard_function_value (return_type, subr, 0, 1);
5114 
5115 	  /* Structures that are returned in registers are not
5116 	     aggregate_value_p, so we may see a PARALLEL or a REG.  */
5117 	  if (REG_P (hard_reg))
5118 	    set_parm_rtl (res, gen_reg_rtx (GET_MODE (hard_reg)));
5119 	  else
5120 	    {
5121 	      gcc_assert (GET_CODE (hard_reg) == PARALLEL);
5122 	      set_parm_rtl (res, gen_group_rtx (hard_reg));
5123 	    }
5124 	}
5125 
5126       /* Set DECL_REGISTER flag so that expand_function_end will copy the
5127 	 result to the real return register(s).  */
5128       DECL_REGISTER (res) = 1;
5129     }
5130 
5131   /* Initialize rtx for parameters and local variables.
5132      In some cases this requires emitting insns.  */
5133   assign_parms (subr);
5134 
5135   /* If function gets a static chain arg, store it.  */
5136   if (cfun->static_chain_decl)
5137     {
5138       tree parm = cfun->static_chain_decl;
5139       rtx local, chain;
5140       rtx_insn *insn;
5141       int unsignedp;
5142 
5143       local = gen_reg_rtx (promote_decl_mode (parm, &unsignedp));
5144       chain = targetm.calls.static_chain (current_function_decl, true);
5145 
5146       set_decl_incoming_rtl (parm, chain, false);
5147       set_parm_rtl (parm, local);
5148       mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
5149 
5150       if (GET_MODE (local) != GET_MODE (chain))
5151 	{
5152 	  convert_move (local, chain, unsignedp);
5153 	  insn = get_last_insn ();
5154 	}
5155       else
5156 	insn = emit_move_insn (local, chain);
5157 
5158       /* Mark the register as eliminable, similar to parameters.  */
5159       if (MEM_P (chain)
5160 	  && reg_mentioned_p (arg_pointer_rtx, XEXP (chain, 0)))
5161 	set_dst_reg_note (insn, REG_EQUIV, chain, local);
5162 
5163       /* If we aren't optimizing, save the static chain onto the stack.  */
5164       if (!optimize)
5165 	{
5166 	  tree saved_static_chain_decl
5167 	    = build_decl (DECL_SOURCE_LOCATION (parm), VAR_DECL,
5168 			  DECL_NAME (parm), TREE_TYPE (parm));
5169 	  rtx saved_static_chain_rtx
5170 	    = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
5171 	  SET_DECL_RTL (saved_static_chain_decl, saved_static_chain_rtx);
5172 	  emit_move_insn (saved_static_chain_rtx, chain);
5173 	  SET_DECL_VALUE_EXPR (parm, saved_static_chain_decl);
5174 	  DECL_HAS_VALUE_EXPR_P (parm) = 1;
5175 	}
5176     }
5177 
5178   /* The following was moved from init_function_start.
5179      The move was supposed to make sdb output more accurate.  */
5180   /* Indicate the beginning of the function body,
5181      as opposed to parm setup.  */
5182   emit_note (NOTE_INSN_FUNCTION_BEG);
5183 
5184   gcc_assert (NOTE_P (get_last_insn ()));
5185 
5186   parm_birth_insn = get_last_insn ();
5187 
5188   /* If the function receives a non-local goto, then store the
5189      bits we need to restore the frame pointer.  */
5190   if (cfun->nonlocal_goto_save_area)
5191     {
5192       tree t_save;
5193       rtx r_save;
5194 
5195       tree var = TREE_OPERAND (cfun->nonlocal_goto_save_area, 0);
5196       gcc_assert (DECL_RTL_SET_P (var));
5197 
5198       t_save = build4 (ARRAY_REF,
5199 		       TREE_TYPE (TREE_TYPE (cfun->nonlocal_goto_save_area)),
5200 		       cfun->nonlocal_goto_save_area,
5201 		       integer_zero_node, NULL_TREE, NULL_TREE);
5202       r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
5203       gcc_assert (GET_MODE (r_save) == Pmode);
5204 
5205       emit_move_insn (r_save, hard_frame_pointer_rtx);
5206       update_nonlocal_goto_save_area ();
5207     }
5208 
5209   if (crtl->profile)
5210     {
5211 #ifdef PROFILE_HOOK
5212       PROFILE_HOOK (current_function_funcdef_no);
5213 #endif
5214     }
5215 
5216   /* If we are doing generic stack checking, the probe should go here.  */
5217   if (flag_stack_check == GENERIC_STACK_CHECK)
5218     stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
5219 
5220   currently_expanding_function_start = false;
5221 }
5222 
5223 void
pop_dummy_function(void)5224 pop_dummy_function (void)
5225 {
5226   pop_cfun ();
5227   in_dummy_function = false;
5228 }
5229 
5230 /* Undo the effects of init_dummy_function_start.  */
5231 void
expand_dummy_function_end(void)5232 expand_dummy_function_end (void)
5233 {
5234   gcc_assert (in_dummy_function);
5235 
5236   /* End any sequences that failed to be closed due to syntax errors.  */
5237   while (in_sequence_p ())
5238     end_sequence ();
5239 
5240   /* Outside function body, can't compute type's actual size
5241      until next function's body starts.  */
5242 
5243   free_after_parsing (cfun);
5244   free_after_compilation (cfun);
5245   pop_dummy_function ();
5246 }
5247 
5248 /* Helper for diddle_return_value.  */
5249 
5250 void
diddle_return_value_1(void (* doit)(rtx,void *),void * arg,rtx outgoing)5251 diddle_return_value_1 (void (*doit) (rtx, void *), void *arg, rtx outgoing)
5252 {
5253   if (! outgoing)
5254     return;
5255 
5256   if (REG_P (outgoing))
5257     (*doit) (outgoing, arg);
5258   else if (GET_CODE (outgoing) == PARALLEL)
5259     {
5260       int i;
5261 
5262       for (i = 0; i < XVECLEN (outgoing, 0); i++)
5263 	{
5264 	  rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
5265 
5266 	  if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
5267 	    (*doit) (x, arg);
5268 	}
5269     }
5270 }
5271 
5272 /* Call DOIT for each hard register used as a return value from
5273    the current function.  */
5274 
5275 void
diddle_return_value(void (* doit)(rtx,void *),void * arg)5276 diddle_return_value (void (*doit) (rtx, void *), void *arg)
5277 {
5278   diddle_return_value_1 (doit, arg, crtl->return_rtx);
5279 }
5280 
5281 static void
do_clobber_return_reg(rtx reg,void * arg ATTRIBUTE_UNUSED)5282 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
5283 {
5284   emit_clobber (reg);
5285 }
5286 
5287 void
clobber_return_register(void)5288 clobber_return_register (void)
5289 {
5290   diddle_return_value (do_clobber_return_reg, NULL);
5291 
5292   /* In case we do use pseudo to return value, clobber it too.  */
5293   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
5294     {
5295       tree decl_result = DECL_RESULT (current_function_decl);
5296       rtx decl_rtl = DECL_RTL (decl_result);
5297       if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
5298 	{
5299 	  do_clobber_return_reg (decl_rtl, NULL);
5300 	}
5301     }
5302 }
5303 
5304 static void
do_use_return_reg(rtx reg,void * arg ATTRIBUTE_UNUSED)5305 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
5306 {
5307   emit_use (reg);
5308 }
5309 
5310 static void
use_return_register(void)5311 use_return_register (void)
5312 {
5313   diddle_return_value (do_use_return_reg, NULL);
5314 }
5315 
5316 /* Generate RTL for the end of the current function.  */
5317 
5318 void
expand_function_end(void)5319 expand_function_end (void)
5320 {
5321   /* If arg_pointer_save_area was referenced only from a nested
5322      function, we will not have initialized it yet.  Do that now.  */
5323   if (arg_pointer_save_area && ! crtl->arg_pointer_save_area_init)
5324     get_arg_pointer_save_area ();
5325 
5326   /* If we are doing generic stack checking and this function makes calls,
5327      do a stack probe at the start of the function to ensure we have enough
5328      space for another stack frame.  */
5329   if (flag_stack_check == GENERIC_STACK_CHECK)
5330     {
5331       rtx_insn *insn, *seq;
5332 
5333       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5334 	if (CALL_P (insn))
5335 	  {
5336 	    rtx max_frame_size = GEN_INT (STACK_CHECK_MAX_FRAME_SIZE);
5337 	    start_sequence ();
5338 	    if (STACK_CHECK_MOVING_SP)
5339 	      anti_adjust_stack_and_probe (max_frame_size, true);
5340 	    else
5341 	      probe_stack_range (STACK_OLD_CHECK_PROTECT, max_frame_size);
5342 	    seq = get_insns ();
5343 	    end_sequence ();
5344 	    set_insn_locations (seq, prologue_location);
5345 	    emit_insn_before (seq, stack_check_probe_note);
5346 	    break;
5347 	  }
5348     }
5349 
5350   /* End any sequences that failed to be closed due to syntax errors.  */
5351   while (in_sequence_p ())
5352     end_sequence ();
5353 
5354   clear_pending_stack_adjust ();
5355   do_pending_stack_adjust ();
5356 
5357   /* Output a linenumber for the end of the function.
5358      SDB depended on this.  */
5359   set_curr_insn_location (input_location);
5360 
5361   /* Before the return label (if any), clobber the return
5362      registers so that they are not propagated live to the rest of
5363      the function.  This can only happen with functions that drop
5364      through; if there had been a return statement, there would
5365      have either been a return rtx, or a jump to the return label.
5366 
5367      We delay actual code generation after the current_function_value_rtx
5368      is computed.  */
5369   rtx_insn *clobber_after = get_last_insn ();
5370 
5371   /* Output the label for the actual return from the function.  */
5372   emit_label (return_label);
5373 
5374   if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ)
5375     {
5376       /* Let except.c know where it should emit the call to unregister
5377 	 the function context for sjlj exceptions.  */
5378       if (flag_exceptions)
5379 	sjlj_emit_function_exit_after (get_last_insn ());
5380     }
5381 
5382   /* If this is an implementation of throw, do what's necessary to
5383      communicate between __builtin_eh_return and the epilogue.  */
5384   expand_eh_return ();
5385 
5386   /* If stack protection is enabled for this function, check the guard.  */
5387   if (crtl->stack_protect_guard
5388       && targetm.stack_protect_runtime_enabled_p ()
5389       && naked_return_label == NULL_RTX)
5390     stack_protect_epilogue ();
5391 
5392   /* If scalar return value was computed in a pseudo-reg, or was a named
5393      return value that got dumped to the stack, copy that to the hard
5394      return register.  */
5395   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
5396     {
5397       tree decl_result = DECL_RESULT (current_function_decl);
5398       rtx decl_rtl = DECL_RTL (decl_result);
5399 
5400       if (REG_P (decl_rtl)
5401 	  ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
5402 	  : DECL_REGISTER (decl_result))
5403 	{
5404 	  rtx real_decl_rtl = crtl->return_rtx;
5405 	  complex_mode cmode;
5406 
5407 	  /* This should be set in assign_parms.  */
5408 	  gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
5409 
5410 	  /* If this is a BLKmode structure being returned in registers,
5411 	     then use the mode computed in expand_return.  Note that if
5412 	     decl_rtl is memory, then its mode may have been changed,
5413 	     but that crtl->return_rtx has not.  */
5414 	  if (GET_MODE (real_decl_rtl) == BLKmode)
5415 	    PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
5416 
5417 	  /* If a non-BLKmode return value should be padded at the least
5418 	     significant end of the register, shift it left by the appropriate
5419 	     amount.  BLKmode results are handled using the group load/store
5420 	     machinery.  */
5421 	  if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
5422 	      && REG_P (real_decl_rtl)
5423 	      && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
5424 	    {
5425 	      emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),
5426 					   REGNO (real_decl_rtl)),
5427 			      decl_rtl);
5428 	      shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
5429 	    }
5430 	  else if (GET_CODE (real_decl_rtl) == PARALLEL)
5431 	    {
5432 	      /* If expand_function_start has created a PARALLEL for decl_rtl,
5433 		 move the result to the real return registers.  Otherwise, do
5434 		 a group load from decl_rtl for a named return.  */
5435 	      if (GET_CODE (decl_rtl) == PARALLEL)
5436 		emit_group_move (real_decl_rtl, decl_rtl);
5437 	      else
5438 		emit_group_load (real_decl_rtl, decl_rtl,
5439 				 TREE_TYPE (decl_result),
5440 				 int_size_in_bytes (TREE_TYPE (decl_result)));
5441 	    }
5442 	  /* In the case of complex integer modes smaller than a word, we'll
5443 	     need to generate some non-trivial bitfield insertions.  Do that
5444 	     on a pseudo and not the hard register.  */
5445 	  else if (GET_CODE (decl_rtl) == CONCAT
5446 		   && is_complex_int_mode (GET_MODE (decl_rtl), &cmode)
5447 		   && GET_MODE_BITSIZE (cmode) <= BITS_PER_WORD)
5448 	    {
5449 	      int old_generating_concat_p;
5450 	      rtx tmp;
5451 
5452 	      old_generating_concat_p = generating_concat_p;
5453 	      generating_concat_p = 0;
5454 	      tmp = gen_reg_rtx (GET_MODE (decl_rtl));
5455 	      generating_concat_p = old_generating_concat_p;
5456 
5457 	      emit_move_insn (tmp, decl_rtl);
5458 	      emit_move_insn (real_decl_rtl, tmp);
5459 	    }
5460 	  /* If a named return value dumped decl_return to memory, then
5461 	     we may need to re-do the PROMOTE_MODE signed/unsigned
5462 	     extension.  */
5463 	  else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
5464 	    {
5465 	      int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
5466 	      promote_function_mode (TREE_TYPE (decl_result),
5467 				     GET_MODE (decl_rtl), &unsignedp,
5468 				     TREE_TYPE (current_function_decl), 1);
5469 
5470 	      convert_move (real_decl_rtl, decl_rtl, unsignedp);
5471 	    }
5472 	  else
5473 	    emit_move_insn (real_decl_rtl, decl_rtl);
5474 	}
5475     }
5476 
5477   /* If returning a structure, arrange to return the address of the value
5478      in a place where debuggers expect to find it.
5479 
5480      If returning a structure PCC style,
5481      the caller also depends on this value.
5482      And cfun->returns_pcc_struct is not necessarily set.  */
5483   if ((cfun->returns_struct || cfun->returns_pcc_struct)
5484       && !targetm.calls.omit_struct_return_reg)
5485     {
5486       rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
5487       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
5488       rtx outgoing;
5489 
5490       if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
5491 	type = TREE_TYPE (type);
5492       else
5493 	value_address = XEXP (value_address, 0);
5494 
5495       outgoing = targetm.calls.function_value (build_pointer_type (type),
5496 					       current_function_decl, true);
5497 
5498       /* Mark this as a function return value so integrate will delete the
5499 	 assignment and USE below when inlining this function.  */
5500       REG_FUNCTION_VALUE_P (outgoing) = 1;
5501 
5502       /* The address may be ptr_mode and OUTGOING may be Pmode.  */
5503       scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (outgoing));
5504       value_address = convert_memory_address (mode, value_address);
5505 
5506       emit_move_insn (outgoing, value_address);
5507 
5508       /* Show return register used to hold result (in this case the address
5509 	 of the result.  */
5510       crtl->return_rtx = outgoing;
5511     }
5512 
5513   /* Emit the actual code to clobber return register.  Don't emit
5514      it if clobber_after is a barrier, then the previous basic block
5515      certainly doesn't fall thru into the exit block.  */
5516   if (!BARRIER_P (clobber_after))
5517     {
5518       start_sequence ();
5519       clobber_return_register ();
5520       rtx_insn *seq = get_insns ();
5521       end_sequence ();
5522 
5523       emit_insn_after (seq, clobber_after);
5524     }
5525 
5526   /* Output the label for the naked return from the function.  */
5527   if (naked_return_label)
5528     emit_label (naked_return_label);
5529 
5530   /* @@@ This is a kludge.  We want to ensure that instructions that
5531      may trap are not moved into the epilogue by scheduling, because
5532      we don't always emit unwind information for the epilogue.  */
5533   if (cfun->can_throw_non_call_exceptions
5534       && targetm_common.except_unwind_info (&global_options) != UI_SJLJ)
5535     emit_insn (gen_blockage ());
5536 
5537   /* If stack protection is enabled for this function, check the guard.  */
5538   if (crtl->stack_protect_guard
5539       && targetm.stack_protect_runtime_enabled_p ()
5540       && naked_return_label)
5541     stack_protect_epilogue ();
5542 
5543   /* If we had calls to alloca, and this machine needs
5544      an accurate stack pointer to exit the function,
5545      insert some code to save and restore the stack pointer.  */
5546   if (! EXIT_IGNORE_STACK
5547       && cfun->calls_alloca)
5548     {
5549       rtx tem = 0;
5550 
5551       start_sequence ();
5552       emit_stack_save (SAVE_FUNCTION, &tem);
5553       rtx_insn *seq = get_insns ();
5554       end_sequence ();
5555       emit_insn_before (seq, parm_birth_insn);
5556 
5557       emit_stack_restore (SAVE_FUNCTION, tem);
5558     }
5559 
5560   /* ??? This should no longer be necessary since stupid is no longer with
5561      us, but there are some parts of the compiler (eg reload_combine, and
5562      sh mach_dep_reorg) that still try and compute their own lifetime info
5563      instead of using the general framework.  */
5564   use_return_register ();
5565 }
5566 
5567 rtx
get_arg_pointer_save_area(void)5568 get_arg_pointer_save_area (void)
5569 {
5570   rtx ret = arg_pointer_save_area;
5571 
5572   if (! ret)
5573     {
5574       ret = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
5575       arg_pointer_save_area = ret;
5576     }
5577 
5578   if (! crtl->arg_pointer_save_area_init)
5579     {
5580       /* Save the arg pointer at the beginning of the function.  The
5581 	 generated stack slot may not be a valid memory address, so we
5582 	 have to check it and fix it if necessary.  */
5583       start_sequence ();
5584       emit_move_insn (validize_mem (copy_rtx (ret)),
5585                       crtl->args.internal_arg_pointer);
5586       rtx_insn *seq = get_insns ();
5587       end_sequence ();
5588 
5589       push_topmost_sequence ();
5590       emit_insn_after (seq, entry_of_function ());
5591       pop_topmost_sequence ();
5592 
5593       crtl->arg_pointer_save_area_init = true;
5594     }
5595 
5596   return ret;
5597 }
5598 
5599 
5600 /* If debugging dumps are requested, dump information about how the
5601    target handled -fstack-check=clash for the prologue.
5602 
5603    PROBES describes what if any probes were emitted.
5604 
5605    RESIDUALS indicates if the prologue had any residual allocation
5606    (i.e. total allocation was not a multiple of PROBE_INTERVAL).  */
5607 
5608 void
dump_stack_clash_frame_info(enum stack_clash_probes probes,bool residuals)5609 dump_stack_clash_frame_info (enum stack_clash_probes probes, bool residuals)
5610 {
5611   if (!dump_file)
5612     return;
5613 
5614   switch (probes)
5615     {
5616     case NO_PROBE_NO_FRAME:
5617       fprintf (dump_file,
5618 	       "Stack clash no probe no stack adjustment in prologue.\n");
5619       break;
5620     case NO_PROBE_SMALL_FRAME:
5621       fprintf (dump_file,
5622 	       "Stack clash no probe small stack adjustment in prologue.\n");
5623       break;
5624     case PROBE_INLINE:
5625       fprintf (dump_file, "Stack clash inline probes in prologue.\n");
5626       break;
5627     case PROBE_LOOP:
5628       fprintf (dump_file, "Stack clash probe loop in prologue.\n");
5629       break;
5630     }
5631 
5632   if (residuals)
5633     fprintf (dump_file, "Stack clash residual allocation in prologue.\n");
5634   else
5635     fprintf (dump_file, "Stack clash no residual allocation in prologue.\n");
5636 
5637   if (frame_pointer_needed)
5638     fprintf (dump_file, "Stack clash frame pointer needed.\n");
5639   else
5640     fprintf (dump_file, "Stack clash no frame pointer needed.\n");
5641 
5642   if (TREE_THIS_VOLATILE (cfun->decl))
5643     fprintf (dump_file,
5644 	     "Stack clash noreturn prologue, assuming no implicit"
5645 	     " probes in caller.\n");
5646   else
5647     fprintf (dump_file,
5648 	     "Stack clash not noreturn prologue.\n");
5649 }
5650 
5651 /* Add a list of INSNS to the hash HASHP, possibly allocating HASHP
5652    for the first time.  */
5653 
5654 static void
record_insns(rtx_insn * insns,rtx end,hash_table<insn_cache_hasher> ** hashp)5655 record_insns (rtx_insn *insns, rtx end, hash_table<insn_cache_hasher> **hashp)
5656 {
5657   rtx_insn *tmp;
5658   hash_table<insn_cache_hasher> *hash = *hashp;
5659 
5660   if (hash == NULL)
5661     *hashp = hash = hash_table<insn_cache_hasher>::create_ggc (17);
5662 
5663   for (tmp = insns; tmp != end; tmp = NEXT_INSN (tmp))
5664     {
5665       rtx *slot = hash->find_slot (tmp, INSERT);
5666       gcc_assert (*slot == NULL);
5667       *slot = tmp;
5668     }
5669 }
5670 
5671 /* INSN has been duplicated or replaced by as COPY, perhaps by duplicating a
5672    basic block, splitting or peepholes.  If INSN is a prologue or epilogue
5673    insn, then record COPY as well.  */
5674 
5675 void
maybe_copy_prologue_epilogue_insn(rtx insn,rtx copy)5676 maybe_copy_prologue_epilogue_insn (rtx insn, rtx copy)
5677 {
5678   hash_table<insn_cache_hasher> *hash;
5679   rtx *slot;
5680 
5681   hash = epilogue_insn_hash;
5682   if (!hash || !hash->find (insn))
5683     {
5684       hash = prologue_insn_hash;
5685       if (!hash || !hash->find (insn))
5686 	return;
5687     }
5688 
5689   slot = hash->find_slot (copy, INSERT);
5690   gcc_assert (*slot == NULL);
5691   *slot = copy;
5692 }
5693 
5694 /* Determine if any INSNs in HASH are, or are part of, INSN.  Because
5695    we can be running after reorg, SEQUENCE rtl is possible.  */
5696 
5697 static bool
contains(const rtx_insn * insn,hash_table<insn_cache_hasher> * hash)5698 contains (const rtx_insn *insn, hash_table<insn_cache_hasher> *hash)
5699 {
5700   if (hash == NULL)
5701     return false;
5702 
5703   if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
5704     {
5705       rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn));
5706       int i;
5707       for (i = seq->len () - 1; i >= 0; i--)
5708 	if (hash->find (seq->element (i)))
5709 	  return true;
5710       return false;
5711     }
5712 
5713   return hash->find (const_cast<rtx_insn *> (insn)) != NULL;
5714 }
5715 
5716 int
prologue_contains(const rtx_insn * insn)5717 prologue_contains (const rtx_insn *insn)
5718 {
5719   return contains (insn, prologue_insn_hash);
5720 }
5721 
5722 int
epilogue_contains(const rtx_insn * insn)5723 epilogue_contains (const rtx_insn *insn)
5724 {
5725   return contains (insn, epilogue_insn_hash);
5726 }
5727 
5728 int
prologue_epilogue_contains(const rtx_insn * insn)5729 prologue_epilogue_contains (const rtx_insn *insn)
5730 {
5731   if (contains (insn, prologue_insn_hash))
5732     return 1;
5733   if (contains (insn, epilogue_insn_hash))
5734     return 1;
5735   return 0;
5736 }
5737 
5738 void
record_prologue_seq(rtx_insn * seq)5739 record_prologue_seq (rtx_insn *seq)
5740 {
5741   record_insns (seq, NULL, &prologue_insn_hash);
5742 }
5743 
5744 void
record_epilogue_seq(rtx_insn * seq)5745 record_epilogue_seq (rtx_insn *seq)
5746 {
5747   record_insns (seq, NULL, &epilogue_insn_hash);
5748 }
5749 
5750 /* Set JUMP_LABEL for a return insn.  */
5751 
5752 void
set_return_jump_label(rtx_insn * returnjump)5753 set_return_jump_label (rtx_insn *returnjump)
5754 {
5755   rtx pat = PATTERN (returnjump);
5756   if (GET_CODE (pat) == PARALLEL)
5757     pat = XVECEXP (pat, 0, 0);
5758   if (ANY_RETURN_P (pat))
5759     JUMP_LABEL (returnjump) = pat;
5760   else
5761     JUMP_LABEL (returnjump) = ret_rtx;
5762 }
5763 
5764 /* Return a sequence to be used as the split prologue for the current
5765    function, or NULL.  */
5766 
5767 static rtx_insn *
make_split_prologue_seq(void)5768 make_split_prologue_seq (void)
5769 {
5770   if (!flag_split_stack
5771       || lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl)))
5772     return NULL;
5773 
5774   start_sequence ();
5775   emit_insn (targetm.gen_split_stack_prologue ());
5776   rtx_insn *seq = get_insns ();
5777   end_sequence ();
5778 
5779   record_insns (seq, NULL, &prologue_insn_hash);
5780   set_insn_locations (seq, prologue_location);
5781 
5782   return seq;
5783 }
5784 
5785 /* Return a sequence to be used as the prologue for the current function,
5786    or NULL.  */
5787 
5788 static rtx_insn *
make_prologue_seq(void)5789 make_prologue_seq (void)
5790 {
5791   if (!targetm.have_prologue ())
5792     return NULL;
5793 
5794   start_sequence ();
5795   rtx_insn *seq = targetm.gen_prologue ();
5796   emit_insn (seq);
5797 
5798   /* Insert an explicit USE for the frame pointer
5799      if the profiling is on and the frame pointer is required.  */
5800   if (crtl->profile && frame_pointer_needed)
5801     emit_use (hard_frame_pointer_rtx);
5802 
5803   /* Retain a map of the prologue insns.  */
5804   record_insns (seq, NULL, &prologue_insn_hash);
5805   emit_note (NOTE_INSN_PROLOGUE_END);
5806 
5807   /* Ensure that instructions are not moved into the prologue when
5808      profiling is on.  The call to the profiling routine can be
5809      emitted within the live range of a call-clobbered register.  */
5810   if (!targetm.profile_before_prologue () && crtl->profile)
5811     emit_insn (gen_blockage ());
5812 
5813   seq = get_insns ();
5814   end_sequence ();
5815   set_insn_locations (seq, prologue_location);
5816 
5817   return seq;
5818 }
5819 
5820 /* Return a sequence to be used as the epilogue for the current function,
5821    or NULL.  */
5822 
5823 static rtx_insn *
make_epilogue_seq(void)5824 make_epilogue_seq (void)
5825 {
5826   if (!targetm.have_epilogue ())
5827     return NULL;
5828 
5829   start_sequence ();
5830   emit_note (NOTE_INSN_EPILOGUE_BEG);
5831   rtx_insn *seq = targetm.gen_epilogue ();
5832   if (seq)
5833     emit_jump_insn (seq);
5834 
5835   /* Retain a map of the epilogue insns.  */
5836   record_insns (seq, NULL, &epilogue_insn_hash);
5837   set_insn_locations (seq, epilogue_location);
5838 
5839   seq = get_insns ();
5840   rtx_insn *returnjump = get_last_insn ();
5841   end_sequence ();
5842 
5843   if (JUMP_P (returnjump))
5844     set_return_jump_label (returnjump);
5845 
5846   return seq;
5847 }
5848 
5849 
5850 /* Generate the prologue and epilogue RTL if the machine supports it.  Thread
5851    this into place with notes indicating where the prologue ends and where
5852    the epilogue begins.  Update the basic block information when possible.
5853 
5854    Notes on epilogue placement:
5855    There are several kinds of edges to the exit block:
5856    * a single fallthru edge from LAST_BB
5857    * possibly, edges from blocks containing sibcalls
5858    * possibly, fake edges from infinite loops
5859 
5860    The epilogue is always emitted on the fallthru edge from the last basic
5861    block in the function, LAST_BB, into the exit block.
5862 
5863    If LAST_BB is empty except for a label, it is the target of every
5864    other basic block in the function that ends in a return.  If a
5865    target has a return or simple_return pattern (possibly with
5866    conditional variants), these basic blocks can be changed so that a
5867    return insn is emitted into them, and their target is adjusted to
5868    the real exit block.
5869 
5870    Notes on shrink wrapping: We implement a fairly conservative
5871    version of shrink-wrapping rather than the textbook one.  We only
5872    generate a single prologue and a single epilogue.  This is
5873    sufficient to catch a number of interesting cases involving early
5874    exits.
5875 
5876    First, we identify the blocks that require the prologue to occur before
5877    them.  These are the ones that modify a call-saved register, or reference
5878    any of the stack or frame pointer registers.  To simplify things, we then
5879    mark everything reachable from these blocks as also requiring a prologue.
5880    This takes care of loops automatically, and avoids the need to examine
5881    whether MEMs reference the frame, since it is sufficient to check for
5882    occurrences of the stack or frame pointer.
5883 
5884    We then compute the set of blocks for which the need for a prologue
5885    is anticipatable (borrowing terminology from the shrink-wrapping
5886    description in Muchnick's book).  These are the blocks which either
5887    require a prologue themselves, or those that have only successors
5888    where the prologue is anticipatable.  The prologue needs to be
5889    inserted on all edges from BB1->BB2 where BB2 is in ANTIC and BB1
5890    is not.  For the moment, we ensure that only one such edge exists.
5891 
5892    The epilogue is placed as described above, but we make a
5893    distinction between inserting return and simple_return patterns
5894    when modifying other blocks that end in a return.  Blocks that end
5895    in a sibcall omit the sibcall_epilogue if the block is not in
5896    ANTIC.  */
5897 
5898 void
thread_prologue_and_epilogue_insns(void)5899 thread_prologue_and_epilogue_insns (void)
5900 {
5901   df_analyze ();
5902 
5903   /* Can't deal with multiple successors of the entry block at the
5904      moment.  Function should always have at least one entry
5905      point.  */
5906   gcc_assert (single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
5907 
5908   edge entry_edge = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
5909   edge orig_entry_edge = entry_edge;
5910 
5911   rtx_insn *split_prologue_seq = make_split_prologue_seq ();
5912   rtx_insn *prologue_seq = make_prologue_seq ();
5913   rtx_insn *epilogue_seq = make_epilogue_seq ();
5914 
5915   /* Try to perform a kind of shrink-wrapping, making sure the
5916      prologue/epilogue is emitted only around those parts of the
5917      function that require it.  */
5918   try_shrink_wrapping (&entry_edge, prologue_seq);
5919 
5920   /* If the target can handle splitting the prologue/epilogue into separate
5921      components, try to shrink-wrap these components separately.  */
5922   try_shrink_wrapping_separate (entry_edge->dest);
5923 
5924   /* If that did anything for any component we now need the generate the
5925      "main" prologue again.  Because some targets require some of these
5926      to be called in a specific order (i386 requires the split prologue
5927      to be first, for example), we create all three sequences again here.
5928      If this does not work for some target, that target should not enable
5929      separate shrink-wrapping.  */
5930   if (crtl->shrink_wrapped_separate)
5931     {
5932       split_prologue_seq = make_split_prologue_seq ();
5933       prologue_seq = make_prologue_seq ();
5934       epilogue_seq = make_epilogue_seq ();
5935     }
5936 
5937   rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
5938 
5939   /* A small fib -- epilogue is not yet completed, but we wish to re-use
5940      this marker for the splits of EH_RETURN patterns, and nothing else
5941      uses the flag in the meantime.  */
5942   epilogue_completed = 1;
5943 
5944   /* Find non-fallthru edges that end with EH_RETURN instructions.  On
5945      some targets, these get split to a special version of the epilogue
5946      code.  In order to be able to properly annotate these with unwind
5947      info, try to split them now.  If we get a valid split, drop an
5948      EPILOGUE_BEG note and mark the insns as epilogue insns.  */
5949   edge e;
5950   edge_iterator ei;
5951   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
5952     {
5953       rtx_insn *prev, *last, *trial;
5954 
5955       if (e->flags & EDGE_FALLTHRU)
5956 	continue;
5957       last = BB_END (e->src);
5958       if (!eh_returnjump_p (last))
5959 	continue;
5960 
5961       prev = PREV_INSN (last);
5962       trial = try_split (PATTERN (last), last, 1);
5963       if (trial == last)
5964 	continue;
5965 
5966       record_insns (NEXT_INSN (prev), NEXT_INSN (trial), &epilogue_insn_hash);
5967       emit_note_after (NOTE_INSN_EPILOGUE_BEG, prev);
5968     }
5969 
5970   edge exit_fallthru_edge = find_fallthru_edge (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds);
5971 
5972   if (exit_fallthru_edge)
5973     {
5974       if (epilogue_seq)
5975 	{
5976 	  insert_insn_on_edge (epilogue_seq, exit_fallthru_edge);
5977 	  commit_edge_insertions ();
5978 
5979 	  /* The epilogue insns we inserted may cause the exit edge to no longer
5980 	     be fallthru.  */
5981 	  FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
5982 	    {
5983 	      if (((e->flags & EDGE_FALLTHRU) != 0)
5984 		  && returnjump_p (BB_END (e->src)))
5985 		e->flags &= ~EDGE_FALLTHRU;
5986 	    }
5987 	}
5988       else if (next_active_insn (BB_END (exit_fallthru_edge->src)))
5989 	{
5990 	  /* We have a fall-through edge to the exit block, the source is not
5991 	     at the end of the function, and there will be an assembler epilogue
5992 	     at the end of the function.
5993 	     We can't use force_nonfallthru here, because that would try to
5994 	     use return.  Inserting a jump 'by hand' is extremely messy, so
5995 	     we take advantage of cfg_layout_finalize using
5996 	     fixup_fallthru_exit_predecessor.  */
5997 	  cfg_layout_initialize (0);
5998 	  basic_block cur_bb;
5999 	  FOR_EACH_BB_FN (cur_bb, cfun)
6000 	    if (cur_bb->index >= NUM_FIXED_BLOCKS
6001 		&& cur_bb->next_bb->index >= NUM_FIXED_BLOCKS)
6002 	      cur_bb->aux = cur_bb->next_bb;
6003 	  cfg_layout_finalize ();
6004 	}
6005     }
6006 
6007   /* Insert the prologue.  */
6008 
6009   rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
6010 
6011   if (split_prologue_seq || prologue_seq)
6012     {
6013       rtx_insn *split_prologue_insn = split_prologue_seq;
6014       if (split_prologue_seq)
6015 	{
6016 	  while (split_prologue_insn && !NONDEBUG_INSN_P (split_prologue_insn))
6017 	    split_prologue_insn = NEXT_INSN (split_prologue_insn);
6018 	  insert_insn_on_edge (split_prologue_seq, orig_entry_edge);
6019 	}
6020 
6021       rtx_insn *prologue_insn = prologue_seq;
6022       if (prologue_seq)
6023 	{
6024 	  while (prologue_insn && !NONDEBUG_INSN_P (prologue_insn))
6025 	    prologue_insn = NEXT_INSN (prologue_insn);
6026 	  insert_insn_on_edge (prologue_seq, entry_edge);
6027 	}
6028 
6029       commit_edge_insertions ();
6030 
6031       /* Look for basic blocks within the prologue insns.  */
6032       if (split_prologue_insn
6033 	  && BLOCK_FOR_INSN (split_prologue_insn) == NULL)
6034 	split_prologue_insn = NULL;
6035       if (prologue_insn
6036 	  && BLOCK_FOR_INSN (prologue_insn) == NULL)
6037 	prologue_insn = NULL;
6038       if (split_prologue_insn || prologue_insn)
6039 	{
6040 	  auto_sbitmap blocks (last_basic_block_for_fn (cfun));
6041 	  bitmap_clear (blocks);
6042 	  if (split_prologue_insn)
6043 	    bitmap_set_bit (blocks,
6044 			    BLOCK_FOR_INSN (split_prologue_insn)->index);
6045 	  if (prologue_insn)
6046 	    bitmap_set_bit (blocks, BLOCK_FOR_INSN (prologue_insn)->index);
6047 	  find_many_sub_basic_blocks (blocks);
6048 	}
6049     }
6050 
6051   default_rtl_profile ();
6052 
6053   /* Emit sibling epilogues before any sibling call sites.  */
6054   for (ei = ei_start (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds);
6055        (e = ei_safe_edge (ei));
6056        ei_next (&ei))
6057     {
6058       /* Skip those already handled, the ones that run without prologue.  */
6059       if (e->flags & EDGE_IGNORE)
6060 	{
6061 	  e->flags &= ~EDGE_IGNORE;
6062 	  continue;
6063 	}
6064 
6065       rtx_insn *insn = BB_END (e->src);
6066 
6067       if (!(CALL_P (insn) && SIBLING_CALL_P (insn)))
6068 	continue;
6069 
6070       if (rtx_insn *ep_seq = targetm.gen_sibcall_epilogue ())
6071 	{
6072 	  start_sequence ();
6073 	  emit_note (NOTE_INSN_EPILOGUE_BEG);
6074 	  emit_insn (ep_seq);
6075 	  rtx_insn *seq = get_insns ();
6076 	  end_sequence ();
6077 
6078 	  /* Retain a map of the epilogue insns.  Used in life analysis to
6079 	     avoid getting rid of sibcall epilogue insns.  Do this before we
6080 	     actually emit the sequence.  */
6081 	  record_insns (seq, NULL, &epilogue_insn_hash);
6082 	  set_insn_locations (seq, epilogue_location);
6083 
6084 	  emit_insn_before (seq, insn);
6085 	}
6086     }
6087 
6088   if (epilogue_seq)
6089     {
6090       rtx_insn *insn, *next;
6091 
6092       /* Similarly, move any line notes that appear after the epilogue.
6093          There is no need, however, to be quite so anal about the existence
6094 	 of such a note.  Also possibly move
6095 	 NOTE_INSN_FUNCTION_BEG notes, as those can be relevant for debug
6096 	 info generation.  */
6097       for (insn = epilogue_seq; insn; insn = next)
6098 	{
6099 	  next = NEXT_INSN (insn);
6100 	  if (NOTE_P (insn)
6101 	      && (NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG))
6102 	    reorder_insns (insn, insn, PREV_INSN (epilogue_seq));
6103 	}
6104     }
6105 
6106   /* Threading the prologue and epilogue changes the artificial refs
6107      in the entry and exit blocks.  */
6108   epilogue_completed = 1;
6109   df_update_entry_exit_and_calls ();
6110 }
6111 
6112 /* Reposition the prologue-end and epilogue-begin notes after
6113    instruction scheduling.  */
6114 
6115 void
reposition_prologue_and_epilogue_notes(void)6116 reposition_prologue_and_epilogue_notes (void)
6117 {
6118   if (!targetm.have_prologue ()
6119       && !targetm.have_epilogue ()
6120       && !targetm.have_sibcall_epilogue ())
6121     return;
6122 
6123   /* Since the hash table is created on demand, the fact that it is
6124      non-null is a signal that it is non-empty.  */
6125   if (prologue_insn_hash != NULL)
6126     {
6127       size_t len = prologue_insn_hash->elements ();
6128       rtx_insn *insn, *last = NULL, *note = NULL;
6129 
6130       /* Scan from the beginning until we reach the last prologue insn.  */
6131       /* ??? While we do have the CFG intact, there are two problems:
6132 	 (1) The prologue can contain loops (typically probing the stack),
6133 	     which means that the end of the prologue isn't in the first bb.
6134 	 (2) Sometimes the PROLOGUE_END note gets pushed into the next bb.  */
6135       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6136 	{
6137 	  if (NOTE_P (insn))
6138 	    {
6139 	      if (NOTE_KIND (insn) == NOTE_INSN_PROLOGUE_END)
6140 		note = insn;
6141 	    }
6142 	  else if (contains (insn, prologue_insn_hash))
6143 	    {
6144 	      last = insn;
6145 	      if (--len == 0)
6146 		break;
6147 	    }
6148 	}
6149 
6150       if (last)
6151 	{
6152 	  if (note == NULL)
6153 	    {
6154 	      /* Scan forward looking for the PROLOGUE_END note.  It should
6155 		 be right at the beginning of the block, possibly with other
6156 		 insn notes that got moved there.  */
6157 	      for (note = NEXT_INSN (last); ; note = NEXT_INSN (note))
6158 		{
6159 		  if (NOTE_P (note)
6160 		      && NOTE_KIND (note) == NOTE_INSN_PROLOGUE_END)
6161 		    break;
6162 		}
6163 	    }
6164 
6165 	  /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
6166 	  if (LABEL_P (last))
6167 	    last = NEXT_INSN (last);
6168 	  reorder_insns (note, note, last);
6169 	}
6170     }
6171 
6172   if (epilogue_insn_hash != NULL)
6173     {
6174       edge_iterator ei;
6175       edge e;
6176 
6177       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
6178 	{
6179 	  rtx_insn *insn, *first = NULL, *note = NULL;
6180 	  basic_block bb = e->src;
6181 
6182 	  /* Scan from the beginning until we reach the first epilogue insn. */
6183 	  FOR_BB_INSNS (bb, insn)
6184 	    {
6185 	      if (NOTE_P (insn))
6186 		{
6187 		  if (NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
6188 		    {
6189 		      note = insn;
6190 		      if (first != NULL)
6191 			break;
6192 		    }
6193 		}
6194 	      else if (first == NULL && contains (insn, epilogue_insn_hash))
6195 		{
6196 		  first = insn;
6197 		  if (note != NULL)
6198 		    break;
6199 		}
6200 	    }
6201 
6202 	  if (note)
6203 	    {
6204 	      /* If the function has a single basic block, and no real
6205 		 epilogue insns (e.g. sibcall with no cleanup), the
6206 		 epilogue note can get scheduled before the prologue
6207 		 note.  If we have frame related prologue insns, having
6208 		 them scanned during the epilogue will result in a crash.
6209 		 In this case re-order the epilogue note to just before
6210 		 the last insn in the block.  */
6211 	      if (first == NULL)
6212 		first = BB_END (bb);
6213 
6214 	      if (PREV_INSN (first) != note)
6215 		reorder_insns (note, note, PREV_INSN (first));
6216 	    }
6217 	}
6218     }
6219 }
6220 
6221 /* Returns the name of function declared by FNDECL.  */
6222 const char *
fndecl_name(tree fndecl)6223 fndecl_name (tree fndecl)
6224 {
6225   if (fndecl == NULL)
6226     return "(nofn)";
6227   return lang_hooks.decl_printable_name (fndecl, 1);
6228 }
6229 
6230 /* Returns the name of function FN.  */
6231 const char *
function_name(struct function * fn)6232 function_name (struct function *fn)
6233 {
6234   tree fndecl = (fn == NULL) ? NULL : fn->decl;
6235   return fndecl_name (fndecl);
6236 }
6237 
6238 /* Returns the name of the current function.  */
6239 const char *
current_function_name(void)6240 current_function_name (void)
6241 {
6242   return function_name (cfun);
6243 }
6244 
6245 
6246 static unsigned int
rest_of_handle_check_leaf_regs(void)6247 rest_of_handle_check_leaf_regs (void)
6248 {
6249 #ifdef LEAF_REGISTERS
6250   crtl->uses_only_leaf_regs
6251     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
6252 #endif
6253   return 0;
6254 }
6255 
6256 /* Insert a TYPE into the used types hash table of CFUN.  */
6257 
6258 static void
used_types_insert_helper(tree type,struct function * func)6259 used_types_insert_helper (tree type, struct function *func)
6260 {
6261   if (type != NULL && func != NULL)
6262     {
6263       if (func->used_types_hash == NULL)
6264 	func->used_types_hash = hash_set<tree>::create_ggc (37);
6265 
6266       func->used_types_hash->add (type);
6267     }
6268 }
6269 
6270 /* Given a type, insert it into the used hash table in cfun.  */
6271 void
used_types_insert(tree t)6272 used_types_insert (tree t)
6273 {
6274   while (POINTER_TYPE_P (t) || TREE_CODE (t) == ARRAY_TYPE)
6275     if (TYPE_NAME (t))
6276       break;
6277     else
6278       t = TREE_TYPE (t);
6279   if (TREE_CODE (t) == ERROR_MARK)
6280     return;
6281   if (TYPE_NAME (t) == NULL_TREE
6282       || TYPE_NAME (t) == TYPE_NAME (TYPE_MAIN_VARIANT (t)))
6283     t = TYPE_MAIN_VARIANT (t);
6284   if (debug_info_level > DINFO_LEVEL_NONE)
6285     {
6286       if (cfun)
6287 	used_types_insert_helper (t, cfun);
6288       else
6289 	{
6290 	  /* So this might be a type referenced by a global variable.
6291 	     Record that type so that we can later decide to emit its
6292 	     debug information.  */
6293 	  vec_safe_push (types_used_by_cur_var_decl, t);
6294 	}
6295     }
6296 }
6297 
6298 /* Helper to Hash a struct types_used_by_vars_entry.  */
6299 
6300 static hashval_t
hash_types_used_by_vars_entry(const struct types_used_by_vars_entry * entry)6301 hash_types_used_by_vars_entry (const struct types_used_by_vars_entry *entry)
6302 {
6303   gcc_assert (entry && entry->var_decl && entry->type);
6304 
6305   return iterative_hash_object (entry->type,
6306 				iterative_hash_object (entry->var_decl, 0));
6307 }
6308 
6309 /* Hash function of the types_used_by_vars_entry hash table.  */
6310 
6311 hashval_t
hash(types_used_by_vars_entry * entry)6312 used_type_hasher::hash (types_used_by_vars_entry *entry)
6313 {
6314   return hash_types_used_by_vars_entry (entry);
6315 }
6316 
6317 /*Equality function of the types_used_by_vars_entry hash table.  */
6318 
6319 bool
equal(types_used_by_vars_entry * e1,types_used_by_vars_entry * e2)6320 used_type_hasher::equal (types_used_by_vars_entry *e1,
6321 			 types_used_by_vars_entry *e2)
6322 {
6323   return (e1->var_decl == e2->var_decl && e1->type == e2->type);
6324 }
6325 
6326 /* Inserts an entry into the types_used_by_vars_hash hash table. */
6327 
6328 void
types_used_by_var_decl_insert(tree type,tree var_decl)6329 types_used_by_var_decl_insert (tree type, tree var_decl)
6330 {
6331   if (type != NULL && var_decl != NULL)
6332     {
6333       types_used_by_vars_entry **slot;
6334       struct types_used_by_vars_entry e;
6335       e.var_decl = var_decl;
6336       e.type = type;
6337       if (types_used_by_vars_hash == NULL)
6338 	types_used_by_vars_hash
6339 	  = hash_table<used_type_hasher>::create_ggc (37);
6340 
6341       slot = types_used_by_vars_hash->find_slot (&e, INSERT);
6342       if (*slot == NULL)
6343 	{
6344 	  struct types_used_by_vars_entry *entry;
6345 	  entry = ggc_alloc<types_used_by_vars_entry> ();
6346 	  entry->type = type;
6347 	  entry->var_decl = var_decl;
6348 	  *slot = entry;
6349 	}
6350     }
6351 }
6352 
6353 namespace {
6354 
6355 const pass_data pass_data_leaf_regs =
6356 {
6357   RTL_PASS, /* type */
6358   "*leaf_regs", /* name */
6359   OPTGROUP_NONE, /* optinfo_flags */
6360   TV_NONE, /* tv_id */
6361   0, /* properties_required */
6362   0, /* properties_provided */
6363   0, /* properties_destroyed */
6364   0, /* todo_flags_start */
6365   0, /* todo_flags_finish */
6366 };
6367 
6368 class pass_leaf_regs : public rtl_opt_pass
6369 {
6370 public:
pass_leaf_regs(gcc::context * ctxt)6371   pass_leaf_regs (gcc::context *ctxt)
6372     : rtl_opt_pass (pass_data_leaf_regs, ctxt)
6373   {}
6374 
6375   /* opt_pass methods: */
execute(function *)6376   virtual unsigned int execute (function *)
6377     {
6378       return rest_of_handle_check_leaf_regs ();
6379     }
6380 
6381 }; // class pass_leaf_regs
6382 
6383 } // anon namespace
6384 
6385 rtl_opt_pass *
make_pass_leaf_regs(gcc::context * ctxt)6386 make_pass_leaf_regs (gcc::context *ctxt)
6387 {
6388   return new pass_leaf_regs (ctxt);
6389 }
6390 
6391 static unsigned int
rest_of_handle_thread_prologue_and_epilogue(void)6392 rest_of_handle_thread_prologue_and_epilogue (void)
6393 {
6394   /* prepare_shrink_wrap is sensitive to the block structure of the control
6395      flow graph, so clean it up first.  */
6396   if (optimize)
6397     cleanup_cfg (0);
6398 
6399   /* On some machines, the prologue and epilogue code, or parts thereof,
6400      can be represented as RTL.  Doing so lets us schedule insns between
6401      it and the rest of the code and also allows delayed branch
6402      scheduling to operate in the epilogue.  */
6403   thread_prologue_and_epilogue_insns ();
6404 
6405   /* Some non-cold blocks may now be only reachable from cold blocks.
6406      Fix that up.  */
6407   fixup_partitions ();
6408 
6409   /* Shrink-wrapping can result in unreachable edges in the epilogue,
6410      see PR57320.  */
6411   cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
6412 
6413   /* The stack usage info is finalized during prologue expansion.  */
6414   if (flag_stack_usage_info || flag_callgraph_info)
6415     output_stack_usage ();
6416 
6417   return 0;
6418 }
6419 
6420 /* Record a final call to CALLEE at LOCATION.  */
6421 
6422 void
record_final_call(tree callee,location_t location)6423 record_final_call (tree callee, location_t location)
6424 {
6425   struct callinfo_callee datum = { location, callee };
6426   vec_safe_push (cfun->su->callees, datum);
6427 }
6428 
6429 /* Record a dynamic allocation made for DECL_OR_EXP.  */
6430 
6431 void
record_dynamic_alloc(tree decl_or_exp)6432 record_dynamic_alloc (tree decl_or_exp)
6433 {
6434   struct callinfo_dalloc datum;
6435 
6436   if (DECL_P (decl_or_exp))
6437     {
6438       datum.location = DECL_SOURCE_LOCATION (decl_or_exp);
6439       const char *name = lang_hooks.decl_printable_name (decl_or_exp, 2);
6440       const char *dot = strrchr (name, '.');
6441       if (dot)
6442 	name = dot + 1;
6443       datum.name = ggc_strdup (name);
6444     }
6445   else
6446     {
6447       datum.location = EXPR_LOCATION (decl_or_exp);
6448       datum.name = NULL;
6449     }
6450 
6451   vec_safe_push (cfun->su->dallocs, datum);
6452 }
6453 
6454 namespace {
6455 
6456 const pass_data pass_data_thread_prologue_and_epilogue =
6457 {
6458   RTL_PASS, /* type */
6459   "pro_and_epilogue", /* name */
6460   OPTGROUP_NONE, /* optinfo_flags */
6461   TV_THREAD_PROLOGUE_AND_EPILOGUE, /* tv_id */
6462   0, /* properties_required */
6463   0, /* properties_provided */
6464   0, /* properties_destroyed */
6465   0, /* todo_flags_start */
6466   ( TODO_df_verify | TODO_df_finish ), /* todo_flags_finish */
6467 };
6468 
6469 class pass_thread_prologue_and_epilogue : public rtl_opt_pass
6470 {
6471 public:
pass_thread_prologue_and_epilogue(gcc::context * ctxt)6472   pass_thread_prologue_and_epilogue (gcc::context *ctxt)
6473     : rtl_opt_pass (pass_data_thread_prologue_and_epilogue, ctxt)
6474   {}
6475 
6476   /* opt_pass methods: */
execute(function *)6477   virtual unsigned int execute (function *)
6478     {
6479       return rest_of_handle_thread_prologue_and_epilogue ();
6480     }
6481 
6482 }; // class pass_thread_prologue_and_epilogue
6483 
6484 } // anon namespace
6485 
6486 rtl_opt_pass *
make_pass_thread_prologue_and_epilogue(gcc::context * ctxt)6487 make_pass_thread_prologue_and_epilogue (gcc::context *ctxt)
6488 {
6489   return new pass_thread_prologue_and_epilogue (ctxt);
6490 }
6491 
6492 
6493 /* If CONSTRAINT is a matching constraint, then return its number.
6494    Otherwise, return -1.  */
6495 
6496 static int
matching_constraint_num(const char * constraint)6497 matching_constraint_num (const char *constraint)
6498 {
6499   if (*constraint == '%')
6500     constraint++;
6501 
6502   if (IN_RANGE (*constraint, '0', '9'))
6503     return strtoul (constraint, NULL, 10);
6504 
6505   return -1;
6506 }
6507 
6508 /* This mini-pass fixes fall-out from SSA in asm statements that have
6509    in-out constraints.  Say you start with
6510 
6511      orig = inout;
6512      asm ("": "+mr" (inout));
6513      use (orig);
6514 
6515    which is transformed very early to use explicit output and match operands:
6516 
6517      orig = inout;
6518      asm ("": "=mr" (inout) : "0" (inout));
6519      use (orig);
6520 
6521    Or, after SSA and copyprop,
6522 
6523      asm ("": "=mr" (inout_2) : "0" (inout_1));
6524      use (inout_1);
6525 
6526    Clearly inout_2 and inout_1 can't be coalesced easily anymore, as
6527    they represent two separate values, so they will get different pseudo
6528    registers during expansion.  Then, since the two operands need to match
6529    per the constraints, but use different pseudo registers, reload can
6530    only register a reload for these operands.  But reloads can only be
6531    satisfied by hardregs, not by memory, so we need a register for this
6532    reload, just because we are presented with non-matching operands.
6533    So, even though we allow memory for this operand, no memory can be
6534    used for it, just because the two operands don't match.  This can
6535    cause reload failures on register-starved targets.
6536 
6537    So it's a symptom of reload not being able to use memory for reloads
6538    or, alternatively it's also a symptom of both operands not coming into
6539    reload as matching (in which case the pseudo could go to memory just
6540    fine, as the alternative allows it, and no reload would be necessary).
6541    We fix the latter problem here, by transforming
6542 
6543      asm ("": "=mr" (inout_2) : "0" (inout_1));
6544 
6545    back to
6546 
6547      inout_2 = inout_1;
6548      asm ("": "=mr" (inout_2) : "0" (inout_2));  */
6549 
6550 static void
match_asm_constraints_1(rtx_insn * insn,rtx * p_sets,int noutputs)6551 match_asm_constraints_1 (rtx_insn *insn, rtx *p_sets, int noutputs)
6552 {
6553   int i;
6554   bool changed = false;
6555   rtx op = SET_SRC (p_sets[0]);
6556   int ninputs = ASM_OPERANDS_INPUT_LENGTH (op);
6557   rtvec inputs = ASM_OPERANDS_INPUT_VEC (op);
6558   bool *output_matched = XALLOCAVEC (bool, noutputs);
6559 
6560   memset (output_matched, 0, noutputs * sizeof (bool));
6561   for (i = 0; i < ninputs; i++)
6562     {
6563       rtx input, output;
6564       rtx_insn *insns;
6565       const char *constraint = ASM_OPERANDS_INPUT_CONSTRAINT (op, i);
6566       int match, j;
6567 
6568       match = matching_constraint_num (constraint);
6569       if (match < 0)
6570 	continue;
6571 
6572       gcc_assert (match < noutputs);
6573       output = SET_DEST (p_sets[match]);
6574       input = RTVEC_ELT (inputs, i);
6575       /* Only do the transformation for pseudos.  */
6576       if (! REG_P (output)
6577 	  || rtx_equal_p (output, input)
6578 	  || !(REG_P (input) || SUBREG_P (input)
6579 	       || MEM_P (input) || CONSTANT_P (input))
6580 	  || !general_operand (input, GET_MODE (output)))
6581 	continue;
6582 
6583       /* We can't do anything if the output is also used as input,
6584 	 as we're going to overwrite it.  */
6585       for (j = 0; j < ninputs; j++)
6586 	if (reg_overlap_mentioned_p (output, RTVEC_ELT (inputs, j)))
6587 	  break;
6588       if (j != ninputs)
6589 	continue;
6590 
6591       /* Avoid changing the same input several times.  For
6592 	 asm ("" : "=mr" (out1), "=mr" (out2) : "0" (in), "1" (in));
6593 	 only change it once (to out1), rather than changing it
6594 	 first to out1 and afterwards to out2.  */
6595       if (i > 0)
6596 	{
6597 	  for (j = 0; j < noutputs; j++)
6598 	    if (output_matched[j] && input == SET_DEST (p_sets[j]))
6599 	      break;
6600 	  if (j != noutputs)
6601 	    continue;
6602 	}
6603       output_matched[match] = true;
6604 
6605       start_sequence ();
6606       emit_move_insn (output, copy_rtx (input));
6607       insns = get_insns ();
6608       end_sequence ();
6609       emit_insn_before (insns, insn);
6610 
6611       constraint = ASM_OPERANDS_OUTPUT_CONSTRAINT(SET_SRC(p_sets[match]));
6612       bool early_clobber_p = strchr (constraint, '&') != NULL;
6613 
6614       /* Now replace all mentions of the input with output.  We can't
6615 	 just replace the occurrence in inputs[i], as the register might
6616 	 also be used in some other input (or even in an address of an
6617 	 output), which would mean possibly increasing the number of
6618 	 inputs by one (namely 'output' in addition), which might pose
6619 	 a too complicated problem for reload to solve.  E.g. this situation:
6620 
6621 	   asm ("" : "=r" (output), "=m" (input) : "0" (input))
6622 
6623 	 Here 'input' is used in two occurrences as input (once for the
6624 	 input operand, once for the address in the second output operand).
6625 	 If we would replace only the occurrence of the input operand (to
6626 	 make the matching) we would be left with this:
6627 
6628 	   output = input
6629 	   asm ("" : "=r" (output), "=m" (input) : "0" (output))
6630 
6631 	 Now we suddenly have two different input values (containing the same
6632 	 value, but different pseudos) where we formerly had only one.
6633 	 With more complicated asms this might lead to reload failures
6634 	 which wouldn't have happen without this pass.  So, iterate over
6635 	 all operands and replace all occurrences of the register used.
6636 
6637 	 However, if one or more of the 'input' uses have a non-matching
6638 	 constraint and the matched output operand is an early clobber
6639 	 operand, then do not replace the input operand, since by definition
6640 	 it conflicts with the output operand and cannot share the same
6641 	 register.  See PR89313 for details.  */
6642 
6643       for (j = 0; j < noutputs; j++)
6644 	if (!rtx_equal_p (SET_DEST (p_sets[j]), input)
6645 	    && reg_overlap_mentioned_p (input, SET_DEST (p_sets[j])))
6646 	  SET_DEST (p_sets[j]) = replace_rtx (SET_DEST (p_sets[j]),
6647 					      input, output);
6648       for (j = 0; j < ninputs; j++)
6649 	if (reg_overlap_mentioned_p (input, RTVEC_ELT (inputs, j)))
6650 	  {
6651 	    if (!early_clobber_p
6652 		|| match == matching_constraint_num
6653 			      (ASM_OPERANDS_INPUT_CONSTRAINT (op, j)))
6654 	      RTVEC_ELT (inputs, j) = replace_rtx (RTVEC_ELT (inputs, j),
6655 						   input, output);
6656 	  }
6657 
6658       changed = true;
6659     }
6660 
6661   if (changed)
6662     df_insn_rescan (insn);
6663 }
6664 
6665 /* Add the decl D to the local_decls list of FUN.  */
6666 
6667 void
add_local_decl(struct function * fun,tree d)6668 add_local_decl (struct function *fun, tree d)
6669 {
6670   gcc_assert (VAR_P (d));
6671   vec_safe_push (fun->local_decls, d);
6672 }
6673 
6674 namespace {
6675 
6676 const pass_data pass_data_match_asm_constraints =
6677 {
6678   RTL_PASS, /* type */
6679   "asmcons", /* name */
6680   OPTGROUP_NONE, /* optinfo_flags */
6681   TV_NONE, /* tv_id */
6682   0, /* properties_required */
6683   0, /* properties_provided */
6684   0, /* properties_destroyed */
6685   0, /* todo_flags_start */
6686   0, /* todo_flags_finish */
6687 };
6688 
6689 class pass_match_asm_constraints : public rtl_opt_pass
6690 {
6691 public:
pass_match_asm_constraints(gcc::context * ctxt)6692   pass_match_asm_constraints (gcc::context *ctxt)
6693     : rtl_opt_pass (pass_data_match_asm_constraints, ctxt)
6694   {}
6695 
6696   /* opt_pass methods: */
6697   virtual unsigned int execute (function *);
6698 
6699 }; // class pass_match_asm_constraints
6700 
6701 unsigned
execute(function * fun)6702 pass_match_asm_constraints::execute (function *fun)
6703 {
6704   basic_block bb;
6705   rtx_insn *insn;
6706   rtx pat, *p_sets;
6707   int noutputs;
6708 
6709   if (!crtl->has_asm_statement)
6710     return 0;
6711 
6712   df_set_flags (DF_DEFER_INSN_RESCAN);
6713   FOR_EACH_BB_FN (bb, fun)
6714     {
6715       FOR_BB_INSNS (bb, insn)
6716 	{
6717 	  if (!INSN_P (insn))
6718 	    continue;
6719 
6720 	  pat = PATTERN (insn);
6721 	  if (GET_CODE (pat) == PARALLEL)
6722 	    p_sets = &XVECEXP (pat, 0, 0), noutputs = XVECLEN (pat, 0);
6723 	  else if (GET_CODE (pat) == SET)
6724 	    p_sets = &PATTERN (insn), noutputs = 1;
6725 	  else
6726 	    continue;
6727 
6728 	  if (GET_CODE (*p_sets) == SET
6729 	      && GET_CODE (SET_SRC (*p_sets)) == ASM_OPERANDS)
6730 	    match_asm_constraints_1 (insn, p_sets, noutputs);
6731 	 }
6732     }
6733 
6734   return TODO_df_finish;
6735 }
6736 
6737 } // anon namespace
6738 
6739 rtl_opt_pass *
make_pass_match_asm_constraints(gcc::context * ctxt)6740 make_pass_match_asm_constraints (gcc::context *ctxt)
6741 {
6742   return new pass_match_asm_constraints (ctxt);
6743 }
6744 
6745 
6746 #include "gt-function.h"
6747