1*b985c9caSMartin Matuskadnl
2*b985c9caSMartin Matuskadnl Checks for libunwind, which usually does a better job than backtrace() when
3*b985c9caSMartin Matuskadnl resolving symbols in the stack backtrace. Newer versions have support for
4*b985c9caSMartin Matuskadnl getting info about the object file the function came from, so we look for
5*b985c9caSMartin Matuskadnl that too and use it if found.
6*b985c9caSMartin Matuskadnl
7*b985c9caSMartin MatuskaAC_DEFUN([ZFS_AC_CONFIG_USER_LIBUNWIND], [
8*b985c9caSMartin Matuska	AC_ARG_WITH([libunwind],
9*b985c9caSMartin Matuska	    AS_HELP_STRING([--with-libunwind],
10*b985c9caSMartin Matuska		[use libunwind for backtraces in userspace assertions]),
11*b985c9caSMartin Matuska	    [],
12*b985c9caSMartin Matuska	    [with_libunwind=auto])
13*b985c9caSMartin Matuska
14*b985c9caSMartin Matuska	AS_IF([test "x$with_libunwind" != "xno"], [
15*b985c9caSMartin Matuska		ZFS_AC_FIND_SYSTEM_LIBRARY(LIBUNWIND, [libunwind], [libunwind.h], [], [unwind], [], [
16*b985c9caSMartin Matuska			dnl unw_get_elf_filename() is sometimes a macro, other
17*b985c9caSMartin Matuska			dnl times a proper symbol, so we can't just do a link
18*b985c9caSMartin Matuska			dnl check; we need to include the header properly.
19*b985c9caSMartin Matuska			AX_SAVE_FLAGS
20*b985c9caSMartin Matuska			CFLAGS="$CFLAGS $LIBUNWIND_CFLAGS"
21*b985c9caSMartin Matuska			LIBS="$LIBS $LIBUNWIND_LIBS"
22*b985c9caSMartin Matuska			AC_MSG_CHECKING([for unw_get_elf_filename in libunwind])
23*b985c9caSMartin Matuska			AC_LINK_IFELSE([
24*b985c9caSMartin Matuska				AC_LANG_PROGRAM([
25*b985c9caSMartin Matuska					#define UNW_LOCAL_ONLY
26*b985c9caSMartin Matuska					#include <libunwind.h>
27*b985c9caSMartin Matuska				], [
28*b985c9caSMartin Matuska					unw_get_elf_filename(0, 0, 0, 0);
29*b985c9caSMartin Matuska				])
30*b985c9caSMartin Matuska			], [
31*b985c9caSMartin Matuska				AC_MSG_RESULT([yes])
32*b985c9caSMartin Matuska				AC_DEFINE(HAVE_LIBUNWIND_ELF, 1,
33*b985c9caSMartin Matuska				    [libunwind has unw_get_elf_filename])
34*b985c9caSMartin Matuska			], [
35*b985c9caSMartin Matuska				AC_MSG_RESULT([no])
36*b985c9caSMartin Matuska			])
37*b985c9caSMartin Matuska			AX_RESTORE_FLAGS
38*b985c9caSMartin Matuska		], [
39*b985c9caSMartin Matuska			AS_IF([test "x$with_libunwind" = "xyes"], [
40*b985c9caSMartin Matuska				AC_MSG_FAILURE([--with-libunwind was given, but libunwind is not available, try installing libunwind-devel])
41*b985c9caSMartin Matuska			])
42*b985c9caSMartin Matuska		])
43*b985c9caSMartin Matuska	])
44*b985c9caSMartin Matuska])
45