From: "Rémi Bernon" Subject: [PATCH 2/6] ntdll: Redirect wine_dbg_sprintf formatting to ntdll.so. Message-Id: <20201121201913.1177092-2-rbernon@codeweavers.com> Date: Sat, 21 Nov 2020 21:19:09 +0100 In-Reply-To: <20201121201913.1177092-1-rbernon@codeweavers.com> References: <20201121201913.1177092-1-rbernon@codeweavers.com> This adds a new __wine_dbg_vsprintf internal export to format and strdup a debug message at once, using ms_abi varargs calling convention in all cases. Signed-off-by: Rémi Bernon --- dlls/ntdll/ntdll.spec | 1 + dlls/ntdll/thread.c | 8 ++++++++ dlls/ntdll/unix/debug.c | 11 +++++++++++ dlls/ntdll/unix/loader.c | 1 + dlls/ntdll/unixlib.h | 3 ++- dlls/winecrt0/debug.c | 14 ++++++++++++++ include/wine/debug.h | 29 +++++++++-------------------- 7 files changed, 46 insertions(+), 21 deletions(-) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 3a7adc92752..393db5caf20 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1617,6 +1617,7 @@ @ cdecl -norelay __wine_dbg_output(str) @ cdecl -norelay __wine_dbg_strdup(str) @ cdecl -norelay __wine_dbg_vprintf(str ptr) +@ cdecl -norelay __wine_dbg_vsprintf(str ptr) # Virtual memory @ cdecl -syscall __wine_locked_recvmsg(long ptr long) diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index a7231d008c6..ada79bf8843 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -82,6 +82,14 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args ) return unix_funcs->dbg_vprintf( format, args ); } +/*********************************************************************** + * __wine_dbg_vsnprintf (NTDLL.@) + */ +const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args ) +{ + return unix_funcs->dbg_vsprintf( format, args ); +} + /******************************************************************* * KiUserApcDispatcher (NTDLL.@) */ diff --git a/dlls/ntdll/unix/debug.c b/dlls/ntdll/unix/debug.c index fe5c3c64272..2b2d63b7adf 100644 --- a/dlls/ntdll/unix/debug.c +++ b/dlls/ntdll/unix/debug.c @@ -485,6 +485,17 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args ) } +/*********************************************************************** + * __wine_dbg_vsprintf (NTDLL.@) + */ +const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args ) +{ + char buffer[200]; + wine_dbg_vsnprintf( buffer, sizeof(buffer), format, args ); + return __wine_dbg_strdup( buffer ); +} + + /*********************************************************************** * dbg_init */ diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 310a4dab93c..a515e55662d 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1547,6 +1547,7 @@ static struct unix_funcs unix_funcs = __wine_dbg_output, __wine_dbg_header, __wine_dbg_vprintf, + __wine_dbg_vsprintf, }; diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index 1e98700a3fd..649ae047e01 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -27,7 +27,7 @@ struct _DISPATCHER_CONTEXT; /* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 107 +#define NTDLL_UNIXLIB_VERSION 108 struct unix_funcs { @@ -99,6 +99,7 @@ struct unix_funcs int (CDECL *dbg_header)( enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *function ); int (CDECL *dbg_vprintf)( const char *format, __ms_va_list args ); + const char * (CDECL *dbg_vsprintf)( const char *format, __ms_va_list args ); }; #endif /* __NTDLL_UNIXLIB_H */ diff --git a/dlls/winecrt0/debug.c b/dlls/winecrt0/debug.c index 5dc93acbecb..d8ba2603145 100644 --- a/dlls/winecrt0/debug.c +++ b/dlls/winecrt0/debug.c @@ -34,6 +34,7 @@ WINE_DECLARE_DEBUG_CHANNEL(timestamp); static const char * (__cdecl *p__wine_dbg_strdup)( const char *str ); static int (__cdecl *p__wine_dbg_output)( const char *str ); static int (__cdecl *p__wine_dbg_vprintf)( const char *format, __ms_va_list args ); +static const char * (__cdecl *p__wine_dbg_vsprintf)( const char *format, __ms_va_list args ); static unsigned char (__cdecl *p__wine_dbg_get_channel_flags)( struct __wine_debug_channel *channel ); static int (__cdecl *p__wine_dbg_header)( enum __wine_debug_class cls, struct __wine_debug_channel *channel, @@ -186,6 +187,13 @@ static int __cdecl fallback__wine_dbg_vprintf( const char *format, __ms_va_list return __wine_dbg_output( str ); } +static const char * __cdecl fallback__wine_dbg_vsprintf( const char *format, __ms_va_list args ) +{ + char str[200]; + vsnprintf( str, sizeof(str), format, args ); + return __wine_dbg_strdup( str ); +} + static int __cdecl fallback__wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *function ) @@ -250,6 +258,12 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args ) return p__wine_dbg_vprintf( format, args ); } +const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args ) +{ + LOAD_FUNC( __wine_dbg_vsprintf ); + return p__wine_dbg_vsprintf( format, args ); +} + unsigned char __cdecl __wine_dbg_get_channel_flags( struct __wine_debug_channel *channel ) { LOAD_FUNC( __wine_dbg_get_channel_flags ); diff --git a/include/wine/debug.h b/include/wine/debug.h index 7024ef270fc..5321429f5c5 100644 --- a/include/wine/debug.h +++ b/include/wine/debug.h @@ -149,6 +149,7 @@ extern int __cdecl __wine_dbg_output( const char *str ); extern int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_channel *channel, const char *function ); extern int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args ); +extern const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args ); /* * Exported definitions and macros @@ -158,28 +159,16 @@ extern int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args ); quotes. The string will be valid for some time, but not indefinitely as strings are re-used. */ -#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT) -# define __wine_dbg_cdecl __cdecl -# define __wine_dbg_va_list __builtin_ms_va_list -# define __wine_dbg_va_start(list,arg) __builtin_ms_va_start(list,arg) -# define __wine_dbg_va_end(list) __builtin_ms_va_end(list) -#else -# define __wine_dbg_cdecl -# define __wine_dbg_va_list va_list -# define __wine_dbg_va_start(list,arg) va_start(list,arg) -# define __wine_dbg_va_end(list) va_end(list) -#endif - -static const char * __wine_dbg_cdecl wine_dbg_sprintf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2); -static inline const char * __wine_dbg_cdecl wine_dbg_sprintf( const char *format, ... ) +static const char * __cdecl wine_dbg_sprintf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2); +static inline const char * __cdecl wine_dbg_sprintf( const char *format, ... ) { - char buffer[200]; - __wine_dbg_va_list args; + const char *ret; + __ms_va_list args; - __wine_dbg_va_start( args, format ); - vsnprintf( buffer, sizeof(buffer), format, args ); - __wine_dbg_va_end( args ); - return __wine_dbg_strdup( buffer ); + __ms_va_start( args, format ); + ret = __wine_dbg_vsprintf( format, args ); + __ms_va_end( args ); + return ret; } static int __cdecl wine_dbg_printf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2); -- 2.29.2