Based on Piotr's findings.
On MSVC i386 targets, structs requiring alignment greater than 4 are never passed by value. Clang follows the same behavior in MSVC mode (see [1] for details and [2] for a follow-up that applies this logic when fields, not necessarily the entire struct, are aligned).
A number of ios functions take fpos_mbstatet as an argument and expect it to be passed by value.
[1] https://reviews.llvm.org/D72114 [2] https://github.com/llvm/llvm-project/issues/63257
From: Jacek Caban jacek@codeweavers.com
Based on Piotr's findings.
On MSVC i386 targets, structs requiring alignment greater than 4 are never passed by value. Clang follows the same behavior in MSVC mode (see [1] for details and [2] for a follow-up that applies this logic when fields, not necessarily the entire struct, are aligned).
A number of ios functions take fpos_mbstatet as an argument and expect it to be passed by value.
[1] https://reviews.llvm.org/D72114 [2] https://github.com/llvm/llvm-project/issues/63257
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57817 --- dlls/msvcp90/ios.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/msvcp90/ios.c b/dlls/msvcp90/ios.c index cb3e7573283..d7f25b559a8 100644 --- a/dlls/msvcp90/ios.c +++ b/dlls/msvcp90/ios.c @@ -41,7 +41,7 @@ bool ios_base_Sync = FALSE;
typedef struct { streamoff off; - __int64 DECLSPEC_ALIGN(8) pos; + INT64 pos; _Mbstatet state; } fpos_mbstatet;
Piotr Caban (@piotr) commented about dlls/msvcp90/ios.c:
typedef struct { streamoff off;
It doesn't work for newer versions of msvcp. `streamoff` and `streamsize` definition in `msvcp90.h` also needs to be fixed.
Could you please also add similar change to msvcp60/ios.c?