Merge remote-tracking branch 'origin/release/2.13/master' into fedora/2.13/master
[glibc.git] / include / alloca.h
blobb99c3d152b63347a6ff1a9f29b7a6136b4b552c2
1 #ifndef _ALLOCA_H
3 #include <stdlib/alloca.h>
4 #include <stackinfo.h>
6 #undef __alloca
8 /* Now define the internal interfaces. */
9 extern void *__alloca (size_t __size);
11 #ifdef __GNUC__
12 # define __alloca(size) __builtin_alloca (size)
13 #endif /* GCC. */
15 extern int __libc_use_alloca (size_t size) __attribute__ ((const));
16 extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
17 libc_hidden_proto (__libc_alloca_cutoff)
19 #define __MAX_ALLOCA_CUTOFF 65536
21 #include <allocalim.h>
23 #if _STACK_GROWS_DOWN
24 # define extend_alloca(buf, len, newlen) \
25 (__typeof (buf)) ({ size_t __newlen = (newlen); \
26 char *__newbuf = __alloca (__newlen); \
27 if (__newbuf + __newlen == (char *) buf) \
28 len += __newlen; \
29 else \
30 len = __newlen; \
31 __newbuf; })
32 #elif _STACK_GROWS_UP
33 # define extend_alloca(buf, len, newlen) \
34 (__typeof (buf)) ({ size_t __newlen = (newlen); \
35 char *__newbuf = __alloca (__newlen); \
36 char *__buf = (buf); \
37 if (__buf + __newlen == __newbuf) \
38 { \
39 len += __newlen; \
40 __newbuf = __buf; \
41 } \
42 else \
43 len = __newlen; \
44 __newbuf; })
45 #else
46 # define extend_alloca(buf, len, newlen) \
47 __alloca (((len) = (newlen)))
48 #endif
50 #if defined stackinfo_get_sp && defined stackinfo_sub_sp
51 # define alloca_account(size, avar) \
52 ({ void *old__ = stackinfo_get_sp (); \
53 void *m__ = __alloca (size); \
54 avar += stackinfo_sub_sp (old__); \
55 m__; })
56 #else
57 # define alloca_account(size, avar) \
58 ({ size_t s__ = (size); \
59 avar += s__; \
60 __alloca (s__); })
61 #endif
63 #endif