diff options
author | Andrew Senkevich <andrew.senkevich@intel.com> | 2015-11-27 17:30:04 +0300 |
---|---|---|
committer | Andrew Senkevich <andrew.senkevich@intel.com> | 2015-11-27 17:30:04 +0300 |
commit | 060f8dbd0ca6eb17d20442dc4df72c2a707bdf86 (patch) | |
tree | 90b5638f0883a577415c5d9715d8fbdda99f7164 | |
parent | af822b45a62940efbf5f691777fd2862c825e6d4 (diff) | |
download | glibc-060f8dbd0ca6eb17d20442dc4df72c2a707bdf86.tar.gz glibc-060f8dbd0ca6eb17d20442dc4df72c2a707bdf86.tar.xz glibc-060f8dbd0ca6eb17d20442dc4df72c2a707bdf86.zip |
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. * NEWS: Mention this fix.
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/x86/fpu/bits/math-vector.h | 29 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/Makefile | 5 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/svml_finite_alias.S | 59 |
6 files changed, 77 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog index b1816c2257..842a7c6f83 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +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. + * NEWS: Mention this fix. + 2015-11-20 Roland McGrath <roland@hack.frob.com> * sysdeps/nacl/dl-map-segments.h (_dl_map_segments): Use diff --git a/NEWS b/NEWS index 30fe67c074..e1003189f6 100644 --- a/NEWS +++ b/NEWS @@ -10,7 +10,7 @@ Version 2.22.1 * The following bugs are resolved with this release: 18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887, 18921, 18928, - 18969, 19018, 19178. + 18969, 19018, 19058, 19178. * The LD_POINTER_GUARD environment variable can no longer be used to disable the pointer guard feature. It is always enabled. diff --git a/math/Makefile b/math/Makefile index 6388baec89..76f99fb720 100644 --- a/math/Makefile +++ b/math/Makefile @@ -98,7 +98,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 diff --git a/sysdeps/x86/fpu/bits/math-vector.h b/sysdeps/x86/fpu/bits/math-vector.h index f9e798b556..f3bfb869d4 100644 --- a/sysdeps/x86/fpu/bits/math-vector.h +++ b/sysdeps/x86/fpu/bits/math-vector.h @@ -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 diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile index 1ebe5118bf..b32b85274a 100644 --- a/sysdeps/x86_64/fpu/Makefile +++ b/sysdeps/x86_64/fpu/Makefile @@ -20,7 +20,10 @@ 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 init-arch + svml_s_sincosf8_core svml_s_sincosf16_core init-arch \ + svml_finite_alias + +libmvec-static-only-routines = svml_finite_alias endif # Variables for libmvec tests. diff --git a/sysdeps/x86_64/fpu/svml_finite_alias.S b/sysdeps/x86_64/fpu/svml_finite_alias.S new file mode 100644 index 0000000000..f8bcfeb550 --- /dev/null +++ b/sysdeps/x86_64/fpu/svml_finite_alias.S @@ -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) |