Better workaround for aliases of *_finite symbols in vector math library.

Old workaround based on assembly aliases can lead to link fail (bug 19058).
This patch makes workaround in another way to avoid it.

    [BZ #19058]
    * math/Makefile ($(inst_libdir)/libm.so): Added libmvec_nonshared.a
    to AS_NEEDED.
    * sysdeps/x86/fpu/bits/math-vector.h: Removed code with old workaround.
    * sysdeps/x86_64/fpu/Makefile (libmvec-support,
    libmvec-static-only-routines): Added new file.
    * sysdeps/x86_64/fpu/svml_finite_alias.S: New file.
This commit is contained in:
Andrew Senkevich 2015-11-27 16:22:26 +03:00
parent 4d952856e3
commit 977a30801f
5 changed files with 74 additions and 31 deletions

View File

@ -1,3 +1,14 @@
2015-11-27 Andrew Senkevich <andrew.senkevich@intel.com>
[BZ #19058]
* math/Makefile ($(inst_libdir)/libm.so): Added libmvec_nonshared.a to
AS_NEEDED.
* sysdeps/x86/fpu/bits/math-vector.h: Removed code with asm aliases
workaround.
* sysdeps/x86_64/fpu/Makefile (libmvec-support,
libmvec-static-only-routines): Added new file.
* sysdeps/x86_64/fpu/svml_finite_alias.S: New file.
2015-11-25 Samuel Thibault <samuel.thibault@ens-lyon.org>
* hurd/sigunwind.c (_hurdsig_longjmp_from_handler): Destroy reply port

View File

@ -99,7 +99,7 @@ $(inst_libdir)/libm.so: $(common-objpfx)format.lds \
(echo '/* GNU ld script'; echo '*/';\
cat $<; \
echo 'GROUP ( $(slibdir)/libm.so$(libm.so-version) ' \
'AS_NEEDED ( $(slibdir)/libmvec.so$(libmvec.so-version) ) )' \
'AS_NEEDED ( $(slibdir)/libmvec_nonshared.a $(slibdir)/libmvec.so$(libmvec.so-version) ) )' \
) > $@
endif

View File

@ -53,34 +53,5 @@
# undef __DECL_SIMD_powf
# define __DECL_SIMD_powf __DECL_SIMD_x86_64
/* Workaround to exclude unnecessary symbol aliases in libmvec
while GCC creates the vector names based on scalar asm name.
Corresponding discussion started at
<https://gcc.gnu.org/ml/gcc/2015-06/msg00173.html>. */
__asm__ ("_ZGVbN2v___log_finite = _ZGVbN2v_log");
__asm__ ("_ZGVcN4v___log_finite = _ZGVcN4v_log");
__asm__ ("_ZGVdN4v___log_finite = _ZGVdN4v_log");
__asm__ ("_ZGVeN8v___log_finite = _ZGVeN8v_log");
__asm__ ("_ZGVbN4v___logf_finite = _ZGVbN4v_logf");
__asm__ ("_ZGVcN8v___logf_finite = _ZGVcN8v_logf");
__asm__ ("_ZGVdN8v___logf_finite = _ZGVdN8v_logf");
__asm__ ("_ZGVeN16v___logf_finite = _ZGVeN16v_logf");
__asm__ ("_ZGVbN2v___exp_finite = _ZGVbN2v_exp");
__asm__ ("_ZGVcN4v___exp_finite = _ZGVcN4v_exp");
__asm__ ("_ZGVdN4v___exp_finite = _ZGVdN4v_exp");
__asm__ ("_ZGVeN8v___exp_finite = _ZGVeN8v_exp");
__asm__ ("_ZGVbN4v___expf_finite = _ZGVbN4v_expf");
__asm__ ("_ZGVcN8v___expf_finite = _ZGVcN8v_expf");
__asm__ ("_ZGVdN8v___expf_finite = _ZGVdN8v_expf");
__asm__ ("_ZGVeN16v___expf_finite = _ZGVeN16v_expf");
__asm__ ("_ZGVbN2vv___pow_finite = _ZGVbN2vv_pow");
__asm__ ("_ZGVcN4vv___pow_finite = _ZGVcN4vv_pow");
__asm__ ("_ZGVdN4vv___pow_finite = _ZGVdN4vv_pow");
__asm__ ("_ZGVeN8vv___pow_finite = _ZGVeN8vv_pow");
__asm__ ("_ZGVbN4vv___powf_finite = _ZGVbN4vv_powf");
__asm__ ("_ZGVcN8vv___powf_finite = _ZGVcN8vv_powf");
__asm__ ("_ZGVdN8vv___powf_finite = _ZGVdN8vv_powf");
__asm__ ("_ZGVeN16vv___powf_finite = _ZGVeN16vv_powf");
# endif
#endif

View File

@ -20,7 +20,9 @@ libmvec-support += svml_d_cos2_core svml_d_cos4_core_avx \
svml_d_pow_data svml_s_powf4_core svml_s_powf8_core_avx \
svml_s_powf8_core svml_s_powf16_core svml_s_powf_data \
svml_s_sincosf4_core svml_s_sincosf8_core_avx \
svml_s_sincosf8_core svml_s_sincosf16_core
svml_s_sincosf8_core svml_s_sincosf16_core svml_finite_alias
libmvec-static-only-routines = svml_finite_alias
endif
# Variables for libmvec tests.

View File

@ -0,0 +1,59 @@
/* These aliases added as workaround to exclude unnecessary symbol
aliases in libmvec.so while compiler creates the vector names
based on scalar asm name. Corresponding discussion is at
<https://gcc.gnu.org/ml/gcc/2015-06/msg00173.html>.
Copyright (C) 2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define ALIAS_IMPL(alias, target) \
ENTRY (alias); \
call target; \
ret; \
END (alias)
.text
ALIAS_IMPL (_ZGVbN2v___log_finite, _ZGVbN2v_log)
ALIAS_IMPL (_ZGVcN4v___log_finite, _ZGVcN4v_log)
ALIAS_IMPL (_ZGVdN4v___log_finite, _ZGVdN4v_log)
ALIAS_IMPL (_ZGVeN8v___log_finite, _ZGVeN8v_log)
ALIAS_IMPL (_ZGVbN4v___logf_finite, _ZGVbN4v_logf)
ALIAS_IMPL (_ZGVcN8v___logf_finite, _ZGVcN8v_logf)
ALIAS_IMPL (_ZGVdN8v___logf_finite, _ZGVdN8v_logf)
ALIAS_IMPL (_ZGVeN16v___logf_finite, _ZGVeN16v_logf)
ALIAS_IMPL (_ZGVbN2v___exp_finite, _ZGVbN2v_exp)
ALIAS_IMPL (_ZGVcN4v___exp_finite, _ZGVcN4v_exp)
ALIAS_IMPL (_ZGVdN4v___exp_finite, _ZGVdN4v_exp)
ALIAS_IMPL (_ZGVeN8v___exp_finite, _ZGVeN8v_exp)
ALIAS_IMPL (_ZGVbN4v___expf_finite, _ZGVbN4v_expf)
ALIAS_IMPL (_ZGVcN8v___expf_finite, _ZGVcN8v_expf)
ALIAS_IMPL (_ZGVdN8v___expf_finite, _ZGVdN8v_expf)
ALIAS_IMPL (_ZGVeN16v___expf_finite, _ZGVeN16v_expf)
ALIAS_IMPL (_ZGVbN2vv___pow_finite, _ZGVbN2vv_pow)
ALIAS_IMPL (_ZGVcN4vv___pow_finite, _ZGVcN4vv_pow)
ALIAS_IMPL (_ZGVdN4vv___pow_finite, _ZGVdN4vv_pow)
ALIAS_IMPL (_ZGVeN8vv___pow_finite, _ZGVeN8vv_pow)
ALIAS_IMPL (_ZGVbN4vv___powf_finite, _ZGVbN4vv_powf)
ALIAS_IMPL (_ZGVcN8vv___powf_finite, _ZGVcN8vv_powf)
ALIAS_IMPL (_ZGVdN8vv___powf_finite, _ZGVdN8vv_powf)
ALIAS_IMPL (_ZGVeN16vv___powf_finite, _ZGVeN16vv_powf)