mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
x86: Set minimum x86-64 level marker [BZ #27318]
Since the full ISA set used in an ELF binary is unknown to compiler, an x86-64 ISA level marker indicates the minimum, not maximum, ISA set required to run such an ELF binary. We never guarantee a library with an x86-64 ISA level v3 marker doesn't contain other ISAs beyond x86-64 ISA level v3, like AVX VNNI. We check the x86-64 ISA level marker for the minimum ISA set. Since -march=sandybridge enables only some ISAs in x86-64 ISA level v3, we should set the needed ISA marker to v2. Otherwise, libc is compiled with -march=sandybridge will fail to run on Sandy Bridge: $ ./elf/ld.so ./libc.so ./libc.so: (p) CPU ISA level is lower than required: needed: 7; got: 3 Set the minimum, instead of maximum, x86-64 ISA level marker should have no impact on the glibc-hwcaps directory assignment logic in ldconfig nor ld.so.
This commit is contained in:
parent
3c66792667
commit
339bf918ea
@ -275,4 +275,10 @@
|
|||||||
/* Define if x86 ISA level should be included in shared libraries. */
|
/* Define if x86 ISA level should be included in shared libraries. */
|
||||||
#undef INCLUDE_X86_ISA_LEVEL
|
#undef INCLUDE_X86_ISA_LEVEL
|
||||||
|
|
||||||
|
/* Define if -msahf is enabled by default on x86. */
|
||||||
|
#undef HAVE_X86_LAHF_SAHF
|
||||||
|
|
||||||
|
/* Define if -mmovbe is enabled by default on x86. */
|
||||||
|
#undef HAVE_X86_MOVBE
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
28
sysdeps/x86/configure
vendored
28
sysdeps/x86/configure
vendored
@ -126,6 +126,8 @@ cat > conftest2.S <<EOF
|
|||||||
4:
|
4:
|
||||||
EOF
|
EOF
|
||||||
libc_cv_include_x86_isa_level=no
|
libc_cv_include_x86_isa_level=no
|
||||||
|
libc_cv_have_x86_lahf_sahf=no
|
||||||
|
libc_cv_have_x86_movbe=no
|
||||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S'
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S'
|
||||||
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
(eval $ac_try) 2>&5
|
(eval $ac_try) 2>&5
|
||||||
@ -135,6 +137,24 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest c
|
|||||||
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
||||||
if test "$count" = 1; then
|
if test "$count" = 1; then
|
||||||
libc_cv_include_x86_isa_level=yes
|
libc_cv_include_x86_isa_level=yes
|
||||||
|
cat > conftest.c <<EOF
|
||||||
|
EOF
|
||||||
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c'
|
||||||
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
test $ac_status = 0; }; } | grep -q "\-msahf"; then
|
||||||
|
libc_cv_have_x86_lahf_sahf=yes
|
||||||
|
fi
|
||||||
|
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c'
|
||||||
|
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
test $ac_status = 0; }; } | grep -q "\-mmovbe"; then
|
||||||
|
libc_cv_have_x86_movbe=yes
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f conftest*
|
rm -f conftest*
|
||||||
@ -144,6 +164,14 @@ $as_echo "$libc_cv_include_x86_isa_level" >&6; }
|
|||||||
if test $libc_cv_include_x86_isa_level = yes; then
|
if test $libc_cv_include_x86_isa_level = yes; then
|
||||||
$as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h
|
$as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
$as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
$as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
config_vars="$config_vars
|
config_vars="$config_vars
|
||||||
enable-x86-isa-level = $libc_cv_include_x86_isa_level"
|
enable-x86-isa-level = $libc_cv_include_x86_isa_level"
|
||||||
|
@ -98,14 +98,30 @@ cat > conftest2.S <<EOF
|
|||||||
4:
|
4:
|
||||||
EOF
|
EOF
|
||||||
libc_cv_include_x86_isa_level=no
|
libc_cv_include_x86_isa_level=no
|
||||||
|
libc_cv_have_x86_lahf_sahf=no
|
||||||
|
libc_cv_have_x86_movbe=no
|
||||||
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S); then
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest conftest1.S conftest2.S); then
|
||||||
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l`
|
||||||
if test "$count" = 1; then
|
if test "$count" = 1; then
|
||||||
libc_cv_include_x86_isa_level=yes
|
libc_cv_include_x86_isa_level=yes
|
||||||
|
cat > conftest.c <<EOF
|
||||||
|
EOF
|
||||||
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c) | grep -q "\-msahf"; then
|
||||||
|
libc_cv_have_x86_lahf_sahf=yes
|
||||||
|
fi
|
||||||
|
if AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c) | grep -q "\-mmovbe"; then
|
||||||
|
libc_cv_have_x86_movbe=yes
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f conftest*])
|
rm -f conftest*])
|
||||||
if test $libc_cv_include_x86_isa_level = yes; then
|
if test $libc_cv_include_x86_isa_level = yes; then
|
||||||
AC_DEFINE(INCLUDE_X86_ISA_LEVEL)
|
AC_DEFINE(INCLUDE_X86_ISA_LEVEL)
|
||||||
fi
|
fi
|
||||||
|
if test $libc_cv_have_x86_lahf_sahf = yes; then
|
||||||
|
AC_DEFINE(HAVE_X86_LAHF_SAHF)
|
||||||
|
fi
|
||||||
|
if test $libc_cv_have_x86_movbe = yes; then
|
||||||
|
AC_DEFINE(HAVE_X86_MOVBE)
|
||||||
|
fi
|
||||||
LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
|
LIBC_CONFIG_VAR([enable-x86-isa-level], [$libc_cv_include_x86_isa_level])
|
||||||
|
@ -29,32 +29,35 @@
|
|||||||
|
|
||||||
/* ELF program property for x86 ISA level. */
|
/* ELF program property for x86 ISA level. */
|
||||||
#ifdef INCLUDE_X86_ISA_LEVEL
|
#ifdef INCLUDE_X86_ISA_LEVEL
|
||||||
# if defined __x86_64__ || defined __FXSR__ || !defined _SOFT_FLOAT \
|
# if defined __SSE__ && defined __SSE2__
|
||||||
|| defined __MMX__ || defined __SSE__ || defined __SSE2__
|
/* NB: ISAs, excluding MMX, in x86-64 ISA level baseline are used. */
|
||||||
# define ISA_BASELINE GNU_PROPERTY_X86_ISA_1_BASELINE
|
# define ISA_BASELINE GNU_PROPERTY_X86_ISA_1_BASELINE
|
||||||
# else
|
# else
|
||||||
# define ISA_BASELINE 0
|
# define ISA_BASELINE 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 \
|
# if ISA_BASELINE && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 \
|
||||||
|| (defined __x86_64__ && defined __LAHF_SAHF__) \
|
&& defined HAVE_X86_LAHF_SAHF && defined __POPCNT__ \
|
||||||
|| defined __POPCNT__ || defined __SSE3__ \
|
&& defined __SSE3__ && defined __SSSE3__ && defined __SSE4_1__ \
|
||||||
|| defined __SSSE3__ || defined __SSE4_1__ || defined __SSE4_2__
|
&& defined __SSE4_2__
|
||||||
|
/* NB: ISAs in x86-64 ISA level v2 are used. */
|
||||||
# define ISA_V2 GNU_PROPERTY_X86_ISA_1_V2
|
# define ISA_V2 GNU_PROPERTY_X86_ISA_1_V2
|
||||||
# else
|
# else
|
||||||
# define ISA_V2 0
|
# define ISA_V2 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined __AVX__ || defined __AVX2__ || defined __F16C__ \
|
# if ISA_V2 && defined __AVX__ && defined __AVX2__ && defined __F16C__ \
|
||||||
|| defined __FMA__ || defined __LZCNT__ || defined __MOVBE__ \
|
&& defined __FMA__ && defined __LZCNT__ && defined HAVE_X86_MOVBE
|
||||||
|| defined __XSAVE__
|
/* NB: ISAs in x86-64 ISA level v3 are used. */
|
||||||
# define ISA_V3 GNU_PROPERTY_X86_ISA_1_V3
|
# define ISA_V3 GNU_PROPERTY_X86_ISA_1_V3
|
||||||
# else
|
# else
|
||||||
# define ISA_V3 0
|
# define ISA_V3 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined __AVX512F__ || defined __AVX512BW__ || defined __AVX512CD__ \
|
# if ISA_V3 && defined __AVX512F__ && defined __AVX512BW__ \
|
||||||
|| defined __AVX512DQ__ || defined __AVX512VL__
|
&& defined __AVX512CD__ && defined __AVX512DQ__ \
|
||||||
|
&& defined __AVX512VL__
|
||||||
|
/* NB: ISAs in x86-64 ISA level v4 are used. */
|
||||||
# define ISA_V4 GNU_PROPERTY_X86_ISA_1_V4
|
# define ISA_V4 GNU_PROPERTY_X86_ISA_1_V4
|
||||||
# else
|
# else
|
||||||
# define ISA_V4 0
|
# define ISA_V4 0
|
||||||
|
Loading…
Reference in New Issue
Block a user