[BZ #9750]
[platform/upstream/glibc.git] / include / alloca.h
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 extend_alloca(buf, len, newlen) \
46   __alloca (((len) = (newlen)))
47 #endif
48
49 #if defined stackinfo_get_sp && defined stackinfo_sub_sp
50 # define alloca_account(size, avar) \
51   ({ void *old__ = stackinfo_get_sp ();                 \
52      void *m__ = __alloca (size);                       \
53      avar += stackinfo_sub_sp (old__);                  \
54      m__; })
55 #else
56 # define alloca_account(size, avar) \
57   ({ size_t s__ = (size);                   \
58      avar += size__;                        \
59      __alloca (size__); })
60 #endif
61
62 #endif