Alignment testing
Dmitry Timoshkov
dmitry at baikal.ru
Mon Apr 26 23:23:40 CDT 2004
"Hans Leidekker" <hans at it.vu.nl> wrote:
> [Use a fixed width font to view this message]
>
> MSVC MinGW GCC
>
> Alignment of __int64: 8 8 8
> Size of __int64: 8 8 8
>
> Alignment of large_int: 8 8 4
> Size of large_int: 8 8 8
>
> Alignment of container1: 8 8 4
> Size of container1: 16 16 12
>
> Alignment of container2: 8 8 4
> Size of container2: 16 16 12
>
> Alignment of container3: 8 8 4
> Size of container3: 8 8 8
>
> Clearly GCC is the odd one out. When a double is embedded in
> a structure GCC does not adjust the alignment of the structure
> to the size of a double.
>
> So, should we add -malign-double to the compiler flags?
After another inspection of Wine's dlls/kernel/tests/generated.c
I think that MSVC case was actually never tested!
Here is an example of the code:
#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus)
# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field)
#elif defined(__GNUC__)
# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field)
#else
/* FIXME: Not sure if is possible to do without compiler extension */
#endif
I don't know what version of MS cl.exe has _MSC_VER >= 1300, but one
that comes with Visual Studio 6.0 has _MSC_VER set to 1200. Moreover,
since the test is a .c file __cplusplus is never defined, therefore
FIELD_ALIGNMENT is not defined by the above code and later in that
file we have:
#ifdef FIELD_ALIGNMENT
# define TEST_FIELD_ALIGNMENT(type, field, align) \
ok(FIELD_ALIGNMENT(type, field) == align, \
"FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \
FIELD_ALIGNMENT(type, field))
#else
# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0)
#endif
i.e. FIELD_ALIGNMENT gets an empty definition. Same for _TYPE_ALIGNMENT.
Patrik, did you actually got it working with MS cl.exe?
--
Dmitry.
More information about the wine-devel
mailing list