On Tuesday 17 December 2024 15:29:38 Martin Storsjö wrote: > On Sat, 14 Dec 2024, Pali Rohár wrote: > > > Ensure that all those __ms_* printf functions calls __stdio_common_* printf > > functions with compatibility options, as it is required for msvcrt.dll > > compatibility and also because tchar.h macros depends on that old legacy > > behavior. > > > > For compatibility call __stdio_common_*printf function always with > > _CRT_INTERNAL_PRINTF_LEGACY_MSVCRT_COMPATIBILITY and > > _CRT_INTERNAL_PRINTF_LEGACY_THREE_DIGIT_EXPONENTS options. > > > > And for wide functions use _CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS > > option which ensures that %s for wide functions expects wide wchar_t* > > string (instead of char*). > > > > Functions (v)snprintf() and (v)snwprintf() needs additional > > _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR option which ensures that > > return value contains number of characters required to format whole string. > > --- > > mingw-w64-crt/Makefile.am | 18 +++++++++++++-- > > .../__ms_fprintf.c} | 2 +- > > .../__ms_fwprintf.c} | 10 ++++----- > > mingw-w64-crt/stdio/ucrt/__ms_printf.c | 22 +++++++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_snprintf.c | 22 +++++++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_snwprintf.c | 22 +++++++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_sprintf.c | 22 +++++++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_swprintf.c | 22 +++++++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vfprintf.c | 17 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vfwprintf.c | 17 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vprintf.c | 16 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vsnprintf.c | 17 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vsnwprintf.c | 17 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vsprintf.c | 16 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vswprintf.c | 17 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_vwprintf.c | 16 ++++++++++++++ > > mingw-w64-crt/stdio/ucrt/__ms_wprintf.c | 22 +++++++++++++++++++ > > This adds quite a lot of boilerplate code, further bloating our makefiles > (our Makefile.in is already 12 MB, and the step of generating Makefile from > Makefile.in on configure can take a significant amount of time if building > e.g. on Windows), for something that in principle was meant to be handled as > just one-line aliases in def files. > > I wonder if it would be possible to just do these redirections in a > different way? When declaring the __ms_ variants in the header, could we fix > this by redirecting it just back to the plain unprefixed symbols with asm() > (or __MINGW_ASM_CALL)?
I think that this is not possible and it is more complicated. __ms_ variant of w- functions has to be called with _CRT_INTERNAL_PRINTF_LEGACY_WIDE_SPECIFIERS options for tchar.h compatibility (usage of those macros expects that %s is _T string, which for unicode builds is wide-string wchar_t*). On the other hand compliant C95+ w- functions requires that %s is always narrow char* string. And our wprintf function is already compliant in both msvcrt and UCRT builds. So at least for w- printf/scanf functions we need two variants for UCRT builds. And this cannot be easily solved by asm alias. I do not have better solution for this now. But I would think about it and maybe I come up with better idea. Also I'm not sure but I have feeling that other *_LEGACY_* are needed too, that is why I included them. But maybe this is not correct?? I do not know right now. > If we do that, we do need to be careful so we don't hit an unprefixed C++ > inline function that is used for __USE_MINGW_ANSI_STDIO=1 though. But since > 4517417c018c12de387207e51e0f3728c5164e50 most of those functions aren't > inline anyway, so I think most of those can be safe. (There are some inline > functions still, entangled with _FORTIFY_SOURCE wrappers, that I didn't take > care of that the time of that commit though.) > > Doing that requires ifdeffing the declarations of the __ms_ functions, to > only use __MINGW_ASM_CALL in the case of UCRT, but I think the total amount > of overhead that way could be less than if we add separate files for all of > this - what do you think? > > // Martin _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public