mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-21 03:13:05 +08:00
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
This commit is contained in:
parent
c757a3da0a
commit
c04d35f442
@ -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])])
|
||||
|
4
configure
vendored
4
configure
vendored
@ -14488,8 +14488,10 @@ else
|
||||
int
|
||||
main ()
|
||||
{
|
||||
PG_INT64_TYPE a = 1;
|
||||
PG_INT64_TYPE b = 1;
|
||||
PG_INT64_TYPE result;
|
||||
__builtin_mul_overflow((PG_INT64_TYPE) 1, (PG_INT64_TYPE) 2, &result);
|
||||
__builtin_mul_overflow(*(volatile PG_INT64_TYPE *) a, *(volatile PG_INT64_TYPE *) b, &result);
|
||||
|
||||
;
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user