From d2e4a6fae0ddf95c7090fcb91548aa4b5242d88f Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 29 Aug 2019 14:46:00 +0200 Subject: [PATCH] configure: Add support for using an external libunwind. Signed-off-by: Alexandre Julliard --- configure | 136 +++++++++++++++++++++++++++++++++---- configure.ac | 37 +++++++++- dlls/ntdll/Makefile.in | 3 +- dlls/ntdll/signal_x86_64.c | 6 +- include/config.h.in | 4 +- 5 files changed, 167 insertions(+), 19 deletions(-) diff --git a/configure b/configure index c06bc4f0796..f3c5f92159c 100755 --- a/configure +++ b/configure @@ -662,6 +662,8 @@ FAUDIO_LIBS FAUDIO_CFLAGS SDL2_LIBS SDL2_CFLAGS +UNWIND_LIBS +UNWIND_CFLAGS UDEV_LIBS UDEV_CFLAGS OSS4_CFLAGS @@ -874,6 +876,7 @@ with_sane with_sdl with_tiff with_udev +with_unwind with_v4l2 with_vkd3d with_vulkan @@ -1852,6 +1855,8 @@ GSTREAMER_CFLAGS GSTREAMER_LIBS UDEV_CFLAGS UDEV_LIBS +UNWIND_CFLAGS +UNWIND_LIBS SDL2_CFLAGS SDL2_LIBS FAUDIO_CFLAGS @@ -2559,6 +2564,8 @@ Optional Packages: --without-sdl do not use SDL --without-tiff do not use TIFF --without-udev do not use udev (plug and play support) + --without-unwind do not use the libunwind library (exception + handling) --without-v4l2 do not use v4l2 (video capture) --without-vkd3d do not use vkd3d (Direct3D 12 support) --without-vulkan do not use Vulkan @@ -2640,6 +2647,9 @@ Some influential environment variables: gstreamer-audio-1.0, overriding pkg-config UDEV_CFLAGS C compiler flags for libudev, overriding pkg-config UDEV_LIBS Linker flags for libudev, overriding pkg-config + UNWIND_CFLAGS + C compiler flags for libunwind, overriding pkg-config + UNWIND_LIBS Linker flags for libunwind, overriding pkg-config SDL2_CFLAGS C compiler flags for sdl2, overriding pkg-config SDL2_LIBS Linker flags for sdl2, overriding pkg-config FAUDIO_CFLAGS @@ -4075,6 +4085,12 @@ if test "${with_udev+set}" = set; then : fi +# Check whether --with-unwind was given. +if test "${with_unwind+set}" = set; then : + withval=$with_unwind; +fi + + # Check whether --with-v4l2 was given. if test "${with_v4l2+set}" = set; then : withval=$with_v4l2; @@ -5590,6 +5606,7 @@ $as_echo "$wine_cv_cc_m32" >&6; } PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib/pkgconfig} export PKG_CONFIG_PATH enable_win16=${enable_win16:-yes} + with_unwind=${with_unwind:-no} else if test "x${GCC}" = "xyes" then @@ -5736,6 +5753,7 @@ $as_echo "$wine_cv_builtin_ms_va_list" >&6; } ;; i[3456789]86*) enable_win16=${enable_win16:-yes} + with_unwind=${with_unwind:-no} ;; esac @@ -8254,18 +8272,6 @@ fi ;; darwin*|macosx*) - for ac_header in libunwind.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "libunwind.h" "ac_cv_header_libunwind_h" "$ac_includes_default" -if test "x$ac_cv_header_libunwind_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBUNWIND_H 1 -_ACEOF - -fi - -done - ac_ext=m ac_cpp='$OBJCPP $CPPFLAGS' ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -14823,6 +14829,110 @@ esac fi +if test "x$with_unwind" != xno +then + if ${UNWIND_CFLAGS:+false} :; then : + if ${PKG_CONFIG+:} false; then : + UNWIND_CFLAGS=`$PKG_CONFIG --cflags libunwind 2>/dev/null` +fi +fi + +if ${UNWIND_LIBS:+false} :; then : + if ${PKG_CONFIG+:} false; then : + UNWIND_LIBS=`$PKG_CONFIG --libs libunwind 2>/dev/null` +fi +fi + +UNWIND_LIBS=${UNWIND_LIBS:-"-lunwind"} +$as_echo "$as_me:${as_lineno-$LINENO}: libunwind cflags: $UNWIND_CFLAGS" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: libunwind libs: $UNWIND_LIBS" >&5 +ac_save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $UNWIND_CFLAGS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for unw_getcontext" >&5 +$as_echo_n "checking for unw_getcontext... " >&6; } +if ${wine_cv_have_unw_getcontext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define UNW_LOCAL_ONLY +#include +int +main () +{ +unw_context_t context; unw_getcontext( &context ); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + wine_cv_have_unw_getcontext="yes" +else + wine_cv_have_unw_getcontext="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $wine_cv_have_unw_getcontext" >&5 +$as_echo "$wine_cv_have_unw_getcontext" >&6; } + if test "$wine_cv_have_unw_getcontext" = no -a -n "$UNWIND_LIBS" + then + save_libs=$LIBS + LIBS="$UNWIND_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unw_getcontext in libunwind" >&5 +$as_echo_n "checking for unw_getcontext in libunwind... " >&6; } +if ${wine_cv_have_libunwind_unw_getcontext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define UNW_LOCAL_ONLY +#include +int +main () +{ +unw_context_t context; unw_getcontext( &context ); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + wine_cv_have_libunwind_unw_getcontext="yes" +else + wine_cv_have_libunwind_unw_getcontext="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $wine_cv_have_libunwind_unw_getcontext" >&5 +$as_echo "$wine_cv_have_libunwind_unw_getcontext" >&6; } + test "$wine_cv_have_libunwind_unw_getcontext" = yes || UNWIND_LIBS="" + LIBS=$save_libs + fi + if test "x$wine_cv_have_unw_getcontext$wine_cv_have_libunwind_unw_getcontext" != xnono + then + +$as_echo "#define HAVE_LIBUNWIND 1" >>confdefs.h + + fi +CPPFLAGS=$ac_save_CPPFLAGS +test -z "$UNWIND_CFLAGS" || UNWIND_CFLAGS=`echo " $UNWIND_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'` +test -z "$UNWIND_LIBS" || UNWIND_LIBS=`echo " $UNWIND_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'` + +fi +case $host in + aarch64*|*-darwin*) + if test "x$wine_cv_have_unw_getcontext$wine_cv_have_libunwind_unw_getcontext" != xnono; then : + case "x$with_unwind" in + x) as_fn_append wine_notices "|libunwind ${notice_platform}development files not found, stack unwinding won't work." ;; + xno) ;; + *) as_fn_error $? "libunwind ${notice_platform}development files not found, stack unwinding won't work. +This is an error since --with-unwind was requested." "$LINENO" 5 ;; +esac + +fi ;; +esac + if test "x$with_sdl" != "xno" then if ${SDL2_CFLAGS:+false} :; then : @@ -19717,6 +19827,8 @@ ALSA_LIBS = $ALSA_LIBS OSS4_CFLAGS = $OSS4_CFLAGS UDEV_CFLAGS = $UDEV_CFLAGS UDEV_LIBS = $UDEV_LIBS +UNWIND_CFLAGS = $UNWIND_CFLAGS +UNWIND_LIBS = $UNWIND_LIBS SDL2_CFLAGS = $SDL2_CFLAGS SDL2_LIBS = $SDL2_LIBS FAUDIO_CFLAGS = $FAUDIO_CFLAGS diff --git a/configure.ac b/configure.ac index e58a9242397..091d831c585 100644 --- a/configure.ac +++ b/configure.ac @@ -82,6 +82,7 @@ AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner AC_ARG_WITH(sdl, AS_HELP_STRING([--without-sdl],[do not use SDL])) AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF])) AC_ARG_WITH(udev, AS_HELP_STRING([--without-udev],[do not use udev (plug and play support)])) +AC_ARG_WITH(unwind, AS_HELP_STRING([--without-unwind],[do not use the libunwind library (exception handling)])) AC_ARG_WITH(v4l2, AS_HELP_STRING([--without-v4l2],[do not use v4l2 (video capture)])) AC_ARG_WITH(vkd3d, AS_HELP_STRING([--without-vkd3d],[do not use vkd3d (Direct3D 12 support)])) AC_ARG_WITH(vulkan, AS_HELP_STRING([--without-vulkan],[do not use Vulkan])) @@ -161,6 +162,7 @@ case $host in PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib/pkgconfig} export PKG_CONFIG_PATH enable_win16=${enable_win16:-yes} + with_unwind=${with_unwind:-no} else if test "x${GCC}" = "xyes" then @@ -214,6 +216,7 @@ case $host in ;; i[[3456789]]86*) enable_win16=${enable_win16:-yes} + with_unwind=${with_unwind:-no} ;; esac @@ -743,7 +746,6 @@ case $host_os in ;; darwin*|macosx*) - AC_CHECK_HEADERS(libunwind.h) AC_LANG_PUSH([Objective C]) AC_CHECK_HEADERS(Metal/Metal.h) AC_LANG_POP([Objective C]) @@ -1676,6 +1678,39 @@ fi WINE_NOTICE_WITH(udev,[test "x$UDEV_LIBS" = "x"], [libudev ${notice_platform}development files not found, plug and play won't be supported.]) +dnl **** Check for libuwind **** +if test "x$with_unwind" != xno +then + WINE_PACKAGE_FLAGS(UNWIND,[libunwind],[-lunwind],,, + [AC_CACHE_CHECK([for unw_getcontext],wine_cv_have_unw_getcontext, + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#define UNW_LOCAL_ONLY +#include ]], + [[unw_context_t context; unw_getcontext( &context );]])], + [wine_cv_have_unw_getcontext="yes"],[wine_cv_have_unw_getcontext="no"])]) + if test "$wine_cv_have_unw_getcontext" = no -a -n "$UNWIND_LIBS" + then + save_libs=$LIBS + LIBS="$UNWIND_LIBS $LIBS" + AC_CACHE_CHECK([for unw_getcontext in libunwind],wine_cv_have_libunwind_unw_getcontext, + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#define UNW_LOCAL_ONLY +#include ]], + [[unw_context_t context; unw_getcontext( &context );]])], + [wine_cv_have_libunwind_unw_getcontext="yes"], + [wine_cv_have_libunwind_unw_getcontext="no"])]) + test "$wine_cv_have_libunwind_unw_getcontext" = yes || UNWIND_LIBS="" + LIBS=$save_libs + fi + if test "x$wine_cv_have_unw_getcontext$wine_cv_have_libunwind_unw_getcontext" != xnono + then + AC_DEFINE(HAVE_LIBUNWIND,1,[Define to 1 if you have the `unwind' library (-lunwind).]) + fi]) +fi +case $host in + aarch64*|*-darwin*) + WINE_NOTICE_WITH(unwind,[test "x$wine_cv_have_unw_getcontext$wine_cv_have_libunwind_unw_getcontext" != xnono], + [libunwind ${notice_platform}development files not found, stack unwinding won't work.]) ;; +esac + dnl **** Check for libSDL2 **** if test "x$with_sdl" != "xno" then diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index 1ad674e3b42..9b4d70f6e8a 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -2,7 +2,8 @@ EXTRADEFS = -D_NTSYSTEM_ MODULE = ntdll.dll IMPORTLIB = ntdll IMPORTS = winecrt0 -EXTRALIBS = $(IOKIT_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) +EXTRAINCL = $(UNWIND_CFLAGS) +EXTRALIBS = $(IOKIT_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) EXTRADLLFLAGS = -nodefaultlibs -Wl,--image-base,0x7bc00000 C_SRCS = \ diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index ec24d0d6ec2..8f8c5c53b80 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -51,7 +51,7 @@ #ifdef HAVE_SYS_UCONTEXT_H # include #endif -#ifdef HAVE_LIBUNWIND_H +#ifdef HAVE_LIBUNWIND # define UNW_LOCAL_ONLY # include #endif @@ -1409,7 +1409,7 @@ static NTSTATUS dwarf_virtual_unwind( ULONG64 ip, ULONG64 *frame,CONTEXT *contex } -#ifdef HAVE_LIBUNWIND_H +#ifdef HAVE_LIBUNWIND /*********************************************************************** * libunwind_set_cursor_from_context */ @@ -1629,7 +1629,7 @@ static NTSTATUS virtual_unwind( ULONG type, DISPATCHER_CONTEXT *dispatch, CONTEX if (status != STATUS_SUCCESS) return status; got_info = TRUE; } -#ifdef HAVE_LIBUNWIND_H +#ifdef HAVE_LIBUNWIND else { status = libunwind_virtual_unwind( context->Rip, &got_info, &dispatch->EstablisherFrame, diff --git a/include/config.h.in b/include/config.h.in index 29ea6f06636..29d34c2510f 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -419,8 +419,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIBUDEV_H -/* Define to 1 if you have the header file. */ -#undef HAVE_LIBUNWIND_H +/* Define to 1 if you have the `unwind' library (-lunwind). */ +#undef HAVE_LIBUNWIND /* Define if you have the libxml2 library */ #undef HAVE_LIBXML2