| 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 | ])
 | 
|---|