]>
Commit | Line | Data |
---|---|---|
9c9d63b1 PM |
1 | # alloca.m4 serial 20 |
2 | dnl Copyright (C) 2002-2004, 2006-2007, 2009-2021 Free Software Foundation, | |
8690e634 JK |
3 | dnl Inc. |
4 | dnl This file is free software; the Free Software Foundation | |
5 | dnl gives unlimited permission to copy and/or distribute it, | |
6 | dnl with or without modifications, as long as this notice is preserved. | |
7 | ||
8 | AC_DEFUN([gl_FUNC_ALLOCA], | |
9 | [ | |
10 | AC_REQUIRE([AC_FUNC_ALLOCA]) | |
11 | if test $ac_cv_func_alloca_works = no; then | |
12 | gl_PREREQ_ALLOCA | |
13 | fi | |
14 | ||
15 | # Define an additional variable used in the Makefile substitution. | |
16 | if test $ac_cv_working_alloca_h = yes; then | |
17 | AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [ | |
18 | AC_EGREP_CPP([Need own alloca], [ | |
19 | #if defined __GNUC__ || defined _AIX || defined _MSC_VER | |
20 | Need own alloca | |
21 | #endif | |
22 | ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no]) | |
23 | ]) | |
24 | if test $gl_cv_rpl_alloca = yes; then | |
25 | dnl OK, alloca can be implemented through a compiler built-in. | |
26 | AC_DEFINE([HAVE_ALLOCA], [1], | |
27 | [Define to 1 if you have 'alloca' after including <alloca.h>, | |
28 | a header that may be supplied by this distribution.]) | |
29 | ALLOCA_H=alloca.h | |
30 | else | |
31 | dnl alloca exists as a library function, i.e. it is slow and probably | |
32 | dnl a memory leak. Don't define HAVE_ALLOCA in this case. | |
33 | ALLOCA_H= | |
34 | fi | |
35 | else | |
36 | ALLOCA_H=alloca.h | |
37 | fi | |
38 | AC_SUBST([ALLOCA_H]) | |
39 | AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"]) | |
c0c3707f CB |
40 | |
41 | if test $ac_cv_working_alloca_h = yes; then | |
42 | HAVE_ALLOCA_H=1 | |
43 | else | |
44 | HAVE_ALLOCA_H=0 | |
45 | fi | |
46 | AC_SUBST([HAVE_ALLOCA_H]) | |
8690e634 JK |
47 | ]) |
48 | ||
49 | # Prerequisites of lib/alloca.c. | |
50 | # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. | |
51 | AC_DEFUN([gl_PREREQ_ALLOCA], [:]) | |
52 | ||
9c9d63b1 | 53 | m4_version_prereq([2.70], [], [ |
8690e634 | 54 | |
9c9d63b1 PM |
55 | # This works around a bug in autoconf <= 2.68 and has simplifications |
56 | # from 2.70. See: | |
57 | # https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html | |
58 | # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497 | |
59 | # https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a | |
8690e634 JK |
60 | |
61 | # _AC_LIBOBJ_ALLOCA | |
62 | # ----------------- | |
63 | # Set up the LIBOBJ replacement of 'alloca'. Well, not exactly | |
64 | # AC_LIBOBJ since we actually set the output variable 'ALLOCA'. | |
65 | # Nevertheless, for Automake, AC_LIBSOURCES it. | |
66 | m4_define([_AC_LIBOBJ_ALLOCA], | |
67 | [# The SVR3 libPW and SVR4 libucb both contain incompatible functions | |
68 | # that cause trouble. Some versions do not even contain alloca or | |
69 | # contain a buggy version. If you still want to use their alloca, | |
70 | # use ar to extract alloca.o from them instead of compiling alloca.c. | |
71 | AC_LIBSOURCES(alloca.c) | |
72 | AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl | |
73 | AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) | |
74 | ||
8690e634 JK |
75 | AC_CACHE_CHECK([stack direction for C alloca], |
76 | [ac_cv_c_stack_direction], | |
77 | [AC_RUN_IFELSE([AC_LANG_SOURCE( | |
78 | [AC_INCLUDES_DEFAULT | |
79 | int | |
80 | find_stack_direction (int *addr, int depth) | |
81 | { | |
82 | int dir, dummy = 0; | |
83 | if (! addr) | |
84 | addr = &dummy; | |
85 | *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; | |
86 | dir = depth ? find_stack_direction (addr, depth - 1) : 0; | |
87 | return dir + dummy; | |
88 | } | |
89 | ||
90 | int | |
91 | main (int argc, char **argv) | |
92 | { | |
93 | return find_stack_direction (0, argc + !argv + 20) < 0; | |
94 | }])], | |
95 | [ac_cv_c_stack_direction=1], | |
96 | [ac_cv_c_stack_direction=-1], | |
97 | [ac_cv_c_stack_direction=0])]) | |
98 | AH_VERBATIM([STACK_DIRECTION], | |
99 | [/* If using the C implementation of alloca, define if you know the | |
100 | direction of stack growth for your system; otherwise it will be | |
101 | automatically deduced at runtime. | |
102 | STACK_DIRECTION > 0 => grows toward higher addresses | |
103 | STACK_DIRECTION < 0 => grows toward lower addresses | |
104 | STACK_DIRECTION = 0 => direction of growth unknown */ | |
9c9d63b1 | 105 | #undef STACK_DIRECTION])dnl |
8690e634 JK |
106 | AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) |
107 | ])# _AC_LIBOBJ_ALLOCA | |
108 | ]) |