Commit Graph

11241 Commits

Author SHA1 Message Date
H.J. Lu
8172aad937 arm: Update elf_machine_load_address for static PIE
When --enable-static-pie is used to configure glibc, we need to use
_dl_relocate_static_pie to compute load address in static PIE.

	* sysdeps/arm/dl-machine.h (elf_machine_load_address): Use
	_dl_relocate_static_pie instead of _dl_start to compute load
	address in static PIE.  Return 0 if _DYNAMIC is undefined for
	static executable.
2017-09-29 16:23:33 -07:00
H.J. Lu
54464e749d mips: Update elf_machine_load_address for static PIE
mips uses a local label to compute load address, which works with static
PIE.  We just need to return 0 if _DYNAMIC is undefined for static
executable.

	* sysdeps/mips/dl-machine.h (elf_machine_dynamic): Return 0 if
	_DYNAMIC is undefined for static executable.
2017-09-29 16:22:00 -07:00
H.J. Lu
f6c5e5bce0 arm: Check PIC instead of SHARED in start.S
Since start.o may be compiled as PIC, we should check PIC instead of
SHARED.

	* sysdeps/arm/start.S (_start): Check PIC instead of SHARED.
2017-09-29 16:20:39 -07:00
Joseph Myers
2f92505d20 Update x86_64 libm-test-ulps.
* sysdeps/x86_64/fpu/libm-test-ulps: Update.
2017-09-29 18:03:48 +00:00
Wilco Dijkstra
bd8d53bb33 Use fabs(f/l) rather than __fabs
A few math functions still use __fabs(f/l) rather than fabs, which
means they won't be inlined. Rename them so they are inlined.
Also add -fno-builtin-fabsl to nofpu powerpc makefile to work around
BZ #29253.

	* sysdeps/ieee754/dbl-64/e_lgamma_r.c
	(__ieee754_lgamma_r): Use fabs rather than __fabs.
	* sysdeps/ieee754/dbl-64/e_log10.c (__ieee754_log10): Likewise.
	* sysdeps/ieee754/dbl-64/e_log2.c (__ieee754_log2): Likewise.
	* sysdeps/ieee754/flt-32/e_lgammaf_r.c
	(__ieee754_lgammaf_r): Use fabsf rather than __fabsf.
	* sysdeps/ieee754/flt-32/e_log10f.c (__ieee754_log10f): Likewise.
	* sysdeps/ieee754/flt-32/e_log2f.c (__ieee754_log2f): Likewise.
	* sysdeps/ieee754/ldbl-128/e_lgammal_r.c
	(__ieee754_lgammal_r): Use fabsl rather than __fabsl.
	* sysdeps/ieee754/ldbl-128/e_log10l.c (__ieee754_log10l): Likewise.
	* sysdeps/ieee754/ldbl-128/e_log2l.c (__ieee754_log2l): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c
	(__ieee754_lgammal_r): Use fabsl rather than __fabsl.
	* sysdeps/ieee754/ldbl-128ibm/e_log10l.c (__ieee754_log10l): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_log2l.c (__ieee754_log2l): Likewise.
	* sysdeps/powerpc/nofpu/Makefile: Add -fno-builtin-fabsl for BZ #29253.
2017-09-29 18:54:24 +01:00
Szabolcs Nagy
4ea49f4c08 New generic powf
without wrapper on aarch64:
powf reciprocal-throughput: 4.2x faster
powf latency: 2.6x faster
old worst-case error: 1.11 ulp
new worst-case error: 0.82 ulp
aarch64 .text size: -780 bytes
aarch64 .rodata size: +144 bytes

powf(x,y) is implemented as exp2(y*log2(x)) with the same algorithms
that are used in exp2f and log2f, except that the log2f polynomial is
larger for extra precision and its output (and exp2f input) may be
scaled by a power of 2 (POWF_SCALE) to simplify the argument reduction
step of exp2 (possible when efficient round and convert toint operation
is available).

The special case handling tries to minimize the checks in the hot path.
When the input of exp2_inline is checked, int arithmetics is used as
that was faster on the tested aarch64 cores.

	* math/Makefile (type-float-routines): Add e_powf_log2_data.
	* sysdeps/ieee754/flt-32/e_powf.c: New implementation.
	* sysdeps/ieee754/flt-32/e_powf_log2_data.c: New file.
	* sysdeps/ieee754/flt-32/math_config.h (__powf_log2_data): Define.
	(issignalingf_inline): Likewise.
	(POWF_LOG2_TABLE_BITS): Likewise.
	(POWF_LOG2_POLY_ORDER): Likewise.
	(POWF_SCALE_BITS): Likewise.
	(POWF_SCALE): Likewise.
	* sysdeps/i386/fpu/e_powf_log2_data.c: New file.
	* sysdeps/ia64/fpu/e_powf_log2_data.c: New file.
	* sysdeps/m68k/m680x0/fpu/e_powf_log2_data.c: New file.
2017-09-29 17:30:53 +01:00
Szabolcs Nagy
875c76c704 New generic log2f
Similar to the new logf: double precision arithmetics and a small
lookup table is used. The argument reduction step is the same as in
the new logf.

without wrapper on aarch64:
log2f reciprocal-throughput: 2.3x faster
log2f latency: 2.1x faster
old worst case error: 1.72 ulp
new worst case error: 0.75 ulp
aarch64 .text size: -252 bytes
aarch64 .rodata size: +244 bytes

	* math/Makefile (type-float-routines): Add e_log2f_data.
	* sysdeps/ieee754/flt-32/e_log2f.c: New implementation.
	* sysdeps/ieee754/flt-32/e_log2f_data.c: New file.
	* sysdeps/ieee754/flt-32/math_config.h (__log2f_data): Define.
	(LOG2F_TABLE_BITS, LOG2F_POLY_ORDER): Define.
	* sysdeps/i386/fpu/e_log2f_data.c: New file.
	* sysdeps/ia64/fpu/e_log2f_data.c: New file.
	* sysdeps/m68k/m680x0/fpu/e_log2f_data.c: New file.
2017-09-29 17:17:41 +01:00
Szabolcs Nagy
bf27d3973d New generic logf
without wrapper on aarch64:
logf reciprocal-throughput: 2.2x faster
logf latency: 1.9x faster
old worst case error: 0.89 ulp
new worst case error: 0.82 ulp
aarch64 .text size: -356 bytes
aarch64 .rodata size: +240 bytes

Uses double precision arithmetics and a lookup table to allow smaller
polynomial and avoid the use of division.

Data is in a separate translation unit with fixed layout to prevent the
compiler generating suboptimal literal access.

Errors are handled inline according to POSIX rules, but this patch
keeps the wrapper with SVID compatible error handling.

Needs libm-test-ulps adjustment for clogf in non-nearest rounding mode.

	* math/Makefile (type-float-routines): Add e_logf_data.
	* sysdeps/ieee754/flt-32/e_logf.c: New implementation.
	* sysdeps/ieee754/flt-32/e_logf_data.c: New file.
	* sysdeps/ieee754/flt-32/math_config.h (__logf_data): Define.
	(LOGF_TABLE_BITS, LOGF_POLY_ORDER): Define.
	* sysdeps/i386/fpu/e_logf_data.c: New file.
	* sysdeps/ia64/fpu/e_logf_data.c: New file.
	* sysdeps/m68k/m680x0/fpu/e_logf_data.c: New file.
2017-09-29 11:46:46 +01:00
H.J. Lu
4088d8dd29 x86: Allow undefined _DYNAMIC in static executable
When --enable-static-pie is used to build static PIE, _DYNAMIC is used
to compute the load address of static PIE.  But _DYNAMIC is undefined
when creating static executable.  This patch makes _DYNAMIC weak in PIE
libc.a so that it can be undefined.

	* sysdeps/i386/dl-machine.h (elf_machine_load_address): Allow
	undefined _DYNAMIC in PIE libc.a.
	* sysdeps/x86_64/dl-machine.h (elf_machine_load_address):
	Likewse.
2017-09-28 15:28:12 -07:00
Wilco Dijkstra
4d3693ec1c Remove ancient __signbit inlines
Remove __signbit inlines from mathinline.h.  Math.h already uses
the builtin when supported, so additional inlines are only used
on pre 4.0 GCCs.  Similarly remove ancient copysign and fabs
inlines.

	* sysdeps/alpha/fpu/bits/mathinline.h: Delete file.
	* sysdeps/ia64/fpu/bits/mathinline.h: Delete file.
	* sysdeps/m68k/coldfire/fpu/bits/mathinline.h: Delete file.
	* sysdeps/m68k/m680x0/fpu/bits/mathinline.h: (__signbitf): Remove.
	(__signbit): Remove.
	(__signbitl): Remove.
	* sysdeps/powerpc/bits/mathinline.h (__signbitf): Remove.
	(__signbit): Remove.
	(__signbitl): Remove.
	* sysdeps/s390/fpu/bits/mathinline.h: (__signbitf): Remove.
	(__signbit): Remove.
	(__signbitl): Remove
	* sysdeps/sparc/fpu/bits/mathinline.h (__signbitf): Remove.
	(__signbit): Remove.
	(__signbitl): Remove.
	* sysdeps/tile/bits/mathinline.h: Delete file.
	* sysdeps/x86/fpu/bits/mathinline.h (__signbitf): Remove.
	(__signbit): Remove.
	(__signbitl): Remove.
