bpo-36618: Add -fmax-type-align=8 flag for clang (GH-12809)

Add -fmax-type-align=8 to CFLAGS when clang compiler is detected.

The pymalloc memory allocator aligns memory on 8 bytes. On x86-64,
clang expects alignment on 16 bytes by default and so uses MOVAPS
instruction which can lead to segmentation fault. Instruct clang that
Python is limited to alignemnt on 8 bytes to use MOVUPS instruction
instead: slower but don't trigger a SIGSEGV if the memory is not
aligned on 16 bytes.

Sadly, the flag must be expected to CFLAGS and not just
CFLAGS_NODIST, since third party C extensions can have the same
issue.
This commit is contained in:
Victor Stinner 2019-04-12 21:27:37 +02:00 committed by GitHub
parent 606c66a17f
commit 23a683adf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 26 deletions

View File

@ -0,0 +1,8 @@
Add ``-fmax-type-align=8`` to CFLAGS when clang compiler is detected. The
pymalloc memory allocator aligns memory on 8 bytes. On x86-64, clang expects
alignment on 16 bytes by default and so uses MOVAPS instruction which can
lead to segmentation fault. Instruct clang that Python is limited to
alignemnt on 8 bytes to use MOVUPS instruction instead: slower but don't
trigger a SIGSEGV if the memory is not aligned on 16 bytes. Sadly, the flag
must be expected to ``CFLAGS`` and not just ``CFLAGS_NODIST``, since third
party C extensions can have the same issue.

42
configure vendored
View File

@ -6813,6 +6813,19 @@ esac
# compiler and platform. BASECFLAGS tweaks need to be made even if the
# user set OPT.
case $CC in
*clang*)
cc_is_clang=1
;;
*)
if $CC --version 2>&1 | grep -q clang
then
cc_is_clang=1
else
cc_is_clang=
fi
esac
# tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line
@ -6826,19 +6839,6 @@ then
WRAP="-fwrapv"
fi
case $CC in
*clang*)
cc_is_clang=1
;;
*)
if $CC --version 2>&1 | grep -q clang
then
cc_is_clang=1
else
cc_is_clang=
fi
esac
if test -n "${cc_is_clang}"
then
# Clang also needs -fwrapv
@ -6879,6 +6879,21 @@ then
esac
fi
if test -n "${cc_is_clang}"
then
# bpo-36618: Add -fmax-type-align=8 to CFLAGS when clang compiler is
# detected. The pymalloc memory allocator aligns memory on 8 bytes. On
# x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS
# instruction which can lead to segmentation fault. Instruct clang that
# Python is limited to alignemnt on 8 bytes to use MOVUPS instruction
# instead: slower but don't trigger a SIGSEGV if the memory is not aligned
# on 16 bytes.
#
# Sadly, the flag must be expected to CFLAGS and not just CFLAGS_NODIST,
# since third party C extensions can have the same issue.
CFLAGS="$CFLAGS -fmax-type-align=8"
fi
@ -10200,6 +10215,7 @@ fi
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.

View File

@ -1464,6 +1464,19 @@ esac
# compiler and platform. BASECFLAGS tweaks need to be made even if the
# user set OPT.
case $CC in
*clang*)
cc_is_clang=1
;;
*)
if $CC --version 2>&1 | grep -q clang
then
cc_is_clang=1
else
cc_is_clang=
fi
esac
# tweak OPT based on compiler and platform, only if the user didn't set
# it on the command line
AC_SUBST(OPT)
@ -1477,19 +1490,6 @@ then
WRAP="-fwrapv"
fi
case $CC in
*clang*)
cc_is_clang=1
;;
*)
if $CC --version 2>&1 | grep -q clang
then
cc_is_clang=1
else
cc_is_clang=
fi
esac
if test -n "${cc_is_clang}"
then
# Clang also needs -fwrapv
@ -1530,6 +1530,21 @@ then
esac
fi
if test -n "${cc_is_clang}"
then
# bpo-36618: Add -fmax-type-align=8 to CFLAGS when clang compiler is
# detected. The pymalloc memory allocator aligns memory on 8 bytes. On
# x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS
# instruction which can lead to segmentation fault. Instruct clang that
# Python is limited to alignemnt on 8 bytes to use MOVUPS instruction
# instead: slower but don't trigger a SIGSEGV if the memory is not aligned
# on 16 bytes.
#
# Sadly, the flag must be expected to CFLAGS and not just CFLAGS_NODIST,
# since third party C extensions can have the same issue.
CFLAGS="$CFLAGS -fmax-type-align=8"
fi
AC_SUBST(BASECFLAGS)
AC_SUBST(CFLAGS_NODIST)
AC_SUBST(LDFLAGS_NODIST)