Improve OpenBSD support: Allow faster VMA determination.
[libsigsegv/ericb.git] / m4 / stack-direction.m4
blob00e0445b3533a382cbe1fb44d0b844dc910e3b4f
1 # stack-direction.m4 serial 1 (libsigsegv-2.8)
2 dnl Copyright (C) 2002-2009 Bruno Haible <bruno@clisp.org>
3 dnl This file is free software, distributed under the terms of the GNU
4 dnl General Public License.  As a special exception to the GNU General
5 dnl Public License, this file may be distributed as part of a program
6 dnl that contains a configuration script generated by Autoconf, under
7 dnl the same distribution terms as the rest of that program.
9 # Determine the stack direction. Define the C macro STACK_DIRECTION.
10 AC_DEFUN([SV_STACK_DIRECTION],
12   AC_CACHE_CHECK([for stack direction], [sv_cv_stack_direction_msg], [
13     case "$host_cpu" in
14       dnl See the #define STACK_GROWS_DOWNWARD in gcc-3.1/gcc/config/*/*.h.
15       a29k | \
16       alpha* | \
17       arc | \
18       arm* | strongarm* | xscale* | \
19       avr | \
20       c1 | c2 | c32 | c34 | c38 | \
21       clipper | \
22       cris | \
23       d30v | \
24       elxsi | \
25       fr30 | \
26       h8300 | \
27       i?86 | x86_64 | \
28       i860 | \
29       ia64 | \
30       m32r | \
31       m68* | \
32       m88k | \
33       mcore | \
34       mips* | \
35       mmix | \
36       mn10200 | \
37       mn10300 | \
38       ns32k | \
39       pdp11 | \
40       pj* | \
41       powerpc* | rs6000 | \
42       romp | \
43       s390* | \
44       sh* | \
45       sparc* | \
46       v850 | \
47       vax | \
48       xtensa)
49         sv_cv_stack_direction=-1 ;;
50       c4x | \
51       dsp16xx | \
52       i960 | \
53       hppa* | parisc* | \
54       stormy16 | \
55       we32k)
56         sv_cv_stack_direction=1 ;;
57       *)
58         if test $cross_compiling = no; then
59           cat > conftest.c <<EOF
60 #include <stdio.h>
61 int
62 get_stack_direction ()
64   auto char dummy;
65   static char *dummyaddr = (char *)0;
66   if (dummyaddr != (char *)0)
67     return &dummy > dummyaddr ? 1 : &dummy < dummyaddr ? -1 : 0;
68   else
69     {
70       dummyaddr = &dummy;
71       {
72         int result = get_stack_direction ();
73         /* The next assignment avoids tail recursion elimination
74            (IRIX 6.4 CC).  */
75         dummyaddr = (char *)0;
76         return result;
77       }
78     }
80 int
81 main ()
83   printf ("%d\n", get_stack_direction ());
84   return 0;
86 EOF
87           AC_TRY_EVAL([ac_link])
88           sv_cv_stack_direction=`./conftest`
89         else
90           sv_cv_stack_direction=0
91         fi
92         ;;
93     esac
94     case $sv_cv_stack_direction in
95       1)  sv_cv_stack_direction_msg="grows up";;
96       -1) sv_cv_stack_direction_msg="grows down";;
97       *)  sv_cv_stack_direction_msg="unknown";;
98     esac
99   ])
100   AC_DEFINE_UNQUOTED([STACK_DIRECTION], [$sv_cv_stack_direction],
101     [Define as the direction of stack growth for your system.
102      STACK_DIRECTION > 0 => grows toward higher addresses
103      STACK_DIRECTION < 0 => grows toward lower addresses
104      STACK_DIRECTION = 0 => spaghetti stack.])