xref: /haiku/src/system/libroot/posix/glibc/include/alloca.h (revision f357360c0e4027337594ffb8144f24654243abb0)
1 #ifndef _ALLOCA_H
2 
3 #include <stdlib/alloca.h>
4 #include <stackinfo.h>
5 
6 #undef	__alloca
7 
8 /* Now define the internal interfaces.  */
9 extern void *__alloca (size_t __size);
10 
11 #ifdef	__GNUC__
12 # define __alloca(size)	__builtin_alloca (size)
13 #endif /* GCC.  */
14 
15 extern int __libc_use_alloca (size_t size) __attribute__ ((const));
16 extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
17 
18 #define __MAX_ALLOCA_CUTOFF	65536
19 
20 #include <allocalim.h>
21 
22 #if _STACK_GROWS_DOWN
23 # define extend_alloca(buf, len, newlen) \
24   (__typeof (buf)) ({ size_t __newlen = (newlen);			      \
25 		      char *__newbuf = __alloca (__newlen);		      \
26 		      if (__newbuf + __newlen == (char *) buf)		      \
27 			len += __newlen;				      \
28 		      else						      \
29 			len = __newlen;					      \
30 		      __newbuf; })
31 #elif _STACK_GROWS_UP
32 # define extend_alloca(buf, len, newlen) \
33   (__typeof (buf)) ({ size_t __newlen = (newlen);			      \
34 		      char *__newbuf = __alloca (__newlen);		      \
35 		      char *__buf = (buf);				      \
36 		      if (__buf + __newlen == __newbuf)			      \
37 			{						      \
38 			  len += __newlen;				      \
39 			  __newbuf = __buf;				      \
40 			}						      \
41 		      else						      \
42 			len = __newlen;					      \
43 		      __newbuf; })
44 #else
45 # define extern_alloca(buf, len, newlen) \
46   __alloca (((len) = (newlen)))
47 #endif
48 
49 #endif
50