On Wed, Jul 08, 2026 at 08:26:32PM +0800, H.J. Lu wrote:
> > Not my main area of expertise - but looks OK.
> >
> > Thanks,
> > Richard.
>
> Hi Jakub,
>
> Does it look correct to you?
This looks really weird. cfgexpand.cc (expand_stack_vars) already has code to
take care about alignments, if I try to lay out e.g. -O2 -fsanitize=address
struct [[gnu::aligned (64)]] A { unsigned char a[512]; };
struct [[gnu::aligned (128)]] B { unsigned char a[1024]; };
struct [[gnu::aligned (32)]] C { unsigned char a[2048]; };
struct [[gnu::aligned (256)]] D { unsigned char a[4096]; };
struct E { unsigned char a[513]; };
struct F { unsigned char a[1025]; };
struct G { unsigned char a[2049]; };
struct H { unsigned char a[4097]; };
[[gnu::noipa]] void
bar (struct A *a, struct B *b, struct C *c, struct D *d, struct E *e, struct F
*f, struct G *g, struct H *h)
{
__builtin_printf ("%p %p %p %p %p %p %p %p\n", a, b, c, d, e, f, g, h);
}
[[gnu::noipa]] void
foo (void)
{
struct A a;
struct B b;
struct C c;
struct D d;
struct E e;
struct F f;
struct G g;
struct H h;
bar (&a, &b, &c, &d, &e, &f, &g, &h);
}
int
main ()
{
foo ();
}
the vars are laid out in the a, c, e, g, b, d, f, h order (because the
sorting first key is very large alignment (never on x86_64), size and only
then alignment, and all the vars have proper alignment.
I'll have a look.
Jakub