Commit f33038bc authored by Simon McVittie's avatar Simon McVittie

build: Require va_copy() or __va_copy() on non-MSVC compilers

va_copy() is a C99 feature, and should be widely supported by now.
gcc in strict C89 mode implements an equivalent __va_copy() instead.

MSVC 2013 implements va_copy(), but at the moment we still aim to support
MSVC 2010 and 2012, which don't have it. However, we know that in
Windows ABIs, va_list is a pointer, so we can use
_DBUS_VA_COPY_ASSIGN. We do not support MSVC for Autotools builds, only
CMake, due to its non-Unixish command-line interface.
Signed-off-by: Simon McVittie's avatarSimon McVittie <smcv@collabora.com>
parent dab4a12e
...@@ -14,6 +14,10 @@ Dependencies: ...@@ -14,6 +14,10 @@ Dependencies:
MSVC >= 2005. In practice this requirement has existed since version MSVC >= 2005. In practice this requirement has existed since version
1.9.2, but it is now official. 1.9.2, but it is now official.
• dbus now requires a C99-compatible va_copy() macro (or a __va_copy()
macro with the same behaviour), except when building for Windows using
MSVC and CMake.
Enhancements: Enhancements:
• Rewrite CONTRIBUTING.md to reflect the current setup • Rewrite CONTRIBUTING.md to reflect the current setup
......
...@@ -121,25 +121,7 @@ elseif(MSVC) ...@@ -121,25 +121,7 @@ elseif(MSVC)
# this is used for msvc < 2013 # this is used for msvc < 2013
set(DBUS_VA_COPY _DBUS_VA_COPY_ASSIGN) set(DBUS_VA_COPY _DBUS_VA_COPY_ASSIGN)
else() else()
CHECK_C_SOURCE_RUNS(" message(FATAL_ERROR "dbus requires an ISO C99-compatible va_copy() macro, or a similar __va_copy(), or MSVC >= 2010")
#include <stdarg.h>
#include <stdlib.h>
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
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;
}
" VA_COPY_AS_ARRAY)
if (NOT VA_COPY_AS_ARRAY)
set(DBUS_VA_COPY_AS_ARRAY 1 CACHE STRING "Set to 1 if va_list cannot be copied as a value")
endif()
endif() endif()
CHECK_C_SOURCE_COMPILES(" CHECK_C_SOURCE_COMPILES("
......
...@@ -71,9 +71,6 @@ ...@@ -71,9 +71,6 @@
/* for msvc */ /* for msvc */
#define _DBUS_VA_COPY_ASSIGN(a1,a2) { a1 = a2; } #define _DBUS_VA_COPY_ASSIGN(a1,a2) { a1 = a2; }
/* Define if va_list cannot be copied as a value */
#cmakedefine DBUS_VA_COPY_AS_ARRAY 1
#cmakedefine DBUS_WITH_GLIB 1 #cmakedefine DBUS_WITH_GLIB 1
#cmakedefine GLIB_VERSION_MIN_REQUIRED @GLIB_VERSION_MIN_REQUIRED@ #cmakedefine GLIB_VERSION_MIN_REQUIRED @GLIB_VERSION_MIN_REQUIRED@
#cmakedefine GLIB_VERSION_MAX_ALLOWED @GLIB_VERSION_MAX_ALLOWED@ #cmakedefine GLIB_VERSION_MAX_ALLOWED @GLIB_VERSION_MAX_ALLOWED@
......
...@@ -565,38 +565,7 @@ fi ...@@ -565,38 +565,7 @@ fi
AS_IF([test -n "$dbus_va_copy_func"], AS_IF([test -n "$dbus_va_copy_func"],
[AC_DEFINE_UNQUOTED([DBUS_VA_COPY], [$dbus_va_copy_func], [A 'va_copy' style function])], [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])])
AC_LANG_PUSH([C])
AC_CACHE_CHECK([whether va_lists can be copied by value],
[dbus_cv_va_val_copy],
[AC_RUN_IFELSE([
AC_LANG_PROGRAM([[
#include <stdarg.h>
#include <stdlib.h>
]],
[[
static void f (int i, ...) {
va_list args1, args2;
va_start (args1, i);
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_val_copy=yes],
[dbus_cv_va_val_copy=no],
[dbus_cv_va_val_copy=yes])
])
AC_LANG_POP([C])
AS_IF([test "x$dbus_cv_va_val_copy" = "xno"],
[AC_DEFINE([DBUS_VA_COPY_AS_ARRAY], 1, [Define if 'va_list' cannot be copied as a value])])
])
#### Atomic integers #### Atomic integers
......
...@@ -614,20 +614,6 @@ void _dbus_logv (DBusSystemLogSeverity severity, ...@@ -614,20 +614,6 @@ void _dbus_logv (DBusSystemLogSeverity severity,
const char *msg, const char *msg,
va_list args) _DBUS_GNUC_PRINTF (2, 0); va_list args) _DBUS_GNUC_PRINTF (2, 0);
/* Define DBUS_VA_COPY() to do the right thing for copying va_list variables.
* config.h may have already defined DBUS_VA_COPY as va_copy or __va_copy.
*/
#if !defined (DBUS_VA_COPY)
# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32))
# define DBUS_VA_COPY(ap1, ap2) (*(ap1) = *(ap2))
# elif defined (DBUS_VA_COPY_AS_ARRAY)
# define DBUS_VA_COPY(ap1, ap2) memcpy ((ap1), (ap2), sizeof (va_list))
# else /* va_list is a pointer */
# define DBUS_VA_COPY(ap1, ap2) ((ap1) = (ap2))
# endif /* va_list is a pointer */
#endif /* !DBUS_VA_COPY */
/** /**
* Casts a primitive C type to a byte array and then indexes * Casts a primitive C type to a byte array and then indexes
* a particular byte of the array. * a particular byte of the array.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment