Piotr Caban : msvcp90: Depend on compiler in _Getcvt implementation if possible.

Alexandre Julliard julliard at winehq.org
Thu May 20 16:09:06 CDT 2021


Module: wine
Branch: master
Commit: 24f7abafd754bb7d706f588e97532ce3169ade9c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=24f7abafd754bb7d706f588e97532ce3169ade9c

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu May 20 21:37:16 2021 +0200

msvcp90: Depend on compiler in _Getcvt implementation if possible.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp100/msvcp100.spec         |  2 +-
 dlls/msvcp110/msvcp110.spec         |  2 +-
 dlls/msvcp120/msvcp120.spec         |  2 +-
 dlls/msvcp120/tests/msvcp120.c      |  8 ++++----
 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               | 38 +++++++++++++++++++++++++------------
 dlls/msvcp90/msvcp90.spec           |  2 +-
 12 files changed, 40 insertions(+), 26 deletions(-)

diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec
index 657cdc9f217..d964954dc1f 100644
--- a/dlls/msvcp100/msvcp100.spec
+++ b/dlls/msvcp100/msvcp100.spec
@@ -2917,7 +2917,7 @@
 @ stub _GetLocaleForCP
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec
index 834c4225373..cd2236fe389 100644
--- a/dlls/msvcp110/msvcp110.spec
+++ b/dlls/msvcp110/msvcp110.spec
@@ -3780,7 +3780,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec
index 633b3da8552..2c5e457b2fc 100644
--- a/dlls/msvcp120/msvcp120.spec
+++ b/dlls/msvcp120/msvcp120.spec
@@ -3723,7 +3723,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 35e90cfa29c..495ee9dd6fb 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -209,7 +209,7 @@ static int (__cdecl *p__ismbblead)(unsigned int);
 
 static MSVCRT_long (__cdecl *p__Xtime_diff_to_millis2)(const xtime*, const xtime*);
 static int (__cdecl *p_xtime_get)(xtime*, int);
-static _Cvtvec* (__cdecl *p__Getcvt)(_Cvtvec*);
+static _Cvtvec (__cdecl *p__Getcvt)(void);
 static void (CDECL *p__Call_once)(int *once, void (CDECL *func)(void));
 static void (CDECL *p__Call_onceEx)(int *once, void (CDECL *func)(void*), void *argv);
 static void (CDECL *p__Do_call)(void *this);
@@ -930,7 +930,7 @@ static void test__Getcvt(void)
     _Cvtvec cvtvec;
     int i;
 
-    p__Getcvt(&cvtvec);
+    cvtvec = p__Getcvt();
     ok(cvtvec.page == 0, "cvtvec.page = %d\n", cvtvec.page);
     ok(cvtvec.mb_max == 1, "cvtvec.mb_max = %d\n", cvtvec.mb_max);
     todo_wine ok(cvtvec.unk == 1, "cvtvec.unk = %d\n", cvtvec.unk);
@@ -941,7 +941,7 @@ static void test__Getcvt(void)
         win_skip("_Getcvt tests\n");
         return;
     }
-    p__Getcvt(&cvtvec);
+    cvtvec = p__Getcvt();
     ok(cvtvec.page == 936, "cvtvec.page = %d\n", cvtvec.page);
     ok(cvtvec.mb_max == 2, "cvtvec.mb_max = %d\n", cvtvec.mb_max);
     ok(cvtvec.unk == 0, "cvtvec.unk = %d\n", cvtvec.unk);
@@ -955,7 +955,7 @@ static void test__Getcvt(void)
     }
 
     p__setmbcp(936);
-    p__Getcvt(&cvtvec);
+    cvtvec = p__Getcvt();
     ok(cvtvec.page == 936, "cvtvec.page = %d\n", cvtvec.page);
     ok(cvtvec.mb_max == 2, "cvtvec.mb_max = %d\n", cvtvec.mb_max);
     ok(cvtvec.unk == 0, "cvtvec.unk = %d\n", cvtvec.unk);
diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec
index c35dcb2d427..93e172a944f 100644
--- a/dlls/msvcp120_app/msvcp120_app.spec
+++ b/dlls/msvcp120_app/msvcp120_app.spec
@@ -3723,7 +3723,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll() msvcp120._Getcoll
 @ cdecl _Getctype(ptr) msvcp120._Getctype
-@ cdecl -ret64 _Getcvt() msvcp120._Getcvt
+@ cdecl -norelay _Getcvt() msvcp120._Getcvt
 @ cdecl _Getdateorder() msvcp120._Getdateorder
 @ cdecl _Getwctype(long ptr) msvcp120._Getwctype
 @ cdecl _Getwctypes(ptr ptr ptr ptr) msvcp120._Getwctypes
diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec
index 6ad46186cb5..7e7ea012236 100644
--- a/dlls/msvcp140/msvcp140.spec
+++ b/dlls/msvcp140/msvcp140.spec
@@ -3651,7 +3651,7 @@
 @ cdecl _File_size(wstr)
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec
index f3ed2e8b667..628e5f7f59e 100644
--- a/dlls/msvcp60/msvcp60.spec
+++ b/dlls/msvcp60/msvcp60.spec
@@ -4276,7 +4276,7 @@
 # extern _FXbig
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ extern _Hugeval _Hugeval
 @ extern _Inf _Inf
 @ stub _LCosh
diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec
index d60e37bcff6..c48945d9509 100644
--- a/dlls/msvcp70/msvcp70.spec
+++ b/dlls/msvcp70/msvcp70.spec
@@ -5063,7 +5063,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ extern _Hugeval
 @ extern _Inf
 @ stub _LCosh
diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec
index 1ccdd09825c..f9fc613b7d0 100644
--- a/dlls/msvcp71/msvcp71.spec
+++ b/dlls/msvcp71/msvcp71.spec
@@ -5117,7 +5117,7 @@
 # extern _FZero
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
 @ extern _Hugeval
diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec
index c1f409a1d78..74c0cac3669 100644
--- a/dlls/msvcp80/msvcp80.spec
+++ b/dlls/msvcp80/msvcp80.spec
@@ -5726,7 +5726,7 @@
 # extern _FXbig
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 0d0af6eac34..bd045333dfc 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -735,9 +735,11 @@ _Ctypevec* __thiscall _Locinfo__Getctype(const _Locinfo *this, _Ctypevec *ret)
 }
 
 /* _Getcvt */
-#if _MSVCP_VER < 110
+#if _MSVCP_VER < 110 && defined(__i386__)
+/* Work around a gcc bug */
 ULONGLONG __cdecl _Getcvt(void)
 {
+    C_ASSERT(sizeof(_Cvtvec) == sizeof(ULONGLONG));
     union {
         _Cvtvec cvtvec;
         ULONGLONG ull;
@@ -749,20 +751,32 @@ ULONGLONG __cdecl _Getcvt(void)
     ret.cvtvec.handle = ___lc_handle_func()[LC_CTYPE];
     return ret.ull;
 }
+#elif _MSVCP_VER < 110
+_Cvtvec __cdecl _Getcvt(void)
+{
+    _Cvtvec ret;
+
+    TRACE("\n");
+
+    ret.page = ___lc_codepage_func();
+    ret.handle = ___lc_handle_func()[LC_CTYPE];
+    return ret;
+}
 #else
-_Cvtvec* __cdecl _Getcvt(_Cvtvec *ret)
+_Cvtvec __cdecl _Getcvt(void)
 {
+    _Cvtvec ret;
     int i;
 
     TRACE("\n");
 
-    memset(ret, 0, sizeof(*ret));
-    ret->page = ___lc_codepage_func();
-    ret->mb_max = ___mb_cur_max_func();
+    memset(&ret, 0, sizeof(ret));
+    ret.page = ___lc_codepage_func();
+    ret.mb_max = ___mb_cur_max_func();
 
-    if(ret->mb_max > 1) {
+    if(ret.mb_max > 1) {
         for(i=0; i<256; i++)
-            if(_ismbblead(i)) ret->isleadbyte[i/8] |= 1 << (i&7);
+            if(_ismbblead(i)) ret.isleadbyte[i/8] |= 1 << (i&7);
     }
     return ret;
 }
@@ -773,14 +787,14 @@ _Cvtvec* __cdecl _Getcvt(_Cvtvec *ret)
 DEFINE_THISCALL_WRAPPER(_Locinfo__Getcvt, 8)
 _Cvtvec* __thiscall _Locinfo__Getcvt(const _Locinfo *this, _Cvtvec *ret)
 {
-#if _MSVCP_VER < 110
-    ULONGLONG ull = _Getcvt();
-    memcpy(ret, &ull, sizeof(ull));
+#if _MSVCP_VER < 110 && defined(__i386__)
+    ULONGLONG cvtvec;
 #else
     _Cvtvec cvtvec;
-    _Getcvt(&cvtvec);
-    memcpy(ret, &cvtvec, sizeof(cvtvec));
 #endif
+
+    cvtvec = _Getcvt();
+    memcpy(ret, &cvtvec, sizeof(cvtvec));
     return ret;
 }
 
diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec
index 9274a24b706..ff6fe952053 100644
--- a/dlls/msvcp90/msvcp90.spec
+++ b/dlls/msvcp90/msvcp90.spec
@@ -6502,7 +6502,7 @@
 # extern _FXbig
 @ cdecl -ret64 _Getcoll()
 @ cdecl _Getctype(ptr)
-@ cdecl -ret64 _Getcvt()
+@ cdecl -norelay _Getcvt()
 @ cdecl _Getdateorder()
 @ cdecl _Getwctype(long ptr)
 @ cdecl _Getwctypes(ptr ptr ptr ptr)




More information about the wine-cvs mailing list