2017-09-28 19:52:13 +01:00
Wilco Dijkstra
1e6d07234f Simplify C99 isgreater macros
Simplify the C99 isgreater macros.  Although some support was added
in GCC 2.97, not all targets added support until GCC 3.1.  Therefore
only use the builtins in math.h from GCC 3.1 onwards, and defer to
generic macros otherwise.  Improve the generic isunordered macro
to use compares rather than call fpclassify twice - this is not only
faster but also correct for signaling NaNs.

	* math/math.h: Improve handling of C99 isgreater macros.
	* sysdeps/alpha/fpu/bits/mathinline.h: Remove isgreater macros.
	* sysdeps/m68k/m680x0/fpu/bits/mathinline.h: Likewise.
	* sysdeps/powerpc/bits/mathinline.h: Likewise.
	* sysdeps/sparc/fpu/bits/mathinline.h: Likewise.
	* sysdeps/x86/fpu/bits/mathinline.h: Likewise.
2017-09-28 19:43:54 +01:00
Szabolcs Nagy
b2f03cf3a4 AArch64: update libm-test-ulps
Update for new expf and logf.

	* sysdeps/aarch64/libm-test-ulps: Update.
2017-09-28 15:28:46 +01:00
Joseph Myers
f124cb3811 Fix nearbyint arithmetic moved before feholdexcept (bug 22225).
In <https://sourceware.org/ml/libc-alpha/2013-05/msg00722.html> I
remarked on the possibility of arithmetic in various nearbyint
implementations being scheduled before feholdexcept calls, resulting
in spurious "inexact" exceptions.

I'm now actually observing this occurring in glibc built for ARM with
GCC 7 (in fact, both copies of the same addition/subtraction sequence
being combined and moved out before the conditionals and
feholdexcept/fesetenv pairs), resulting in test failures.

