Commit | Line | Data |
---|---|---|
f0007cad | 1 | # alloca.m4 serial 14 |
af07e104 | 2 | dnl Copyright (C) 2002-2004, 2006-2007, 2009-2013 Free Software Foundation, |
61cd9dc9 | 3 | dnl Inc. |
103dc4d4 LC |
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 | [ | |
103dc4d4 LC |
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. | |
f240aacb | 26 | AC_DEFINE([HAVE_ALLOCA], [1], |
103dc4d4 LC |
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]) | |
dd7d0148 | 39 | AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"]) |
103dc4d4 LC |
40 | ]) |
41 | ||
42 | # Prerequisites of lib/alloca.c. | |
43 | # STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. | |
44 | AC_DEFUN([gl_PREREQ_ALLOCA], [:]) | |
231c0e0e LC |
45 | |
46 | # This works around a bug in autoconf <= 2.68. | |
47 | # See <http://lists.gnu.org/archive/html/bug-gnulib/2011-06/msg00277.html>. | |
48 | ||
49 | m4_version_prereq([2.69], [] ,[ | |
50 | ||
51 | # This is taken from the following Autoconf patch: | |
52 | # http://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497 | |
53 | ||
54 | # _AC_LIBOBJ_ALLOCA | |
55 | # ----------------- | |
f0007cad LC |
56 | # Set up the LIBOBJ replacement of 'alloca'. Well, not exactly |
57 | # AC_LIBOBJ since we actually set the output variable 'ALLOCA'. | |
231c0e0e LC |
58 | # Nevertheless, for Automake, AC_LIBSOURCES it. |
59 | m4_define([_AC_LIBOBJ_ALLOCA], | |
60 | [# The SVR3 libPW and SVR4 libucb both contain incompatible functions | |
61 | # that cause trouble. Some versions do not even contain alloca or | |
62 | # contain a buggy version. If you still want to use their alloca, | |
63 | # use ar to extract alloca.o from them instead of compiling alloca.c. | |
64 | AC_LIBSOURCES(alloca.c) | |
65 | AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl | |
f0007cad | 66 | AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.]) |
231c0e0e | 67 | |
f0007cad | 68 | AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray, |
231c0e0e LC |
69 | [AC_EGREP_CPP(webecray, |
70 | [#if defined CRAY && ! defined CRAY2 | |
71 | webecray | |
72 | #else | |
73 | wenotbecray | |
74 | #endif | |
75 | ], ac_cv_os_cray=yes, ac_cv_os_cray=no)]) | |
76 | if test $ac_cv_os_cray = yes; then | |
77 | for ac_func in _getb67 GETB67 getb67; do | |
78 | AC_CHECK_FUNC($ac_func, | |
35428fb6 | 79 | [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func, |
f0007cad LC |
80 | [Define to one of '_getb67', 'GETB67', |
81 | 'getb67' for Cray-2 and Cray-YMP | |
35428fb6 | 82 | systems. This function is required for |
f0007cad | 83 | 'alloca.c' support on those systems.]) |
231c0e0e LC |
84 | break]) |
85 | done | |
86 | fi | |
87 | ||
88 | AC_CACHE_CHECK([stack direction for C alloca], | |
35428fb6 | 89 | [ac_cv_c_stack_direction], |
231c0e0e LC |
90 | [AC_RUN_IFELSE([AC_LANG_SOURCE( |
91 | [AC_INCLUDES_DEFAULT | |
92 | int | |
93 | find_stack_direction (int *addr, int depth) | |
94 | { | |
95 | int dir, dummy = 0; | |
96 | if (! addr) | |
97 | addr = &dummy; | |
98 | *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; | |
99 | dir = depth ? find_stack_direction (addr, depth - 1) : 0; | |
100 | return dir + dummy; | |
101 | } | |
102 | ||
103 | int | |
104 | main (int argc, char **argv) | |
105 | { | |
106 | return find_stack_direction (0, argc + !argv + 20) < 0; | |
107 | }])], | |
35428fb6 LC |
108 | [ac_cv_c_stack_direction=1], |
109 | [ac_cv_c_stack_direction=-1], | |
110 | [ac_cv_c_stack_direction=0])]) | |
231c0e0e LC |
111 | AH_VERBATIM([STACK_DIRECTION], |
112 | [/* If using the C implementation of alloca, define if you know the | |
113 | direction of stack growth for your system; otherwise it will be | |
114 | automatically deduced at runtime. | |
35428fb6 LC |
115 | STACK_DIRECTION > 0 => grows toward higher addresses |
116 | STACK_DIRECTION < 0 => grows toward lower addresses | |
117 | STACK_DIRECTION = 0 => direction of growth unknown */ | |
231c0e0e LC |
118 | @%:@undef STACK_DIRECTION])dnl |
119 | AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction) | |
120 | ])# _AC_LIBOBJ_ALLOCA | |
121 | ]) |