build: check AVX512 rather than binutils version

Rather than checking the binutils version number, which can lead to
unnecessary disabling of AVX512 if fixes have been backported to distro
versions, we can instead check the output of "as" from binutils to see if
it is correct.

The check in the script uses the minimal assembly reproduction code posted
to the public bug tracker for gcc/binutils for those issues [1]. If the
binutils bug is present, the instruction parameters - specifically the
displacement parameter - will be different in the disassembled output
compared to the input. Therefore the check involves assembling a single
instruction and disassembling it again, checking that the two match.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Tested-by: Harry van Haaren <harry.van.haaren@intel.com>
This commit is contained in:
Bruce Richardson 2020-07-04 12:48:01 +01:00 committed by Thomas Monjalon
parent b29ac33ffc
commit 68b1f1cda5
5 changed files with 25 additions and 10 deletions

View File

@ -123,6 +123,7 @@ M: Bruce Richardson <bruce.richardson@intel.com>
F: meson.build F: meson.build
F: meson_options.txt F: meson_options.txt
F: config/rte_config.h F: config/rte_config.h
F: buildtools/binutils-avx512-check.sh
F: buildtools/call-sphinx-build.py F: buildtools/call-sphinx-build.py
F: buildtools/gen-pmdinfo-cfile.sh F: buildtools/gen-pmdinfo-cfile.sh
F: buildtools/list-dir-globs.py F: buildtools/list-dir-globs.py

View File

@ -0,0 +1,16 @@
#! /bin/sh
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2020 Intel Corporation
AS=${AS:-as}
OBJFILE=$(mktemp -t dpdk.binutils-check.XXXXXX.o)
trap 'rm -f "$OBJFILE"' EXIT
# from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028
GATHER_PARAMS='0x8(,%ymm1,1),%ymm0{%k2}'
# assemble vpgather to file and similarly check
echo "vpgatherqq $GATHER_PARAMS" | $AS --64 -o $OBJFILE -
objdump -d --no-show-raw-insn $OBJFILE | grep -q $GATHER_PARAMS || {
echo "vpgatherqq displacement error with as"
exit 1
}

View File

@ -1,13 +1,12 @@
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2017-2019 Intel Corporation # Copyright(c) 2017-2019 Intel Corporation
subdir('pmdinfogen')
pkgconf = find_program('pkg-config', 'pkgconf', required: false) pkgconf = find_program('pkg-config', 'pkgconf', required: false)
pmdinfo = find_program('gen-pmdinfo-cfile.sh') pmdinfo = find_program('gen-pmdinfo-cfile.sh')
list_dir_globs = find_program('list-dir-globs.py') list_dir_globs = find_program('list-dir-globs.py')
check_symbols = find_program('check-symbols.sh') check_symbols = find_program('check-symbols.sh')
ldflags_ibverbs_static = find_program('options-ibverbs-static.sh') ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
binutils_avx512_check = find_program('binutils-avx512-check.sh')
# set up map-to-win script using python, either built-in or external # set up map-to-win script using python, either built-in or external
python3 = import('python').find_installation(required: false) python3 = import('python').find_installation(required: false)

View File

@ -3,14 +3,10 @@
# get binutils version for the workaround of Bug 97 # get binutils version for the workaround of Bug 97
if not is_windows if not is_windows
ldver = run_command('ld', '-v').stdout().strip() binutils_ok = run_command(binutils_avx512_check)
if ldver.contains('2.30') and cc.has_argument('-mno-avx512f') if binutils_ok.returncode() != 0 and cc.has_argument('-mno-avx512f')
machine_args += '-mno-avx512f' machine_args += '-mno-avx512f'
message('Binutils 2.30 detected, disabling AVX512 support as workaround for bug #97') warning('Binutils error with AVX512 assembly, disabling AVX512 support')
endif
if ldver.contains('2.31') and cc.has_argument('-mno-avx512f')
machine_args += '-mno-avx512f'
message('Binutils 2.31 detected, disabling AVX512 support as workaround for bug #249')
endif endif
endif endif

View File

@ -39,10 +39,13 @@ global_inc = include_directories('.', 'config',
'lib/librte_eal/@0@/include'.format(host_machine.system()), 'lib/librte_eal/@0@/include'.format(host_machine.system()),
'lib/librte_eal/@0@/include'.format(arch_subdir), 'lib/librte_eal/@0@/include'.format(arch_subdir),
) )
# do configuration and get tool paths
subdir('buildtools')
subdir('config') subdir('config')
# build libs and drivers # build libs and drivers
subdir('buildtools') subdir('buildtools/pmdinfogen')
subdir('lib') subdir('lib')
subdir('drivers') subdir('drivers')