Imported Upstream version 3.8
[platform/upstream/diffutils.git] / m4 / stack-direction.m4
1 # stack-direction.m4 serial 7
2 dnl Copyright (C) 2002-2021 Free Software Foundation, Inc.
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.
8
9 dnl Written by Bruno Haible.
10
11 # Determine the stack direction. Define the C macro STACK_DIRECTION.
12 AC_DEFUN([SV_STACK_DIRECTION],
13 [
14   AC_REQUIRE([AC_CANONICAL_HOST])
15   AC_CACHE_CHECK([for stack direction], [sv_cv_stack_direction_msg], [
16     case "$host_cpu" in
17       dnl See the #define STACK_GROWS_DOWNWARD in gcc-3.1/gcc/config/*/*.h.
18       a29k | \
19       aarch64* | \
20       alpha* | \
21       arc | \
22       arm* | strongarm* | xscale* | \
23       avr | avr32 | \
24       bfin | \
25       c1 | c2 | c32 | c34 | c38 | \
26       clipper | \
27       cris | \
28       d30v | \
29       elxsi | \
30       fr30 | \
31       h8300 | \
32       i?86 | x86_64 | \
33       i860 | \
34       ia64 | \
35       m32r | \
36       m68* | \
37       m88k | \
38       mcore | \
39       microblaze | \
40       mips* | \
41       mmix | \
42       mn10200 | \
43       mn10300 | \
44       nios2 | \
45       nds32* | \
46       ns32k | \
47       pdp11 | \
48       pj* | \
49       powerpc* | rs6000 | \
50       riscv* | \
51       romp | \
52       s390* | \
53       sh* | \
54       sparc* | \
55       v850 | \
56       vax | \
57       xtensa)
58         sv_cv_stack_direction=-1 ;;
59       c4x | \
60       dsp16xx | \
61       i960 | \
62       hppa* | parisc* | \
63       stormy16 | \
64       we32k)
65         sv_cv_stack_direction=1 ;;
66       *)
67         if test $cross_compiling = no; then
68           cat > conftest.c <<EOF
69 #include <stdio.h>
70 int
71 find_stack_direction (int *addr, int depth)
72 {
73   int dir, dummy = 0;
74   if (! addr)
75     addr = &dummy;
76   *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
77   dir = depth ? find_stack_direction (addr, depth - 1) : 0;
78   return dir + dummy;
79 }
80 int
81 main (int argc, char *argv[])
82 {
83   printf ("%d\n", find_stack_direction (NULL, argc + 20));
84   return 0;
85 }
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.])
105 ])