diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/alloca.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/include/alloca.h b/include/alloca.h index 9536fe0f1f..de541f4e5a 100644 --- a/include/alloca.h +++ b/include/alloca.h @@ -1,6 +1,7 @@ #ifndef _ALLOCA_H #include <stdlib/alloca.h> +#include <stackinfo.h> #undef __alloca @@ -18,4 +19,31 @@ extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const)); #include <allocalim.h> +#if _STACK_GROWS_DOWN +# define extend_alloca(buf, len, newlen) \ + (__typeof (buf)) ({ size_t __newlen = (newlen); \ + char *__newbuf = __alloca (__newlen); \ + if (__newbuf + __newlen == (char *) buf) \ + len += __newlen; \ + else \ + len = __newlen; \ + __newbuf; }) +#elif _STACK_GROWS_UP +# define extend_alloca(buf, len, newlen) \ + (__typeof (buf)) ({ size_t __newlen = (newlen); \ + char *__newbuf = __alloca (__newlen); \ + char *__buf = (buf); \ + if (__buf + __newlen == __newbuf) \ + { \ + len += __newlen; \ + __newbuf = __buf; \ + } \ + else \ + len = __newlen; \ + __newbuf; }) +#else +# define extern_alloca(buf, len, newlen) \ + __alloca (((len) = (newlen))) +#endif + #endif |