This patch makes the nearbyint implementations with this particular
feholdexcept / arithmetic / fesetenv pattern consistently use
math_opt_barrier on the function argument when first used in
arithmetic, and also consistently use math_force_eval before fesetenv
(the latter was generally already done, but the dbl-64/wordsize-64
implementation used math_opt_barrier instead, and as
math_opt_barrier's intended effect is through its output value being
used, such a use that doesn't use the return value is suspect).

Tested for x86_64 (--disable-multi-arch so more of these
implementations get used), and for ARM in a configuration where I saw
the problem scheduling.

	[BZ #22225]
	* sysdeps/ieee754/dbl-64/s_nearbyint.c (__nearbyint): Use
	math_opt_barrier on argument when doing arithmetic on it.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_nearbyint.c (__nearbyint):
	Likewise.  Use math_force_eval not math_opt_barrier after
	arithmetic.
	* sysdeps/ieee754/flt-32/s_nearbyintf.c (__nearbyintf): Use
	math_opt_barrier on argument when doing arithmetic on it.
	* sysdeps/ieee754/ldbl-128/s_nearbyintl.c (__nearbyintl):
	Likewise.
2017-09-28 01:59:02 +00:00
H.J. Lu
7edd06916d Update sysdeps/unix/sysv/linux/ifaddrs.c
Fix

../sysdeps/unix/sysv/linux/ifaddrs.c:835:27: error: ‘getifaddrs’ aliased to undefined symbol ‘__getifaddrs’
 weak_alias (__getifaddrs, getifaddrs)
                           ^
../sysdeps/unix/sysv/linux/ifaddrs.c:844:28: error: ‘freeifaddrs’ aliased to undefined symbol ‘__freeifaddrs’
 weak_alias (__freeifaddrs, freeifaddrs)

caused by

commit 4009ddc692
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Thu Sep 28 00:19:18 2017 +0200

    hurd: Fix `getifaddrs' and `freeifaddrs' symbol exposition

	* sysdeps/unix/sysv/linux/ifaddrs.c (__getifaddrs): Add
	libc_hidden_def.
	(__freeifaddrs): Likewise.
2017-09-27 17:18:32 -07:00
Samuel Thibault
4009ddc692 hurd: Fix getifaddrs' and freeifaddrs' symbol exposition
from `freeaddrinfo'.

`getifaddrs' and `freeifaddrs' are not in POSIX, they should not be
exposed along `freeaddrinfo' (through `__check_pf') which is POSIX.

	* include/ifaddrs.h (__getifaddrs, __freeifaddrs): New declarations,
	and use libc_hidden_def on them.
	* inet/ifaddrs.c (__getifaddrs, __freeifaddrs): Use libc_hidden_def on
	them.
	* sysdeps/gnu/ifaddrs.c (__getifaddrs, __freeifaddrs): Likewise.
	* inet/check_pf.c (__check_pf): Use __getifaddrs and __freeifaddrs
	instead of getifaddrs and freeifaddrs.
2017-09-28 01:05:18 +02:00
Samuel Thibault
64a4af28a6 hurd: Fix seekdir' symbol exposition from rewinddir'
`seekdir' is MISC || XOPEN, it should not be exposed along `rewinddir' which
is POSIX.

	* include/dirent.h (__seekdir): New declaration.
	* sysdeps/mach/hurd/seekdir.c (seekdir): Rename to __seekdir and
	redefine as weak alias.
	* sysdeps/mach/hurd/rewinddir.c (__rewinddir): Use __seekdir instead
	of seekdir.
2017-09-28 00:49:59 +02:00
Samuel Thibault
52a1f1814e hurd: Fix revoke' symbol exposition from unlockpt'
`revoke' is MISC only, it should not be exposed along `unlockpt' which is
XOPEN.

	* include/unistd.h (__revoke): New declaration.
	* misc/revoke.c (revoke): Rename to __revoke, and redefine as weak
	alias.
	* sysdeps/mach/hurd/revoke.c (revoke): Likewise.
	* sysdeps/unix/bsd/unlockpt.c (unlockpt): Use __revoke instead of
	revoke.
2017-09-28 00:49:05 +02:00
Samuel Thibault
2c7bbfaf4e hurd: Fix dirfd symbol exposition from ftw
dirfd is XOPEN2K8 only, it should not be exposed along ftw which is earlier.

	* include/dirent.h (__dirfd): New declaration.
	* dirent/dirfd.c (dirfd): Rename to __dirfd, and redefine as weak
	alias.
	* sysdeps/posix/dirfd/dirfd.c (dirfd): Likewise.
	* sysdeps/mach/hurd/dirfd.c (dirfd): Likewise.
	* io/ftw.c (open_dir_stream, ftw_dir): Use __dirfd instead of dirfd.
2017-09-28 00:49:05 +02:00
Joseph Myers
bfb0deb355 Fix make-syscalls.sh VDSO support for GCC 8.
sysdeps/unix/make-syscalls.sh has support, used only by x32, for
generating IFUNCs for kernel VDSO symbols.  This support creates
IFUNCs by setting symbol types manually, which is bad for debug info
and does not work with current GCC mainline because it results in
errors from the checks on types of function aliases.

This patch fixes it to use the common __ifunc macro, which uses the
ifunc attribute when available and so works with GCC mainline.  Note
however that the original error resulted from an indirect inclusion of
a header declaring __gettimeofday from the generated sources, and
using __ifunc now relies on such an indirect inclusion remaining as it
means use of __typeof to determine the correct types.  If glibc's
headers change in such a way as to remove that indirect inclusion, it
will become necessary to change the syscalls.list syntax for VDSO
syscalls so the name of the header to include can be specified.

Tested (compilation only) with build-many-glibcs.py that this fixes
the build for x32 with GCC mainline.

	* sysdeps/unix/make-syscalls.sh: Use __ifunc to define symbols
	using VDSO.
2017-09-26 21:21:01 +00:00
Joseph Myers
2d9193f2f5 Use generic __ifunc for SPARC.
glibc fails to build with GCC mainline for SPARC because of the use of
manually-created IFUNCs, which fail the tests of compatibility of
function alias types.  This patch changes sparc-ifunc.h to use the
generic __ifunc in defining sparc_libm_ifunc.  The generic __ifunc can
use the GCC ifunc attribute when available, so ensuring
type-correctness as well as better debug info than when setting symbol
types in asm statements.

Note that for this to fix the build with GCC mainline the GCC patch
<https://gcc.gnu.org/ml/gcc-patches/2017-09/msg01779.html>, or
building GCC with --enable-gnu-indirect-function, is also needed.

Tested (compilation only) with build-many-glibcs.py (sparc64-linux-gnu
and sparcv9-linux-gnu, with GCC 8 with the above patch, and also with
GCC 7).

	* sysdeps/sparc/sparc-ifunc.h [!__ASSEMBLER__] (sparc_libm_ifunc):
	Define using __ifunc.
2017-09-26 19:49:33 +00:00
Tulio Magno Quites Machado Filho
4c5a7a02b6 powerpc: Regenerate ULPs for expf() and exp2f()
Remove all entries for expf() and exp2f() and regenerate them.

	* sysdeps/powerpc/fpu/libm-test-ulps: Regenerate expf() and
	exp2f() values.
2017-09-26 16:13:33 -03:00
Joseph Myers
12ef66c411 Fix ia64 executable stack default (bug 22156).
As per https://gcc.gnu.org/ml/gcc-patches/2017-09/msg01220.html ia64
defaults to non-executable stacks in the Linux kernel (furthermore,
the use of function descriptors means that trampolines for nested
function pointers never need an executable stack).  glibc however
defines DEFAULT_STACK_PERMS to include PF_X for that architecture,
meaning (a) elf/check-execstack fails and (b) (from code inspection,
not tested, but this is why I think this is a user-visible bug) thread
stacks are unnecessarily mapped with execute permission.  This patch
fixes the DEFAULT_STACK_PERMS definition in question.

Tested (compilation only) with build-many-glibcs.py for ia64.  This
fixes the check-execstack failure.

	[BZ #22156]
	* sysdeps/ia64/stackinfo.h (DEFAULT_STACK_PERMS): Likewise.
2017-09-26 16:30:46 +00:00
Adhemerval Zanella
ccf970c7a7 posix: Add compat glob symbol to not follow dangling symbols
This patch follows commit 5554304f0 (posix: Allow glob to match dangling
symlinks [BZ #866]) by adding a compat symbol that follow previous
semantic of not following dangling symlinks and thus avoiding call
gl_lstat with GLOB_ALTDIRFUNC.

It avoids failure with old binaries that not set the alternate function
pointer for lstat (GNUmake for instance).  The following scenario, for
instance, fails with current GNUmake because glibc will access unitialized
memory when calling gl_lstat:

  $ cat src/t/t.c
  int main ()
  {
    return 0;
  }
  $ cat Makefile
  SRC = $(wildcard src/*/t.c)
  OBJ = $(patsubst src/%.c, obj/%.o, $(SRC))

  prog:           $(OBJ)
                  $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog

  obj/%.o:        src/%.c
                  $(CC) $(CFLAGS) -c $< -o $@
  $ make

This works as expected with the patch applied.  Since it is for generic
ABI, default compat symbols are added with override for Linux due LFS.
Now we have two compat symbols for glob on Linux:

  1. sysdeps/unix/sysv/linux/oldglob.c which implements glob64 with
     the old dirent layout.  For this implementation I also set it to
     not follow dangling symlinks (which is the safest path).

  2. sysdeps/unix/sysv/linux/glob{64}-lstat-compat.c which implements
     the compat symbol for dangling symlinks.  As for generic glob,
     the implementation uses XSTAT_IS_XSTAT64 to define whether
     both __glob_lstat_compat and __glob64_lstat_compat should be
     different implementations.  For archictures that define
     XSTAT_IS_XSTAT64, __glob_lstat_compat is aliased to
     __glob64_lstat_compat.

  3. sysdeps/unix/sysv/linux/alpha/oldglob.c with a different glob_t
     layout.  As for 1. this patch changes it to not follow dangling
     symlinks.

The patch also bumps _GNU_GLOB_INTERFACE_VERSION to 2 to advertise the
new semantic.  On GNUmake, for instance, it will force to it use its
internal glob implementation instead and avoiding triggering the same
failure on builds against newer GLIBCs.

Checked on x86_64-linux-gnu and i686-linux-gnu.  I also checked
with a build against the major ABIs required to check for the abilist.

The changes should also work on gnulib (I run gnulib-tool.py check glob
and it shown no regressions).

	[BZ #22183]
	* include/gnu-versions.h (_GNU_GLOB_INTERFACE_VERSION): Increase
	version to 2.
	* posix/Makefile (routines): Add glob-lstat-compat and
	glob64-lstat-compat.
	* posix/Versions (GLIBC_2.27, glob, glob64): Add symbol version.
	* posix/glob-lstat-compat.c: New file.
	* posix/glob64-lstat-compat.c: Likewise.
	* posix/tst-glob_lstat_compat.c: Likewise.
	* sysdeps/unix/sysv/linux/glob-lstat-compat.c: Likewise.
	* sysdeps/unix/sysv/linux/alpha/glob-lstat-compat.c: Likewise.
	* sysdeps/unix/sysv/linux/glob64-lstat-compat.c: Likewise.
	* sysdeps/unix/sysv/linux/alpha/glob.c: Remove file.
	* posix/glob.c (glob_lstat): New function.
	(glob): Rename to __glob and add versioned symbol to 2.27.
	(glob_in_dir): Use glob_lstat.
	* posix/glob64.c (glob64): Add GLOB_ATTRIBUTE.
	* sysdeps/unix/sysv/linux/arm/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/glob.c (glob): Add versioned symbol for
	2.27.
	* sysdeps/unix/sysv/linux/glob64.c (glob64): Likewise.
	* sysdeps/unix/sysv/linux/oldglob.c (GLOB_NO_LSTAT): Define.
	* sysdeps/unix/sysv/linux/alpha/oldglob.c (__old_glob): Do not use
	gl_lstat on glob call.
	* sysdeps/unix/sysv/linux/aarch64/libc.abilist: Add GLIBC_2.27 glob
	and glob64 symbols.
	* sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist:
	Likewise.
	* sysdeps/unix/linux/powerpc/powerpc32/nofpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
2017-09-25 18:04:16 -07:00
Stefan Liebler
9947638d74 Fix typo in sincos32.h inclusion guard.
This patch fixes a typo in inclusion guard in sincos32.h.

ChangeLog:

	* sysdeps/ieee754/dbl-64/sincos32.h
	[SINCCOS32_H]: Remove define.
	[SINCOS32_H]: Define.
2017-09-25 15:56:22 +02:00
Szabolcs Nagy
f5f0f52651 New expf and exp2f version without SVID compat wrapper
This patch changes the expf and exp2f error handling semantics to only
set errno accoring to POSIX rules. New symbol version is introduced at
GLIBC_2.27.

The old wrappers are kept for compat symbols.

Internal calls to __expf now get the new error semantics, this seems to
only affect sysdeps/i386/fpu/s_expm1f.S where the errno-only behaviour
should be correct.

ia64 needed assembly change to have the new and compat versioned symbol
map to the same function.

All linux libm abilists are updated.

	* math/Versions (expf): New libm symbol at GLIBC_2.27.
	(exp2f): Likewise.
	* math/w_exp2f.c: New file.
	* math/w_expf.c: New file.
	* math/w_exp2f_compat.c (__exp2f_compat): For compat symbol only.
	* math/w_expf_compat.c (__expf_compat): Likewise.
	* sysdeps/ia64/fpu/e_exp2f.S: Add versioned symbols.
	* sysdeps/ia64/fpu/e_expf.S: Likewise.
	* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Update.
	* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.
2017-09-25 10:45:08 +01:00
Szabolcs Nagy
72aa623345 Optimized generic expf and exp2f with wrappers
Based on new expf and exp2f code from
https://github.com/ARM-software/optimized-routines/

with wrapper on aarch64:
expf reciprocal-throughput: 2.3x faster
expf latency: 1.7x faster
without wrapper on aarch64:
expf reciprocal-throughput: 3.3x faster
expf latency: 1.7x faster
without wrapper on aarch64:
exp2f reciprocal-throughput: 2.8x faster
exp2f latency: 1.3x faster
libm.so size on aarch64:
.text size: -152 bytes
.rodata size: -1740 bytes
expf/exp2f worst case nearest rounding error: 0.502 ulp
worst case non-nearest rounding error: 1 ulp

Error checks are inline and errno setting is in separate tail called
functions, but the wrappers are kept in this patch to handle the
_LIB_VERSION==_SVID_ case.  (So e.g. errno is set twice for expf calls
and once for __expf_finite calls on targets where the new code is used.)

Double precision arithmetics is used which is expected to be faster on
most targets (including soft-float) than using single precision and it
is easier to get good precision result with it.

Const data is kept in a separate translation unit which complicates
maintenance a bit, but is expected to give good code for literal loads
on most targets and allows sharing data across expf, exp2f and powf.
(This data is disabled on i386, m68k and ia64 which have their own
expf, exp2f and powf code.)

Some details may need target specific tweaks:
- best convert and round to int operation in the arg reduction may be
different across targets.
- code was optimized on fma target, optimal polynomial eval may be
different without fma.
- gcc does not always generate good code for fp bit representation
access via unions or it may be inherently slow on some targets.

The libm-test-ulps will need adjustment because..
- The argument reduction ideally uses nearest rounded rint, but that is
not efficient on most targets, so the polynomial can get evaluated on a
wider interval in non-nearest rounding mode making 1 ulp errors common
in that case.
- The polynomial is evaluated such that it may have 1 ulp error on
negative tiny inputs with upward rounding.

	* math/Makefile (type-float-routines): Add math_errf and e_exp2f_data.
	* sysdeps/aarch64/fpu/math_private.h (TOINT_INTRINSICS): Define.
	(roundtoint, converttoint): Likewise.
	* sysdeps/ieee754/flt-32/e_expf.c: New implementation.
	* sysdeps/ieee754/flt-32/e_exp2f.c: New implementation.
	* sysdeps/ieee754/flt-32/e_exp2f_data.c: New file.
	* sysdeps/ieee754/flt-32/math_config.h: New file.
	* sysdeps/ieee754/flt-32/math_errf.c: New file.
	* sysdeps/ieee754/flt-32/t_exp2f.h: Remove.
	* sysdeps/i386/fpu/e_exp2f_data.c: New file.
	* sysdeps/i386/fpu/math_errf.c: New file.
	* sysdeps/ia64/fpu/e_exp2f_data.c: New file.
	* sysdeps/ia64/fpu/math_errf.c: New file.
	* sysdeps/m68k/m680x0/fpu/e_exp2f_data.c: New file.
	* sysdeps/m68k/m680x0/fpu/math_errf.c: New file.
2017-09-25 10:44:39 +01:00
Samuel Thibault
fcafcd162c hurd: Fix exposition of s/gettimeofday through timespec_s/get
conform/ISO11/time.h/linknamespace complains that using timespec_get exposes
gettimeofday.

conform/POSIX/time.h/linknamespace complains that using clock_settime
exposes settimeofday.

	* sysdeps/unix/clock_gettime.c (realtime_gettime, __clock_gettime): Use
	__gettimeofday instead of gettimeofday.
	* sysdeps/unix/clock_settime.c (__clock_settime): Use __settimeofday
	instead of settimeofday.
2017-09-25 01:55:02 +02:00
Samuel Thibault
b38a42a098 hurd: Fix bits/socket.h conformity
* sysdeps/mach/hurd/bits/socket.h: Include <bits/wordsize.h> instead
	of <limits.h>
	(__need_NULL): Do not define.
	(__ss_aligntype): Use __WORDSIZE instead of ULONG_MAX to determine
	alignment.
	[!__USE_MISC] (pseudo_AF_XTP, pseudo_AF_RTIP, pseudo_AF_PIP,
	CMGROUP_MAX, cmsgcred): Do not define.
	(CMSG_FIRSTHDR, __cmsg_nxthdr): Use (struct cmsghdr *) 0 instead of
	NULL.
	* bits/socket.h: Likewise.
2017-09-24 22:21:41 +02:00
Samuel Thibault
5e6f32531e hurd: Make sure dl-sysdep.c defines proper symbol names
* sysdeps/mach/hurd/dl-sysdep.c (check_no_hidden): New macro.
	(__open, __close, __libc_read, __libc_write, __writev, __libc_lseek64,
	__mmap, __fxstat64, __xstat64, __access, __access_noerrno, __getpid,
	__getcwd, __sbrk, __strtoul_internal, _exit, abort): Use check_no_hidden
	to make sure that these symbols are defined.
2017-09-24 17:54:02 +02:00
Joseph Myers
2f49ce7d62 Use libm_alias_float in flt-32.
This patch makes flt-32 libm functions use libm_alias_float to define
public interfaces (in cases where _Float32 aliases of those interfaces
would be appropriate, so not for finitef / isinff / isnanf).

Tested for x86_64.  Also tested with build-many-glibcs.py that
installed stripped shared libraries are unchanged by the patch.

	* sysdeps/ieee754/flt-32/s_asinhf.c: Include <libm-alias-float.h>.
	(asinhf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_atanf.c: Include <libm-alias-float.h>.
	(atanf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_cbrtf.c: Include <libm-alias-float.h>.
	(cbrtf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_ceilf.c: Include <libm-alias-float.h>.
	(ceilf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_copysignf.c: Include
	<libm-alias-float.h>.
	(copysignf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_cosf.c: Include <libm-alias-float.h>.
	(cosf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_erff.c: Include <libm-alias-float.h>.
	(erff): Define using libm_alias_float.
	(erfcf): Likewise.
	* sysdeps/ieee754/flt-32/s_expm1f.c: Include <libm-alias-float.h>.
	(expm1f): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_fabsf.c: Include <libm-alias-float.h>.
	(fabsf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_floorf.c: Include <libm-alias-float.h>.
	(floorf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_frexpf.c: Include <libm-alias-float.h>.
	(frexpf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_fromfpf.c (fromfpf): Define using
	libm_alias_float.
	* sysdeps/ieee754/flt-32/s_fromfpf_main.c: Include
	<libm-alias-float.h>.
	* sysdeps/ieee754/flt-32/s_fromfpxf.c (fromfpxf): Define using
	libm_alias_float.
	* sysdeps/ieee754/flt-32/s_getpayloadf.c: Include
	<libm-alias-float.h>.
	(getpayloadf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_llrintf.c: Include
	<libm-alias-float.h>.
	(llrintf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_llroundf.c: Include
	<libm-alias-float.h>.
	(llroundf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_logbf.c: Include <libm-alias-float.h>.
	(logbf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_lrintf.c: Include <libm-alias-float.h>.
	(lrintf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_lroundf.c: Include <libm-alias-float.h>.
	(lroundf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_modff.c: Include <libm-alias-float.h>.
	(modff): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_nearbyintf.c: Include
	<libm-alias-float.h>.
	(nearbyintf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_nextafterf.c: Include
	<libm-alias-float.h>.
	(nextafterf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_nextupf.c: Include
	<libm-alias-float.h>.
	(nextupf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_remquof.c: Include
	<libm-alias-float.h>.
	(remquof): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_rintf.c: Include <libm-alias-float.h>.
	(rintf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_roundevenf.c: Include
	<libm-alias-float.h>.
	(roundevenf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_roundf.c: Include <libm-alias-float.h>.
	(roundf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_setpayloadf.c (setpayloadf): Define
	using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_setpayloadf_main.c: Include
	<libm-alias-float.h>.
	* sysdeps/ieee754/flt-32/s_setpayloadsigf.c (setpayloadsigf):
	Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_sincosf.c: Include
	<libm-alias-float.h>.
	(sincosf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_sinf.c: Include <libm-alias-float.h>.
	(sinf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_tanf.c: Include <libm-alias-float.h>.
	(tanf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_tanhf.c: Include <libm-alias-float.h>.
	(tanhf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_totalorderf.c: Include
	<libm-alias-float.h>.
	(totalorderf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_totalordermagf.c: Include
	<libm-alias-float.h>.
	(totalordermagf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_truncf.c: Include <libm-alias-float.h>.
	(truncf): Define using libm_alias_float.
	* sysdeps/ieee754/flt-32/s_ufromfpf.c (ufromfpf): Define using
	libm_alias_float.
	* sysdeps/ieee754/flt-32/s_ufromfpxf.c (ufromfpxf): Define using
	libm_alias_float.
2017-09-22 20:24:12 +00:00
Gabriel F. T. Gomes
9ac3c68218 Remove conditional on LDBL_MANT_DIG from e_lgammal_r.c
The IEEE 754 implementation of lgammal in sysdeps/ieee754/ldbl-128/ used
to be shared by IBM's implementation in sysdeps/ieee754/ldbl-128ibm/ (by
an inclusion of the source file).  In order for the algorithm to work
for IBM's implementation, a check for LDBL_MANT_DIG was required. Since
the source file is no longer shared, the requirement for the check is
gone.  This patch removes the conditionals.

Tested for powerpc64le and s390x.

	* sysdeps/ieee754/ldbl-128/e_lgammal_r.c (__ieee754_lgammal_r):
	Remove conditionals on LDBL_MANT_DIG.
	* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c
	(__ieee754_lgammal_r): Likewise.
2017-09-21 17:37:40 -03:00
Gabriel F. T. Gomes
d2f0ed09f8 ldbl-128ibm: Automatic replacing of _Float128 and L()
The ldbl-128ibm implementation of j0l, j1l, lgammal_r, and cbrtl, as
well as the tables used by expl were copied from ldbl-128.  However, the
original files used _Float128 for the type and L() for the literal
suffix.  This patch uses the following sed command to rewrite _Float128
as long double and L(x) as xL (for e_expl.c, e_j0l.c, e_j1l.c,
e_lgammal_r.c, and t_expl.h):

  sed -i <filename> \
    -e "/^#define _Float128 long double/d" \
    -e "/^#define L(x) x ## L/d" \
    -e "/L(/s/)/L/" \
    -e "/L(/s/L(//" \
    -e "s/_Float128/long double/g"

For sysdeps/ieee754/ldbl-128ibm/s_cbrtl.c, this sed command incorrectly
replaces a few occurrences of L(), so the following command is used
instead:

  sed -i sysdeps/ieee754/ldbl-128ibm/s_cbrtl.c \
    -e "/^#define _Float128 long double/d" \
    -e "/^#define L(x) x ## L/d" \
    -e "s/L(0\.3\{40\})/0.3333333333333333333333333333333333333333L/" \
    -e "s/L(3\.7568280825958912391243e-1)/3.7568280825958912391243e-1L/" \
    -e "/L(/s/)/L/" \
    -e "/L(/s/L(//" \
    -e "s/_Float128/long double/g"

Tested for powerpc64le with patched [1] and unpatched gcc.

[1] https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01028.html

	* sysdeps/ieee754/ldbl-128ibm/e_expl.c: Remove definitions of
	_Float128 and L().
	* sysdeps/ieee754/ldbl-128ibm/e_j0l.c: Remove definitions of
	_Float128 and L(). Replace _Float128 with long double and L(x)
	with xL, throughout the file.
	* sysdeps/ieee754/ldbl-128ibm/e_j1l.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_cbrtl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/t_expl.h: Likewise.
2017-09-21 17:37:39 -03:00
Gabriel F. T. Gomes
c5c2e667bf ldbl-128ibm: Copy implementations from ldbl-128 instead of including them
Some files under sysdeps/ieee754/ldbl-128ibm/ are able to reuse the
implementation in sysdeps/ieee754/ldbl-128/ by defining _Float128 to
long double.  This relied on compiler support for _Float128 being
disabled.  On powerpc, such support was disabled by default, however, it
got enabled by default [1] in GCC 8.

This patch copies the implementations from ldbl-128 to ldbl-128ibm.  The
uses of _Float128 and L() are kept intact in this patch and are replaced
with a script in a subsequent patch.

[1] https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01028.html

Tested for powerpc64 and powerpc64le.

	* sysdeps/ieee754/ldbl-128ibm/e_expl.c: Include tables from
	sysdeps/ieee754/ldbl-128ibm.
	* sysdeps/ieee754/ldbl-128ibm/e_j0l.c: Copy contents from the
	equivalent implementation in sysdeps/ieee754/ldbl-128/ instead
	of including it.  Keep _Float128 and L() intact.  These will be
	reviewed by a separate patch.
	* sysdeps/ieee754/ldbl-128ibm/e_j1l.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_lgammal_r.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_cbrtl.c: Likewise.
	* sysdeps/ieee754/ldbl-128ibm/t_expl.h: Likewise.
2017-09-21 17:37:39 -03:00
Gabriel F. T. Gomes
e010deb231 powerpc: Add redirection for finitef128, isinf128, and isnanf128
On powerpc64le, compiler support for float128 is not enabled by default
on gcc.  To enable it, the flag -mfloat128 must be passed as a command
line option to the compiler.  This means that only the few files that
actively have -mfloat128 passed as an argument get compiler support for
float128, whereas all other files don't.

When -mfloat128 becomes enabled by default on powerpc [1], all the files
that do not currently have compiler support for float128 enabled during
their compilation, will start to have it.  This will lead to build
errors in s_finite.c, s_isinf.c, and s_isnan.c.

The errors are due to the unintended macro expansion of __finitef128 to
__redirect_finitef128 in math/bits/mathcalls-helper-functions.h.  In
that header, __MATHDECL_1 takes '__finite' and 'f128' as arguments and
concatenates them.  However, since '__finite' has been redefined in
s_finite.c, the function declaration becomes __redirect_finitef128:

    extern int __redirect___finitef128 (_Float128 __value) __attribute__ ((__nothrow__ )) __attribute__ ((__const__));

This declaration itself is OK.  The problem arises when include/math.h
creates the hidden prototype ('hidden_proto (__finitef128)'), which
expands to:

    extern __typeof (__finitef128) __finitef128 __attribute__ ((visibility ("hidden")));

Since __finitef128 is not declared, __typeof fails.  This effect was
already true for the 'float' and 'long double' versions and is now true
for float128.  Likewise for isinsff128 and isnanf128.

This patch defines __finitef128 as __redirect___finitef128 in
sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c, similarly to what's
done for the float and long double versions of these functions, to get
rid of the build error.  Likewise for isinff128 and isnanf128.

[1] https://gcc.gnu.org/ml/gcc-patches/2017-08/msg01028.html

Tested for powerpc64 and powerpc64le.

	* sysdeps/powerpc/powerpc64/fpu/multiarch/s_finite.c
	(__finitef128): Define to __redirect___finitef128.
	* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isinf.c
	(__isinff128): Define to __redirect___isinff128.
	* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan.c
	(__isnanf128): Define to __redirect___isnanf128.
2017-09-21 17:37:39 -03:00
Gabriel F. T. Gomes
ffa448041b powerpc64le: Add -mfloat128 to tst-strtod-nan-locale testcase
On powerpc64le, not all files can have the flag -mfloat128 passed as an
option on the compile command, since that could conflict with other
flags, such as -mno-vsx.  Each file that needs the flag, gets it through
a CFLAGS-filename variable on sysdeps/powerpc/powerpc64le/Makefile.

The test cases tst-strtod-nan-locale and tst-wcstod-nan-locale are
missing this flag.

Tested for powerpc64le.

	* sysdeps/powerpc/powerpc64le/Makefile
	(CFLAGS-tst-strtod-nan-locale.c): New variable.
	(CFLAGS-tst-wcstod-nan-locale.c): New variable.
2017-09-21 17:37:39 -03:00
Joseph Myers
ae8372d7e4 Add SSE4.1 trunc, truncf (bug 20142).
This patch adds SSE4.1 versions of trunc and truncf, using the roundsd
/ roundss instructions, similar to the versions of ceil, floor, rint
and nearbyint functions we already have.  In my testing with the glibc
benchtests these are about 30% faster than the C versions for double,
20% faster for float.

Tested for x86_64.

	[BZ #20142]
	* sysdeps/x86_64/fpu/multiarch/Makefile (libm-sysdep_routines):
	Add s_trunc-c, s_truncf-c, s_trunc-sse4_1 and s_truncf-sse4_1.
	* sysdeps/x86_64/fpu/multiarch/s_trunc-c.c: New file.
	* sysdeps/x86_64/fpu/multiarch/s_trunc-sse4_1.S: Likewise.
	* sysdeps/x86_64/fpu/multiarch/s_trunc.c: Likewise.
	* sysdeps/x86_64/fpu/multiarch/s_truncf-c.c: Likewise.
	* sysdeps/x86_64/fpu/multiarch/s_truncf-sse4_1.S: Likewise.
	* sysdeps/x86_64/fpu/multiarch/s_truncf.c: Likewise.
2017-09-20 16:54:05 +00:00
Joseph Myers
d82468d100 Fix fexecve build where syscall macros call sizeof.
The recent fexecve changes broke the build on (at least) alpha (maybe
other configurations, that was the first breakage I saw in my
build-many-glibcs.py run):

In file included from ../sysdeps/unix/sysv/linux/alpha/sysdep.h:29:0,
                 from ../sysdeps/alpha/nptl/tls.h:31,
                 from ../include/errno.h:25,
                 from ../sysdeps/unix/sysv/linux/fexecve.c:18:
../sysdeps/unix/sysv/linux/fexecve.c: In function 'fexecve':
../sysdeps/unix/alpha/sysdep.h:203:10: error: 'sizeof' on array function parameter 'argv' will return size of 'char * const*' [-Werror=sizeof-array-argument]
   (sizeof(arg) == 4 ? (long)(int)(long)(arg) : (long)(arg))
          ^
../sysdeps/unix/alpha/sysdep.h:302:26: note: in expansion of macro 'syscall_promote'
  register long _tmp_18 = syscall_promote (arg3);  \
                          ^~~~~~~~~~~~~~~
../sysdeps/unix/alpha/sysdep.h:173:2: note: in expansion of macro 'inline_syscall5'
  inline_syscall##nr(__NR_##name, args); \
  ^~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/alpha/sysdep.h:85:2: note: in expansion of macro 'INLINE_SYSCALL1'
  INLINE_SYSCALL1(name, nr, args);    \
  ^~~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/fexecve.c:42:3: note: in expansion of macro 'INLINE_SYSCALL'
   INLINE_SYSCALL (execveat, 5, fd, "", argv, envp, AT_EMPTY_PATH);
   ^~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/fexecve.c:33:30: note: declared here
 fexecve (int fd, char *const argv[], char *const envp[])
                              ^~~~

This patch fixes this similarly to previous fixes for such issues: use
&argv[0] and &envp[0] as the syscall macro arguments.  Tested
(compilation only) for alpha-linux-gnu with build-many-glibcs.py.

	* sysdeps/unix/sysv/linux/fexecve.c (fexecve) [__NR_execveat]:
	Explicitly take address of first element of array arguments in
	call to INLINE_SYSCALL.
2017-09-19 15:50:38 +00:00
Andreas Schwab
43ffc53a35 Use execveat syscall in fexecve (bug 22134)
By using execveat we no longer depend on /proc.  The execveat syscall was
introduced in 3.19, except for a few late comers.
2017-09-19 16:19:14 +02:00
Wilco Dijkstra
ca3a382ea3 Enable unwind info in libc-start.c and backtrace.c
Add unwind info to __libc_start_main so that unwinding continues one
extra level to _start.  Similarly add unwind info to backtrace.
Given many targets require this, do this in a general way.

	* csu/Makefile: Add -funwind-tables to libc-start.c.
	* debug/Makefile: Add -funwind-tables to backtrace.c.
	* sysdeps/aarch64/Makefile: Remove CFLAGS-backtrace.c.
	* sysdeps/arm/Makefile: Likewise.
	* sysdeps/i386/Makefile: Likewise.
	* sysdeps/m68k/Makefile: Likewise.
	* sysdeps/mips/Makefile: Likewise.
	* sysdeps/nios2/Makefile: Likewise.
	* sysdeps/sh/Makefile: Likewise.
	* sysdeps/sparc/Makefile: Likewise.
2017-09-19 15:07:58 +01:00
Rajalakshmi Srinivasaraghavan
bd17ba29eb powerpc: Avoid misaligned stores in memset
As per the section "3.1.4.2 Alignment Interrupts" of the "POWER8 Processor
User's Manual for the Single-Chip Module", alignment interrupt is reported
for misaligned stores in  Caching-inhibited storage.  As memset is used in
some drivers for DMA (like xorg), this patch avoids misaligned stores for
sizes less than 8 in memset.
2017-09-19 13:55:49 +05:30
Joseph Myers
6d9b0b5a22 Fix powerpc64le problem from last ldbl-opt patch.
This patch fixes a problem on powerpc64le that I missed in initial
testing of my last patch to ldbl-opt.  In the specific case of
powerpc64le, the weak aliases for exp10l and remainderl do not get
defined in the generic wrappers because of how those wrappers
undefine and redefine weak_alias.  This patch restores those aliases
in the ldbl-opt code.

Tested (compilation only) for powerpc64le with build-many-glibcs.py.

	* sysdeps/ieee754/ldbl-opt/w_exp10l_compat.c [LIBM_SVID_COMPAT &&
	!LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)] (weak_alias): Undefine and
	redefine.
	[LIBM_SVID_COMPAT && !LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)]
	(exp10l): Define as weak alias.
	* sysdeps/ieee754/ldbl-opt/w_remainderl_compat.c [LIBM_SVID_COMPAT
	&& !LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)] (weak_alias): Undefine
	and redefine.
	[LIBM_SVID_COMPAT && !LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)]
	(remainderl): Define as weak alias.
2017-09-18 23:26:35 +00:00
Joseph Myers
92892fdbfa Use libm_alias_ldouble in math/.
This patch converts libm function implementations in math/ from using
weak_alias to using libm_alias_ldouble to define public function
names, in cases where it would be appropriate to define _Float128 /
_Float64x aliases for those functions as well (in cases where either
or both of those types exist and have the same ABI as long double).
This eliminates many ldbl-opt wrappers round these function
implementations.

Tested for x86_64, and with build-many-glibcs.py.  All installed
stripped shared libraries are unchanged except for libm.so on
powerpc64le.  As noted for a previous patch, powerpc64le's use of
ldbl-opt means various long double functions get defined using
long_double_symbol which gives them an explicit symbol version in the
object files, and this patch results in some such functions using
weak_alias instead (because powerpc64le never had a previous version
of these functions for long double = double); both produce a valid
libm.so with the same public symbols at the same versions, but macros
expanding to call weak_alias is cleaner in this case.

	* math/s_fmal.c: Include <libm-alias-ldouble.h>.
	(fmal): Define using libm_alias_ldouble.
	* math/w_acoshl_compat.c: Include <libm-alias-ldouble.h>.
	(acoshl): Define using libm_alias_ldouble.
	* math/w_acosl_compat.c: Include <libm-alias-ldouble.h>.
	(acosl): Define using libm_alias_ldouble.
	* math/w_asinl_compat.c: Include <libm-alias-ldouble.h>.
	(asinl): Define using libm_alias_ldouble.
	* math/w_atan2l_compat.c: Include <libm-alias-ldouble.h>.
	(atan2l): Define using libm_alias_ldouble.
	* math/w_atanhl_compat.c: Include <libm-alias-ldouble.h>.
	(atanhl): Define using libm_alias_ldouble.
	* math/w_coshl_compat.c: Include <libm-alias-ldouble.h>.
	(coshl): Define using libm_alias_ldouble.
	* math/w_exp10l_compat.c: Include <libm-alias-ldouble.h>.
	(exp10l): Define using libm_alias_ldouble.
	* math/w_exp2l_compat.c: Include <libm-alias-ldouble.h>.
	(exp2l): Define using libm_alias_ldouble.
	* math/w_expl_compat.c: Include <libm-alias-ldouble.h>.
	(expl): Define using libm_alias_ldouble.
	* math/w_fmodl_compat.c: Include <libm-alias-ldouble.h>.
	(fmodl): Define using libm_alias_ldouble.
	* math/w_hypotl_compat.c: Include <libm-alias-ldouble.h>.
	(hypotl): Define using libm_alias_ldouble.
	* math/w_j0l_compat.c: Include <libm-alias-ldouble.h>.
	(j0l): Define using libm_alias_ldouble.
	(y0l): Likewise.
	* math/w_j1l_compat.c: Include <libm-alias-ldouble.h>.
	(j1l): Define using libm_alias_ldouble.
	(y1l): Likewise.
	* math/w_jnl_compat.c: Include <libm-alias-ldouble.h>.
	(jnl): Define using libm_alias_ldouble.
	(ynl): Likewise.
	* math/w_log10l_compat.c: Include <libm-alias-ldouble.h>.
	(log10l): Define using libm_alias_ldouble.
	* math/w_log2l_compat.c: Include <libm-alias-ldouble.h>.
	(log2l): Define using libm_alias_ldouble.
	* math/w_logl_compat.c: Include <libm-alias-ldouble.h>.
	(logl): Define using libm_alias_ldouble.
	* math/w_powl_compat.c: Include <libm-alias-ldouble.h>.
	(powl): Define using libm_alias_ldouble.
	* math/w_remainderl_compat.c: Include <libm-alias-ldouble.h>.
	(remainderl): Define using libm_alias_ldouble.
	* math/w_sinhl_compat.c: Include <libm-alias-ldouble.h>.
	(sinhl): Define using libm_alias_ldouble.
	* math/w_sqrtl_compat.c: Include <libm-alias-ldouble.h>.
	(sqrtl): Define using libm_alias_ldouble.
	* math/w_tgammal_compat.c: Include <libm-alias-ldouble.h>.
	(tgammal): Define using libm_alias_ldouble.
	* sysdeps/ieee754/ldbl-opt/w_exp10l_compat.c [LIBM_SVID_COMPAT]
	(exp10l): Do not use long_double_symbol here.
	* sysdeps/ieee754/ldbl-opt/w_remainderl_compat.c
	[LIBM_SVID_COMPAT] (remainderl): Likewise.
	* sysdeps/ieee754/ldbl-opt/s_fmal.c: Remove.
	* sysdeps/ieee754/ldbl-opt/w_acoshl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_acosl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_asinl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_atan2l_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_atanhl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_coshl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_expl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_fmodl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_hypotl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_j0l_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_j1l_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_jnl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_log10l_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_log2l_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_logl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_powl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_sinhl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_sqrtl_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_tgammal_compat.c: Likewise.
2017-09-18 17:51:33 +00:00
Wang Boshi
6cd380dd36 AArch64: use movz/movk instead of literal pools in start.S
eXecute-Only Memory (XOM) is a protection mechanism against some ROP
attacks. XOM sets the code as executable and unreadable, so the access
to any data, like literal pools, in the code section causes the fault
with XOM. The compiler can disable literal pools for C source files,
but not for assembly files, so I use movz/movk instead of literal pools
in start.S for XOM.

I add MOVL macro with movz/movk instructions like movl pseudo-instruction
in armasm, and use the macro instead of literal pools.

	* sysdeps/aarch64/start.S: Use MOVL instead of literal pools.
	* sysdeps/aarch64/sysdep.h (MOVL): Add MOVL macro.
2017-09-18 18:15:47 +01:00
Samuel Thibault
1c6d89e9a4 Add missing libc_hidden_weak/def calls
* io/read.c (read): Add libc_hidden_weak.
	* sysdeps/mach/hurd/read.c (read): Likewise.
	* io/write.c (write): Likewise.
	* sysdeps/mach/hurd/write.c (write): Likewise.
	* io/pread64.c (__pread64): Likewise.
	* sysdeps/mach/hurd/pread64.c (__pread64): Likewise.
	* posix/pread64.c (__pread64): Add libc_hidden_def.
2017-09-17 21:57:39 +02:00
Joseph Myers
9ac4470888 Use libm_alias_double in math/.
This patch converts libm function implementations in math/ from using
weak_alias to using libm_alias_double to define public function names,
in cases where it would be appropriate to define _Float64 / _Float32x
aliases for those functions as well.  This eliminates many
NO_LONG_DOUBLE conditionals and ldbl-opt wrappers round these function
implementations.

Tested for x86_64.  Also tested with build-many-glibcs.py.  Binary
differences seen are that the different order in which remainder and
drem symbols get defined as a result of this patch (the same source
file defines the same aliases, but in a different order of definition)
changes the order of symbols in the final libm.so when long double =
double, and for ldbl-opt configurations, the compat symbols for Bessel
functions were previously defined by e.g. "compat_symbol (libm, j0,
j0l, GLIBC_2_0)", which declares j0l as a compat symbol based on j0
and so makes j0l weak because j0 is weak, and are now defined
(indirectly via the relevant macros) based on e.g. __j0, so are no
longer weak because __j0 isn't weak.

	* math/s_fma.c: Include <libm-alias-double.h>.
	(fma): Define using libm_alias_double.
	* math/s_nextafter.c: Include <libm-alias-double.h>.
	(nextafter): Define using libm_alias_double.
	* math/w_acos_compat.c: Include <libm-alias-double.h>.
	(acos): Define using libm_alias_double.
	* math/w_acosh_compat.c: Include <libm-alias-double.h>.
	(aocsh): Define using libm_alias_double.
	* math/w_asin_compat.c: Include <libm-alias-double.h>.
	(asin): Define using libm_alias_double.
	* math/w_atan2_compat.c: Include <libm-alias-double.h>.
	(atan2): Define using libm_alias_double.
	* math/w_atanh_compat.c: Include <libm-alias-double.h>.
	(atanh): Define using libm_alias_double.
	* math/w_cosh_compat.c: Include <libm-alias-double.h>.
	(cosh): Define using libm_alias_double.
	* math/w_exp10_compat.c: Include <libm-alias-double.h>.
	(exp10): Define using libm_alias_double.
	* math/w_exp2_compat.c: Include <libm-alias-double.h>.
	(exp2): Define using libm_alias_double.
	* math/w_exp_compat.c: Include <libm-alias-double.h>.
	(exp): Define using libm_alias_double.
	* math/w_fmod_compat.c: Include <libm-alias-double.h>.
	(fmod): Define using libm_alias_double.
	* math/w_hypot_compat.c: Include <libm-alias-double.h>.
	(hypot): Define using libm_alias_double.
	* math/w_j0_compat.c: Include <libm-alias-double.h>.
	(j0): Define using libm_alias_double.
	(y0): Likewise.
	* math/w_j1_compat.c: Include <libm-alias-double.h>.
	(j1): Define using libm_alias_double.
	(y1): Likewise.
	* math/w_jn_compat.c: Include <libm-alias-double.h>.
	(jn): Define using libm_alias_double.
	(yn): Likewise.
	* math/w_log10_compat.c: Include <libm-alias-double.h>.
	(log10): Define using libm_alias_double.
	* math/w_log2_compat.c: Include <libm-alias-double.h>.
	(log2): Define using libm_alias_double.
	* math/w_log_compat.c: Include <libm-alias-double.h>.
	(log): Define using libm_alias_double.
	* math/w_pow_compat.c: Include <libm-alias-double.h>.
	(pow): Define using libm_alias_double.
	* math/w_remainder_compat.c: Include <libm-alias-double.h>.
	(remainder): Define using libm_alias_double.
	* math/w_sinh_compat.c: Include <libm-alias-double.h>.
	(sinh): Define using libm_alias_double.
	* math/w_sqrt_compat.c: Include <libm-alias-double.h>.
	(sqrt): Define using libm_alias_double.
	* math/w_tgamma_compat.c: Include <libm-alias-double.h>.
	(tgamma): Define using libm_alias_double.
	* sysdeps/ieee754/ldbl-opt/s_nextafter.c [LONG_DOUBLE_COMPAT(libm,
	GLIBC_2_0)] (nextafterl): Do not define compat symbol here.
	* sysdeps/ieee754/ldbl-opt/w_exp10_compat.c
	[LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)] (exp10l): Likewise.
	* sysdeps/ieee754/ldbl-opt/w_remainder_compat.c
	[LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)] (remainderl): Likewise.
	* sysdeps/ieee754/ldbl-opt/w_acos_compat.c: Remove.
	* sysdeps/ieee754/ldbl-opt/w_acosh_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_asin_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_atan2_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_atanh_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_cosh_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_exp_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_fmod_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_hypot_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_j0_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_j1_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_jn_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_log10_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_log2_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_log_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_pow_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_sinh_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_sqrt_compat.c: Likewise.
	* sysdeps/ieee754/ldbl-opt/w_tgamma_compat.c: Likewise.
2017-09-15 23:10:02 +00:00
Tulio Magno Quites Machado Filho
61c45f2505 [BZ #21745] powerpc: build some IFUNC math functions for libc and libm
Some math functions have to be distributed in libc because they're
required by printf.
libc and libm require their own builds of these functions, e.g. libc
functions have to call __stack_chk_fail_local in order to bypass the
PLT, while libm functions have to call __stack_chk_fail.

While math/Makefile treat the generic cases, i.e. s_isinff, the
multiarch Makefile has to treat its own files, i.e. s_isinff-ppc64.

	[BZ #21745]
	* sysdeps/powerpc/powerpc64/fpu/multiarch/Makefile:
	[$(subdir) = math] (sysdep_calls): New variable.  Has the
	previous contents of sysdep_routines, but re-sorted..
	[$(subdir) = math] (sysdep_routines): Re-use the contents from
	sysdep_calls.
	[$(subdir) = math] (libm-sysdep_routines): Remove the functions
	defined in sysdep_calls and replace by the respective m_* names.
	* sysdeps/powerpc/powerpc64/fpu/multiarch/s_isnan-ppc64.S:
	(compat_symbol): Undefine to avoid duplicated compat symbols in
	libc.
2017-09-15 15:09:19 -03:00
Joseph Myers
01f2881245 Make more libm functions into weak aliases.
Many libm functions define the function as __<func> and then define
<func> as a weak alias.  This is not at all limited to cases where
there is an internal call that has namespace reasons to need to call
__<func> instead of <func>.

The common macros for creating libm function aliases work on the basis
of public function names all being aliases; that is, they define
aliases for functions using the above pattern.  Thus, where a function
just defines the public name <func> directly, changing that to be a
weak alias enables a subsequent conversion to the common macros to
retain the exact existing symbols (and so be testable by comparison of
stripped binaries).

This patch converts many existing functions to use the weak alias
pattern, as preparation for subsequent conversions to common macros.
I do expect that _FloatN/_FloatNx function aliases will end up needing
new variants of the common macros that do *not* create the original
float / double / long double name of a function - for cases where that
name is created specially to give it a particular symbol version, for
example - but for functions that can use the most common macros to
create all the public names as aliases, it makes sense for them to do
so.

Regarding the Bessel function wrappers in this patch: only float and
double wrappers are changed because the long double wrappers already
used the weak alias pattern.

Tested for x86_64, and with build-many-glibcs.py.

	* include/math.h (roundeven): Change hidden_proto call to
	__roundeven.
	* math/w_j0_compat.c (j0): Rename to __j0 and define as weak
	alias.
	[NO_LONG_DOUBLE] (__j0l): New strong alias.
	(y0): Rename to __y0 and define as weak alias.
	[NO_LONG_DOUBLE] (__y0l): New strong alias.
	* math/w_j0f_compat.c (j0f): Rename to __j0f and define as weak
	alias.
	(y0f): Rename to __y0f and define as weak alias.
	* math/w_j1_compat.c (j1): Rename to __j1 and define as weak
	alias.
	[NO_LONG_DOUBLE] (__j1l): New strong alias.
	(y1): Rename to __y1 and define as weak alias.
	[NO_LONG_DOUBLE] (__y1l): New strong alias.
	* math/w_j1f_compat.c (j1f): Rename to __j1f and define as weak
	alias.
	(y1f): Rename to __y1f and define as weak alias.
	* math/w_jn_compat.c (jn): Rename to __jn and define as weak
	alias.
	[NO_LONG_DOUBLE] (__jnl): New strong alias.
	(yn): Rename to __yn and define as weak alias.
	[NO_LONG_DOUBLE] (__ynl): New strong alias.
	* math/w_jnf_compat.c (jnf): Rename to __jnf and define as weak
	alias.
	(ynf): Rename to __ynf and define as weak alias.
	* sysdeps/ieee754/dbl-64/s_fromfp.c (FUNC): Define to __fromfp.
	(fromfp): Define as weak alias.
	[NO_LONG_DOUBLE] (__fromfpl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_fromfpx.c (FUNC): Define to __fromfpx.
	(fromfpx): Define as weak alias.
	[NO_LONG_DOUBLE] (__fromfpxl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_getpayload.c (getpayload): Rename to
	__getpayload and define as weak alias.
	[NO_LONG_DOUBLE] (__getpayloadl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_roundeven.c (roundeven): Rename to
	__roundeven and define as weak alias.
	[NO_LONG_DOUBLE] (__roundevenl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_setpayload.c (FUNC): Define to
	__setpayload.
	(setpayload): Define as weak alias.
	[NO_LONG_DOUBLE] (__setpayloadl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_setpayloadsig.c (FUNC): Define to
	__setpayloadsig.
	(setpayloadsig): Define as weak alias.
	[NO_LONG_DOUBLE] (__setpayloadsigl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_totalorder.c (totalorder): Rename to
	__totalorder and define as weak alias.
	[NO_LONG_DOUBLE] (__totalorderl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_totalordermag.c (totalordermag): Rename
	to __totalordermag and define as weak alias.
	[NO_LONG_DOUBLE] (__totalordermagl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_ufromfp.c (FUNC): Define to __ufromfp.
	(ufromfp): Define as weak alias.
	[NO_LONG_DOUBLE] (__ufromfpl): New strong alias.
	* sysdeps/ieee754/dbl-64/s_ufromfpx.c (FUNC): Define to
	__ufromfpx.
	(ufromfpx): Define as weak alias.
	[NO_LONG_DOUBLE] (__ufromfpxl): New strong alias.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_getpayload.c (getpayload):
	Rename to __getpayload and define as weak alias.
	[NO_LONG_DOUBLE] (__getpayloadl): New strong alias.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_roundeven.c (roundeven):
	Rename to __roundeven and define as weak alias.
	[NO_LONG_DOUBLE] (__roundevenl): New strong alias.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_totalorder.c (totalorder):
	Rename to __totalorder and define as weak alias.
	[NO_LONG_DOUBLE] (__totalorderl): New strong alias.
	* sysdeps/ieee754/dbl-64/wordsize-64/s_totalordermag.c
	(totalordermag): Rename to __totalordermag and define as weak
	alias.
	[NO_LONG_DOUBLE] (__totalordermagl): New strong alias.
	* sysdeps/ieee754/float128/float128_private.h (__getpayloadl): New
	macro.
	(__roundevenl): Likewise.
	(__totalorderl): Likewise.
	(__totalordermagl): Likewise
	* sysdeps/ieee754/float128/s_fromfpf128.c (FUNC): Define to
	__fromfpf128.
	(fromfpf128): Define as weak alias.
	* sysdeps/ieee754/float128/s_fromfpxf128.c (FUNC): Define to
	__fromfpxf128.
	(fromfpxf128): Define as weak alias.
	* sysdeps/ieee754/float128/s_setpayloadf128.c (FUNC): Define to
	__setpayloadf128.
	(setpayloadf128): Define as weak alias.
	* sysdeps/ieee754/float128/s_setpayloadsigf128.c (FUNC): Define to
	__setpayloadsigf128.
	(setpayloadsigf128): Define as weak alias.
	* sysdeps/ieee754/float128/s_ufromfpf128.c (FUNC): Define to
	__ufromfpf128.
	(ufromfpf128): Define as weak alias.
	* sysdeps/ieee754/float128/s_ufromfpxf128.c (FUNC): Define to
	__ufromfpxf128.
	(ufromfpxf128): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_fromfpf.c (FUNC): Define to __fromfpf.
	(fromfpf): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_fromfpxf.c (FUNC): Define to
	__fromfpxf.
	(fromfpxf): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_getpayloadf.c (getpayloadf): Rename to
	__getpayloadf and define as weak alias.
	* sysdeps/ieee754/flt-32/s_roundevenf.c (roundevenf): Rename to
	__roundevenf and define as weak alias.
	* sysdeps/ieee754/flt-32/s_setpayloadf.c (FUNC): Define to
	__setpayloadf.
	(setpayloadf): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_setpayloadsigf.c (FUNC): Define to
	__setpayloadsigf.
	(setpayloadsigf): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_totalorderf.c (totalorderf): Rename to
	__totalorderf and define as weak alias.
	* sysdeps/ieee754/flt-32/s_totalordermagf.c (totalordermagf):
	Rename to __totalordermagf and define as weak alias.
	* sysdeps/ieee754/flt-32/s_ufromfpf.c (FUNC): Define to
	__ufromfpf.
	(ufromfpf): Define as weak alias.
	* sysdeps/ieee754/flt-32/s_ufromfpxf.c (FUNC): Define to
	__ufromfpxf.
	(ufromfpxf): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_fromfpl.c (FUNC): Define to
	__fromfpl.
	(fromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_fromfpxl.c (FUNC): Define to
	__fromfpxl.
	(fromfpxl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_getpayloadl.c (getpayloadl): Rename
	to __getpayloadl and define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_roundevenl.c (roundevenl): Rename to
	__roundevenl and define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_setpayloadl.c (FUNC): Define to
	__setpayloadl.
	(setpayloadl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_setpayloadsigl.c (FUNC): Define to
	__setpayloadsigl.
	(setpayloadsigl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_totalorderl.c (totalorderl): Rename
	to __totalorderl and define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_totalordermagl.c (totalordermagl):
	Rename to __totalordermagl and define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_ufromfpl.c (FUNC): Define to
	__ufromfpl.
	(ufromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128/s_ufromfpxl.c (FUNC): Define to
	__ufromfpxl.
	(ufromfpxl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_fromfpl.c (FUNC): Define to
	__fromfpl.
	(fromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_fromfpxl.c (FUNC): Define to
	__fromfpxl.
	(fromfpxl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_getpayloadl.c (getpayloadl):
	Rename to __getpayloadl and define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_roundevenl.c (roundevenl): Rename
	to __roundevenl and define as weak alias.  Call __roundeven
	instead of roundeven.
	* sysdeps/ieee754/ldbl-128ibm/s_setpayloadl.c (FUNC): Define to
	__setpayloadl.
	(setpayloadl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_setpayloadsigl.c (FUNC): Define to
	__setpayloadsigl.
	(setpayloadsigl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_totalorderl.c (totalorderl):
	Rename to __totalorderl and define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_totalordermagl.c (totalordermagl):
	Rename to __totalordermagl and define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_ufromfpl.c (FUNC): Define to
	__ufromfpl.
	(ufromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-128ibm/s_ufromfpxl.c (FUNC): Define to
	__ufromfpxl.
	(ufromfpxl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_fromfpl.c (FUNC): Define to
	__fromfpl.
	(fromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_fromfpxl.c (FUNC): Define to
	__fromfpxl.
	(fromfpxl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_getpayloadl.c (getpayloadl): Rename to
	__getpayloadl and define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_roundevenl.c (roundevenl): Rename to
	__roundevenl and define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_setpayloadl.c (FUNC): Define to
	__setpayloadl.
	(setpayloadl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_setpayloadsigl.c (FUNC): Define to
	__setpayloadsigl.
	(setpayloadsigl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_totalorderl.c (totalorderl): Rename to
	__totalorderl and define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_totalordermagl.c (totalordermagl):
	Rename to __totalordermagl and define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_ufromfpl.c (FUNC): Define to
	__ufromfpl.
	(ufromfpl): Define as weak alias.
	* sysdeps/ieee754/ldbl-96/s_ufromfpxl.c (FUNC): Define to
	__ufromfpxl.
	(ufromfpxl): Define as weak alias.
2017-09-14 22:28:53 +00:00
Joseph Myers
02093e6222 Define and use libm_alias_float128.
Continuing the process of setting up common macros for libm function
aliases, with a view to using them to define _FloatN / _FloatNx
aliases in future, this patch adds a libm_alias_float128 macro and
uses it in the type-generic templates.  (_Float128 functions will end
up with _Float64x aliases on powerpc64le, but not on x86_64/x86/ia64
because _Float64x has long double format there, and the macro will
provide a single place for the conditionals for that choice, as well
as for once ldbl-128 functions always build *f128 and need
conditionals for whether to have *l aliases.)

Tested for x86_64.  Also tested with build-many-glibcs.py that
installed stripped shared libraries are unchanged by the patch.

	* sysdeps/generic/libm-alias-float128.h: New file.
	* sysdeps/generic/math-type-macros-float128.h: Include
	<libm-alias-float128.h>.
	[!declare_mgen_alias] (declare_mgen_alias): Define macro.
2017-09-14 01:11:46 +00:00
Joseph Myers
1aae75ef80 Define and use libm_alias_ldouble.
Continuing the process of setting up common macros for libm function
aliases, with a view to using them to define _FloatN / _FloatNx
aliases in future, this patch adds a libm_alias_ldouble macro and uses
it in the type-generic templates.

Since math-type-macros-ldouble.h already did the appropriate thing for
each symbol (weak_alias or long_double_symbol), this is just a
straightforward rearrangement of code, to make the required logic
available in a place that can also be used outside of the type-generic
templates in future (in particular, to eliminate various wrappers for
functions in ldbl-opt and ldbl-64-128).

Tested for x86_64.  Also tested with build-many-glibcs.py that
installed stripped shared libraries are unchanged by the patch.

	* sysdeps/generic/libm-alias-ldouble.h: New file.
	* sysdeps/ieee754/ldbl-opt/libm-alias-ldouble.h: Likewise.
	* sysdeps/ieee754/ldbl-opt/math-type-macros-ldouble.h: Remove.
	* sysdeps/generic/math-type-macros-ldouble.h: Include
	<libm-alias-ldouble.h>.
	[!declare_mgen_alias] (declare_mgen_alias): Define to use
	libm_alias_ldouble.
2017-09-13 22:17:23 +00:00
Szabolcs Nagy
bcea7ad608 Move exp compat wrappers under math/
Move exp compat wrappers to math/w_exp{,f,l}_compat.c to be
consistent with other wrappers.

	* sysdeps/ieee754/dbl-64/w_exp_compat.c: Move to...
	* math/w_exp_compat.c: ... here.
	* sysdeps/ieee754/flt-32/w_expf_compat.c: Move to...
	* math/w_expf_compat.c: ... here.
	* sysdeps/ieee754/ldbl-128/w_expl_compat.c: Move to...
	* math/w_expl_compat.c: ... here.
	* sysdeps/ieee754/ldbl-128ibm/w_expl_compat.c: Remove.
	* sysdeps/ieee754/ldbl-96/w_expl_compat.c: Remove.
	* sysdeps/ieee754/ldbl-opt/w_exp_compat.c: Use the new path.
	* sysdeps/ieee754/ldbl-opt/w_expl_compat.c: Likewise.
2017-09-13 17:22:22 +01:00