From 83cc0110f2662b5d8c3530e05de666d65d535bb8 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 20 May 2021 21:37:23 +0200 Subject: [PATCH] msvcp90: Depend on compiler in _Getcoll implementation if possible. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/msvcp100/msvcp100.spec | 2 +- dlls/msvcp110/msvcp110.spec | 2 +- dlls/msvcp120/msvcp120.spec | 2 +- dlls/msvcp120_app/msvcp120_app.spec | 2 +- dlls/msvcp140/msvcp140.spec | 2 +- dlls/msvcp60/msvcp60.spec | 2 +- dlls/msvcp70/msvcp70.spec | 2 +- dlls/msvcp71/msvcp71.spec | 2 +- dlls/msvcp80/msvcp80.spec | 2 +- dlls/msvcp90/locale.c | 13 ++++++++----- dlls/msvcp90/msvcp90.spec | 2 +- dlls/msvcp90/tests/misc.c | 29 +++++++++++++---------------- 12 files changed, 31 insertions(+), 31 deletions(-) diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec index d964954dc1f..1fc93b05438 100644 --- a/dlls/msvcp100/msvcp100.spec +++ b/dlls/msvcp100/msvcp100.spec @@ -2915,7 +2915,7 @@ @ extern _FSnan # extern _FXbig @ stub _GetLocaleForCP -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index cd2236fe389..aeab529d69a 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -3778,7 +3778,7 @@ @ stub _FXp_sqrtx @ stub _FXp_subx # extern _FZero -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index 2c5e457b2fc..0b1cb92f8ce 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -3721,7 +3721,7 @@ @ stub _FXp_sqrtx @ stub _FXp_subx # extern _FZero -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index 93e172a944f..eefb9762708 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -3721,7 +3721,7 @@ @ stub _FXp_sqrtx @ stub _FXp_subx # extern _FZero -@ cdecl -ret64 _Getcoll() msvcp120._Getcoll +@ cdecl -norelay _Getcoll() msvcp120._Getcoll @ cdecl _Getctype(ptr) msvcp120._Getctype @ cdecl -norelay _Getcvt() msvcp120._Getcvt @ cdecl _Getdateorder() msvcp120._Getdateorder diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 7e7ea012236..d2cb4dbed8c 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -3649,7 +3649,7 @@ @ stub _FSinh @ extern _FSnan @ cdecl _File_size(wstr) -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec index 628e5f7f59e..de7aafa73b7 100644 --- a/dlls/msvcp60/msvcp60.spec +++ b/dlls/msvcp60/msvcp60.spec @@ -4274,7 +4274,7 @@ @ stub _FSinh @ extern _FSnan _FSnan # extern _FXbig -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ extern _Hugeval _Hugeval diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec index c48945d9509..d1a152ff0e3 100644 --- a/dlls/msvcp70/msvcp70.spec +++ b/dlls/msvcp70/msvcp70.spec @@ -5061,7 +5061,7 @@ @ extern _FSnan # extern _FXbig # extern _FZero -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ extern _Hugeval diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec index f9fc613b7d0..6176c9be2df 100644 --- a/dlls/msvcp71/msvcp71.spec +++ b/dlls/msvcp71/msvcp71.spec @@ -5115,7 +5115,7 @@ @ extern _FSnan # extern _FXbig # extern _FZero -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getwctype(long ptr) diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec index 74c0cac3669..f450286505a 100644 --- a/dlls/msvcp80/msvcp80.spec +++ b/dlls/msvcp80/msvcp80.spec @@ -5724,7 +5724,7 @@ @ stub _FSinh @ extern _FSnan # extern _FXbig -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c index bd045333dfc..2f6c103b2a2 100644 --- a/dlls/msvcp90/locale.c +++ b/dlls/msvcp90/locale.c @@ -669,20 +669,23 @@ static _Collvec* getcoll(_Collvec *ret) } /* _Getcoll */ -#if defined(__i386__) || _MSVCP_VER<110 +#if defined(__i386__) +/* Work around a gcc bug */ ULONGLONG __cdecl _Getcoll(void) { + C_ASSERT(sizeof(_Collvec) == sizeof(ULONGLONG)); ULONGLONG ret; - C_ASSERT(sizeof(_Collvec) <= sizeof(ULONGLONG)); - getcoll((_Collvec*)&ret); return ret; } #else -_Collvec* __cdecl _Getcoll(_Collvec *ret) +_Collvec __cdecl _Getcoll(void) { - return getcoll(ret); + _Collvec ret; + + getcoll(&ret); + return ret; } #endif diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index ff6fe952053..15b16ed7f12 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -6500,7 +6500,7 @@ @ stub _FSinh @ extern _FSnan # extern _FXbig -@ cdecl -ret64 _Getcoll() +@ cdecl -norelay _Getcoll() @ cdecl _Getctype(ptr) @ cdecl -norelay _Getcvt() @ cdecl _Getdateorder() diff --git a/dlls/msvcp90/tests/misc.c b/dlls/msvcp90/tests/misc.c index 9d6fe2b9bcc..546f10f6858 100644 --- a/dlls/msvcp90/tests/misc.c +++ b/dlls/msvcp90/tests/misc.c @@ -101,7 +101,7 @@ static char* (__cdecl *p_Copy_s)(char*, size_t, const char*, size_t); static unsigned short (__cdecl *p_wctype)(const char*); static MSVCP__Ctypevec* (__cdecl *p__Getctype)(MSVCP__Ctypevec*); -static /*MSVCP__Collvec*/ULONGLONG (__cdecl *p__Getcoll)(void); +static MSVCP__Collvec (__cdecl *p__Getcoll)(void); static wctrans_t (__cdecl *p_wctrans)(const char*); static wint_t (__cdecl *p_towctrans)(wint_t, wctrans_t); static void (__cdecl *p_locale__Locimp__Locimp_Addfac)(locale__Locimp*,locale_facet*,size_t); @@ -604,26 +604,23 @@ static void test__Getctype(void) static void test__Getcoll(void) { - ULONGLONG (__cdecl *p__Getcoll_arg)(MSVCP__Collvec*); +#ifdef __i386__ + /* Workaround a gcc bug */ + ULONGLONG tmp; +#define call__Getcoll(ret) tmp = ((ULONGLONG (__cdecl*)(void))p__Getcoll)(); \ + memcpy(&ret, &tmp, sizeof(tmp)) +#else +#define call__Getcoll(ret) ret = p__Getcoll() +#endif _locale_t locale; - - union { - MSVCP__Collvec collvec; - ULONGLONG ull; - }ret; + MSVCP__Collvec ret; locale = p__get_current_locale(); locale->locinfo->lc_handle[LC_COLLATE] = 0x7654321; p__free_locale(locale); - ret.ull = 0; - p__Getcoll_arg = (void*)p__Getcoll; - p__Getcoll_arg(&ret.collvec); - ok(ret.collvec.handle == 0, "ret.handle = %x\n", ret.collvec.handle); - ok(ret.collvec.page == 0, "ret.page = %x\n", ret.collvec.page); - - ret.ull = p__Getcoll(); - ok(ret.collvec.handle == 0x7654321, "ret.collvec.handle = %x\n", ret.collvec.handle); - ok(ret.collvec.page == 0, "ret.page = %x\n", ret.collvec.page); + call__Getcoll(ret); + ok(ret.handle == 0x7654321, "ret.handle = %x\n", ret.handle); + ok(ret.page == 0, "ret.page = %x\n", ret.page); } static void test_towctrans(void)