summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-04-28 15:07:10 +0200
committerGitHub <noreply@github.com>2017-04-28 15:07:10 +0200
commit826f83f1d562a7b878499bc3af2267cfdfe5f2f9 (patch)
treed35096a04bd036d1e807309764002f40d4274f9e
parent5a4e3d8f9c37e700402b23fafbfc413e5ca3113d (diff)
downloadcpython-git-826f83f1d562a7b878499bc3af2267cfdfe5f2f9.tar.gz
bpo-30104: Only use -fno-strict-aliasing on dtoa.c (#1340)
On clang, only compile dtoa.c with -fno-strict-aliasing, use strict aliasing to compile all other C files.
-rw-r--r--Makefile.pre.in9
-rwxr-xr-xconfigure11
-rw-r--r--configure.ac13
3 files changed, 17 insertions, 16 deletions
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 4145634c03..e5141f11da 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -107,6 +107,8 @@ ARFLAGS= @ARFLAGS@
CFLAGSFORSHARED=@CFLAGSFORSHARED@
# C flags used for building the interpreter object files
PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
+# Strict or non-strict aliasing flags used to compile dtoa.c, see above
+CFLAGS_ALIASING=@CFLAGS_ALIASING@
# Machine-dependent subdirectories
@@ -1536,6 +1538,13 @@ config.status: $(srcdir)/configure
.c.o:
$(CC) -c $(PY_CORE_CFLAGS) -o $@ $<
+# bpo-30104: dtoa.c uses union to cast double to unsigned long[2]. clang 4.0
+# with -O2 or higher and strict aliasing miscompiles the ratio() function
+# causing rounding issues. Compile dtoa.c using -fno-strict-aliasing on clang.
+# https://bugs.llvm.org//show_bug.cgi?id=31928
+Python/dtoa.o: Python/dtoa.c
+ $(CC) -c $(PY_CORE_CFLAGS) $(CFLAGS_ALIASING) -o $@ $<
+
# Run reindent on the library
reindent:
./$(BUILDPYTHON) $(srcdir)/Tools/scripts/reindent.py -r $(srcdir)/Lib
diff --git a/configure b/configure
index 1c90d3101c..3e89bfabc3 100755
--- a/configure
+++ b/configure
@@ -668,6 +668,7 @@ OTHER_LIBTOOL_OPT
UNIVERSAL_ARCH_FLAGS
CFLAGS_NODIST
BASECFLAGS
+CFLAGS_ALIASING
OPT
LLVM_PROF_FOUND
target_os
@@ -6829,13 +6830,7 @@ then
then
# Clang also needs -fwrapv
WRAP="-fwrapv"
-
- # bpo-30104: Python/dtoa.c requires to be build with
- # -fno-strict-aliasing to fix compiler issue on the
- # double/ULong[2] union using clang 4.0 and optimization level
- # -O2 or higher
- # https://bugs.llvm.org//show_bug.cgi?id=31928
- ALIASING="-fno-strict-aliasing"
+ CFLAGS_ALIASING="-fno-strict-aliasing"
fi
case $ac_cv_prog_cc_g in
@@ -6857,7 +6852,7 @@ then
;;
esac
- OPT="$OPT $STRICT_PROTO $ALIASING"
+ OPT="$OPT $STRICT_PROTO"
case $ac_sys_system in
SCO_SV*) OPT="$OPT -m486 -DSCO5"
diff --git a/configure.ac b/configure.ac
index e5b725795a..c58322dc8c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1440,6 +1440,7 @@ esac
# tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line
AC_SUBST(OPT)
+AC_SUBST(CFLAGS_ALIASING)
if test "${OPT-unset}" = "unset"
then
case $GCC in
@@ -1469,13 +1470,9 @@ then
then
# Clang also needs -fwrapv
WRAP="-fwrapv"
-
- # bpo-30104: Python/dtoa.c requires to be build with
- # -fno-strict-aliasing to fix compiler issue on the
- # double/ULong[2] union using clang 4.0 and optimization level
- # -O2 or higher
- # https://bugs.llvm.org//show_bug.cgi?id=31928
- ALIASING="-fno-strict-aliasing"
+ # bpo-30104: disable strict aliasing to compile correctly dtoa.c,
+ # see Makefile.pre.in for more information
+ CFLAGS_ALIASING="-fno-strict-aliasing"
fi
case $ac_cv_prog_cc_g in
@@ -1497,7 +1494,7 @@ then
;;
esac
- OPT="$OPT $STRICT_PROTO $ALIASING"
+ OPT="$OPT $STRICT_PROTO"
case $ac_sys_system in
SCO_SV*) OPT="$OPT -m486 -DSCO5"