]> granicus.if.org Git - postgresql/commitdiff
Try harder to detect unavailability of __builtin_mul_overflow(int64).
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Dec 2017 16:52:22 +0000 (11:52 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 17 Dec 2017 16:52:22 +0000 (11:52 -0500)
Commit c04d35f44 didn't quite do the job here, because it still allowed
the compiler to deduce that the function call could be optimized away.
Prevent that by putting the arguments and results in global variables.

Discussion: https://postgr.es/m/20171213213754.pydkyjs6bt2hvsdb@alap3.anarazel.de

config/c-compiler.m4
configure

index b35436481c5897051542329d5717c119b5b7e29b..076656c77f16787b68b4be03a4ae5607debbdf1c 100644 (file)
@@ -310,18 +310,19 @@ fi])# PGAC_C_BUILTIN_CONSTANT_P
 # and define HAVE__BUILTIN_OP_OVERFLOW if so.
 #
 # Check for the most complicated case, 64 bit multiplication, as a
-# proxy for all of the operations. Use volatile variables to avoid the
-# compiler computing result at compile time, even though the runtime
-# might not supply operation. Have to link to be sure to recognize a
-# missing __builtin_mul_overflow.
+# proxy for all of the operations.  To detect the case where the compiler
+# knows the function but library support is missing, we must link not just
+# compile, and store the results in global variables so the compiler doesn't
+# optimize away the call.
 AC_DEFUN([PGAC_C_BUILTIN_OP_OVERFLOW],
 [AC_CACHE_CHECK(for __builtin_mul_overflow, pgac_cv__builtin_op_overflow,
-[AC_LINK_IFELSE([AC_LANG_PROGRAM([],
-[PG_INT64_TYPE a = 1;
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([
+PG_INT64_TYPE a = 1;
 PG_INT64_TYPE b = 1;
 PG_INT64_TYPE result;
-__builtin_mul_overflow(*(volatile PG_INT64_TYPE *) a, *(volatile PG_INT64_TYPE *) b, &result);]
-)],
+int oflo;
+],
+[oflo = __builtin_mul_overflow(a, b, &result);])],
 [pgac_cv__builtin_op_overflow=yes],
 [pgac_cv__builtin_op_overflow=no])])
 if test x"$pgac_cv__builtin_op_overflow" = xyes ; then
index 22ca4230fceacd9e0d3e51d216604815ac60f6f7..d9b7b8d7ec76a94706c348df927651febfd16f10 100755 (executable)
--- a/configure
+++ b/configure
@@ -14485,14 +14485,15 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-int
-main ()
-{
 PG_INT64_TYPE a = 1;
 PG_INT64_TYPE b = 1;
 PG_INT64_TYPE result;
-__builtin_mul_overflow(*(volatile PG_INT64_TYPE *) a, *(volatile PG_INT64_TYPE *) b, &result);
+int oflo;
 
+int
+main ()
+{
+oflo = __builtin_mul_overflow(a, b, &result);
   ;
   return 0;
 }