summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/ac-macros/misc.m423
-rw-r--r--configure.in2
-rw-r--r--include/config-netware.h3
-rw-r--r--include/config-win.h2
-rw-r--r--include/my_global.h4
-rw-r--r--sql/sql_parse.cc6
6 files changed, 39 insertions, 1 deletions
diff --git a/config/ac-macros/misc.m4 b/config/ac-macros/misc.m4
index 0619a52fbbf..9f84e06fa46 100644
--- a/config/ac-macros/misc.m4
+++ b/config/ac-macros/misc.m4
@@ -450,6 +450,29 @@ AC_DEFINE([HAVE_BOOL], [1], [bool is not defined by all C++ compilators])
fi
])dnl
+AC_DEFUN([MYSQL_STACK_DIRECTION],
+ [AC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction,
+ [AC_TRY_RUN([#include <stdlib.h>
+ int find_stack_direction ()
+ {
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+ }
+ int main ()
+ {
+ exit (find_stack_direction() < 0);
+ }], ac_cv_c_stack_direction=1, ac_cv_c_stack_direction=-1,
+ ac_cv_c_stack_direction=)])
+ AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
+])dnl
+
AC_DEFUN([MYSQL_CHECK_LONGLONG_TO_FLOAT],
[
AC_MSG_CHECKING(if conversion of longlong to float works)
diff --git a/configure.in b/configure.in
index e2857cf43e3..1d62c8a59d9 100644
--- a/configure.in
+++ b/configure.in
@@ -1792,6 +1792,8 @@ MYSQL_TYPE_ACCEPT
#---END:
# Figure out what type of struct rlimit to use with setrlimit
MYSQL_TYPE_STRUCT_RLIMIT
+# Find where the stack goes
+MYSQL_STACK_DIRECTION
# We want to skip alloca on irix unconditionally. It may work on some version..
MYSQL_FUNC_ALLOCA
# Do struct timespec have members tv_sec or ts_sec
diff --git a/include/config-netware.h b/include/config-netware.h
index f7f494b519c..e6bddee034e 100644
--- a/include/config-netware.h
+++ b/include/config-netware.h
@@ -112,6 +112,9 @@ extern "C" {
/* signal by closing the sockets */
#define SIGNAL_WITH_VIO_CLOSE 1
+/* On NetWare, stack grows towards lower address */
+#define STACK_DIRECTION -1
+
/* On NetWare, we need to set stack size for threads, otherwise default 16K is used */
#define NW_THD_STACKSIZE 65536
diff --git a/include/config-win.h b/include/config-win.h
index fa5c15b0668..bc2ae60f137 100644
--- a/include/config-win.h
+++ b/include/config-win.h
@@ -250,6 +250,8 @@ inline double ulonglong2double(ulonglong value)
#endif
+#define STACK_DIRECTION -1
+
/* Optimized store functions for Intel x86 */
#ifndef _WIN64
diff --git a/include/my_global.h b/include/my_global.h
index 91860f6e7a9..8b6cdef8daa 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -804,6 +804,10 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define ulong_to_double(X) ((double) (ulong) (X))
#define SET_STACK_SIZE(X) /* Not needed on real machines */
+#ifndef STACK_DIRECTION
+#error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS"
+#endif
+
#if !defined(HAVE_STRTOK_R)
#define strtok_r(A,B,C) strtok((A),(B))
#endif
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f2a61b7f7c5..2ee20fe6dc2 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -5042,7 +5042,11 @@ bool check_merge_table_access(THD *thd, char *db,
#ifndef EMBEDDED_LIBRARY
-#define used_stack(A,B) (long)(A > B ? A - B : B - A)
+#if STACK_DIRECTION < 0
+#define used_stack(A,B) (long) (A - B)
+#else
+#define used_stack(A,B) (long) (B - A)
+#endif
#ifndef DBUG_OFF
long max_stack_used;