[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#698315: [build] openmsx: FTBFS due to invalid alignment assumptions



On Tue, Nov 26, 2013 at 11:49 PM, Thorsten Glaser <tg@mirbsd.de> wrote:
> I know that GCC will need the alignment attribute twice in structs, e.g.
>
> struct foo {
>         int bar __attribute__((__aligned__(8)));
>         int baz;
> } __attribute__((__aligned__(8)));

That's not true: the alignment of a struct is the largest alignment of any
of its members. So the explicit alignment of bar is sufficient.

#include <stdio.h>
#include <stdlib.h>

struct foo {
    int bar __attribute__((__aligned__(8)));
    int baz;
} __attribute__((__aligned__(8)));

struct foo2 {
    int bar __attribute__((__aligned__(8)));
    int baz;
};

struct foo3 {
    int bar;
    int baz;
};

struct foo4 {
    int bar;
    int baz;
} __attribute__((__aligned__(8)));

int main(int argc, char *argv[])
{
    printf("__alignof__(struct foo) = %zu\n", __alignof__(struct foo));
    printf("__alignof__(struct foo2) = %zu\n", __alignof__(struct foo2));
    printf("__alignof__(struct foo3) = %zu\n", __alignof__(struct foo3));
    printf("__alignof__(struct foo4) = %zu\n", __alignof__(struct foo4));
    exit(0);
}

On m68k:
__alignof__(struct foo) = 8
__alignof__(struct foo2) = 8
__alignof__(struct foo3) = 2
__alignof__(struct foo4) = 8

On amd64:
__alignof__(struct foo) = 8
__alignof__(struct foo2) = 8
__alignof__(struct foo3) = 4
__alignof__(struct foo4) = 8

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds


Reply to: