1 dnl Autoconf configuration for libsigsegv.
2 dnl Process this file with autoconf to produce a configure script.
4 dnl Copyright (C) 2002-2011 Bruno Haible <bruno@clisp.org>
6 dnl This program is free software; you can redistribute it and/or modify
7 dnl it under the terms of the GNU General Public License as published by
8 dnl the Free Software Foundation; either version 2, or (at your option)
11 dnl This program is distributed in the hope that it will be useful,
12 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
13 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 dnl GNU General Public License for more details.
16 dnl You should have received a copy of the GNU General Public License
17 dnl along with this program; if not, write to the Free Software Foundation,
18 dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 AC_CONFIG_SRCDIR([src/sigsegv.h.in])
23 AC_CONFIG_AUX_DIR([build-aux])
27 { echo; echo "${term_bold}Build Tools:${term_norm}"; } >& AS_MESSAGE_FD
29 AM_INIT_AUTOMAKE([libsigsegv], [2.10])
30 AM_CONFIG_HEADER([config.h])
32 dnl Override automake's tar command used for creating distributions.
33 am__tar='${AMTAR} chf - --owner=root --group=root "$$tardir"'
41 dnl ========================== Determine PLATFORM ==========================
42 dnl Requires AC_CANONICAL_HOST.
43 dnl PLATFORM is a modified config.guess triple that is supposed to contain
44 dnl the bits of information which influence the configuration or functioning
45 dnl of catching faults.
47 AC_MSG_CHECKING([host platform])
49 changequote(,)dnl Autoconf 2.52 brokenness
52 kernelversion=`uname -r | sed -e 's/^\([0-9.]*\).*/\1/'`
53 sv_cv_host=`echo $sv_cv_host | sed -e "s/linux/linux$kernelversion/"`
56 changequote([,])dnl Autoconf 2.52 brokenness
57 cat > conftest.c << EOF
59 #ifdef __GNU_LIBRARY__
60 Version __GLIBC__ . __GLIBC_MINOR__
63 glibcversion=`$CPP $CPPFLAGS conftest.c 2>/dev/null | grep Version | sed -e 's/Version//' -e 's/ //g'`
64 if test -n "$glibcversion"; then
65 sv_cv_host="$sv_cv_host-glibc$glibcversion"
67 AC_MSG_RESULT([$sv_cv_host])
68 PLATFORM="$sv_cv_host"
71 dnl ========================== Done with PLATFORM ==========================
76 LT_INIT([disable-shared])
78 # For testing cross-compilation behaviour.
81 { echo; echo "${term_bold}Optional Platform Environment:${term_norm}"; } >& AS_MESSAGE_FD
83 dnl Headers to be included with <signal.h>. On MacOS X (Darwin) one also
84 dnl needs <sys/signal.h>.
85 AC_CHECK_HEADERS([sys/signal.h])
88 dnl ========================== Determine CFG_SIGNALS ==========================
89 dnl Requires AC_CANONICAL_HOST.
91 dnl List of signals that are sent when an invalid virtual memory address
92 dnl is accessed, or when the stack overflows.
94 sunos4* | freebsd* | dragonfly* | openbsd* | netbsd* | kfreebsd* | knetbsd*)
95 CFG_SIGNALS=signals-bsd.h ;;
97 CFG_SIGNALS=signals-hpux.h ;;
99 CFG_SIGNALS=signals-macos.h ;;
101 CFG_SIGNALS=signals-hurd.h ;;
103 CFG_SIGNALS=signals.h ;;
105 AC_DEFINE_UNQUOTED([CFG_SIGNALS], ["$CFG_SIGNALS"],
106 [The name of the include file describing the fault signals.])
108 dnl ========================== Done with CFG_SIGNALS ==========================
111 # How to determine the memory page size.
114 # How to allocate fresh memory using mmap.
115 # (We need mmap, because mprotect() doesn't work on malloc()ed memory on
120 dnl ================== Determine CFG_HANDLER partially, ==================
121 dnl ================== CFG_FAULT, CFG_MACHFAULT, ==================
122 dnl ================== FAULT_CONTEXT, FAULT_CONTEXT_INCLUDE ==================
123 dnl Requires AC_CANONICAL_HOST, SV_MMAP_ANON.
125 # How to write a SIGSEGV handler with access to the fault address.
127 # On MacOS X 10.2 or newer, we don't need these tests, because we'll end up
128 # using handler-macos.c anyway. If we were to perform the tests, 5 Crash Report
129 # dialog windows would pop up.
131 macos* | darwin[[6-9]]* | darwin[[1-9]][[0-9]]*) ;;
134 dnl FIXME: Put in some more known values into the third argument.
135 SV_TRY_FAULT([POSIX], sv_cv_fault_posix,
136 [*-*-solaris2.[7-9] | i?86-*-linux2.[4-9]* | i?86-*-freebsd[4-9]* | i?86-*-mirbsd1[0-9] | alpha*-dec-osf[4-9]* | *-*-hpux11* | mips-sgi-irix6*],
138 [int sig, siginfo_t *sip, void *ucp],
140 [action.sa_sigaction = &sigsegv_handler;
141 action.sa_flags = SA_SIGINFO;])
143 SV_TRY_FAULT([Linux/i386], sv_cv_fault_linux_i386, [i?86-*-linux2.[2-9]*],
144 [#include <asm/sigcontext.h>],
145 [int sig, struct sigcontext sc],
148 SV_TRY_FAULT([old Linux/i386], sv_cv_fault_linux_i386_old,
149 [i?86-*-linux2.[2-9]*],
151 [int sig, unsigned int more],
152 [((unsigned long *) &more) [21]])
154 dnl FIXME: Put in some more known values into the third argument.
155 SV_TRY_FAULT([Linux/m68k], sv_cv_fault_linux_m68k, [],
156 [#include <asm/sigcontext.h>
157 #include "$srcdir/src/fault-linux-m68k-old.c"],
158 [int sig, int code, struct sigcontext *scp],
159 [get_fault_addr (scp)])
161 dnl FIXME: Put in some more known values into the third argument.
162 SV_TRY_FAULT([Linux/PowerPC], sv_cv_fault_linux_powerpc, [],
163 [#include <asm/sigcontext.h>],
164 [int sig, struct sigcontext *scp],
167 dnl FIXME: Put in some more known values into the third argument.
168 SV_TRY_FAULT([Linux/HPPA], sv_cv_fault_linux_hppa, [],
170 [int sig, siginfo_t *sip, void *ucp],
172 [action.sa_sigaction = &sigsegv_handler;
173 action.sa_flags = SA_SIGINFO;])
175 dnl FIXME: Put in some more known values into the third argument.
176 SV_TRY_FAULT([BSD], sv_cv_fault_bsd, [i?86-*-freebsd[4-9]*],
178 [int sig, int code, struct sigcontext *scp, void *addr],
181 dnl FIXME: Put in some more known values into the third argument.
182 SV_TRY_FAULT([IRIX], sv_cv_fault_irix, [mips-sgi-irix6*],
184 [int sig, int code, struct sigcontext *scp],
185 [(unsigned long) scp->sc_badvaddr])
187 dnl FIXME: Put in some more known values into the third argument.
188 SV_TRY_FAULT([HP-UX HPPA], sv_cv_fault_hpux_hppa, [hppa*-*-hpux11*],
190 #define USE_64BIT_REGS(mc) \
191 (((mc).ss_flags & SS_WIDEREGS) && ((mc).ss_flags & SS_NARROWISINVALID))
192 #define GET_CR21(mc) \
193 (USE_64BIT_REGS(mc) ? (mc).ss_wide.ss_64.ss_cr21 : (mc).ss_narrow.ss_cr21)
195 [int sig, int code, struct sigcontext *scp],
196 [GET_CR21 (scp->sc_sl.sl_ss)])
198 dnl FIXME: Put in some more known values into the third argument.
199 SV_TRY_FAULT([OSF/1 Alpha], sv_cv_fault_osf_alpha,
200 [alpha*-*-osf[4-9]* | alpha*-*-linux2.[4-9]*],
202 [int sig, int code, struct sigcontext *scp],
203 [scp->sc_traparg_a0])
205 dnl FIXME: Put in some more known values into the third argument.
206 SV_TRY_FAULT([NetBSD Alpha], sv_cv_fault_netbsd_alpha,
207 [alpha*-*-osf[4-9]* | alpha-*-*bsd*],
208 [#include "$srcdir/src/fault-netbsd-alpha.c"],
209 [int sig, int code, struct sigcontext *scp],
210 [get_fault_addr (scp)])
212 dnl FIXME: Put in some more known values into the third argument.
213 SV_TRY_FAULT([AIX], sv_cv_fault_aix, [*-*-aix[34]*],
215 [int sig, int code, struct sigcontext *scp],
216 [scp->sc_jmpbuf.jmp_context.o_vaddr])
218 SV_TRY_FAULT([MacOSX/Darwin7 PowerPC], sv_cv_fault_macosdarwin7_ppc,
219 [powerpc-*-darwin7*],
220 [#include "$srcdir/src/fault-macosdarwin7-powerpc.c"],
221 [int sig, siginfo_t *sip, ucontext_t *ucp],
222 [get_fault_addr (sip, ucp)],
223 [action.sa_sigaction = &sigsegv_handler;
224 action.sa_flags = SA_SIGINFO;])
226 if test "$sv_cv_fault_macosdarwin7_ppc" != yes; then
227 SV_TRY_FAULT([MacOSX/Darwin5 PowerPC], sv_cv_fault_macosdarwin5_ppc,
228 [powerpc-*-darwin5*],
229 [#include "$srcdir/src/fault-macosdarwin5-powerpc.c"],
230 [int sig, int code, struct sigcontext *scp],
231 [get_fault_addr (scp)])
234 dnl FIXME: Put in some more known values into the third argument.
235 SV_TRY_FAULT([Hurd], sv_cv_fault_hurd, [],
237 [int sig, int code, struct sigcontext *scp],
240 # End of MacOS X special casing.
244 dnl Now determine the fault handler include file.
245 dnl We prefer the platform specific include files to the generic fault-posix.h
246 dnl because the former often defines SIGSEGV_FAULT_STACKPOINTER.
247 dnl Also we put the BSD test second-to-last, because the test may produce
253 FAULT_CONTEXT_INCLUDE=
255 dnl First the cases where the OS provides the fault address.
257 if test -z "$CFG_FAULT" && test "$sv_cv_fault_aix" = yes; then
259 powerpc* | rs6000) CFG_FAULT=fault-aix3-powerpc.h ;;
260 *) CFG_FAULT=fault-aix3.h ;;
262 FAULT_CONTEXT='struct sigcontext'
264 if test -z "$CFG_FAULT" && test "$sv_cv_fault_irix" = yes; then
266 mips*) CFG_FAULT=fault-irix-mips.h ;;
267 *) CFG_FAULT=fault-irix.h ;;
269 FAULT_CONTEXT='struct sigcontext'
271 if test -z "$CFG_FAULT" && test "$sv_cv_fault_hpux_hppa" = yes; then
273 hppa* | parisc*) CFG_FAULT=fault-hpux-hppa.h ;;
274 *) CFG_FAULT=fault-hpux.h ;;
276 FAULT_CONTEXT='struct sigcontext'
278 if test -z "$CFG_FAULT" && test "$sv_cv_fault_osf_alpha" = yes; then
280 alpha*) CFG_FAULT=fault-osf-alpha.h ;;
281 *) CFG_FAULT=fault-osf.h ;;
283 FAULT_CONTEXT='struct sigcontext'
285 if test -z "$CFG_FAULT" && test "$sv_cv_fault_netbsd_alpha" = yes; then
287 alpha*) CFG_FAULT=fault-netbsd-alpha.h ;;
289 FAULT_CONTEXT='struct sigcontext'
291 if test -z "$CFG_FAULT" && test "$sv_cv_fault_hurd" = yes; then
293 netbsd*) # A false positive.
296 CFG_FAULT=fault-hurd.h
297 FAULT_CONTEXT='struct sigcontext'
301 if test -z "$CFG_FAULT" && test "$sv_cv_fault_bsd" = yes; then
303 freebsd* | dragonfly* | kfreebsd*)
306 CFG_FAULT=fault-freebsd-i386.h
307 FAULT_CONTEXT='struct sigcontext'
310 CFG_FAULT=fault-bsd.h
316 CFG_FAULT=fault-bsd.h
321 if test -z "$CFG_FAULT" && test "$sv_cv_fault_posix" = yes; then
325 alpha*) CFG_FAULT=fault-openbsd-alpha.h ;;
326 arm* | strongarm* | xscale*) CFG_FAULT=fault-openbsd-arm.h ;;
327 hppa* | parisc*) CFG_FAULT=fault-openbsd-hppa.h ;;
328 i?86 | x86_64) CFG_FAULT=fault-openbsd-i386.h ;;
329 m68*) CFG_FAULT=fault-openbsd-m68k.h ;;
330 m88k*) CFG_FAULT=fault-openbsd-m88k.h ;;
331 mips*) CFG_FAULT=fault-openbsd-mips.h ;;
332 powerpc* | rs6000) CFG_FAULT=fault-openbsd-powerpc.h ;;
333 sh*) CFG_FAULT=fault-openbsd-sh.h ;;
334 sparc*) CFG_FAULT=fault-openbsd-sparc.h ;;
335 vax*) CFG_FAULT=fault-openbsd-vax.h ;;
336 *) CFG_FAULT=fault-openbsd.h ;;
338 FAULT_CONTEXT='struct sigcontext'
343 CFG_FAULT=fault-openbsd-i386.h
344 FAULT_CONTEXT='struct sigcontext'
351 CFG_FAULT=fault-linux-ia64-old.h
352 FAULT_CONTEXT='struct sigcontext'
357 if test -z "$CFG_FAULT"; then
358 dnl <ucontext.h> was required by POSIX:2001, and many systems have it. But
359 dnl POSIX:2008 does not require it any more, and MirBSD does not have it.
360 AC_CHECK_HEADERS([ucontext.h])
361 if test $ac_cv_header_ucontext_h = yes; then
365 i?86 | x86_64) CFG_FAULT=fault-solaris-i386.h ;;
366 sparc*) CFG_FAULT=fault-solaris-sparc.h ;;
367 *) CFG_FAULT=fault-solaris.h ;;
372 powerpc* | rs6000) CFG_FAULT=fault-aix5-powerpc.h ;;
373 *) CFG_FAULT=fault-aix5.h ;;
377 CFG_FAULT=fault-netbsd.h
382 CFG_FAULT=fault-linux-alpha.h
384 arm* | strongarm* | xscale*)
385 CFG_FAULT=fault-linux-arm.h
388 CFG_FAULT=fault-linux-cris.h
391 CFG_FAULT=fault-linux-hppa.h
394 CFG_FAULT=fault-linux-i386.h
397 CFG_FAULT=fault-linux-ia64.h
400 CFG_FAULT=fault-linux-m68k.h
403 CFG_FAULT=fault-linux-mips.h
406 CFG_FAULT=fault-linux-powerpc.h
409 CFG_FAULT=fault-linux-s390.h
412 CFG_FAULT=fault-linux-sh.h
415 CFG_FAULT=fault-linux-sparc.h
418 CFG_FAULT=fault-posix-ucontext.h
423 CFG_FAULT=fault-posix-ucontext.h
426 FAULT_CONTEXT='ucontext_t'
427 FAULT_CONTEXT_INCLUDE='#include <ucontext.h>'
429 CFG_FAULT=fault-posix.h
434 if test -z "$CFG_FAULT" && test "$sv_cv_fault_linux_i386" = yes; then
436 i?86 | x86_64) CFG_FAULT=fault-linux-i386-old.h ;;
438 FAULT_CONTEXT='struct sigcontext'
440 if test -z "$CFG_FAULT" && test "$sv_cv_fault_linux_i386_old" = yes; then
442 i?86 | x86_64) CFG_FAULT=fault-linux-i386-oldold.h ;;
444 FAULT_CONTEXT='struct sigcontext'
446 if test -z "$CFG_FAULT" && test "$sv_cv_fault_linux_powerpc" = yes; then
448 powerpc* | rs6000) CFG_FAULT=fault-linux-powerpc-old.h ;;
450 FAULT_CONTEXT='struct sigcontext'
452 if test -z "$CFG_FAULT" && test "$sv_cv_fault_linux_hppa" = yes; then
454 hppa* | parisc*) CFG_FAULT=fault-linux-hppa-old.h ;;
457 if test -z "$CFG_FAULT"; then
459 macos* | darwin[[6-9]]* | darwin[[1-9]][[0-9]]*)
461 powerpc* | rs6000 | i?86 | x86_64)
462 CFG_MACHFAULT=machfault-macos.h
463 FAULT_CONTEXT_INCLUDE='#include <signal.h>
464 #include <mach/thread_status.h>
465 #if defined __ppc64__
466 #define sigsegv_thread_state_t ppc_thread_state64_t
467 #elif defined __ppc__
468 #define sigsegv_thread_state_t ppc_thread_state_t
470 #if defined __x86_64__
471 #define sigsegv_thread_state_t x86_thread_state64_t
472 #elif defined __i386__
473 #if defined x86_THREAD_STATE32
474 #define sigsegv_thread_state_t x86_thread_state32_t
476 #define sigsegv_thread_state_t i386_thread_state_t
479 FAULT_CONTEXT='sigsegv_thread_state_t'
482 if test -n "$CFG_MACHFAULT"; then
483 CFG_HANDLER=handler-macos.c
484 CFG_FAULT=fault-macos.h # nonexistent, just a dummy
490 dnl Next, the cases where there is a hairy CPU dependent way to get the
493 if test -z "$CFG_FAULT" && test "$sv_cv_fault_linux_m68k" = yes; then
496 CFG_FAULT=fault-linux-m68k-old.h
497 FAULT_CONTEXT='struct sigcontext'
501 if test -z "$CFG_FAULT" && test "$sv_cv_fault_macosdarwin7_ppc" = yes; then
504 CFG_FAULT=fault-macosdarwin7-powerpc.h
505 FAULT_CONTEXT='ucontext_t'
506 FAULT_CONTEXT_INCLUDE='#include <signal.h>
507 #include <ucontext.h>'
511 if test -z "$CFG_FAULT" && test "$sv_cv_fault_macosdarwin5_ppc" = yes; then
514 CFG_FAULT=fault-macosdarwin5-powerpc.h
515 FAULT_CONTEXT='struct sigcontext'
521 FAULT_CONTEXT='CONTEXT'
522 FAULT_CONTEXT_INCLUDE='#include <windows.h>'
523 CFG_FAULT=fault-win32.h # nonexistent, just a dummy
526 FAULT_CONTEXT='struct _CONTEXT'
527 # CONTEXT is defined in <windows.h>, but cygwin programs should not
528 # normally inspect the contents of CONTEXT, and the outright inclusion
529 # of <windows.h> pollutes the namespace.
530 FAULT_CONTEXT_INCLUDE='struct _CONTEXT;'
531 # Cygwin 1.7 uses fault-posix.h. Cygwin 1.5.x needs a hacky workaround.
532 if test -z "$CFG_FAULT"; then
533 CFG_FAULT=fault-cygwin-old.h
534 AC_DEFINE([OLD_CYGWIN_WORKAROUND], [1],
535 [Define to 1 on Cygwin versions older than 1.7.])
539 if test -n "$CFG_FAULT"; then
540 sv_cv_have_sigsegv_recovery=yes
542 sv_cv_have_sigsegv_recovery=no
544 dnl No way to get the fault address. But other information is available.
550 CFG_FAULT=fault-linux-alpha-old.h
551 FAULT_CONTEXT='struct sigcontext'
553 arm* | strongarm* | xscale*)
554 CFG_FAULT=fault-linux-arm-old.h
555 FAULT_CONTEXT='struct sigcontext'
558 CFG_FAULT=fault-linux-cris-old.h
559 FAULT_CONTEXT='struct sigcontext'
562 CFG_FAULT=fault-linux-mips-old.h
563 FAULT_CONTEXT='struct sigcontext'
566 CFG_FAULT=fault-linux-s390-old.h
567 FAULT_CONTEXT='struct sigcontext'
570 CFG_FAULT=fault-linux-sh-old.h
571 FAULT_CONTEXT='struct sigcontext'
574 CFG_FAULT=fault-linux-sparc-old.h
575 FAULT_CONTEXT='struct sigcontext'
578 CFG_FAULT=fault-linux-x86_64-old.h
579 FAULT_CONTEXT='struct sigcontext'
585 i?86 | x86_64) CFG_FAULT=fault-beos-i386.h ;;
586 *) CFG_FAULT=fault-beos.h ;;
588 FAULT_CONTEXT='struct vregs'
592 i?86 | x86_64) CFG_FAULT=fault-macos-i386.h ;;
594 FAULT_CONTEXT='struct sigcontext'
598 AC_MSG_CHECKING([for the fault handler specifics])
599 if test -n "$CFG_FAULT"; then
600 sv_cv_fault_include=$CFG_FAULT
602 if test -n "$CFG_MACHFAULT"; then
603 sv_cv_fault_include=$CFG_MACHFAULT
605 sv_cv_fault_include=none
608 AC_MSG_RESULT([$sv_cv_fault_include])
609 if test -z "$CFG_FAULT"; then
610 CFG_FAULT=fault-none.h
612 AC_DEFINE_UNQUOTED([CFG_FAULT], ["$CFG_FAULT"],
613 [The name of the include file describing the fault handler.])
614 if test -z "$CFG_MACHFAULT"; then
615 CFG_MACHFAULT=fault-none.h
617 AC_DEFINE_UNQUOTED([CFG_MACHFAULT], ["$CFG_MACHFAULT"],
618 [The name of the include file describing the Mach fault handler.])
619 AC_SUBST([FAULT_CONTEXT])
620 AC_SUBST([FAULT_CONTEXT_INCLUDE])
621 dnl AM_SUBST_NOTMAKE, because FAULT_CONTEXT_INCLUDE may have a multiline value.
622 AM_SUBST_NOTMAKE([FAULT_CONTEXT_INCLUDE])
624 dnl ================== Done with CFG_HANDLER partially, ==================
625 dnl ================== CFG_FAULT, CFG_MACHFAULT, ==================
626 dnl ================== FAULT_CONTEXT, FAULT_CONTEXT_INCLUDE ==================
629 dnl ===================== Determine HAVE_SIGSEGV_RECOVERY =====================
630 dnl Requires CFG_HANDLER / CFG_FAULT / etc.
632 AC_MSG_CHECKING([if the system supports catching SIGSEGV])
633 AC_MSG_RESULT([$sv_cv_have_sigsegv_recovery])
634 if test $sv_cv_have_sigsegv_recovery != no; then
635 HAVE_SIGSEGV_RECOVERY=1
637 HAVE_SIGSEGV_RECOVERY=0
639 AC_SUBST([HAVE_SIGSEGV_RECOVERY])
641 dnl ===================== Done with HAVE_SIGSEGV_RECOVERY =====================
644 dnl The stackoverflow_context_t type depends on the CFG_FAULT include file.
650 dnl ========================= Determine CFG_STACKVMA =========================
651 dnl Requires AC_CANONICAL_HOST.
653 dnl Determination of the stack's virtual memory area.
654 AC_CACHE_CHECK([for PIOCMAP in sys/procfs.h], [sv_cv_procfsvma], [
655 AC_TRY_LINK([#include <sys/procfs.h>],
656 [int x = PIOCNMAP + PIOCMAP; prmap_t y;],
657 [sv_cv_procfsvma=yes], [sv_cv_procfsvma=no])
659 AC_CHECK_FUNCS([mquery mincore])
661 if test $sv_cv_procfsvma = yes; then
662 CFG_STACKVMA=stackvma-procfs.c
665 linux*) CFG_STACKVMA=stackvma-linux.c ;;
666 freebsd* | dragonfly*) CFG_STACKVMA=stackvma-freebsd.c ;;
667 netbsd*) CFG_STACKVMA=stackvma-netbsd.c ;;
668 beos*) CFG_STACKVMA=stackvma-beos.c ;;
669 macos* | darwin*) CFG_STACKVMA=stackvma-mach.c ;;
672 dnl We prefer the mquery based approach over the mincore based approach,
673 dnl because stackvma-mincore.c:is_unmapped() has a bad worst-case runtime.
674 if test -z "$CFG_STACKVMA" && test $ac_cv_func_mquery = yes; then
675 CFG_STACKVMA=stackvma-mquery.c
677 if test -z "$CFG_STACKVMA" && test $ac_cv_func_mincore = yes; then
678 CFG_STACKVMA=stackvma-mincore.c
680 if test -n "$CFG_STACKVMA"; then
681 AC_DEFINE([HAVE_STACKVMA], [1],
682 [Define if CFG_STACKVMA is set to a nontrivial source file.])
684 CFG_STACKVMA=stackvma-none.c
686 AC_DEFINE_UNQUOTED([CFG_STACKVMA], ["$CFG_STACKVMA"],
687 [The name of the file determining the stack virtual memory area.])
688 AC_SUBST([CFG_STACKVMA])
690 dnl ========================= Done with CFG_STACKVMA =========================
693 AC_CHECK_FUNCS([getrlimit setrlimit])
695 dnl Catching stack overflow requires an alternate signal stack.
696 dnl The old "install a guard page" trick would be unreliable, because
697 dnl we don't know where exactly to place the guard page.
701 dnl =========================== Determine CFG_LEAVE ===========================
702 dnl Requires AC_CANONICAL_HOST.
704 # How to longjmp out of a signal handler, in such a way that the
705 # alternate signal stack remains functional.
707 # On MacOS X 10.2 or newer, we don't need these tests, because we'll end up
708 # using handler-macos.c anyway. If we were to perform the tests, 2 Crash Report
709 # dialog windows would pop up.
711 macos* | darwin[[6-9]]* | darwin[[1-9]][[0-9]]*) ;;
714 dnl FIXME: Put in some more known values into the third argument.
715 SV_TRY_LEAVE_HANDLER_LONGJMP([], sv_cv_leave_handler_longjmp,
716 [*-*-osf[4-9]* | *-*-hpux11* | *-*-linux2.[2-9]*],
719 dnl FIXME: Put in some more known values into the third argument.
720 SV_TRY_LEAVE_HANDLER_LONGJMP([ and sigaltstack],
721 sv_cv_leave_handler_longjmp_sigaltstack,
725 #define SS_ONSTACK SA_ONSTACK
729 if (sigaltstack (NULL, &ss) >= 0)
731 ss.ss_flags &= ~SS_ONSTACK;
732 sigaltstack (&ss, NULL);
736 dnl FIXME: Put in some more known values into the third argument.
737 SV_TRY_LEAVE_HANDLER_LONGJMP([ and setcontext],
738 sv_cv_leave_handler_longjmp_setcontext,
739 [*-*-irix* | *-*-solaris*],
740 [#include <ucontext.h>
742 #define SS_ONSTACK SA_ONSTACK
746 static ucontext_t uc;
748 if (getcontext (&uc) >= 0)
750 if (uc.uc_stack.ss_flags & SS_ONSTACK)
752 uc.uc_stack.ss_flags &= ~SS_ONSTACK;
758 # End of MacOS X special casing.
762 # How to siglongjmp out of a signal handler, in such a way that the
763 # alternate signal stack remains functional.
765 # On MacOS X 10.2 or newer, we don't need these tests, because we'll end up
766 # using handler-macos.c anyway. If we were to perform the tests, 2 Crash Report
767 # dialog windows would pop up.
769 macos* | darwin[[6-9]]* | darwin[[1-9]][[0-9]]*) ;;
772 dnl FIXME: Put in some more known values into the third argument.
773 SV_TRY_LEAVE_HANDLER_SIGLONGJMP([], sv_cv_leave_handler_siglongjmp,
774 [*-*-osf[4-9]* | *-*-hpux11* | *-*-linux2.[2-9]* | *-*-irix* | *-*-solaris*],
777 dnl FIXME: Put in some more known values into the third argument.
778 SV_TRY_LEAVE_HANDLER_SIGLONGJMP([ and sigaltstack],
779 sv_cv_leave_handler_siglongjmp_sigaltstack,
783 #define SS_ONSTACK SA_ONSTACK
787 if (sigaltstack (NULL, &ss) >= 0)
789 ss.ss_flags &= ~SS_ONSTACK;
790 sigaltstack (&ss, NULL);
794 dnl FIXME: Put in some more known values into the third argument.
795 SV_TRY_LEAVE_HANDLER_SIGLONGJMP([ and setcontext],
796 sv_cv_leave_handler_siglongjmp_setcontext,
798 [#include <ucontext.h>
800 #define SS_ONSTACK SA_ONSTACK
804 static ucontext_t uc;
806 if (getcontext(&uc) >= 0)
808 if (uc.uc_stack.ss_flags & SS_ONSTACK)
810 uc.uc_stack.ss_flags &= ~SS_ONSTACK;
816 # End of MacOS X special casing.
821 if test "$sv_cv_leave_handler_longjmp" != no; then
822 CFG_LEAVE=leave-nop.c
824 if test "$sv_cv_leave_handler_longjmp_sigaltstack" != no; then
825 CFG_LEAVE=leave-sigaltstack.c
827 if test "$sv_cv_leave_handler_longjmp_setcontext" != no; then
828 CFG_LEAVE=leave-setcontext.c
833 # On BeOS, the 6 tests fail because sigaltstack() doesn't exist.
834 # If one uses set_signal_stack() instead of sigaltstack(), the first
835 # test actually works. i.e. sv_cv_leave_handler_longjmp would be 'yes'.
836 beos*) CFG_LEAVE=leave-nop.c ;;
838 if test -z "$CFG_LEAVE"; then
839 CFG_LEAVE=leave-none.c
841 AC_DEFINE_UNQUOTED([CFG_LEAVE], ["$CFG_LEAVE"],
842 [The name of the file implementing sigsegv_reset_onstack_flag.])
843 AC_SUBST([CFG_LEAVE])
845 dnl =========================== Done with CFG_LEAVE ===========================
848 dnl ================= Determine HAVE_STACK_OVERFLOW_RECOVERY =================
849 dnl Requires AC_CANONICAL_HOST, CFG_HANDLER / CFG_FAULT / etc., CFG_STACKVMA,
852 AC_CACHE_CHECK([if the system supports catching stack overflow],
853 [sv_cv_have_stack_overflow_recovery],
855 dnl On Mach, it requires a machfault-*.h (see src/handler-macos.c).
856 dnl On Unix, it requires either sigaltstack() or the BeOS set_signal_stack()
857 dnl function, and the ability to longjmp out of the signal handler, and on
858 dnl Unix it also requires a fault-*.h or a stackvma-*.c with certain
859 dnl properties (see src/handler-unix.c).
860 if test "$CFG_MACHFAULT" != fault-none.h; then
861 sv_cv_have_stack_overflow_recovery=yes
864 mingw* | cygwin*) sv_cv_have_stack_overflow_recovery=yes ;;
866 if test "$CFG_LEAVE" != 'leave-none.c'; then
867 if test "$sv_cv_sigaltstack" != no; then
868 sv_cv_have_stack_overflow_recovery=maybe
871 beos*) sv_cv_have_stack_overflow_recovery=maybe ;;
872 *) sv_cv_have_stack_overflow_recovery=no ;;
876 sv_cv_have_stack_overflow_recovery=no
881 if test $sv_cv_have_stack_overflow_recovery = maybe; then
882 if test -n "$CFG_FAULT"; then
883 AC_EGREP_CPP([xyzzy], [
884 #include "$srcdir/src/$CFG_FAULT"
885 #ifdef SIGSEGV_FAULT_HANDLER_ARGLIST
886 #ifdef SIGSEGV_FAULT_ADDRESS
890 ], [condA=true], [condA=false])
894 if test -n "$CFG_FAULT"; then
895 AC_EGREP_CPP([xyzzy], [
896 #include "$srcdir/src/$CFG_FAULT"
897 #ifdef SIGSEGV_FAULT_HANDLER_ARGLIST
898 #ifdef SIGSEGV_FAULT_STACKPOINTER
902 ], [condB=true], [condB=false])
906 if test "$CFG_STACKVMA" != "stackvma-none.c"; then
911 if { $condA && $condB; } || { $condA && $condC; } || { $condB && $condC; }; then
912 sv_cv_have_stack_overflow_recovery=yes
914 sv_cv_have_stack_overflow_recovery=no
918 if test $sv_cv_have_stack_overflow_recovery != no; then
919 HAVE_STACK_OVERFLOW_RECOVERY=1
921 HAVE_STACK_OVERFLOW_RECOVERY=0
923 AC_SUBST([HAVE_STACK_OVERFLOW_RECOVERY])
925 dnl ================= Done with HAVE_STACK_OVERFLOW_RECOVERY =================
928 dnl ======================= Determine CFG_HANDLER fully =======================
929 dnl Requires AC_CANONICAL_HOST, CFG_HANDLER / CFG_FAULT / etc.,
930 dnl HAVE_SIGSEGV_RECOVERY, HAVE_STACK_OVERFLOW_RECOVERY.
933 mingw* | cygwin*) CFG_HANDLER=handler-win32.c ;;
935 if test -z "$CFG_HANDLER"; then
936 if test $sv_cv_have_sigsegv_recovery = no \
937 && test $sv_cv_have_stack_overflow_recovery = no; then
938 CFG_HANDLER=handler-none.c
940 CFG_HANDLER=handler-unix.c
945 AC_DEFINE_UNQUOTED([CFG_HANDLER], ["$CFG_HANDLER"],
946 [The name of the file implementing the handler functionality.])
947 AC_SUBST([CFG_HANDLER])
949 dnl ======================= Done with CFG_HANDLER fully =======================
951 dnl Test whether to enable Cygwin specific tests.
952 AM_CONDITIONAL([CYGWIN],
958 dnl Test whether to make system calls fail with error EFAULT.
959 dnl More precisely: whether passing invalid memory accesses to system calls
960 dnl should make the system call fail with error EFAULT, rather than invoking
961 dnl the signal handler.
962 dnl It is necessary on Cygwin: otherwise the cygwin1 test fails.
964 cygwin*) enable_EFAULT=yes ;;
965 *) enable_EFAULT=no ;;
967 if test $enable_EFAULT = yes; then
968 AC_DEFINE([ENABLE_EFAULT], [1],
969 [Define to 1 if attempting to make system calls fail with error EFAULT])
971 AM_CONDITIONAL([ENABLE_EFAULT], [test $enable_EFAULT = yes])
973 if test $enable_EFAULT = yes; then
978 dnl Test for features used in tests.
982 { echo; echo "${term_bold}Build Parameters:${term_norm}"; } >& AS_MESSAGE_FD
984 dnl Relocatability is a nop for this package.
987 { echo; echo "${term_bold}Output Substitution:${term_norm}"; } >& AS_MESSAGE_FD
989 dnl AC_OUTPUT([Makefile])
991 src/Makefile src/sigsegv.h
994 { echo; echo "Now please type '${term_bold}make${term_norm}' to compile. Good luck."; echo; } >& AS_MESSAGE_FD