Remove emulation of va_copy() in non-C99 compilers

dbus now requires a (mostly-)C99 compiler, which guarantees the presence
of Standard C va_copy().

Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
Simon McVittie 2022-07-19 20:37:19 +01:00
parent bf30fe6d60
commit a54ed9ffad
8 changed files with 11 additions and 167 deletions

View file

@ -80,51 +80,6 @@ int main() {
epoll_create1 (EPOLL_CLOEXEC);
}" DBUS_HAVE_LINUX_EPOLL)
CHECK_C_SOURCE_COMPILES("
#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
va_copy (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
exit (1);
va_end (args1); va_end (args2);
}
int main() {
f (0, 42);
return 0;
}
" HAVE_VA_COPY)
CHECK_C_SOURCE_COMPILES("
#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
__va_copy (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
exit (1);
va_end (args1); va_end (args2);
}
int main() {
f (0, 42);
return 0;
}
" HAVE___VA_COPY)
if(HAVE_VA_COPY)
set(DBUS_VA_COPY va_copy CACHE STRING "va_copy function")
elseif(HAVE___VA_COPY)
set(DBUS_VA_COPY __va_copy CACHE STRING "va_copy function")
elseif(MSVC)
# this is used for msvc < 2013
set(DBUS_VA_COPY _DBUS_VA_COPY_ASSIGN)
else()
message(FATAL_ERROR "dbus requires an ISO C99-compatible va_copy() macro, or a similar __va_copy(), or MSVC >= 2010")
endif()
CHECK_C_SOURCE_COMPILES("
int main() {
int a = 4;

View file

@ -83,12 +83,6 @@
# define DBUS_ENABLE_X11_AUTOLAUNCH 1
#endif
/* A 'va_copy' style function */
#cmakedefine DBUS_VA_COPY @DBUS_VA_COPY@
/* for msvc */
#define _DBUS_VA_COPY_ASSIGN(a1,a2) { a1 = a2; }
#cmakedefine DBUS_WITH_GLIB 1
#cmakedefine GLIB_VERSION_MIN_REQUIRED @GLIB_VERSION_MIN_REQUIRED@
#cmakedefine GLIB_VERSION_MAX_ALLOWED @GLIB_VERSION_MAX_ALLOWED@

View file

@ -567,59 +567,6 @@ esac
# the AC_INCLUDES_DEFAULT.
AC_CHECK_DECLS([environ])
dnl **********************************
dnl *** va_copy checks (from GLib) ***
dnl **********************************
dnl we currently check for all three va_copy possibilities, so we get
dnl all results in config.log for bug reports.
AC_CACHE_CHECK([for an implementation of va_copy()],dbus_cv_va_copy,[
AC_LINK_IFELSE([AC_LANG_SOURCE([#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
va_copy (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
exit (1);
va_end (args1); va_end (args2);
}
int main() {
f (0, 42);
return 0;
}])],
[dbus_cv_va_copy=yes],
[dbus_cv_va_copy=no])
])
AC_CACHE_CHECK([for an implementation of __va_copy()],dbus_cv___va_copy,[
AC_LINK_IFELSE([AC_LANG_SOURCE([#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
__va_copy (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
exit (1);
va_end (args1); va_end (args2);
}
int main() {
f (0, 42);
return 0;
}])],
[dbus_cv___va_copy=yes],
[dbus_cv___va_copy=no])
])
if test "x$dbus_cv_va_copy" = "xyes"; then
dbus_va_copy_func=va_copy
else if test "x$dbus_cv___va_copy" = "xyes"; then
dbus_va_copy_func=__va_copy
fi
fi
AS_IF([test -n "$dbus_va_copy_func"],
[AC_DEFINE_UNQUOTED([DBUS_VA_COPY], [$dbus_va_copy_func], [A 'va_copy' style function])],
[AC_MSG_ERROR([dbus requires an ISO C99-compatible va_copy() macro, or a compatible __va_copy(), or MSVC >= 2010 and CMake])])
#### Atomic integers
AC_CACHE_CHECK([whether $CC knows __sync_sub_and_fetch()],

View file

@ -843,7 +843,7 @@ _dbus_message_iter_get_args_valist (DBusMessageIter *iter,
/* copy var_args first, then we can do another iteration over it to
* free memory and close unix fds if parse failed at some point.
*/
DBUS_VA_COPY (copy_args, var_args);
va_copy (copy_args, var_args);
while (spec_type != DBUS_TYPE_INVALID)
{

View file

@ -41,8 +41,6 @@
#include "dbus-marshal-basic.h" /* probably should be removed by moving the usage of DBUS_TYPE
* into the marshaling-related files
*/
/* for DBUS_VA_COPY */
#include "dbus-sysdeps.h"
/**
* @defgroup DBusString DBusString class
@ -1112,7 +1110,7 @@ _dbus_string_append_printf_valist (DBusString *str,
DBUS_STRING_PREAMBLE (str);
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
/* Measure the message length without terminating nul */
len = _dbus_printf_string_upper_bound (format, args);

View file

@ -3825,7 +3825,7 @@ _dbus_printf_string_upper_bound (const char *format,
int len;
va_list args_copy;
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
len = vsnprintf (static_buf, bufsize, format, args_copy);
va_end (args_copy);
@ -3843,7 +3843,7 @@ _dbus_printf_string_upper_bound (const char *format,
* or the real length could be coincidentally the same. Which is it?
* If vsnprintf returns the truncated length, we'll go to the slow
* path. */
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
if (vsnprintf (static_buf, 1, format, args_copy) == 1)
len = -1;
@ -3864,7 +3864,7 @@ _dbus_printf_string_upper_bound (const char *format,
if (buf == NULL)
return -1;
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
len = vsnprintf (buf, bufsize, format, args_copy);
va_end (args_copy);
@ -5097,7 +5097,7 @@ _dbus_logv (DBusSystemLogSeverity severity,
_dbus_assert_not_reached ("invalid log severity");
}
DBUS_VA_COPY (tmp, args);
va_copy (tmp, args);
vsyslog (flags, msg, tmp);
va_end (tmp);
}
@ -5107,7 +5107,7 @@ _dbus_logv (DBusSystemLogSeverity severity,
if (log_flags & DBUS_LOG_FLAGS_STDERR)
#endif
{
DBUS_VA_COPY (tmp, args);
va_copy (tmp, args);
fprintf (stderr, "%s[" DBUS_PID_FORMAT "]: ", syslog_tag, _dbus_getpid ());
vfprintf (stderr, msg, tmp);
fputc ('\n', stderr);

View file

@ -744,7 +744,7 @@ int _dbus_printf_string_upper_bound (const char *format,
va_list args_copy;
bufsize = sizeof (buf);
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
len = _vsnprintf (buf, bufsize - 1, format, args_copy);
va_end (args_copy);
@ -759,7 +759,7 @@ int _dbus_printf_string_upper_bound (const char *format,
if (p == NULL)
return -1;
DBUS_VA_COPY (args_copy, args);
va_copy (args_copy, args);
len = _vsnprintf (p, bufsize - 1, format, args_copy);
va_end (args_copy);
free (p);
@ -4249,7 +4249,7 @@ _dbus_logv (DBusSystemLogSeverity severity,
{
DBusString out = _DBUS_STRING_INIT_INVALID;
const char *message = NULL;
DBUS_VA_COPY (tmp, args);
va_copy (tmp, args);
if (!_dbus_string_init (&out))
goto out;
@ -4276,7 +4276,7 @@ out:
if (log_flags & DBUS_LOG_FLAGS_STDERR)
{
DBUS_VA_COPY (tmp, args);
va_copy (tmp, args);
fprintf (stderr, "%s[%lu]: %s: ", log_tag, _dbus_pid_for_log (), s);
vfprintf (stderr, msg, tmp);
fprintf (stderr, "\n");

View file

@ -642,56 +642,6 @@ have_backtrace = (cc.has_header('execinfo.h', args: compile_args_c)
)
config.set('HAVE_BACKTRACE', have_backtrace)
# **********************************
# *** va_copy checks (from GLib) ***
# **********************************
# we currently check for all three va_copy possibilities, so we get
# all results in config.log for bug reports.
# Can't use cc.has_function here because va_copy is not
# exactly a function
va_copy_check = '''
#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...)
{
va_list args1, args2;
va_start (args1, i);
@0@ (args2, args1);
if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
exit (1);
va_end (args1);
va_end (args2);
}
int main()
{
f (0, 42);
return 0;
}
'''
has_va_copy = cc.links(va_copy_check.format('va_copy'), args: compile_args_c)
has___va_copy = cc.links(va_copy_check.format('__va_copy'), args: compile_args_c)
if has_va_copy
va_copy = 'va_copy'
elif has___va_copy
va_copy = '__va_copy'
elif cc.get_id() == 'msvc'
va_copy = '_DBUS_VA_COPY_ASSIGN'
config.set('_DBUS_VA_COPY_ASSIGN(a1,a2)', '{ a1 = a2; }')
else
error('dbus requires an ISO C99-compatible va_copy() macro, '
+ 'or a compatible __va_copy()')
endif
config.set('DBUS_VA_COPY', va_copy)
# Can't use cc.has_function here because atomic operations are not
# exactly functions
config.set10(