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.
This commit is contained in:
Victor Stinner 2017-04-28 15:07:10 +02:00 committed by GitHub
parent 5a4e3d8f9c
commit 826f83f1d5
3 changed files with 17 additions and 16 deletions

View File

@ -107,6 +107,8 @@ ARFLAGS= @ARFLAGS@
CFLAGSFORSHARED=@CFLAGSFORSHARED@ CFLAGSFORSHARED=@CFLAGSFORSHARED@
# C flags used for building the interpreter object files # C flags used for building the interpreter object files
PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE 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 # Machine-dependent subdirectories
@ -1536,6 +1538,13 @@ config.status: $(srcdir)/configure
.c.o: .c.o:
$(CC) -c $(PY_CORE_CFLAGS) -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 # Run reindent on the library
reindent: reindent:
./$(BUILDPYTHON) $(srcdir)/Tools/scripts/reindent.py -r $(srcdir)/Lib ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/reindent.py -r $(srcdir)/Lib

11
configure vendored
View File

@ -668,6 +668,7 @@ OTHER_LIBTOOL_OPT
UNIVERSAL_ARCH_FLAGS UNIVERSAL_ARCH_FLAGS
CFLAGS_NODIST CFLAGS_NODIST
BASECFLAGS BASECFLAGS
CFLAGS_ALIASING
OPT OPT
LLVM_PROF_FOUND LLVM_PROF_FOUND
target_os target_os
@ -6829,13 +6830,7 @@ then
then then
# Clang also needs -fwrapv # Clang also needs -fwrapv
WRAP="-fwrapv" WRAP="-fwrapv"
CFLAGS_ALIASING="-fno-strict-aliasing"
# 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"
fi fi
case $ac_cv_prog_cc_g in case $ac_cv_prog_cc_g in
@ -6857,7 +6852,7 @@ then
;; ;;
esac esac
OPT="$OPT $STRICT_PROTO $ALIASING" OPT="$OPT $STRICT_PROTO"
case $ac_sys_system in case $ac_sys_system in
SCO_SV*) OPT="$OPT -m486 -DSCO5" SCO_SV*) OPT="$OPT -m486 -DSCO5"

View File

@ -1440,6 +1440,7 @@ esac
# tweak OPT based on compiler and platform, only if the user didn't set # tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line # it on the command line
AC_SUBST(OPT) AC_SUBST(OPT)
AC_SUBST(CFLAGS_ALIASING)
if test "${OPT-unset}" = "unset" if test "${OPT-unset}" = "unset"
then then
case $GCC in case $GCC in
@ -1469,13 +1470,9 @@ then
then then
# Clang also needs -fwrapv # Clang also needs -fwrapv
WRAP="-fwrapv" WRAP="-fwrapv"
# bpo-30104: disable strict aliasing to compile correctly dtoa.c,
# bpo-30104: Python/dtoa.c requires to be build with # see Makefile.pre.in for more information
# -fno-strict-aliasing to fix compiler issue on the CFLAGS_ALIASING="-fno-strict-aliasing"
# 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"
fi fi
case $ac_cv_prog_cc_g in case $ac_cv_prog_cc_g in
@ -1497,7 +1494,7 @@ then
;; ;;
esac esac
OPT="$OPT $STRICT_PROTO $ALIASING" OPT="$OPT $STRICT_PROTO"
case $ac_sys_system in case $ac_sys_system in
SCO_SV*) OPT="$OPT -m486 -DSCO5" SCO_SV*) OPT="$OPT -m486 -DSCO5"