summaryrefslogtreecommitdiff
path: root/config/c-compiler.m4
diff options
context:
space:
mode:
authorAndres Freund2017-12-16 20:49:41 +0000
committerAndres Freund2017-12-16 20:49:41 +0000
commitc04d35f442a8c4fd5a20103b31839ec52fce3046 (patch)
tree7b39615fb8aac2b41fe17c02f91f95981d717341 /config/c-compiler.m4
parentc757a3da0af0e5eb636eeee2af6602d279162b0a (diff)
Try to detect runtime unavailability of __builtin_mul_overflow(int64).
On some systems the results of 64 bit __builtin_mul_overflow() operations can be computed at compile time, but not at runtime. The known cases are arm buildfar animals using clang where the runtime operation is implemented in a unavailable function. Try to avoid compile-time computation by using volatile arguments to __builtin_mul_overflow(). In that case we hopefully will get a link error when unavailable, similar to what buildfarm animals dangomushi and gull are reporting. Author: Andres Freund Discussion: https://postgr.es/m/20171213213754.pydkyjs6bt2hvsdb@alap3.anarazel.de
Diffstat (limited to 'config/c-compiler.m4')
-rw-r--r--config/c-compiler.m412
1 files changed, 8 insertions, 4 deletions
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
index 67323ade124..b35436481c5 100644
--- a/config/c-compiler.m4
+++ b/config/c-compiler.m4
@@ -310,13 +310,17 @@ 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. Have to link to be sure to
-# recognize a missing __builtin_mul_overflow.
+# 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.
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 result;
-__builtin_mul_overflow((PG_INT64_TYPE) 1, (PG_INT64_TYPE) 2, &result);]
+[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);]
)],
[pgac_cv__builtin_op_overflow=yes],
[pgac_cv__builtin_op_overflow=no])])