On Fri, May 06, 2016 at 10:44:15AM +0100, Dominik Vogt wrote:
> > diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
> > index 21f21c9..4d48afd 100644
> > --- a/gcc/cfgexpand.c
> > +++ b/gcc/cfgexpand.c
> ...
> > @@ -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);
> ...
> 
> See below.
> 
> > @@ -1186,6 +1190,18 @@ 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);
> 
> 1) Should this use PREFERRED_STACK_BOUNDARY or just STACK_BOUNDARY?
> 2) Is this the right place for rounding up, or should 
>    it be done above, maybe in get_dynamic_stack_size?
> 
> Not sure whether this is the right 
> 
> > +         large_base = get_dynamic_stack_base (loffset, large_align);
> > +         large_allocation_done = true;
> > +       }
> >       gcc_assert (large_base != NULL);
> >  
> >       large_alloc += alignb - 1;
> 
> > diff --git a/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c 
> > b/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c
> > new file mode 100644
> > index 0000000..e06a16c
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c
> > @@ -0,0 +1,14 @@
> > +/* Verify that run time aligned local variables are aloocated in the 
> > prologue
> > +   in one pass together with normal local variables.  */
> > +/* { dg-do compile } */
> > +/* { dg-options "-O0" } */
> > +
> > +extern void bar (void *, void *, void *);
> > +void foo (void)
> > +{
> > +  int i;
> > +  __attribute__ ((aligned(65536))) char runtime_aligned_1[512];
> > +  __attribute__ ((aligned(32768))) char runtime_aligned_2[1024];
> > +  bar (&i, &runtime_aligned_1, &runtime_aligned_2);
> > +}
> > +/* { dg-final { scan-assembler-times "cfi_def_cfa_offset" 2 { target { 
> > s390*-*-* } } } } */
> 
> I've no idea how to test this on other targets, or how to express
> the test in a target independent way.  The scan-assembler-times
> does not work on x86_64.
> 
> Ciao
> 
> Dominik ^_^  ^_^
> 
> -- 
> 
> Dominik Vogt
> IBM Germany
> 
> 


Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt
IBM Germany

Reply via email to