1 /* A pass for lowering trees to RTL.
2    Copyright (C) 2004, 2005 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
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "rtl.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "function.h"
30 #include "expr.h"
31 #include "langhooks.h"
32 #include "tree-flow.h"
33 #include "timevar.h"
34 #include "tree-dump.h"
35 #include "tree-pass.h"
36 #include "except.h"
37 #include "flags.h"
38 #include "diagnostic.h"
39 #include "toplev.h"
40 #include "debug.h"
41 #include "params.h"
42 
43 /* Verify that there is exactly single jump instruction since last and attach
44    REG_BR_PROB note specifying probability.
45    ??? We really ought to pass the probability down to RTL expanders and let it
46    re-distribute it when the conditional expands into multiple conditionals.
47    This is however difficult to do.  */
48 static void
add_reg_br_prob_note(rtx last,int probability)49 add_reg_br_prob_note (rtx last, int probability)
50 {
51   if (profile_status == PROFILE_ABSENT)
52     return;
53   for (last = NEXT_INSN (last); last && NEXT_INSN (last); last = NEXT_INSN (last))
54     if (JUMP_P (last))
55       {
56 	/* It is common to emit condjump-around-jump sequence when we don't know
57 	   how to reverse the conditional.  Special case this.  */
58 	if (!any_condjump_p (last)
59 	    || !JUMP_P (NEXT_INSN (last))
60 	    || !simplejump_p (NEXT_INSN (last))
61 	    || !NEXT_INSN (NEXT_INSN (last))
62 	    || !BARRIER_P (NEXT_INSN (NEXT_INSN (last)))
63 	    || !NEXT_INSN (NEXT_INSN (NEXT_INSN (last)))
64 	    || !LABEL_P (NEXT_INSN (NEXT_INSN (NEXT_INSN (last))))
65 	    || NEXT_INSN (NEXT_INSN (NEXT_INSN (NEXT_INSN (last)))))
66 	  goto failed;
67 	gcc_assert (!find_reg_note (last, REG_BR_PROB, 0));
68 	REG_NOTES (last)
69 	  = gen_rtx_EXPR_LIST (REG_BR_PROB,
70 			       GEN_INT (REG_BR_PROB_BASE - probability),
71 			       REG_NOTES (last));
72 	return;
73       }
74   if (!last || !JUMP_P (last) || !any_condjump_p (last))
75     goto failed;
76   gcc_assert (!find_reg_note (last, REG_BR_PROB, 0));
77   REG_NOTES (last)
78     = gen_rtx_EXPR_LIST (REG_BR_PROB,
79 			 GEN_INT (probability), REG_NOTES (last));
80   return;
81 failed:
82   if (dump_file)
83     fprintf (dump_file, "Failed to add probability note\n");
84 }
85 
86 
87 #ifndef LOCAL_ALIGNMENT
88 #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
89 #endif
90 
91 #ifndef STACK_ALIGNMENT_NEEDED
92 #define STACK_ALIGNMENT_NEEDED 1
93 #endif
94 
95 
96 /* This structure holds data relevant to one variable that will be
97    placed in a stack slot.  */
98 struct stack_var
99 {
100   /* The Variable.  */
101   tree decl;
102 
103   /* The offset of the variable.  During partitioning, this is the
104      offset relative to the partition.  After partitioning, this
105      is relative to the stack frame.  */
106   HOST_WIDE_INT offset;
107 
108   /* Initially, the size of the variable.  Later, the size of the partition,
109      if this variable becomes it's partition's representative.  */
110   HOST_WIDE_INT size;
111 
112   /* The *byte* alignment required for this variable.  Or as, with the
113      size, the alignment for this partition.  */
114   unsigned int alignb;
115 
116   /* The partition representative.  */
117   size_t representative;
118 
119   /* The next stack variable in the partition, or EOC.  */
120   size_t next;
121 };
122 
123 #define EOC  ((size_t)-1)
124 
125 /* We have an array of such objects while deciding allocation.  */
126 static struct stack_var *stack_vars;
127 static size_t stack_vars_alloc;
128 static size_t stack_vars_num;
129 
130 /* An array of indicies such that stack_vars[stack_vars_sorted[i]].size
131    is non-decreasing.  */
132 static size_t *stack_vars_sorted;
133 
134 /* We have an interference graph between such objects.  This graph
135    is lower triangular.  */
136 static bool *stack_vars_conflict;
137 static size_t stack_vars_conflict_alloc;
138 
139 /* The phase of the stack frame.  This is the known misalignment of
140    virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY.  That is,
141    (frame_offset+frame_phase) % PREFERRED_STACK_BOUNDARY == 0.  */
142 static int frame_phase;
143 
144 /* Used during expand_used_vars to remember if we saw any decls for
145    which we'd like to enable stack smashing protection.  */
146 static bool has_protected_decls;
147 
148 /* Used during expand_used_vars.  Remember if we say a character buffer
149    smaller than our cutoff threshold.  Used for -Wstack-protector.  */
150 static bool has_short_buffer;
151 
152 /* Discover the byte alignment to use for DECL.  Ignore alignment
153    we can't do with expected alignment of the stack boundary.  */
154 
155 static unsigned int
get_decl_align_unit(tree decl)156 get_decl_align_unit (tree decl)
157 {
158   unsigned int align;
159 
160   align = DECL_ALIGN (decl);
161   align = LOCAL_ALIGNMENT (TREE_TYPE (decl), align);
162   if (align > PREFERRED_STACK_BOUNDARY)
163     {
164       warning (0, "ignoring alignment for stack allocated %q+D", decl);
165       align = PREFERRED_STACK_BOUNDARY;
166     }
167   if (cfun->stack_alignment_needed < align)
168     cfun->stack_alignment_needed = align;
169 
170   return align / BITS_PER_UNIT;
171 }
172 
173 /* Allocate SIZE bytes at byte alignment ALIGN from the stack frame.
174    Return the frame offset.  */
175 
176 static HOST_WIDE_INT
alloc_stack_frame_space(HOST_WIDE_INT size,HOST_WIDE_INT align)177 alloc_stack_frame_space (HOST_WIDE_INT size, HOST_WIDE_INT align)
178 {
179   HOST_WIDE_INT offset, new_frame_offset;
180 
181   new_frame_offset = frame_offset;
182   if (FRAME_GROWS_DOWNWARD)
183     {
184       new_frame_offset -= size + frame_phase;
185       new_frame_offset &= -align;
186       new_frame_offset += frame_phase;
187       offset = new_frame_offset;
188     }
189   else
190     {
191       new_frame_offset -= frame_phase;
192       new_frame_offset += align - 1;
193       new_frame_offset &= -align;
194       new_frame_offset += frame_phase;
195       offset = new_frame_offset;
196       new_frame_offset += size;
197     }
198   frame_offset = new_frame_offset;
199 
200   if (frame_offset_overflow (frame_offset, cfun->decl))
201     frame_offset = offset = 0;
202 
203   return offset;
204 }
205 
206 /* Accumulate DECL into STACK_VARS.  */
207 
208 static void
add_stack_var(tree decl)209 add_stack_var (tree decl)
210 {
211   if (stack_vars_num >= stack_vars_alloc)
212     {
213       if (stack_vars_alloc)
214 	stack_vars_alloc = stack_vars_alloc * 3 / 2;
215       else
216 	stack_vars_alloc = 32;
217       stack_vars
218 	= XRESIZEVEC (struct stack_var, stack_vars, stack_vars_alloc);
219     }
220   stack_vars[stack_vars_num].decl = decl;
221   stack_vars[stack_vars_num].offset = 0;
222   stack_vars[stack_vars_num].size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
223   stack_vars[stack_vars_num].alignb = get_decl_align_unit (decl);
224 
225   /* All variables are initially in their own partition.  */
226   stack_vars[stack_vars_num].representative = stack_vars_num;
227   stack_vars[stack_vars_num].next = EOC;
228 
229   /* Ensure that this decl doesn't get put onto the list twice.  */
230   SET_DECL_RTL (decl, pc_rtx);
231 
232   stack_vars_num++;
233 }
234 
235 /* Compute the linear index of a lower-triangular coordinate (I, J).  */
236 
237 static size_t
triangular_index(size_t i,size_t j)238 triangular_index (size_t i, size_t j)
239 {
240   if (i < j)
241     {
242       size_t t;
243       t = i, i = j, j = t;
244     }
245   return (i * (i + 1)) / 2 + j;
246 }
247 
248 /* Ensure that STACK_VARS_CONFLICT is large enough for N objects.  */
249 
250 static void
resize_stack_vars_conflict(size_t n)251 resize_stack_vars_conflict (size_t n)
252 {
253   size_t size = triangular_index (n-1, n-1) + 1;
254 
255   if (size <= stack_vars_conflict_alloc)
256     return;
257 
258   stack_vars_conflict = XRESIZEVEC (bool, stack_vars_conflict, size);
259   memset (stack_vars_conflict + stack_vars_conflict_alloc, 0,
260 	  (size - stack_vars_conflict_alloc) * sizeof (bool));
261   stack_vars_conflict_alloc = size;
262 }
263 
264 /* Make the decls associated with luid's X and Y conflict.  */
265 
266 static void
add_stack_var_conflict(size_t x,size_t y)267 add_stack_var_conflict (size_t x, size_t y)
268 {
269   size_t index = triangular_index (x, y);
270   gcc_assert (index < stack_vars_conflict_alloc);
271   stack_vars_conflict[index] = true;
272 }
273 
274 /* Check whether the decls associated with luid's X and Y conflict.  */
275 
276 static bool
stack_var_conflict_p(size_t x,size_t y)277 stack_var_conflict_p (size_t x, size_t y)
278 {
279   size_t index = triangular_index (x, y);
280   gcc_assert (index < stack_vars_conflict_alloc);
281   return stack_vars_conflict[index];
282 }
283 
284 /* Returns true if TYPE is or contains a union type.  */
285 
286 static bool
aggregate_contains_union_type(tree type)287 aggregate_contains_union_type (tree type)
288 {
289   tree field;
290 
291   if (TREE_CODE (type) == UNION_TYPE
292       || TREE_CODE (type) == QUAL_UNION_TYPE)
293     return true;
294   if (TREE_CODE (type) == ARRAY_TYPE)
295     return aggregate_contains_union_type (TREE_TYPE (type));
296   if (TREE_CODE (type) != RECORD_TYPE)
297     return false;
298 
299   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
300     if (TREE_CODE (field) == FIELD_DECL)
301       if (aggregate_contains_union_type (TREE_TYPE (field)))
302 	return true;
303 
304   return false;
305 }
306 
307 /* A subroutine of expand_used_vars.  If two variables X and Y have alias
308    sets that do not conflict, then do add a conflict for these variables
309    in the interference graph.  We also need to make sure to add conflicts
310    for union containing structures.  Else RTL alias analysis comes along
311    and due to type based aliasing rules decides that for two overlapping
312    union temporaries { short s; int i; } accesses to the same mem through
313    different types may not alias and happily reorders stores across
314    life-time boundaries of the temporaries (See PR25654).
315    We also have to mind MEM_IN_STRUCT_P and MEM_SCALAR_P.  */
316 
317 static void
add_alias_set_conflicts(void)318 add_alias_set_conflicts (void)
319 {
320   size_t i, j, n = stack_vars_num;
321 
322   for (i = 0; i < n; ++i)
323     {
324       tree type_i = TREE_TYPE (stack_vars[i].decl);
325       bool aggr_i = AGGREGATE_TYPE_P (type_i);
326       bool contains_union;
327 
328       contains_union = aggregate_contains_union_type (type_i);
329       for (j = 0; j < i; ++j)
330 	{
331 	  tree type_j = TREE_TYPE (stack_vars[j].decl);
332 	  bool aggr_j = AGGREGATE_TYPE_P (type_j);
333 	  if (aggr_i != aggr_j
334 	      /* Either the objects conflict by means of type based
335 		 aliasing rules, or we need to add a conflict.  */
336 	      || !objects_must_conflict_p (type_i, type_j)
337 	      /* In case the types do not conflict ensure that access
338 		 to elements will conflict.  In case of unions we have
339 		 to be careful as type based aliasing rules may say
340 		 access to the same memory does not conflict.  So play
341 		 safe and add a conflict in this case.  */
342 	      || contains_union)
343 	    add_stack_var_conflict (i, j);
344 	}
345     }
346 }
347 
348 /* A subroutine of partition_stack_vars.  A comparison function for qsort,
349    sorting an array of indicies by the size of the object.  */
350 
351 static int
stack_var_size_cmp(const void * a,const void * b)352 stack_var_size_cmp (const void *a, const void *b)
353 {
354   HOST_WIDE_INT sa = stack_vars[*(const size_t *)a].size;
355   HOST_WIDE_INT sb = stack_vars[*(const size_t *)b].size;
356   unsigned int uida = DECL_UID (stack_vars[*(const size_t *)a].decl);
357   unsigned int uidb = DECL_UID (stack_vars[*(const size_t *)b].decl);
358 
359   if (sa < sb)
360     return -1;
361   if (sa > sb)
362     return 1;
363   /* For stack variables of the same size use the uid of the decl
364      to make the sort stable.  */
365   if (uida < uidb)
366     return -1;
367   if (uida > uidb)
368     return 1;
369   return 0;
370 }
371 
372 /* A subroutine of partition_stack_vars.  The UNION portion of a UNION/FIND
373    partitioning algorithm.  Partitions A and B are known to be non-conflicting.
374    Merge them into a single partition A.
375 
376    At the same time, add OFFSET to all variables in partition B.  At the end
377    of the partitioning process we've have a nice block easy to lay out within
378    the stack frame.  */
379 
380 static void
union_stack_vars(size_t a,size_t b,HOST_WIDE_INT offset)381 union_stack_vars (size_t a, size_t b, HOST_WIDE_INT offset)
382 {
383   size_t i, last;
384 
385   /* Update each element of partition B with the given offset,
386      and merge them into partition A.  */
387   for (last = i = b; i != EOC; last = i, i = stack_vars[i].next)
388     {
389       stack_vars[i].offset += offset;
390       stack_vars[i].representative = a;
391     }
392   stack_vars[last].next = stack_vars[a].next;
393   stack_vars[a].next = b;
394 
395   /* Update the required alignment of partition A to account for B.  */
396   if (stack_vars[a].alignb < stack_vars[b].alignb)
397     stack_vars[a].alignb = stack_vars[b].alignb;
398 
399   /* Update the interference graph and merge the conflicts.  */
400   for (last = stack_vars_num, i = 0; i < last; ++i)
401     if (stack_var_conflict_p (b, i))
402       add_stack_var_conflict (a, i);
403 }
404 
405 /* A subroutine of expand_used_vars.  Binpack the variables into
406    partitions constrained by the interference graph.  The overall
407    algorithm used is as follows:
408 
409 	Sort the objects by size.
410 	For each object A {
411 	  S = size(A)
412 	  O = 0
413 	  loop {
414 	    Look for the largest non-conflicting object B with size <= S.
415 	    UNION (A, B)
416 	    offset(B) = O
417 	    O += size(B)
418 	    S -= size(B)
419 	  }
420 	}
421 */
422 
423 static void
partition_stack_vars(void)424 partition_stack_vars (void)
425 {
426   size_t si, sj, n = stack_vars_num;
427 
428   stack_vars_sorted = XNEWVEC (size_t, stack_vars_num);
429   for (si = 0; si < n; ++si)
430     stack_vars_sorted[si] = si;
431 
432   if (n == 1)
433     return;
434 
435   if (flag_stack_shuffle)
436     {
437       /* Fisher-Yates shuffle */
438       for (si = n - 1; si > 0; si--)
439 	{
440 	  size_t tmp;
441 	  sj = arc4random_uniform(si + 1);
442 
443 	  tmp = stack_vars_sorted[si];
444 	  stack_vars_sorted[si] = stack_vars_sorted[sj];
445 	  stack_vars_sorted[sj] = tmp;
446 	}
447     }
448   else
449     qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_size_cmp);
450 
451   /* Special case: detect when all variables conflict, and thus we can't
452      do anything during the partitioning loop.  It isn't uncommon (with
453      C code at least) to declare all variables at the top of the function,
454      and if we're not inlining, then all variables will be in the same scope.
455      Take advantage of very fast libc routines for this scan.  */
456   gcc_assert (sizeof(bool) == sizeof(char));
457   if (memchr (stack_vars_conflict, false, stack_vars_conflict_alloc) == NULL)
458     return;
459 
460   for (si = 0; si < n; ++si)
461     {
462       size_t i = stack_vars_sorted[si];
463       HOST_WIDE_INT isize = stack_vars[i].size;
464       HOST_WIDE_INT offset = 0;
465 
466       for (sj = si; sj-- > 0; )
467 	{
468 	  size_t j = stack_vars_sorted[sj];
469 	  HOST_WIDE_INT jsize = stack_vars[j].size;
470 	  unsigned int jalign = stack_vars[j].alignb;
471 
472 	  /* Ignore objects that aren't partition representatives.  */
473 	  if (stack_vars[j].representative != j)
474 	    continue;
475 
476 	  /* Ignore objects too large for the remaining space.  */
477 	  if (isize < jsize)
478 	    continue;
479 
480 	  /* Ignore conflicting objects.  */
481 	  if (stack_var_conflict_p (i, j))
482 	    continue;
483 
484 	  /* Refine the remaining space check to include alignment.  */
485 	  if (offset & (jalign - 1))
486 	    {
487 	      HOST_WIDE_INT toff = offset;
488 	      toff += jalign - 1;
489 	      toff &= -(HOST_WIDE_INT)jalign;
490 	      if (isize - (toff - offset) < jsize)
491 		continue;
492 
493 	      isize -= toff - offset;
494 	      offset = toff;
495 	    }
496 
497 	  /* UNION the objects, placing J at OFFSET.  */
498 	  union_stack_vars (i, j, offset);
499 
500 	  isize -= jsize;
501 	  if (isize == 0)
502 	    break;
503 	}
504     }
505 }
506 
507 /* A debugging aid for expand_used_vars.  Dump the generated partitions.  */
508 
509 static void
dump_stack_var_partition(void)510 dump_stack_var_partition (void)
511 {
512   size_t si, i, j, n = stack_vars_num;
513 
514   for (si = 0; si < n; ++si)
515     {
516       i = stack_vars_sorted[si];
517 
518       /* Skip variables that aren't partition representatives, for now.  */
519       if (stack_vars[i].representative != i)
520 	continue;
521 
522       fprintf (dump_file, "Partition %lu: size " HOST_WIDE_INT_PRINT_DEC
523 	       " align %u\n", (unsigned long) i, stack_vars[i].size,
524 	       stack_vars[i].alignb);
525 
526       for (j = i; j != EOC; j = stack_vars[j].next)
527 	{
528 	  fputc ('\t', dump_file);
529 	  print_generic_expr (dump_file, stack_vars[j].decl, dump_flags);
530 	  fprintf (dump_file, ", offset " HOST_WIDE_INT_PRINT_DEC "\n",
531 		   stack_vars[i].offset);
532 	}
533     }
534 }
535 
536 /* Assign rtl to DECL at frame offset OFFSET.  */
537 
538 static void
expand_one_stack_var_at(tree decl,HOST_WIDE_INT offset)539 expand_one_stack_var_at (tree decl, HOST_WIDE_INT offset)
540 {
541   HOST_WIDE_INT align;
542   rtx x;
543 
544   /* If this fails, we've overflowed the stack frame.  Error nicely?  */
545   gcc_assert (offset == trunc_int_for_mode (offset, Pmode));
546 
547   x = plus_constant (virtual_stack_vars_rtx, offset);
548   x = gen_rtx_MEM (DECL_MODE (decl), x);
549 
550   /* Set alignment we actually gave this decl.  */
551   offset -= frame_phase;
552   align = offset & -offset;
553   align *= BITS_PER_UNIT;
554   if (align > STACK_BOUNDARY || align == 0)
555     align = STACK_BOUNDARY;
556   DECL_ALIGN (decl) = align;
557   DECL_USER_ALIGN (decl) = 0;
558 
559   set_mem_attributes (x, decl, true);
560   SET_DECL_RTL (decl, x);
561 }
562 
563 /* A subroutine of expand_used_vars.  Give each partition representative
564    a unique location within the stack frame.  Update each partition member
565    with that location.  */
566 
567 static void
expand_stack_vars(bool (* pred)(tree))568 expand_stack_vars (bool (*pred) (tree))
569 {
570   size_t si, i, j, n = stack_vars_num;
571 
572   for (si = 0; si < n; ++si)
573     {
574       HOST_WIDE_INT offset;
575 
576       i = stack_vars_sorted[si];
577 
578       /* Skip variables that aren't partition representatives, for now.  */
579       if (stack_vars[i].representative != i)
580 	continue;
581 
582       /* Skip variables that have already had rtl assigned.  See also
583 	 add_stack_var where we perpetrate this pc_rtx hack.  */
584       if (DECL_RTL (stack_vars[i].decl) != pc_rtx)
585 	continue;
586 
587       /* Check the predicate to see whether this variable should be
588 	 allocated in this pass.  */
589       if (pred && !pred (stack_vars[i].decl))
590 	continue;
591 
592       offset = alloc_stack_frame_space (stack_vars[i].size,
593 					stack_vars[i].alignb);
594 
595       /* Create rtl for each variable based on their location within the
596 	 partition.  */
597       for (j = i; j != EOC; j = stack_vars[j].next)
598 	expand_one_stack_var_at (stack_vars[j].decl,
599 				 stack_vars[j].offset + offset);
600     }
601 }
602 
603 /* A subroutine of expand_one_var.  Called to immediately assign rtl
604    to a variable to be allocated in the stack frame.  */
605 
606 static void
expand_one_stack_var(tree var)607 expand_one_stack_var (tree var)
608 {
609   HOST_WIDE_INT size, offset, align;
610 
611   size = tree_low_cst (DECL_SIZE_UNIT (var), 1);
612   align = get_decl_align_unit (var);
613   offset = alloc_stack_frame_space (size, align);
614 
615   expand_one_stack_var_at (var, offset);
616 }
617 
618 /* A subroutine of expand_one_var.  Called to assign rtl
619    to a TREE_STATIC VAR_DECL.  */
620 
621 static void
expand_one_static_var(tree var)622 expand_one_static_var (tree var)
623 {
624   /* In unit-at-a-time all the static variables are expanded at the end
625      of compilation process.  */
626   if (flag_unit_at_a_time)
627     return;
628   /* If this is an inlined copy of a static local variable,
629      look up the original.  */
630   var = DECL_ORIGIN (var);
631 
632   /* If we've already processed this variable because of that, do nothing.  */
633   if (TREE_ASM_WRITTEN (var))
634     return;
635 
636   /* Give the front end a chance to do whatever.  In practice, this is
637      resolving duplicate names for IMA in C.  */
638   if (lang_hooks.expand_decl (var))
639     return;
640 
641   /* Otherwise, just emit the variable.  */
642   rest_of_decl_compilation (var, 0, 0);
643 }
644 
645 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL
646    that will reside in a hard register.  */
647 
648 static void
expand_one_hard_reg_var(tree var)649 expand_one_hard_reg_var (tree var)
650 {
651   rest_of_decl_compilation (var, 0, 0);
652 }
653 
654 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL
655    that will reside in a pseudo register.  */
656 
657 static void
expand_one_register_var(tree var)658 expand_one_register_var (tree var)
659 {
660   tree type = TREE_TYPE (var);
661   int unsignedp = TYPE_UNSIGNED (type);
662   enum machine_mode reg_mode
663     = promote_mode (type, DECL_MODE (var), &unsignedp, 0);
664   rtx x = gen_reg_rtx (reg_mode);
665 
666   SET_DECL_RTL (var, x);
667 
668   /* Note if the object is a user variable.  */
669   if (!DECL_ARTIFICIAL (var))
670     {
671       mark_user_reg (x);
672 
673       /* Trust user variables which have a pointer type to really
674 	 be pointers.  Do not trust compiler generated temporaries
675 	 as our type system is totally busted as it relates to
676 	 pointer arithmetic which translates into lots of compiler
677 	 generated objects with pointer types, but which are not really
678 	 pointers.  */
679       if (POINTER_TYPE_P (type))
680 	mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (var))));
681     }
682 }
683 
684 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL that
685    has some associated error, e.g. its type is error-mark.  We just need
686    to pick something that won't crash the rest of the compiler.  */
687 
688 static void
expand_one_error_var(tree var)689 expand_one_error_var (tree var)
690 {
691   enum machine_mode mode = DECL_MODE (var);
692   rtx x;
693 
694   if (mode == BLKmode)
695     x = gen_rtx_MEM (BLKmode, const0_rtx);
696   else if (mode == VOIDmode)
697     x = const0_rtx;
698   else
699     x = gen_reg_rtx (mode);
700 
701   SET_DECL_RTL (var, x);
702 }
703 
704 /* A subroutine of expand_one_var.  VAR is a variable that will be
705    allocated to the local stack frame.  Return true if we wish to
706    add VAR to STACK_VARS so that it will be coalesced with other
707    variables.  Return false to allocate VAR immediately.
708 
709    This function is used to reduce the number of variables considered
710    for coalescing, which reduces the size of the quadratic problem.  */
711 
712 static bool
defer_stack_allocation(tree var,bool toplevel)713 defer_stack_allocation (tree var, bool toplevel)
714 {
715   /* If stack protection is enabled, *all* stack variables must be deferred,
716      so that we can re-order the strings to the top of the frame.  */
717   if (flag_stack_protect)
718     return true;
719 
720   /* Variables in the outermost scope automatically conflict with
721      every other variable.  The only reason to want to defer them
722      at all is that, after sorting, we can more efficiently pack
723      small variables in the stack frame.  Continue to defer at -O2.  */
724   if (toplevel && optimize < 2)
725     return false;
726 
727   /* Without optimization, *most* variables are allocated from the
728      stack, which makes the quadratic problem large exactly when we
729      want compilation to proceed as quickly as possible.  On the
730      other hand, we don't want the function's stack frame size to
731      get completely out of hand.  So we avoid adding scalars and
732      "small" aggregates to the list at all.  */
733   if (optimize == 0 && tree_low_cst (DECL_SIZE_UNIT (var), 1) < 32)
734     return false;
735 
736   return true;
737 }
738 
739 /* A subroutine of expand_used_vars.  Expand one variable according to
740    its flavor.  Variables to be placed on the stack are not actually
741    expanded yet, merely recorded.  */
742 
743 static void
expand_one_var(tree var,bool toplevel)744 expand_one_var (tree var, bool toplevel)
745 {
746   if (TREE_CODE (var) != VAR_DECL)
747     lang_hooks.expand_decl (var);
748   else if (DECL_EXTERNAL (var))
749     ;
750   else if (DECL_HAS_VALUE_EXPR_P (var))
751     ;
752   else if (TREE_STATIC (var))
753     expand_one_static_var (var);
754   else if (DECL_RTL_SET_P (var))
755     ;
756   else if (TREE_TYPE (var) == error_mark_node)
757     expand_one_error_var (var);
758   else if (DECL_HARD_REGISTER (var))
759     expand_one_hard_reg_var (var);
760   else if (use_register_for_decl (var))
761     expand_one_register_var (var);
762   else if (defer_stack_allocation (var, toplevel))
763     add_stack_var (var);
764   else
765     expand_one_stack_var (var);
766 }
767 
768 /* A subroutine of expand_used_vars.  Walk down through the BLOCK tree
769    expanding variables.  Those variables that can be put into registers
770    are allocated pseudos; those that can't are put on the stack.
771 
772    TOPLEVEL is true if this is the outermost BLOCK.  */
773 
774 static void
expand_used_vars_for_block(tree block,bool toplevel)775 expand_used_vars_for_block (tree block, bool toplevel)
776 {
777   size_t i, j, old_sv_num, this_sv_num, new_sv_num;
778   tree t;
779 
780   old_sv_num = toplevel ? 0 : stack_vars_num;
781 
782   /* Expand all variables at this level.  */
783   for (t = BLOCK_VARS (block); t ; t = TREE_CHAIN (t))
784     if (TREE_USED (t)
785 	/* Force local static variables to be output when marked by
786 	   used attribute.  For unit-at-a-time, cgraph code already takes
787 	   care of this.  */
788 	|| (!flag_unit_at_a_time && TREE_STATIC (t)
789 	    && DECL_PRESERVE_P (t)))
790       expand_one_var (t, toplevel);
791 
792   this_sv_num = stack_vars_num;
793 
794   /* Expand all variables at containing levels.  */
795   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
796     expand_used_vars_for_block (t, false);
797 
798   /* Since we do not track exact variable lifetimes (which is not even
799      possible for variables whose address escapes), we mirror the block
800      tree in the interference graph.  Here we cause all variables at this
801      level, and all sublevels, to conflict.  Do make certain that a
802      variable conflicts with itself.  */
803   if (old_sv_num < this_sv_num)
804     {
805       new_sv_num = stack_vars_num;
806       resize_stack_vars_conflict (new_sv_num);
807 
808       for (i = old_sv_num; i < new_sv_num; ++i)
809 	for (j = i < this_sv_num ? i+1 : this_sv_num; j-- > old_sv_num ;)
810 	  add_stack_var_conflict (i, j);
811     }
812 }
813 
814 /* A subroutine of expand_used_vars.  Walk down through the BLOCK tree
815    and clear TREE_USED on all local variables.  */
816 
817 static void
clear_tree_used(tree block)818 clear_tree_used (tree block)
819 {
820   tree t;
821 
822   for (t = BLOCK_VARS (block); t ; t = TREE_CHAIN (t))
823     /* if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) */
824       TREE_USED (t) = 0;
825 
826   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
827     clear_tree_used (t);
828 }
829 
830 enum {
831   SPCT_FLAG_DEFAULT = 1,
832   SPCT_FLAG_ALL = 2,
833   SPCT_FLAG_STRONG = 3
834 };
835 
836 /* Examine TYPE and determine a bit mask of the following features.  */
837 
838 #define SPCT_HAS_LARGE_CHAR_ARRAY	1
839 #define SPCT_HAS_SMALL_CHAR_ARRAY	2
840 #define SPCT_HAS_ARRAY			4
841 #define SPCT_HAS_AGGREGATE		8
842 
843 static unsigned int
stack_protect_classify_type(tree type)844 stack_protect_classify_type (tree type)
845 {
846   unsigned int ret = 0;
847   tree t;
848 
849   switch (TREE_CODE (type))
850     {
851     case ARRAY_TYPE:
852       t = TYPE_MAIN_VARIANT (TREE_TYPE (type));
853       if (t == char_type_node
854 	  || t == signed_char_type_node
855 	  || t == unsigned_char_type_node)
856 	{
857 	  unsigned HOST_WIDE_INT max = PARAM_VALUE (PARAM_SSP_BUFFER_SIZE);
858 	  unsigned HOST_WIDE_INT len;
859 
860 	  if (!TYPE_SIZE_UNIT (type)
861 	      || !host_integerp (TYPE_SIZE_UNIT (type), 1))
862 	    len = max;
863 	  else
864 	    len = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
865 
866 	  if (len < max)
867 	    ret = SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_ARRAY;
868 	  else
869 	    ret = SPCT_HAS_LARGE_CHAR_ARRAY | SPCT_HAS_ARRAY;
870 	}
871       else
872 	ret = SPCT_HAS_ARRAY;
873       break;
874 
875     case UNION_TYPE:
876     case QUAL_UNION_TYPE:
877     case RECORD_TYPE:
878       ret = SPCT_HAS_AGGREGATE;
879       for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t))
880 	if (TREE_CODE (t) == FIELD_DECL)
881 	  ret |= stack_protect_classify_type (TREE_TYPE (t));
882       break;
883 
884     default:
885       break;
886     }
887 
888   return ret;
889 }
890 
891 /* Return nonzero if DECL should be segregated into the "vulnerable" upper
892    part of the local stack frame.  Remember if we ever return nonzero for
893    any variable in this function.  The return value is the phase number in
894    which the variable should be allocated.  */
895 
896 static int
stack_protect_decl_phase(tree decl)897 stack_protect_decl_phase (tree decl)
898 {
899   unsigned int bits = stack_protect_classify_type (TREE_TYPE (decl));
900   int ret = 0;
901 
902   if (bits & SPCT_HAS_SMALL_CHAR_ARRAY)
903     has_short_buffer = true;
904 
905   if (flag_stack_protect == SPCT_FLAG_ALL
906       || flag_stack_protect == SPCT_FLAG_STRONG)
907     {
908       if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY))
909 	  && !(bits & SPCT_HAS_AGGREGATE))
910 	ret = 1;
911       else if (bits & SPCT_HAS_ARRAY)
912 	ret = 2;
913     }
914   else
915     ret = (bits & SPCT_HAS_LARGE_CHAR_ARRAY) != 0;
916 
917   if (ret)
918     has_protected_decls = true;
919 
920   return ret;
921 }
922 
923 /* Two helper routines that check for phase 1 and phase 2.  These are used
924    as callbacks for expand_stack_vars.  */
925 
926 static bool
stack_protect_decl_phase_1(tree decl)927 stack_protect_decl_phase_1 (tree decl)
928 {
929   return stack_protect_decl_phase (decl) == 1;
930 }
931 
932 static bool
stack_protect_decl_phase_2(tree decl)933 stack_protect_decl_phase_2 (tree decl)
934 {
935   return stack_protect_decl_phase (decl) == 2;
936 }
937 
938 /* Ensure that variables in different stack protection phases conflict
939    so that they are not merged and share the same stack slot.  */
940 
941 static void
add_stack_protection_conflicts(void)942 add_stack_protection_conflicts (void)
943 {
944   size_t i, j, n = stack_vars_num;
945   unsigned char *phase;
946 
947   phase = XNEWVEC (unsigned char, n);
948   for (i = 0; i < n; ++i)
949     phase[i] = stack_protect_decl_phase (stack_vars[i].decl);
950 
951   for (i = 0; i < n; ++i)
952     {
953       unsigned char ph_i = phase[i];
954       for (j = 0; j < i; ++j)
955 	if (ph_i != phase[j])
956 	  add_stack_var_conflict (i, j);
957     }
958 
959   XDELETEVEC (phase);
960 }
961 
962 /* Create a decl for the guard at the top of the stack frame.  */
963 
964 static void
create_stack_guard(bool protect)965 create_stack_guard (bool protect)
966 {
967   tree guard = build_decl (VAR_DECL, NULL, ptr_type_node);
968   TREE_THIS_VOLATILE (guard) = 1;
969   TREE_USED (guard) = 1;
970   expand_one_stack_var (guard);
971   if (protect)
972     cfun->stack_protect_guard = guard;
973 }
974 
975 /* Helper routine to check if a record or union contains an array field. */
976 
977 static int
record_or_union_type_has_array_p(tree tree_type)978 record_or_union_type_has_array_p (tree tree_type)
979 {
980   tree fields = TYPE_FIELDS (tree_type);
981   tree f;
982 
983   for (f = fields; f; f = TREE_CHAIN (f))
984     if (TREE_CODE (f) == FIELD_DECL)
985       {
986 	tree field_type = TREE_TYPE (f);
987 	if ((TREE_CODE (field_type) == RECORD_TYPE
988 	     || TREE_CODE (field_type) == UNION_TYPE
989 	     || TREE_CODE (field_type) == QUAL_UNION_TYPE)
990 	    && record_or_union_type_has_array_p (field_type))
991 	  return 1;
992 	if (TREE_CODE (field_type) == ARRAY_TYPE)
993 	  return 1;
994       }
995   return 0;
996 }
997 
998 /* Expand all variables used in the function.  */
999 
1000 static void
expand_used_vars(void)1001 expand_used_vars (void)
1002 {
1003   tree t, outer_block = DECL_INITIAL (current_function_decl);
1004   bool gen_stack_protect_signal = false;
1005 
1006   /* Compute the phase of the stack frame for this function.  */
1007   {
1008     int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1009     int off = STARTING_FRAME_OFFSET % align;
1010     frame_phase = off ? align - off : 0;
1011   }
1012 
1013   /* Set TREE_USED on all variables in the unexpanded_var_list.  */
1014   for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
1015     TREE_USED (TREE_VALUE (t)) = 1;
1016 
1017   /* Clear TREE_USED on all variables associated with a block scope.  */
1018   clear_tree_used (outer_block);
1019 
1020   /* Initialize local stack smashing state.  */
1021   has_protected_decls = false;
1022   has_short_buffer = false;
1023 
1024   if (flag_stack_protect == SPCT_FLAG_STRONG)
1025     for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
1026       {
1027 	tree var = TREE_VALUE (t);
1028 	if (!is_global_var (var))
1029 	  {
1030 	    tree var_type = TREE_TYPE (var);
1031 	    /* Examine local referenced variables that have their addresses
1032 	     * taken, contain an array, or are arrays. */
1033 	    if (TREE_CODE (var) == VAR_DECL
1034 		&& (TREE_CODE (var_type) == ARRAY_TYPE
1035 		    || TREE_ADDRESSABLE (var)
1036 		    || ((TREE_CODE (var_type) == RECORD_TYPE
1037 			 || TREE_CODE (var_type) == UNION_TYPE
1038 			 || TREE_CODE (var_type) == QUAL_UNION_TYPE)
1039 			&& record_or_union_type_has_array_p (var_type))))
1040 	      {
1041 		gen_stack_protect_signal = true;
1042 		break;
1043 	      }
1044 	  }
1045       }
1046 
1047   /* At this point all variables on the unexpanded_var_list with TREE_USED
1048      set are not associated with any block scope.  Lay them out.  */
1049   for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
1050     {
1051       tree var = TREE_VALUE (t);
1052       bool expand_now = false;
1053 
1054       /* We didn't set a block for static or extern because it's hard
1055 	 to tell the difference between a global variable (re)declared
1056 	 in a local scope, and one that's really declared there to
1057 	 begin with.  And it doesn't really matter much, since we're
1058 	 not giving them stack space.  Expand them now.  */
1059       if (TREE_STATIC (var) || DECL_EXTERNAL (var))
1060 	expand_now = true;
1061 
1062       /* Any variable that could have been hoisted into an SSA_NAME
1063 	 will have been propagated anywhere the optimizers chose,
1064 	 i.e. not confined to their original block.  Allocate them
1065 	 as if they were defined in the outermost scope.  */
1066       else if (is_gimple_reg (var))
1067 	expand_now = true;
1068 
1069       /* If the variable is not associated with any block, then it
1070 	 was created by the optimizers, and could be live anywhere
1071 	 in the function.  */
1072       else if (TREE_USED (var))
1073 	expand_now = true;
1074 
1075       /* Finally, mark all variables on the list as used.  We'll use
1076 	 this in a moment when we expand those associated with scopes.  */
1077       TREE_USED (var) = 1;
1078 
1079       if (expand_now)
1080 	expand_one_var (var, true);
1081     }
1082   cfun->unexpanded_var_list = NULL_TREE;
1083 
1084   /* At this point, all variables within the block tree with TREE_USED
1085      set are actually used by the optimized function.  Lay them out.  */
1086   expand_used_vars_for_block (outer_block, true);
1087 
1088   if (stack_vars_num > 0)
1089     {
1090       /* Due to the way alias sets work, no variables with non-conflicting
1091 	 alias sets may be assigned the same address.  Add conflicts to
1092 	 reflect this.  */
1093       add_alias_set_conflicts ();
1094 
1095       /* If stack protection is enabled, we don't share space between
1096 	 vulnerable data and non-vulnerable data.  */
1097       if (flag_stack_protect)
1098 	add_stack_protection_conflicts ();
1099 
1100       /* Now that we have collected all stack variables, and have computed a
1101 	 minimal interference graph, attempt to save some stack space.  */
1102       partition_stack_vars ();
1103       if (dump_file)
1104 	dump_stack_var_partition ();
1105     }
1106 
1107   switch (flag_stack_protect)
1108     {
1109     case SPCT_FLAG_ALL:
1110       create_stack_guard (true);
1111       break;
1112 
1113     case SPCT_FLAG_STRONG:
1114       create_stack_guard (gen_stack_protect_signal
1115 	  || current_function_calls_alloca || has_protected_decls);
1116       break;
1117 
1118     case SPCT_FLAG_DEFAULT:
1119       create_stack_guard(current_function_calls_alloca || has_protected_decls);
1120       break;
1121 
1122     default:
1123       ;
1124     }
1125 
1126   /* Assign rtl to each variable based on these partitions.  */
1127   if (stack_vars_num > 0)
1128     {
1129       if (!flag_stack_shuffle)
1130 	{
1131 	  /* Reorder decls to be protected by iterating over the variables
1132 	     array multiple times, and allocating out of each phase in turn.  */
1133 	  /* ??? We could probably integrate this into the qsort we did
1134 	     earlier, such that we naturally see these variables first,
1135 	     and thus naturally allocate things in the right order.  */
1136 	  if (has_protected_decls)
1137 	    {
1138 	      /* Phase 1 contains only character arrays.  */
1139 	      expand_stack_vars (stack_protect_decl_phase_1);
1140 
1141 	      /* Phase 2 contains other kinds of arrays.  */
1142 	      if (flag_stack_protect == 2)
1143 		expand_stack_vars (stack_protect_decl_phase_2);
1144 	    }
1145 	}
1146 
1147       expand_stack_vars (NULL);
1148 
1149       /* Free up stack variable graph data.  */
1150       XDELETEVEC (stack_vars);
1151       XDELETEVEC (stack_vars_sorted);
1152       XDELETEVEC (stack_vars_conflict);
1153       stack_vars = NULL;
1154       stack_vars_alloc = stack_vars_num = 0;
1155       stack_vars_conflict = NULL;
1156       stack_vars_conflict_alloc = 0;
1157     }
1158 
1159   /* If the target requires that FRAME_OFFSET be aligned, do it.  */
1160   if (STACK_ALIGNMENT_NEEDED)
1161     {
1162       HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1163       if (!FRAME_GROWS_DOWNWARD)
1164 	frame_offset += align - 1;
1165       frame_offset &= -align;
1166     }
1167 }
1168 
1169 
1170 /* If we need to produce a detailed dump, print the tree representation
1171    for STMT to the dump file.  SINCE is the last RTX after which the RTL
1172    generated for STMT should have been appended.  */
1173 
1174 static void
maybe_dump_rtl_for_tree_stmt(tree stmt,rtx since)1175 maybe_dump_rtl_for_tree_stmt (tree stmt, rtx since)
1176 {
1177   if (dump_file && (dump_flags & TDF_DETAILS))
1178     {
1179       fprintf (dump_file, "\n;; ");
1180       print_generic_expr (dump_file, stmt, TDF_SLIM);
1181       fprintf (dump_file, "\n");
1182 
1183       print_rtl (dump_file, since ? NEXT_INSN (since) : since);
1184     }
1185 }
1186 
1187 /* A subroutine of expand_gimple_basic_block.  Expand one COND_EXPR.
1188    Returns a new basic block if we've terminated the current basic
1189    block and created a new one.  */
1190 
1191 static basic_block
expand_gimple_cond_expr(basic_block bb,tree stmt)1192 expand_gimple_cond_expr (basic_block bb, tree stmt)
1193 {
1194   basic_block new_bb, dest;
1195   edge new_edge;
1196   edge true_edge;
1197   edge false_edge;
1198   tree pred = COND_EXPR_COND (stmt);
1199   tree then_exp = COND_EXPR_THEN (stmt);
1200   tree else_exp = COND_EXPR_ELSE (stmt);
1201   rtx last2, last;
1202 
1203   last2 = last = get_last_insn ();
1204 
1205   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1206   if (EXPR_LOCUS (stmt))
1207     {
1208       emit_line_note (*(EXPR_LOCUS (stmt)));
1209       record_block_change (TREE_BLOCK (stmt));
1210     }
1211 
1212   /* These flags have no purpose in RTL land.  */
1213   true_edge->flags &= ~EDGE_TRUE_VALUE;
1214   false_edge->flags &= ~EDGE_FALSE_VALUE;
1215 
1216   /* We can either have a pure conditional jump with one fallthru edge or
1217      two-way jump that needs to be decomposed into two basic blocks.  */
1218   if (TREE_CODE (then_exp) == GOTO_EXPR && IS_EMPTY_STMT (else_exp))
1219     {
1220       jumpif (pred, label_rtx (GOTO_DESTINATION (then_exp)));
1221       add_reg_br_prob_note (last, true_edge->probability);
1222       maybe_dump_rtl_for_tree_stmt (stmt, last);
1223       if (EXPR_LOCUS (then_exp))
1224 	emit_line_note (*(EXPR_LOCUS (then_exp)));
1225       return NULL;
1226     }
1227   if (TREE_CODE (else_exp) == GOTO_EXPR && IS_EMPTY_STMT (then_exp))
1228     {
1229       jumpifnot (pred, label_rtx (GOTO_DESTINATION (else_exp)));
1230       add_reg_br_prob_note (last, false_edge->probability);
1231       maybe_dump_rtl_for_tree_stmt (stmt, last);
1232       if (EXPR_LOCUS (else_exp))
1233 	emit_line_note (*(EXPR_LOCUS (else_exp)));
1234       return NULL;
1235     }
1236   gcc_assert (TREE_CODE (then_exp) == GOTO_EXPR
1237 	      && TREE_CODE (else_exp) == GOTO_EXPR);
1238 
1239   jumpif (pred, label_rtx (GOTO_DESTINATION (then_exp)));
1240   add_reg_br_prob_note (last, true_edge->probability);
1241   last = get_last_insn ();
1242   expand_expr (else_exp, const0_rtx, VOIDmode, 0);
1243 
1244   BB_END (bb) = last;
1245   if (BARRIER_P (BB_END (bb)))
1246     BB_END (bb) = PREV_INSN (BB_END (bb));
1247   update_bb_for_insn (bb);
1248 
1249   new_bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
1250   dest = false_edge->dest;
1251   redirect_edge_succ (false_edge, new_bb);
1252   false_edge->flags |= EDGE_FALLTHRU;
1253   new_bb->count = false_edge->count;
1254   new_bb->frequency = EDGE_FREQUENCY (false_edge);
1255   new_edge = make_edge (new_bb, dest, 0);
1256   new_edge->probability = REG_BR_PROB_BASE;
1257   new_edge->count = new_bb->count;
1258   if (BARRIER_P (BB_END (new_bb)))
1259     BB_END (new_bb) = PREV_INSN (BB_END (new_bb));
1260   update_bb_for_insn (new_bb);
1261 
1262   maybe_dump_rtl_for_tree_stmt (stmt, last2);
1263 
1264   if (EXPR_LOCUS (else_exp))
1265     emit_line_note (*(EXPR_LOCUS (else_exp)));
1266 
1267   return new_bb;
1268 }
1269 
1270 /* A subroutine of expand_gimple_basic_block.  Expand one CALL_EXPR
1271    that has CALL_EXPR_TAILCALL set.  Returns non-null if we actually
1272    generated a tail call (something that might be denied by the ABI
1273    rules governing the call; see calls.c).
1274 
1275    Sets CAN_FALLTHRU if we generated a *conditional* tail call, and
1276    can still reach the rest of BB.  The case here is __builtin_sqrt,
1277    where the NaN result goes through the external function (with a
1278    tailcall) and the normal result happens via a sqrt instruction.  */
1279 
1280 static basic_block
expand_gimple_tailcall(basic_block bb,tree stmt,bool * can_fallthru)1281 expand_gimple_tailcall (basic_block bb, tree stmt, bool *can_fallthru)
1282 {
1283   rtx last2, last;
1284   edge e;
1285   edge_iterator ei;
1286   int probability;
1287   gcov_type count;
1288 
1289   last2 = last = get_last_insn ();
1290 
1291   expand_expr_stmt (stmt);
1292 
1293   for (last = NEXT_INSN (last); last; last = NEXT_INSN (last))
1294     if (CALL_P (last) && SIBLING_CALL_P (last))
1295       goto found;
1296 
1297   maybe_dump_rtl_for_tree_stmt (stmt, last2);
1298 
1299   *can_fallthru = true;
1300   return NULL;
1301 
1302  found:
1303   /* ??? Wouldn't it be better to just reset any pending stack adjust?
1304      Any instructions emitted here are about to be deleted.  */
1305   do_pending_stack_adjust ();
1306 
1307   /* Remove any non-eh, non-abnormal edges that don't go to exit.  */
1308   /* ??? I.e. the fallthrough edge.  HOWEVER!  If there were to be
1309      EH or abnormal edges, we shouldn't have created a tail call in
1310      the first place.  So it seems to me we should just be removing
1311      all edges here, or redirecting the existing fallthru edge to
1312      the exit block.  */
1313 
1314   probability = 0;
1315   count = 0;
1316 
1317   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1318     {
1319       if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
1320 	{
1321 	  if (e->dest != EXIT_BLOCK_PTR)
1322 	    {
1323 	      e->dest->count -= e->count;
1324 	      e->dest->frequency -= EDGE_FREQUENCY (e);
1325 	      if (e->dest->count < 0)
1326 		e->dest->count = 0;
1327 	      if (e->dest->frequency < 0)
1328 		e->dest->frequency = 0;
1329 	    }
1330 	  count += e->count;
1331 	  probability += e->probability;
1332 	  remove_edge (e);
1333 	}
1334       else
1335 	ei_next (&ei);
1336     }
1337 
1338   /* This is somewhat ugly: the call_expr expander often emits instructions
1339      after the sibcall (to perform the function return).  These confuse the
1340      find_many_sub_basic_blocks code, so we need to get rid of these.  */
1341   last = NEXT_INSN (last);
1342   gcc_assert (BARRIER_P (last));
1343 
1344   *can_fallthru = false;
1345   while (NEXT_INSN (last))
1346     {
1347       /* For instance an sqrt builtin expander expands if with
1348 	 sibcall in the then and label for `else`.  */
1349       if (LABEL_P (NEXT_INSN (last)))
1350 	{
1351 	  *can_fallthru = true;
1352 	  break;
1353 	}
1354       delete_insn (NEXT_INSN (last));
1355     }
1356 
1357   e = make_edge (bb, EXIT_BLOCK_PTR, EDGE_ABNORMAL | EDGE_SIBCALL);
1358   e->probability += probability;
1359   e->count += count;
1360   BB_END (bb) = last;
1361   update_bb_for_insn (bb);
1362 
1363   if (NEXT_INSN (last))
1364     {
1365       bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
1366 
1367       last = BB_END (bb);
1368       if (BARRIER_P (last))
1369 	BB_END (bb) = PREV_INSN (last);
1370     }
1371 
1372   maybe_dump_rtl_for_tree_stmt (stmt, last2);
1373 
1374   return bb;
1375 }
1376 
1377 /* Expand basic block BB from GIMPLE trees to RTL.  */
1378 
1379 static basic_block
expand_gimple_basic_block(basic_block bb)1380 expand_gimple_basic_block (basic_block bb)
1381 {
1382   block_stmt_iterator bsi = bsi_start (bb);
1383   tree stmt = NULL;
1384   rtx note, last;
1385   edge e;
1386   edge_iterator ei;
1387 
1388   if (dump_file)
1389     {
1390       fprintf (dump_file,
1391 	       "\n;; Generating RTL for tree basic block %d\n",
1392 	       bb->index);
1393     }
1394 
1395   init_rtl_bb_info (bb);
1396   bb->flags |= BB_RTL;
1397 
1398   if (!bsi_end_p (bsi))
1399     stmt = bsi_stmt (bsi);
1400 
1401   if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
1402     {
1403       last = get_last_insn ();
1404 
1405       expand_expr_stmt (stmt);
1406 
1407       /* Java emits line number notes in the top of labels.
1408 	 ??? Make this go away once line number notes are obsoleted.  */
1409       BB_HEAD (bb) = NEXT_INSN (last);
1410       if (NOTE_P (BB_HEAD (bb)))
1411 	BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb));
1412       bsi_next (&bsi);
1413       note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb));
1414 
1415       maybe_dump_rtl_for_tree_stmt (stmt, last);
1416     }
1417   else
1418     note = BB_HEAD (bb) = emit_note (NOTE_INSN_BASIC_BLOCK);
1419 
1420   NOTE_BASIC_BLOCK (note) = bb;
1421 
1422   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1423     {
1424       /* Clear EDGE_EXECUTABLE.  This flag is never used in the backend.  */
1425       e->flags &= ~EDGE_EXECUTABLE;
1426 
1427       /* At the moment not all abnormal edges match the RTL representation.
1428 	 It is safe to remove them here as find_many_sub_basic_blocks will
1429 	 rediscover them.  In the future we should get this fixed properly.  */
1430       if (e->flags & EDGE_ABNORMAL)
1431 	remove_edge (e);
1432       else
1433 	ei_next (&ei);
1434     }
1435 
1436   for (; !bsi_end_p (bsi); bsi_next (&bsi))
1437     {
1438       tree stmt = bsi_stmt (bsi);
1439       basic_block new_bb;
1440 
1441       if (!stmt)
1442 	continue;
1443 
1444       /* Expand this statement, then evaluate the resulting RTL and
1445 	 fixup the CFG accordingly.  */
1446       if (TREE_CODE (stmt) == COND_EXPR)
1447 	{
1448 	  new_bb = expand_gimple_cond_expr (bb, stmt);
1449 	  if (new_bb)
1450 	    return new_bb;
1451 	}
1452       else
1453 	{
1454 	  tree call = get_call_expr_in (stmt);
1455 	  if (call && CALL_EXPR_TAILCALL (call))
1456 	    {
1457 	      bool can_fallthru;
1458 	      new_bb = expand_gimple_tailcall (bb, stmt, &can_fallthru);
1459 	      if (new_bb)
1460 		{
1461 		  if (can_fallthru)
1462 		    bb = new_bb;
1463 		  else
1464 		    return new_bb;
1465 		}
1466 	    }
1467 	  else
1468 	    {
1469 	      last = get_last_insn ();
1470 	      expand_expr_stmt (stmt);
1471 	      maybe_dump_rtl_for_tree_stmt (stmt, last);
1472 	    }
1473 	}
1474     }
1475 
1476   do_pending_stack_adjust ();
1477 
1478   /* Find the block tail.  The last insn in the block is the insn
1479      before a barrier and/or table jump insn.  */
1480   last = get_last_insn ();
1481   if (BARRIER_P (last))
1482     last = PREV_INSN (last);
1483   if (JUMP_TABLE_DATA_P (last))
1484     last = PREV_INSN (PREV_INSN (last));
1485   BB_END (bb) = last;
1486 
1487   update_bb_for_insn (bb);
1488 
1489   return bb;
1490 }
1491 
1492 
1493 /* Create a basic block for initialization code.  */
1494 
1495 static basic_block
construct_init_block(void)1496 construct_init_block (void)
1497 {
1498   basic_block init_block, first_block;
1499   edge e = NULL;
1500   int flags;
1501 
1502   /* Multiple entry points not supported yet.  */
1503   gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1);
1504   init_rtl_bb_info (ENTRY_BLOCK_PTR);
1505   init_rtl_bb_info (EXIT_BLOCK_PTR);
1506   ENTRY_BLOCK_PTR->flags |= BB_RTL;
1507   EXIT_BLOCK_PTR->flags |= BB_RTL;
1508 
1509   e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
1510 
1511   /* When entry edge points to first basic block, we don't need jump,
1512      otherwise we have to jump into proper target.  */
1513   if (e && e->dest != ENTRY_BLOCK_PTR->next_bb)
1514     {
1515       tree label = tree_block_label (e->dest);
1516 
1517       emit_jump (label_rtx (label));
1518       flags = 0;
1519     }
1520   else
1521     flags = EDGE_FALLTHRU;
1522 
1523   init_block = create_basic_block (NEXT_INSN (get_insns ()),
1524 				   get_last_insn (),
1525 				   ENTRY_BLOCK_PTR);
1526   init_block->frequency = ENTRY_BLOCK_PTR->frequency;
1527   init_block->count = ENTRY_BLOCK_PTR->count;
1528   if (e)
1529     {
1530       first_block = e->dest;
1531       redirect_edge_succ (e, init_block);
1532       e = make_edge (init_block, first_block, flags);
1533     }
1534   else
1535     e = make_edge (init_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
1536   e->probability = REG_BR_PROB_BASE;
1537   e->count = ENTRY_BLOCK_PTR->count;
1538 
1539   update_bb_for_insn (init_block);
1540   return init_block;
1541 }
1542 
1543 
1544 /* Create a block containing landing pads and similar stuff.  */
1545 
1546 static void
construct_exit_block(void)1547 construct_exit_block (void)
1548 {
1549   rtx head = get_last_insn ();
1550   rtx end;
1551   basic_block exit_block;
1552   edge e, e2;
1553   unsigned ix;
1554   edge_iterator ei;
1555 
1556   /* Make sure the locus is set to the end of the function, so that
1557      epilogue line numbers and warnings are set properly.  */
1558 #ifdef USE_MAPPED_LOCATION
1559   if (cfun->function_end_locus != UNKNOWN_LOCATION)
1560 #else
1561   if (cfun->function_end_locus.file)
1562 #endif
1563     input_location = cfun->function_end_locus;
1564 
1565   /* The following insns belong to the top scope.  */
1566   record_block_change (DECL_INITIAL (current_function_decl));
1567 
1568   /* Generate rtl for function exit.  */
1569   expand_function_end ();
1570 
1571   end = get_last_insn ();
1572   if (head == end)
1573     return;
1574   while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head)))
1575     head = NEXT_INSN (head);
1576   exit_block = create_basic_block (NEXT_INSN (head), end,
1577 				   EXIT_BLOCK_PTR->prev_bb);
1578   exit_block->frequency = EXIT_BLOCK_PTR->frequency;
1579   exit_block->count = EXIT_BLOCK_PTR->count;
1580 
1581   ix = 0;
1582   while (ix < EDGE_COUNT (EXIT_BLOCK_PTR->preds))
1583     {
1584       e = EDGE_PRED (EXIT_BLOCK_PTR, ix);
1585       if (!(e->flags & EDGE_ABNORMAL))
1586 	redirect_edge_succ (e, exit_block);
1587       else
1588 	ix++;
1589     }
1590 
1591   e = make_edge (exit_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
1592   e->probability = REG_BR_PROB_BASE;
1593   e->count = EXIT_BLOCK_PTR->count;
1594   FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR->preds)
1595     if (e2 != e)
1596       {
1597 	e->count -= e2->count;
1598 	exit_block->count -= e2->count;
1599 	exit_block->frequency -= EDGE_FREQUENCY (e2);
1600       }
1601   if (e->count < 0)
1602     e->count = 0;
1603   if (exit_block->count < 0)
1604     exit_block->count = 0;
1605   if (exit_block->frequency < 0)
1606     exit_block->frequency = 0;
1607   update_bb_for_insn (exit_block);
1608 }
1609 
1610 /* Helper function for discover_nonconstant_array_refs.
1611    Look for ARRAY_REF nodes with non-constant indexes and mark them
1612    addressable.  */
1613 
1614 static tree
discover_nonconstant_array_refs_r(tree * tp,int * walk_subtrees,void * data ATTRIBUTE_UNUSED)1615 discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
1616 				   void *data ATTRIBUTE_UNUSED)
1617 {
1618   tree t = *tp;
1619 
1620   if (IS_TYPE_OR_DECL_P (t))
1621     *walk_subtrees = 0;
1622   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1623     {
1624       while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1625 	      && is_gimple_min_invariant (TREE_OPERAND (t, 1))
1626 	      && (!TREE_OPERAND (t, 2)
1627 		  || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
1628 	     || (TREE_CODE (t) == COMPONENT_REF
1629 		 && (!TREE_OPERAND (t,2)
1630 		     || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
1631 	     || TREE_CODE (t) == BIT_FIELD_REF
1632 	     || TREE_CODE (t) == REALPART_EXPR
1633 	     || TREE_CODE (t) == IMAGPART_EXPR
1634 	     || TREE_CODE (t) == VIEW_CONVERT_EXPR
1635 	     || TREE_CODE (t) == NOP_EXPR
1636 	     || TREE_CODE (t) == CONVERT_EXPR)
1637 	t = TREE_OPERAND (t, 0);
1638 
1639       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
1640 	{
1641 	  t = get_base_address (t);
1642 	  if (t && DECL_P (t))
1643 	    TREE_ADDRESSABLE (t) = 1;
1644 	}
1645 
1646       *walk_subtrees = 0;
1647     }
1648 
1649   return NULL_TREE;
1650 }
1651 
1652 /* RTL expansion is not able to compile array references with variable
1653    offsets for arrays stored in single register.  Discover such
1654    expressions and mark variables as addressable to avoid this
1655    scenario.  */
1656 
1657 static void
discover_nonconstant_array_refs(void)1658 discover_nonconstant_array_refs (void)
1659 {
1660   basic_block bb;
1661   block_stmt_iterator bsi;
1662 
1663   FOR_EACH_BB (bb)
1664     {
1665       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1666 	walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
1667 		   NULL , NULL);
1668     }
1669 }
1670 
1671 /* Translate the intermediate representation contained in the CFG
1672    from GIMPLE trees to RTL.
1673 
1674    We do conversion per basic block and preserve/update the tree CFG.
1675    This implies we have to do some magic as the CFG can simultaneously
1676    consist of basic blocks containing RTL and GIMPLE trees.  This can
1677    confuse the CFG hooks, so be careful to not manipulate CFG during
1678    the expansion.  */
1679 
1680 static unsigned int
tree_expand_cfg(void)1681 tree_expand_cfg (void)
1682 {
1683   basic_block bb, init_block;
1684   sbitmap blocks;
1685   edge_iterator ei;
1686   edge e;
1687 
1688   /* Some backends want to know that we are expanding to RTL.  */
1689   currently_expanding_to_rtl = 1;
1690 
1691   /* Prepare the rtl middle end to start recording block changes.  */
1692   reset_block_changes ();
1693 
1694   /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE.  */
1695   discover_nonconstant_array_refs ();
1696 
1697   /* Expand the variables recorded during gimple lowering.  */
1698   expand_used_vars ();
1699 
1700   /* Honor stack protection warnings.  */
1701   if (warn_stack_protect)
1702     {
1703       if (current_function_calls_alloca)
1704 	warning (0, "not protecting local variables: variable length buffer");
1705       if (has_short_buffer && !cfun->stack_protect_guard)
1706 	warning (0, "not protecting function: no buffer at least %d bytes long",
1707 		 (int) PARAM_VALUE (PARAM_SSP_BUFFER_SIZE));
1708     }
1709 
1710   /* Set up parameters and prepare for return, for the function.  */
1711   expand_function_start (current_function_decl);
1712 
1713   /* If this function is `main', emit a call to `__main'
1714      to run global initializers, etc.  */
1715   if (DECL_NAME (current_function_decl)
1716       && MAIN_NAME_P (DECL_NAME (current_function_decl))
1717       && DECL_FILE_SCOPE_P (current_function_decl))
1718     expand_main_function ();
1719 
1720   /* Initialize the stack_protect_guard field.  This must happen after the
1721      call to __main (if any) so that the external decl is initialized.  */
1722   if (cfun->stack_protect_guard)
1723     stack_protect_prologue ();
1724 
1725   /* Register rtl specific functions for cfg.  */
1726   rtl_register_cfg_hooks ();
1727 
1728   init_block = construct_init_block ();
1729 
1730   /* Clear EDGE_EXECUTABLE on the entry edge(s).  It is cleaned from the
1731      remaining edges in expand_gimple_basic_block.  */
1732   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
1733     e->flags &= ~EDGE_EXECUTABLE;
1734 
1735   FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR, next_bb)
1736     bb = expand_gimple_basic_block (bb);
1737 
1738   construct_exit_block ();
1739 
1740   /* We're done expanding trees to RTL.  */
1741   currently_expanding_to_rtl = 0;
1742 
1743   /* Convert tree EH labels to RTL EH labels, and clean out any unreachable
1744      EH regions.  */
1745   convert_from_eh_region_ranges ();
1746 
1747   rebuild_jump_labels (get_insns ());
1748   find_exception_handler_labels ();
1749 
1750   blocks = sbitmap_alloc (last_basic_block);
1751   sbitmap_ones (blocks);
1752   find_many_sub_basic_blocks (blocks);
1753   purge_all_dead_edges ();
1754   sbitmap_free (blocks);
1755 
1756   compact_blocks ();
1757 #ifdef ENABLE_CHECKING
1758   verify_flow_info();
1759 #endif
1760 
1761   /* There's no need to defer outputting this function any more; we
1762      know we want to output it.  */
1763   DECL_DEFER_OUTPUT (current_function_decl) = 0;
1764 
1765   /* Now that we're done expanding trees to RTL, we shouldn't have any
1766      more CONCATs anywhere.  */
1767   generating_concat_p = 0;
1768 
1769   finalize_block_changes ();
1770 
1771   if (dump_file)
1772     {
1773       fprintf (dump_file,
1774 	       "\n\n;;\n;; Full RTL generated for this function:\n;;\n");
1775       /* And the pass manager will dump RTL for us.  */
1776     }
1777 
1778   /* If we're emitting a nested function, make sure its parent gets
1779      emitted as well.  Doing otherwise confuses debug info.  */
1780   {
1781     tree parent;
1782     for (parent = DECL_CONTEXT (current_function_decl);
1783 	 parent != NULL_TREE;
1784 	 parent = get_containing_scope (parent))
1785       if (TREE_CODE (parent) == FUNCTION_DECL)
1786 	TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
1787   }
1788 
1789   /* We are now committed to emitting code for this function.  Do any
1790      preparation, such as emitting abstract debug info for the inline
1791      before it gets mangled by optimization.  */
1792   if (cgraph_function_possibly_inlined_p (current_function_decl))
1793     (*debug_hooks->outlining_inline_function) (current_function_decl);
1794 
1795   TREE_ASM_WRITTEN (current_function_decl) = 1;
1796 
1797   /* After expanding, the return labels are no longer needed. */
1798   return_label = NULL;
1799   naked_return_label = NULL;
1800   return 0;
1801 }
1802 
1803 struct tree_opt_pass pass_expand =
1804 {
1805   "expand",				/* name */
1806   NULL,                                 /* gate */
1807   tree_expand_cfg,			/* execute */
1808   NULL,                                 /* sub */
1809   NULL,                                 /* next */
1810   0,                                    /* static_pass_number */
1811   TV_EXPAND,				/* tv_id */
1812   /* ??? If TER is enabled, we actually receive GENERIC.  */
1813   PROP_gimple_leh | PROP_cfg,           /* properties_required */
1814   PROP_rtl,                             /* properties_provided */
1815   PROP_trees,				/* properties_destroyed */
1816   0,                                    /* todo_flags_start */
1817   TODO_dump_func,                       /* todo_flags_finish */
1818   'r'					/* letter */
1819 };
1820