summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Kopytov <Alexey.Kopytov@sun.com>2009-03-25 16:20:38 +0300
committerAlexey Kopytov <Alexey.Kopytov@sun.com>2009-03-25 16:20:38 +0300
commitb9965ca6168ac53fb1f2960b1296be8fedd35ac4 (patch)
treed14b8c466a28465d48948a129a81004df00d5a3d
parenta6975c5febf4adc582a9fbc7ca0ab51b1fff99af (diff)
parentc4eba1edc174262cd76fdfed84b1a1bdb5b35df0 (diff)
downloadmariadb-git-b9965ca6168ac53fb1f2960b1296be8fedd35ac4.tar.gz
Automerge
-rw-r--r--configure.in21
-rw-r--r--include/my_global.h16
2 files changed, 34 insertions, 3 deletions
diff --git a/configure.in b/configure.in
index d86218bd782..ca8c0dc09b4 100644
--- a/configure.in
+++ b/configure.in
@@ -2085,6 +2085,27 @@ esac
AC_MSG_CHECKING(for isinf in <math.h>)
AC_TRY_LINK([#include <math.h>], [float f = 0.0; int r = isinf(f); return r],
AC_MSG_RESULT(yes)
+ AC_MSG_CHECKING(whether isinf() is safe to use in C code)
+ AC_TRY_RUN([
+#include <math.h>
+int main()
+{
+ double a= 10.0;
+ double b= 1e308;
+
+ return !isinf(a * b);
+}
+],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ AC_DEFINE([HAVE_BROKEN_ISINF], [1],
+ [Define to 1 if isinf() uses 80-bit register for intermediate values])
+ ],
+ [
+# Let's be optimistic when cross-compiling, since the only compiler known
+# to be affected by this isinf() bug is GCC 4.3 on 32-bit x86.
+ AC_MSG_RESULT([[cross-compiling, assuming 'yes']])
+ ])
AC_MSG_CHECKING(whether isinf() can be used in C++ code)
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
diff --git a/include/my_global.h b/include/my_global.h
index ad86aeb749f..803315e3dcd 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -905,10 +905,20 @@ typedef SOCKET_SIZE_TYPE size_socket;
#endif
#ifdef HAVE_ISINF
-/* isinf() can be used in both C and C++ code */
-#define my_isinf(X) isinf(X)
+/* Check if C compiler is affected by GCC bug #39228 */
+#if !defined(__cplusplus) && defined(HAVE_BROKEN_ISINF)
+/* Force store/reload of the argument to/from a 64-bit double */
+static inline double my_isinf(double x)
+{
+ volatile double t= x;
+ return isinf(t);
+}
#else
-#define my_isinf(X) (!isfinite(X) && !isnan(X))
+/* System-provided isinf() is available and safe to use */
+#define my_isinf(X) isinf(X)
+#endif
+#else /* !HAVE_ISINF */
+#define my_isinf(X) (!finite(X) && !isnan(X))
#endif
/* Define missing math constants. */