From 9c1031a1a1da3f647ad6dbcdc4c140be6f4bb8ad Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 10 Mar 2008 21:50:50 +0000 Subject: [PATCH] Use -fwrapv in CFLAGS if we are using a version of gcc that accepts this flag. This prevents compiler optimizations that assume overflow won't occur, which breaks numerous overflow tests that we need to have working. It is known that gcc 4.3 causes problems and possible that 4.1 does. Per my proposal of some time ago and a recent report from Kris Jurka. Backpatch as far as 8.0, which is as far as the patch conveniently goes. 7.x was pretty short of overflow tests anyway, so it may not matter there, even assuming that anyone cares whether 7.x builds on recent gcc. --- configure | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 ++ 2 files changed, 52 insertions(+) diff --git a/configure b/configure index 476ce76c8a..c93694a0a2 100755 --- a/configure +++ b/configure @@ -3563,6 +3563,56 @@ sed 's/^/| /' conftest.$ac_ext >&5 echo "${ECHO_T}no" >&6; } fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + # Disable optimizations that assume no overflow; needed for gcc 4.3+ + { echo "$as_me:$LINENO: checking if $CC supports -fwrapv" >&5 +echo $ECHO_N "checking if $CC supports -fwrapv... $ECHO_C" >&6; } +pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS -fwrapv" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="$pgac_save_CFLAGS" + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext elif test "$ICC" = yes; then diff --git a/configure.in b/configure.in index d3e5765748..e1582aa91f 100644 --- a/configure.in +++ b/configure.in @@ -284,6 +284,8 @@ if test "$GCC" = yes -a "$ICC" = no; then PGAC_PROG_CC_CFLAGS_OPT([-Wendif-labels]) # Disable strict-aliasing rules; needed for gcc 3.3+ PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing]) + # Disable optimizations that assume no overflow; needed for gcc 4.3+ + PGAC_PROG_CC_CFLAGS_OPT([-fwrapv]) elif test "$ICC" = yes; then # Intel's compiler has a bug/misoptimization in checking for # division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS. -- 2.39.5