winapi: Generate the 64-bit variant of structure size/alignment tests.

oldstable
Alexandre Julliard 2010-04-07 17:22:51 +02:00
parent 6b11a3c3f8
commit a8e86e35dd
10 changed files with 19907 additions and 851 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -56,42 +56,103 @@
* Test helper macros
*/
#ifdef _WIN64
#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);
# define TEST_TYPE_SIZE(type, size)
#ifdef TYPE_ALIGNMENT
# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);
#else
# define TEST_TYPE_ALIGN(type, align)
#endif
#ifdef _TYPE_ALIGNMENT
# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);
# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);
#else
# define TEST_TARGET_ALIGN(type, align)
# define TEST_FIELD_ALIGN(type, field, align)
# define TEST_FIELD_OFFSET(type, field, offset)
#else
# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);
# ifdef TYPE_ALIGNMENT
# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);
# else
# define TEST_TYPE_ALIGN(type, align)
# endif
# ifdef _TYPE_ALIGNMENT
# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);
# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);
# else
# define TEST_TARGET_ALIGN(type, align)
# define TEST_FIELD_ALIGN(type, field, align)
# endif
# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);
#endif
#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);
#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size)
#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size)
#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0);
#define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0);
#ifdef _WIN64
static void test_pack_ASSOCF(void)
{
/* ASSOCF */
TEST_TYPE_SIZE (ASSOCF, 4)
TEST_TYPE_ALIGN (ASSOCF, 4)
TEST_TYPE_UNSIGNED(ASSOCF)
}
static void test_pack_DLLGETVERSIONPROC(void)
{
/* DLLGETVERSIONPROC */
TEST_TYPE_SIZE (DLLGETVERSIONPROC, 8)
TEST_TYPE_ALIGN (DLLGETVERSIONPROC, 8)
}
static void test_pack_DLLVERSIONINFO(void)
{
/* DLLVERSIONINFO (pack 8) */
TEST_TYPE_SIZE (DLLVERSIONINFO, 20)
TEST_TYPE_ALIGN (DLLVERSIONINFO, 4)
TEST_FIELD_SIZE (DLLVERSIONINFO, cbSize, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO, cbSize, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO, cbSize, 0)
TEST_FIELD_SIZE (DLLVERSIONINFO, dwMajorVersion, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMajorVersion, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMajorVersion, 4)
TEST_FIELD_SIZE (DLLVERSIONINFO, dwMinorVersion, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMinorVersion, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMinorVersion, 8)
TEST_FIELD_SIZE (DLLVERSIONINFO, dwBuildNumber, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO, dwBuildNumber, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO, dwBuildNumber, 12)
TEST_FIELD_SIZE (DLLVERSIONINFO, dwPlatformID, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO, dwPlatformID, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO, dwPlatformID, 16)
}
static void test_pack_DLLVERSIONINFO2(void)
{
/* DLLVERSIONINFO2 (pack 8) */
TEST_TYPE_SIZE (DLLVERSIONINFO2, 32)
TEST_TYPE_ALIGN (DLLVERSIONINFO2, 8)
TEST_FIELD_SIZE (DLLVERSIONINFO2, info1, 20)
TEST_FIELD_ALIGN (DLLVERSIONINFO2, info1, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO2, info1, 0)
TEST_FIELD_SIZE (DLLVERSIONINFO2, dwFlags, 4)
TEST_FIELD_ALIGN (DLLVERSIONINFO2, dwFlags, 4)
TEST_FIELD_OFFSET(DLLVERSIONINFO2, dwFlags, 20)
TEST_FIELD_SIZE (DLLVERSIONINFO2, ullVersion, 8)
TEST_FIELD_ALIGN (DLLVERSIONINFO2, ullVersion, 8)
TEST_FIELD_OFFSET(DLLVERSIONINFO2, ullVersion, 24)
}
static void test_pack_HUSKEY(void)
{
/* HUSKEY */
TEST_TYPE_SIZE (HUSKEY, 8)
TEST_TYPE_ALIGN (HUSKEY, 8)
}
static void test_pack_PHUSKEY(void)
{
/* PHUSKEY */
TEST_TYPE_SIZE (PHUSKEY, 8)
TEST_TYPE_ALIGN (PHUSKEY, 8)
TEST_TARGET_SIZE (PHUSKEY, 8)
TEST_TARGET_ALIGN(PHUSKEY, 8)
}
#else /* _WIN64 */
static void test_pack_ASSOCF(void)
{
/* ASSOCF */
@ -161,6 +222,8 @@ static void test_pack_PHUSKEY(void)
TEST_TARGET_ALIGN(PHUSKEY, 4)
}
#endif /* _WIN64 */
static void test_pack(void)
{
test_pack_ASSOCF();
@ -173,9 +236,5 @@ static void test_pack(void)
START_TEST(generated)
{
#ifdef _WIN64
ok(0, "The type size / alignment tests don't support Win64 yet\n");
#else
test_pack();
#endif
}

View File

@ -54,45 +54,289 @@
* Test helper macros
*/
#ifdef _WIN64
#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);
# define TEST_TYPE_SIZE(type, size)
#ifdef TYPE_ALIGNMENT
# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);
#else
# define TEST_TYPE_ALIGN(type, align)
#endif
#ifdef _TYPE_ALIGNMENT
# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);
# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);
#else
# define TEST_TARGET_ALIGN(type, align)
# define TEST_FIELD_ALIGN(type, field, align)
# define TEST_FIELD_OFFSET(type, field, offset)
#else
# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);
# ifdef TYPE_ALIGNMENT
# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);
# else
# define TEST_TYPE_ALIGN(type, align)
# endif
# ifdef _TYPE_ALIGNMENT
# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);
# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);
# else
# define TEST_TARGET_ALIGN(type, align)
# define TEST_FIELD_ALIGN(type, field, align)
# endif
# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);
#endif
#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);
#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size)
#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size)
#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0);
#define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0);
#ifdef _WIN64
static void test_pack_BINDINFO(void)
{
/* BINDINFO (pack 4) */
/* BINDINFO */
TEST_FIELD_SIZE (BINDINFO, cbSize, 4)
TEST_FIELD_ALIGN (BINDINFO, cbSize, 4)
TEST_FIELD_OFFSET(BINDINFO, cbSize, 0)
TEST_FIELD_SIZE (BINDINFO, szExtraInfo, 8)
TEST_FIELD_ALIGN (BINDINFO, szExtraInfo, 8)
TEST_FIELD_OFFSET(BINDINFO, szExtraInfo, 8)
}
static void test_pack_IBindHost(void)
{
/* IBindHost */
}
static void test_pack_IBindHostVtbl(void)
{
/* IBindHostVtbl */
}
static void test_pack_IBindStatusCallback(void)
{
/* IBindStatusCallback */
}
static void test_pack_IBindStatusCallbackVtbl(void)
{
/* IBindStatusCallbackVtbl */
}
static void test_pack_IBinding(void)
{
/* IBinding */
}
static void test_pack_IBindingVtbl(void)
{
/* IBindingVtbl */
}
static void test_pack_IInternetProtocolInfo(void)
{
/* IInternetProtocolInfo */
}
static void test_pack_IInternetProtocolInfoVtbl(void)
{
/* IInternetProtocolInfoVtbl */
}
static void test_pack_IInternetSession(void)
{
/* IInternetSession */
}
static void test_pack_IInternetSessionVtbl(void)
{
/* IInternetSessionVtbl */
}
static void test_pack_IPersistMoniker(void)
{
/* IPersistMoniker */
}
static void test_pack_IPersistMonikerVtbl(void)
{
/* IPersistMonikerVtbl */
}
static void test_pack_IWinInetHttpInfo(void)
{
/* IWinInetHttpInfo */
}
static void test_pack_IWinInetHttpInfoVtbl(void)
{
/* IWinInetHttpInfoVtbl */
}
static void test_pack_IWinInetInfo(void)
{
/* IWinInetInfo */
}
static void test_pack_IWinInetInfoVtbl(void)
{
/* IWinInetInfoVtbl */
}
static void test_pack_LPBINDHOST(void)
{
/* LPBINDHOST */
TEST_TYPE_SIZE (LPBINDHOST, 8)
TEST_TYPE_ALIGN (LPBINDHOST, 8)
}
static void test_pack_LPBINDING(void)
{
/* LPBINDING */
TEST_TYPE_SIZE (LPBINDING, 8)
TEST_TYPE_ALIGN (LPBINDING, 8)
}
static void test_pack_LPBINDSTATUSCALLBACK(void)
{
/* LPBINDSTATUSCALLBACK */
TEST_TYPE_SIZE (LPBINDSTATUSCALLBACK, 8)
TEST_TYPE_ALIGN (LPBINDSTATUSCALLBACK, 8)
}
static void test_pack_LPIINTERNETPROTOCOLINFO(void)
{
/* LPIINTERNETPROTOCOLINFO */
TEST_TYPE_SIZE (LPIINTERNETPROTOCOLINFO, 8)
TEST_TYPE_ALIGN (LPIINTERNETPROTOCOLINFO, 8)
}
static void test_pack_LPIINTERNETSESSION(void)
{
/* LPIINTERNETSESSION */
TEST_TYPE_SIZE (LPIINTERNETSESSION, 8)
TEST_TYPE_ALIGN (LPIINTERNETSESSION, 8)
}
static void test_pack_LPPERSISTMONIKER(void)
{
/* LPPERSISTMONIKER */
TEST_TYPE_SIZE (LPPERSISTMONIKER, 8)
TEST_TYPE_ALIGN (LPPERSISTMONIKER, 8)
}
static void test_pack_LPREMFORMATETC(void)
{
/* LPREMFORMATETC */
TEST_TYPE_SIZE (LPREMFORMATETC, 8)
TEST_TYPE_ALIGN (LPREMFORMATETC, 8)
}
static void test_pack_LPREMSECURITY_ATTRIBUTES(void)
{
/* LPREMSECURITY_ATTRIBUTES */
TEST_TYPE_SIZE (LPREMSECURITY_ATTRIBUTES, 8)
TEST_TYPE_ALIGN (LPREMSECURITY_ATTRIBUTES, 8)
}
static void test_pack_LPWININETHTTPINFO(void)
{
/* LPWININETHTTPINFO */
TEST_TYPE_SIZE (LPWININETHTTPINFO, 8)
TEST_TYPE_ALIGN (LPWININETHTTPINFO, 8)
}
static void test_pack_LPWININETINFO(void)
{
/* LPWININETINFO */
TEST_TYPE_SIZE (LPWININETINFO, 8)
TEST_TYPE_ALIGN (LPWININETINFO, 8)
}
static void test_pack_PREMSECURITY_ATTRIBUTES(void)
{
/* PREMSECURITY_ATTRIBUTES */
TEST_TYPE_SIZE (PREMSECURITY_ATTRIBUTES, 8)
TEST_TYPE_ALIGN (PREMSECURITY_ATTRIBUTES, 8)
}
static void test_pack_REMSECURITY_ATTRIBUTES(void)
{
/* REMSECURITY_ATTRIBUTES */
TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12)
TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4)
TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4)
TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, nLength, 4)
TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, nLength, 0)
TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4)
TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, bInheritHandle, 4)
TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, bInheritHandle, 4)
TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, bInheritHandle, 8)
}
static void test_pack_RemBINDINFO(void)
{
/* RemBINDINFO */
TEST_TYPE_SIZE (RemBINDINFO, 96)
TEST_TYPE_ALIGN (RemBINDINFO, 8)
TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4)
TEST_FIELD_ALIGN (RemBINDINFO, cbSize, 4)
TEST_FIELD_OFFSET(RemBINDINFO, cbSize, 0)
TEST_FIELD_SIZE (RemBINDINFO, szExtraInfo, 8)
TEST_FIELD_ALIGN (RemBINDINFO, szExtraInfo, 8)
TEST_FIELD_OFFSET(RemBINDINFO, szExtraInfo, 8)
TEST_FIELD_SIZE (RemBINDINFO, grfBindInfoF, 4)
TEST_FIELD_ALIGN (RemBINDINFO, grfBindInfoF, 4)
TEST_FIELD_OFFSET(RemBINDINFO, grfBindInfoF, 16)
TEST_FIELD_SIZE (RemBINDINFO, dwBindVerb, 4)
TEST_FIELD_ALIGN (RemBINDINFO, dwBindVerb, 4)
TEST_FIELD_OFFSET(RemBINDINFO, dwBindVerb, 20)
TEST_FIELD_SIZE (RemBINDINFO, szCustomVerb, 8)
TEST_FIELD_ALIGN (RemBINDINFO, szCustomVerb, 8)
TEST_FIELD_OFFSET(RemBINDINFO, szCustomVerb, 24)
TEST_FIELD_SIZE (RemBINDINFO, cbstgmedData, 4)
TEST_FIELD_ALIGN (RemBINDINFO, cbstgmedData, 4)
TEST_FIELD_OFFSET(RemBINDINFO, cbstgmedData, 32)
TEST_FIELD_SIZE (RemBINDINFO, dwOptions, 4)
TEST_FIELD_ALIGN (RemBINDINFO, dwOptions, 4)
TEST_FIELD_OFFSET(RemBINDINFO, dwOptions, 36)
TEST_FIELD_SIZE (RemBINDINFO, dwOptionsFlags, 4)
TEST_FIELD_ALIGN (RemBINDINFO, dwOptionsFlags, 4)
TEST_FIELD_OFFSET(RemBINDINFO, dwOptionsFlags, 40)
TEST_FIELD_SIZE (RemBINDINFO, dwCodePage, 4)
TEST_FIELD_ALIGN (RemBINDINFO, dwCodePage, 4)
TEST_FIELD_OFFSET(RemBINDINFO, dwCodePage, 44)
TEST_FIELD_SIZE (RemBINDINFO, securityAttributes, 12)
TEST_FIELD_ALIGN (RemBINDINFO, securityAttributes, 4)
TEST_FIELD_OFFSET(RemBINDINFO, securityAttributes, 48)
TEST_FIELD_SIZE (RemBINDINFO, iid, 16)
TEST_FIELD_ALIGN (RemBINDINFO, iid, 4)
TEST_FIELD_OFFSET(RemBINDINFO, iid, 60)
TEST_FIELD_SIZE (RemBINDINFO, pUnk, 8)
TEST_FIELD_ALIGN (RemBINDINFO, pUnk, 8)
TEST_FIELD_OFFSET(RemBINDINFO, pUnk, 80)
TEST_FIELD_SIZE (RemBINDINFO, dwReserved, 4)
TEST_FIELD_ALIGN (RemBINDINFO, dwReserved, 4)
TEST_FIELD_OFFSET(RemBINDINFO, dwReserved, 88)
}
static void test_pack_RemFORMATETC(void)
{
/* RemFORMATETC */
TEST_TYPE_SIZE (RemFORMATETC, 20)
TEST_TYPE_ALIGN (RemFORMATETC, 4)
TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4)
TEST_FIELD_ALIGN (RemFORMATETC, cfFormat, 4)
TEST_FIELD_OFFSET(RemFORMATETC, cfFormat, 0)
TEST_FIELD_SIZE (RemFORMATETC, ptd, 4)
TEST_FIELD_ALIGN (RemFORMATETC, ptd, 4)
TEST_FIELD_OFFSET(RemFORMATETC, ptd, 4)
TEST_FIELD_SIZE (RemFORMATETC, dwAspect, 4)
TEST_FIELD_ALIGN (RemFORMATETC, dwAspect, 4)
TEST_FIELD_OFFSET(RemFORMATETC, dwAspect, 8)
TEST_FIELD_SIZE (RemFORMATETC, lindex, 4)
TEST_FIELD_ALIGN (RemFORMATETC, lindex, 4)
TEST_FIELD_OFFSET(RemFORMATETC, lindex, 12)
TEST_FIELD_SIZE (RemFORMATETC, tymed, 4)
TEST_FIELD_ALIGN (RemFORMATETC, tymed, 4)
TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16)
}
#else /* _WIN64 */
static void test_pack_BINDINFO(void)
{
/* BINDINFO */
TEST_FIELD_SIZE (BINDINFO, cbSize, 4)
TEST_FIELD_ALIGN (BINDINFO, cbSize, 4)
TEST_FIELD_OFFSET(BINDINFO, cbSize, 0)
@ -108,7 +352,7 @@ static void test_pack_IBindHost(void)
static void test_pack_IBindHostVtbl(void)
{
/* IBindHostVtbl (pack 4) */
/* IBindHostVtbl */
}
static void test_pack_IBindStatusCallback(void)
@ -118,7 +362,7 @@ static void test_pack_IBindStatusCallback(void)
static void test_pack_IBindStatusCallbackVtbl(void)
{
/* IBindStatusCallbackVtbl (pack 4) */
/* IBindStatusCallbackVtbl */
}
static void test_pack_IBinding(void)
@ -128,7 +372,7 @@ static void test_pack_IBinding(void)
static void test_pack_IBindingVtbl(void)
{
/* IBindingVtbl (pack 4) */
/* IBindingVtbl */
}
static void test_pack_IInternetProtocolInfo(void)
@ -138,7 +382,7 @@ static void test_pack_IInternetProtocolInfo(void)
static void test_pack_IInternetProtocolInfoVtbl(void)
{
/* IInternetProtocolInfoVtbl (pack 4) */
/* IInternetProtocolInfoVtbl */
}
static void test_pack_IInternetSession(void)
@ -148,7 +392,7 @@ static void test_pack_IInternetSession(void)
static void test_pack_IInternetSessionVtbl(void)
{
/* IInternetSessionVtbl (pack 4) */
/* IInternetSessionVtbl */
}
static void test_pack_IPersistMoniker(void)
@ -158,7 +402,7 @@ static void test_pack_IPersistMoniker(void)
static void test_pack_IPersistMonikerVtbl(void)
{
/* IPersistMonikerVtbl (pack 4) */
/* IPersistMonikerVtbl */
}
static void test_pack_IWinInetHttpInfo(void)
@ -168,7 +412,7 @@ static void test_pack_IWinInetHttpInfo(void)
static void test_pack_IWinInetHttpInfoVtbl(void)
{
/* IWinInetHttpInfoVtbl (pack 4) */
/* IWinInetHttpInfoVtbl */
}
static void test_pack_IWinInetInfo(void)
@ -178,7 +422,7 @@ static void test_pack_IWinInetInfo(void)
static void test_pack_IWinInetInfoVtbl(void)
{
/* IWinInetInfoVtbl (pack 4) */
/* IWinInetInfoVtbl */
}
static void test_pack_LPBINDHOST(void)
@ -260,7 +504,7 @@ static void test_pack_PREMSECURITY_ATTRIBUTES(void)
static void test_pack_REMSECURITY_ATTRIBUTES(void)
{
/* REMSECURITY_ATTRIBUTES (pack 4) */
/* REMSECURITY_ATTRIBUTES */
TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12)
TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4)
TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4)
@ -276,7 +520,7 @@ static void test_pack_REMSECURITY_ATTRIBUTES(void)
static void test_pack_RemBINDINFO(void)
{
/* RemBINDINFO (pack 4) */
/* RemBINDINFO */
TEST_TYPE_SIZE (RemBINDINFO, 72)
TEST_TYPE_ALIGN (RemBINDINFO, 4)
TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4)
@ -322,7 +566,7 @@ static void test_pack_RemBINDINFO(void)
static void test_pack_RemFORMATETC(void)
{
/* RemFORMATETC (pack 4) */
/* RemFORMATETC */
TEST_TYPE_SIZE (RemFORMATETC, 20)
TEST_TYPE_ALIGN (RemFORMATETC, 4)
TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4)
@ -342,6 +586,8 @@ static void test_pack_RemFORMATETC(void)
TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16)
}
#endif /* _WIN64 */
static void test_pack(void)
{
test_pack_BINDINFO();
@ -379,9 +625,5 @@ static void test_pack(void)
START_TEST(generated)
{
#ifdef _WIN64
ok(0, "The type size / alignment tests don't support Win64 yet\n");
#else
test_pack();
#endif
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -42,6 +42,8 @@ use tests qw($tests);
use type;
use util qw(replace_file);
my $pointer_size = 4;
my @tests = ();
if ($options->pack) {
push @tests, "pack";
@ -172,9 +174,9 @@ sub _find_align_kind_size($) {
my $kind;
my $size;
if (/\*+$/) {
$align = 4;
$align = $pointer_size;
$kind = "pointer";
$size = 4;
$size = $pointer_size;
} elsif(/^(?:(signed|unsigned)\s+)?(?:__int8|char|byte)$/) {
$align = 1;
$kind = defined($1) ? $1 : "signed";
@ -191,10 +193,14 @@ sub _find_align_kind_size($) {
$align = 4;
$kind = defined($1) ? $1 : "signed";
$size = 4;
} elsif (/^(?:(signed|unsigned)\s+)?(?:__int32|int|long(?:\s+int)?)$/) {
} elsif (/^(?:(signed|unsigned)\s+)?(?:__int32|int)$/) {
$align = 4;
$kind = defined($1) ? $1 : "signed";
$size = 4;
} elsif (/^(?:(signed|unsigned)\s+)?(?:long(?:\s+int)?)$/) {
$align = $pointer_size;
$kind = defined($1) ? $1 : "signed";
$size = $pointer_size;
} elsif (/^(?:float)$/) {
$align = 4;
$kind = "float";
@ -212,13 +218,13 @@ sub _find_align_kind_size($) {
$kind = "float";
$size = 12;
} elsif (/^H(?:DC|BITMAP|BRUSH|ICON|INSTANCE|KEY|MENU|METAFILE|WND)$/) {
$align = 4;
$align = $pointer_size;
$kind = "pointer";
$size = 4;
$size = $pointer_size;
} elsif (/^LP(?:BYTE|CSTR|CWSTR|DWORD|STR|VOID|WSTR)$/) {
$align = 4;
$align = $pointer_size;
$kind = "pointer";
$size = 4;
$size = $pointer_size;
} elsif (/^(?:FILETIME)$/) {
$align = 4;
$kind = "struct";
@ -270,13 +276,13 @@ sub _find_align_kind_size($) {
$size_parse_reported{$_} = 1;
}
} elsif (/^\w+\s*\((?:\s*CALLBACK|\s*NTAPI|\s*WINAPI)?\s*\*\s*\)\s*\(.*?\)$/) {
$align = 4;
$align = $pointer_size;
$kind = "pointer";
$size = 4;
$size = $pointer_size;
}
my $align2;
if (defined(my $type = $type_name2type{$_})) {
if (defined(my $type = $type_name2type{$pointer_size}{$_})) {
$align2 = $type->align;
}
@ -292,7 +298,7 @@ sub _find_align_kind_size($) {
}
my $size2;
if (defined(my $type = $type_name2type{$_})) {
if (defined(my $type = $type_name2type{$pointer_size}{$_})) {
$size2 = $type->size;
}
@ -331,7 +337,9 @@ sub find_count($) {
}
foreach my $file (@files) {
$progress_current++;
$progress_current++;
foreach my $ptr (4, 8) {
$pointer_size = $ptr;
{
open(IN, "< $wine_dir/$file") || die "Error: Can't open $wine_dir/$file: $!\n";
@ -351,14 +359,14 @@ foreach my $file (@files) {
my $line;
my $type;
my @packs = (4);
my @packs = ();
my @ifdefs = ();
my $update_output = sub {
my $progress = "";
my $prefix = "";
$progress .= "$file (file $progress_current of $progress_max)";
$progress .= "$file (file $progress_current of $progress_max" . sprintf ", %u-bit)", $pointer_size * 8;
$prefix .= "$file: ";
if(defined($line)) {
@ -391,11 +399,11 @@ foreach my $file (@files) {
pop @packs unless @ifdefs && !$ifdefs[$#ifdefs];
#print "found poppack on line $begin_line\n";
} elsif ($preprocessor =~ /^\#\s*ifdef\s+_WIN64/) {
push @ifdefs, 0;
push @ifdefs, ($pointer_size == 8);
} elsif ($preprocessor =~ /^\#\s*ifndef\s+_WIN64/) {
push @ifdefs, 1;
push @ifdefs, ($pointer_size == 4);
} elsif ($preprocessor =~ /^\#\s*elif\s+defined(_WIN64)/) {
$ifdefs[$#ifdefs] = 0;
$ifdefs[$#ifdefs] = ($pointer_size == 8);
} elsif ($preprocessor =~ /^\#\s*ifdef\s/) {
push @ifdefs, 2;
} elsif ($preprocessor =~ /^\#\s*ifndef\s/) {
@ -420,7 +428,7 @@ foreach my $file (@files) {
&$update_output();
my $name = $type->name;
$file2types{$file}{$name} = $type;
$file2types{$pointer_size}{$file}{$name} = $type;
$type->set_find_align_callback(\&find_align);
$type->set_find_kind_callback(\&find_kind);
@ -447,7 +455,7 @@ foreach my $file (@files) {
}
# $output->write("$name: $size\n");
$type_name2type{$name} = $type;
$type_name2type{$pointer_size}{$name} = $type;
} else {
# $output->write("$name: can't find size\n");
}
@ -465,6 +473,7 @@ foreach my $file (@files) {
}
$output->prefix("");
}
}
########################################################################
@ -544,36 +553,24 @@ sub output_header($$$) {
print OUT " * Test helper macros\n";
print OUT " */\n";
print OUT "\n";
print OUT "#ifdef _WIN64\n";
print OUT "#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);\n";
print OUT "\n";
print OUT "# define TEST_TYPE_SIZE(type, size)\n";
print OUT "#ifdef TYPE_ALIGNMENT\n";
print OUT "# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);\n";
print OUT "#else\n";
print OUT "# define TEST_TYPE_ALIGN(type, align)\n";
print OUT "#endif\n";
print OUT "\n";
print OUT "#ifdef _TYPE_ALIGNMENT\n";
print OUT "# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);\n";
print OUT "# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);\n";
print OUT "#else\n";
print OUT "# define TEST_TARGET_ALIGN(type, align)\n";
print OUT "# define TEST_FIELD_ALIGN(type, field, align)\n";
print OUT "# define TEST_FIELD_OFFSET(type, field, offset)\n";
print OUT "\n";
print OUT "#else\n";
print OUT "\n";
print OUT "# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size);\n";
print OUT "\n";
print OUT "# ifdef TYPE_ALIGNMENT\n";
print OUT "# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align);\n";
print OUT "# else\n";
print OUT "# define TEST_TYPE_ALIGN(type, align)\n";
print OUT "# endif\n";
print OUT "\n";
print OUT "# ifdef _TYPE_ALIGNMENT\n";
print OUT "# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align);\n";
print OUT "# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align);\n";
print OUT "# else\n";
print OUT "# define TEST_TARGET_ALIGN(type, align)\n";
print OUT "# define TEST_FIELD_ALIGN(type, field, align)\n";
print OUT "# endif\n";
print OUT "\n";
print OUT "# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);\n";
print OUT "\n";
print OUT "#endif\n";
print OUT "\n";
print OUT "#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset);\n";
print OUT "\n";
print OUT "#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size)\n";
print OUT "#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size)\n";
print OUT "#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0);\n";
@ -594,11 +591,7 @@ sub output_footer($$$) {
print OUT "START_TEST(generated)\n";
print OUT "{\n";
foreach my $test (@tests) {
print OUT "#ifdef _WIN64\n";
print OUT " ok(0, \"The type size / alignment tests don't support Win64 yet\\n\");\n";
print OUT "#else\n";
print OUT " test_$test();\n";
print OUT "#endif\n";
}
print OUT "}\n";
}
@ -781,7 +774,7 @@ sub output_test_pack($$$$) {
}
foreach my $header (@headers) {
my $type_name2type = $file2types{"include/$header"};
my $type_name2type = $file2types{$pointer_size}{"include/$header"};
foreach my $_type_name (@type_names) {
my $type_name = $_type_name;
@ -825,7 +818,13 @@ sub output_file($$$$) {
my %type_names_used2;
if ($test eq "pack") {
output_test_pack(\*OUT, $test_dir, $test, \%type_names_used2);
print OUT "#ifdef _WIN64\n\n";
$pointer_size = 8;
output_test_pack(\*OUT, $test_dir, $test, \%type_names_used2);
print OUT "#else /* _WIN64 */\n\n";
$pointer_size = 4;
output_test_pack(\*OUT, $test_dir, $test, \%type_names_used2);
print OUT "#endif /* _WIN64 */\n\n";
} else {
die "no such test ($test)\n";
}
@ -858,10 +857,10 @@ foreach my $test_dir (@test_dirs) {
replace_file($file, \&output_file, $test_dir, \@tests, \%type_names_used);
}
foreach my $header (sort(keys(%file2types))) {
foreach my $header (sort(keys(%{$file2types{$pointer_size}}))) {
$output->prefix("$header: ");
$header =~ s%^include/%%;
my $type_name2type = $file2types{"include/$header"};
my $type_name2type = $file2types{$pointer_size}{"include/$header"};
foreach my $_type_name (sort(keys(%$type_name2type))) {
my $type_name = $_type_name;
@ -874,8 +873,8 @@ foreach my $header (sort(keys(%file2types))) {
$output->prefix("$winapi_dir/tests.dat: ");
foreach my $type_name (sort(keys(%type_names_used))) {
my $found = 0;
foreach my $header (sort(keys(%file2types))) {
my $type_name2type = $file2types{"include/$header"};
foreach my $header (sort(keys(%{$file2types{$pointer_size}}))) {
my $type_name2type = $file2types{$pointer_size}{"include/$header"};
if (exists($type_name2type{$type_name})) {
$found = 1;
}