[PATCH 2/6] ntdll: Redirect wine_dbg_sprintf formatting to ntdll.so.
Rémi Bernon
rbernon at codeweavers.com
Sat Nov 21 14:19:09 CST 2020
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 <rbernon at codeweavers.com>
---
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
More information about the wine-devel
mailing list