diff options
-rw-r--r-- | config/ac-macros/misc.m4 | 23 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | include/config-netware.h | 3 | ||||
-rw-r--r-- | include/config-win.h | 2 | ||||
-rw-r--r-- | include/my_global.h | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 6 |
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; |