summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--include/ruby/ruby.h8
2 files changed, 9 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index e5be5a778e..93341fc777 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2493,6 +2493,7 @@ AC_CACHE_CHECK([for $1], AS_TR_SH(rb_cv_builtin_$1),
AS_IF([test "${AS_TR_SH(rb_cv_builtin_$1)}" != no], [
AC_DEFINE(AS_TR_CPP(HAVE_BUILTIN_$1))
])])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)])
RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)])
RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index fe0ecf4622..19489bb18c 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -1595,7 +1595,15 @@ rb_num2char_inline(VALUE x)
#define ZALLOC(type) RB_ZALLOC(type)
#define REALLOC_N(var,type,n) RB_REALLOC_N(var,type,n)
+#ifdef HAVE_BUILTIN___BUILTIN_ALLOCA_WITH_ALIGN
+/* I don't know why but __builtin_alloca_with_align's second argument
+ takes bits rather than bytes. */
+#define ALLOCA_N(type, n) \
+ (type*)__builtin_alloca_with_align((sizeof(type)*(n)), \
+ sizeof(type) * CHAR_BIT)
+#else
#define ALLOCA_N(type,n) ((type*)alloca(sizeof(type)*(n)))
+#endif
void *rb_alloc_tmp_buffer(volatile VALUE *store, long len) RUBY_ATTR_ALLOC_SIZE((2));
void *rb_alloc_tmp_buffer_with_count(volatile VALUE *store, size_t len,size_t count) RUBY_ATTR_ALLOC_SIZE((2,3));