1 /* Copyright (C) 1992, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17 
18 #ifndef	_ALLOCA_H
19 #define	_ALLOCA_H	1
20 
21 #include <features.h>
22 
23 #define	__need_size_t
24 #include <stddef.h>
25 
26 __BEGIN_DECLS
27 
28 /* Remove any previous definitions.  */
29 #undef	alloca
30 
31 /* Allocate a block that will be freed when the calling function exits.  */
32 extern void *alloca (size_t __size) __THROW;
33 
34 #ifdef	__GNUC__
35 # define alloca(size)	__builtin_alloca (size)
36 #endif /* GCC.  */
37 
38 #ifdef _LIBC
39 # define __MAX_ALLOCA_CUTOFF	65536
40 
41 # include <bits/stackinfo.h>
42 # ifdef _STACK_GROWS_DOWN
43 #  define extend_alloca(buf, len, newlen) \
44    (__typeof (buf)) ({ size_t __newlen = (newlen);			      \
45 		      char *__newbuf = alloca (__newlen);		      \
46 		      if (__newbuf + __newlen == (char *) buf)		      \
47 			len += __newlen;				      \
48 		      else						      \
49 			len = __newlen;					      \
50 		      __newbuf; })
51 # elif defined _STACK_GROWS_UP
52 #  define extend_alloca(buf, len, newlen) \
53    (__typeof (buf)) ({ size_t __newlen = (newlen);			      \
54 		      char *__newbuf = alloca (__newlen);		      \
55 		      char *__buf = (buf);				      \
56 		      if (__buf + __newlen == __newbuf)			      \
57 			{						      \
58 			  len += __newlen;				      \
59 			  __newbuf = __buf;				      \
60 			}						      \
61 		      else						      \
62 			len = __newlen;					      \
63 		      __newbuf; })
64 # else
65 #  error unknown stack
66 #  define extend_alloca(buf, len, newlen) \
67    alloca (((len) = (newlen)))
68 # endif
69 
70 extern int __libc_alloca_cutoff (size_t size);
71 #endif
72 
73 __END_DECLS
74 
75 #endif /* alloca.h */
76