There's one thing I don't quite understand and which seems to have
changed since v1:
On 07/04/2016 02:19 PM, Dominik Vogt wrote:
@@ -1099,8 +1101,10 @@ expand_stack_vars (bool (*pred) (size_t), struct
stack_vars_data *data)
/* If there were any, allocate space. */
if (large_size > 0)
- large_base = allocate_dynamic_stack_space (GEN_INT (large_size), 0,
- large_align, true);
+ {
+ large_allocsize = GEN_INT (large_size);
+ get_dynamic_stack_size (&large_allocsize, 0, large_align, NULL);
+ }
}
for (si = 0; si < n; ++si)
@@ -1186,6 +1190,19 @@ expand_stack_vars (bool (*pred) (size_t), struct
stack_vars_data *data)
/* Large alignment is only processed in the last pass. */
if (pred)
continue;
+
+ if (large_allocsize && ! large_allocation_done)
+ {
+ /* Allocate space the virtual stack vars area in the
+ prologue. */
+ HOST_WIDE_INT loffset;
+
+ loffset = alloc_stack_frame_space
+ (INTVAL (large_allocsize),
+ PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT);
+ large_base = get_dynamic_stack_base (loffset, large_align);
+ large_allocation_done = true;
+ }
gcc_assert (large_base != NULL);
Why is this code split between the two places here? v1 seems to have
done it all in the first piece of code where we now only set
large_allocsize.
Bernd