summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/alloca.h28
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