Commit Graph

29549 Commits

Author SHA1 Message Date
H.J. Lu
e19f02428b Mark ld.so internel __profile_frequency hidden
Since ld.so internel __profile_frequency is only used internally in
ld.so, it can be made hidden.

	[BZ #19122]
	* include/libc-internal.h [IS_IN (rtld)] (__profile_frequency):
	Add attribute_hidden.
2015-10-15 14:20:59 -07:00
H.J. Lu
6d56699d7e Mark internal fcntl functions hidden
Since internal fcntl functions are only used internally in ld.so and
libc.so, they can be made hidden.

	[BZ #19122]
	* include/fcntl.h (__libc_fcntl): Add attribute_hidden.
	[IS_IN (rtld)] (__open): Likewise.
	[IS_IN (rtld)] (__fcntl): Likewise.
2015-10-15 14:16:41 -07:00
H.J. Lu
8303c7409c Mark internal dirent functions hidden
Since internal dirent functions are only used internally in ld.so and
libc.so, they can be made hidden.

	[BZ #19122]
	* include/dirent.h (__opendirat): Add attribute_hidden.
	(__getdents): Likewise.
	(__getdents64): Likewise.
	(__alloc_dir): Likewise.
	[IS_IN (rtld)] (__closedir): Likewise.
	[IS_IN (rtld)] (__fdopendir): Likewise.
	[IS_IN (rtld)] (__readdir): Likewise.
	[IS_IN (rtld)] (__readdir64): Likewise.
	[IS_IN (rtld)] (__rewinddir): Likewise.
2015-10-15 14:15:41 -07:00
H.J. Lu
d6e855d810 Mark _dl_catch_error hidden
Since _dl_catch_error is only used internally in ld.so, it should be
declared in sysdeps/generic/ldsodefs.h, not include/dlfcn.h and it can
be made hidden.

	[BZ #19122]
	* include/dlfcn.h (_dl_catch_error): Moved to ...
	* sysdeps/generic/ldsodefs.h (_dl_catch_error): Add
	attribute_hidden.
2015-10-15 14:13:50 -07:00
H.J. Lu
a1afb41193 Mark internal _itoa functions hidden
Since internal _itoa functions are only used internally in ld.so and
libc.so, they can be made hidden.

	[BZ #19122]
	* sysdeps/generic/_itoa.h (_itoa): Add attribute_hidden.
	(_itoa_word): Likewise.
2015-10-15 14:07:06 -07:00
H.J. Lu
58c9ff1bdb Mark internal _dl_XXX functions hidden
Since internal _dl_XXX functions are only used internally in ld.so,
they can be made hidden.

	[BZ #19122]
	* elf/dl-runtime.c (_dl_fixup): Add attribute_hidden.
	* elf/dynamic-link.h (_dl_try_allocate_static_tls): Likewise.
	* sysdeps/generic/dl-cache.h (_dl_cache_libcmp): Likewise.
	* sysdeps/generic/ldsodefs.h (_dl_name_match_p): Likewise.
	(_dl_higher_prime_number): Likewise.
	(_dl_debug_printf_c): Likewise.
	(_dl_signal_cerror): Likewise.
	(_dl_receive_error): Likewise.
	(_dl_reloc_bad_type): Likewise.
	(_dl_resolve_conflicts): Likewise.
	(_dl_check_all_versions): Likewise.
	(_dl_check_map_versions): Likewise.
	(_dl_sort_fini): Likewise.
	(_dl_debug_initialize): Likewise.
	(_dl_init_paths): Likewise.
	(_dl_show_auxv): Likewise.
	(_dl_next_ld_env_entry): Likewise.
	(_dl_important_hwcaps): Likewise.
	(_dl_load_cache_lookup): Likewise.
	(_dl_update_slotinfo): Likewise.
	(_dl_show_scope): Likewise.
2015-10-15 14:04:31 -07:00
H.J. Lu
b8b21bde18 Mark _wordcopy_XXX functions hidden
Since _wordcopy_XXX functions are only used internally in ld.so and
libc.so, they can be made hidden.

	[BZ #19122]
	* sysdeps/generic/memcopy.h (_wordcopy_fwd_aligned): Add
	attribute_hidden.
	(_wordcopy_fwd_dest_aligned): Likewise.
	(_wordcopy_bwd_aligned): Likewise.
	(_wordcopy_bwd_dest_aligned): Likewise.
2015-10-15 14:01:48 -07:00
H.J. Lu
9edf9b18b1 Mark x86 _dl_unmap/_dl_make_tlsdesc_dynamic hidden
Since x86 _dl_unmap and _dl_make_tlsdesc_dynamic are only used
internally in ld.so, they can be made hidden.

	[BZ #19122]
	* sysdeps/i386/dl-lookupcfg.h (_dl_unmap): Add attribute_hidden.
	* sysdeps/i386/dl-tlsdesc.h (_dl_make_tlsdesc_dynamic):
	Likewise.
	* sysdeps/x86_64/dl-tlsdesc.h (_dl_make_tlsdesc_dynamic):
	Likewise.
	* sysdeps/x86_64/dl-lookupcfg.h (_dl_unmap): Likewise.
2015-10-15 13:48:54 -07:00
H.J. Lu
983a33fa7d Add comments for GCC 5 requirement
* sysdeps/unix/sysv/linux/i386/sysdep.h: Add comments for
	GCC 5 requirement.
2015-10-15 13:35:40 -07:00
Joseph Myers
b7d09f0d63 Remove assembler -mtune=i686 configure test.
There is a configure test for assembler support for -mtune=i686.  This
option was added in binutils 2.18 so the test is obsolete; this patch
removes it.

Tested for x86 (testsuite, and that installed shared libraries are
unchanged by the patch).

	* sysdeps/i386/configure.ac (libc_cv_as_i686): Remove configure
	test.
	* sysdeps/i386/configure: Regenerated.
	* sysdeps/i386/i686/Makefile [$(config-asflags-i686) = yes]: Make
	code unconditional.
2015-10-15 20:28:27 +00:00
Joseph Myers
75b0964bc8 Remove .previous, .popsection configure tests.
There is a configure test for the assembler .previous directive, and,
as a fallback, for .popsection.

glibc now only supports ELF.  For ELF, the GNU assembler has supported
.previous since version 2.2 (support added by

Mon Jul 19 15:21:20 1993  Ken Raeburn  (raeburn@rtl.cygnus.com)

        * config/obj-elf.c (obj_elf_previous): New function.
        (previous_section, previous_subsection): New vars.
        (obj_elf_section): Save current place in case DWARF code wants us
        to pop back to it.  Handle unquoted section name as well as quoted
        section name.  Don't crash on invalid strings.
        (obj_pseudo_table): Handle new pseudos "previous", "2byte", and
        "4byte".

).  Thus this configure test is obsolete, and this patch removes it
(and with it the fallback .popsection test).

Tested for x86_64 and x86 (testsuite, and that installed shared
libraries are unchanged by the patch).

	* configure.ac (libc_cv_asm_previous_directive): Remove configure
	test.
	(libc_cv_asm_popsection_directive): Likewise.
	* configure: Regenerated.
	* config.h.in (HAVE_ASM_PREVIOUS_DIRECTIVE): Remove #undef.
	(HAVE_ASM_POPSECTION_DIRECTIVE): Likewise.
	* include/libc-symbols.h [HAVE_ASM_PREVIOUS_DIRECTIVE]
	(__make_section_unallocated): Make definition unconditional.
	[HAVE_ASM_POPSECTION_DIRECTIVE] (__make_section_unallocated):
	Remove conditional definition.
	[!HAVE_ASM_PREVIOUS_DIRECTIVE && !HAVE_ASM_POPSECTION_DIRECTIVE]
	(__make_section_unallocated): Likewise.
2015-10-15 19:47:55 +00:00
Joseph Myers
30f58bb192 Remove -static-libgcc configure test.
There is a configure test for -static-libgcc.  GCC added this option
in version 3.0, so this test is obsolete; this patch removes it.

Tested for x86_64 and x86 (testsuite, and that installed shared
libraries are unchanged by the patch).

	* configure.ac (libc_cv_gcc_static_libgcc): Remove configure test.
	* configure: Regenerated.
	* config.make.in (static-libgcc): Remove variable.
	* Makerules (build-shlib-helper): Use -static-libgcc instead of
	$(static-libgcc).
	(build-module-helper): Likewise.
2015-10-15 19:32:58 +00:00
Joseph Myers
06e2c64669 Remove stddef.h configure test.
There is a configure test "for libc-friendly stddef.h", which sets a
makefile variable stddef.h that appears to be nowhere used.  It
appears the uses of this variable were removed by:

Tue Feb 21 00:10:50 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

        * Makefile (headers): Remove $(stddef.h).
        * Makeconfig (stddef.h): Variable removed; now require gcc version
        >= 2.2.
        * stddef.h: File removed.

(having been added by

Wed May 26 14:44:19 1993  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)

        * configure.in (autoconf checks): Add new check for a
        libc-friendly stddef.h.

so the test was of use for less than two years, before being obsolete
for over 20 years).  This patch removes the test.

Tested for x86_64 and x86 (testsuite, and that installed shared
libraries are unchanged by the patch).

	* configure.ac (libc_cv_friendly_stddef): Remove configure test.
	* configure: Regenerated.
2015-10-15 19:31:46 +00:00
Florian Weimer
95e8397481 vfscanf: Use struct scratch_buffer instead of extend_alloca
A custom character buffer is added in this commit, in the form of
struct char_buffer.  The char_buffer_add function replaces the
ADDW macro (which has grown with each successive security fix).
The char_buffer_add slow path is moved out-of-line, reducing
code size.

	* stdio-common/vfscanf.c (MEMCPY): Remove macro.
	(struct char_buffer): New type.
	(char_buffer_start, char_buffer_size, char_buffer_error)
	(char_buffer_rewind, char_buffer_add): New functions.
	(ADDW): Remove macro, replaced by the char_buffer_add function.
	(_IO_vfscanf_internal): Rewrite using struct char_buffer instead
	of extend_alloca.  Make control flow more explicit.
2015-10-15 17:18:51 +02:00
H.J. Lu
b994fd7937 Remove i386/epoll_pwait.S
Only i386 implements epoll_pwait in assembly code withot cancellation
support.  All other architectures implement epoll_pwait in epoll_pwait.c
with

int epoll_pwait (int epfd, struct epoll_event *events,
		 int maxevents, int timeout,
		 const sigset_t *set)
{
  return SYSCALL_CANCEL (epoll_pwait, epfd, events, maxevents,
			 timeout, set, _NSIG / 8);
}

Although there is no test for epoll_pwait in glibc, since SYSCALL_CANCEL
works on i386 and epoll_pwait.c works for other architectures, it is
safe to assume that epoll_pwait.c with SYSCALL_CANCEL also works on
i386.

	[BZ #19137]
	* sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c):
	Add -fomit-frame-pointer.
	* sysdeps/unix/sysv/linux/i386/epoll_pwait.S: Remove file.
2015-10-15 06:26:50 -07:00
H.J. Lu
98ad631cd0 Optimize i386 syscall inlining for GCC 5
Since GCC 5 and above can properly spill %ebx when needed, we can inline
syscalls with 6 arguments if GCC 5 or above is used to compile glibc.
This patch rewrites INTERNAL_SYSCALL macros and skips __libc_do_syscall
for GCC 5.

For sysdeps/unix/sysv/linux/i386/brk.c, with -O2 -march=i686
-mtune=generic, GCC 5.2 now generates:

<__brk>:
   0:	push   %ebx
   1:	mov    $0x2d,%eax
   6:	mov    0x8(%esp),%ebx
   a:	call   b <__brk+0xb>	b: R_386_PC32	__x86.get_pc_thunk.dx
   f:	add    $0x2,%edx	11: R_386_GOTPC	_GLOBAL_OFFSET_TABLE_
  15:	call   *%gs:0x10
  1c:	mov    0x0(%edx),%edx	1e: R_386_GOT32	__curbrk
  22:	cmp    %eax,%ebx
  24:	mov    %eax,(%edx)
  26:	ja     30 <__brk+0x30>
  28:	xor    %eax,%eax
  2a:	pop    %ebx
  2b:	ret

instead of

<__brk>:
   0:	push   %ebx
   1:	mov    0x8(%esp),%ecx
   5:	call   6 <__brk+0x6>	6: R_386_PC32	__x86.get_pc_thunk.bx
   a:	add    $0x2,%ebx	c: R_386_GOTPC	_GLOBAL_OFFSET_TABLE_
  10:	xchg   %ecx,%ebx
  12:	mov    $0x2d,%eax
  17:	call   *%gs:0x10
  1e:	xchg   %ecx,%ebx
  20:	mov    %eax,%edx
  22:	mov    0x0(%ebx),%eax	24: R_386_GOT32	__curbrk
  28:	mov    %edx,(%eax)
  2a:	xor    %eax,%eax
  2c:	cmp    %edx,%ecx
  2e:	ja     38 <__brk+0x38>
  30:	pop    %ebx
  31:	ret

The new one is shorter by 2 instructions.

	* sysdeps/unix/sysv/linux/i386/libc-do-syscall.S
	(__libc_do_syscall): Defined only if !__GNUC_PREREQ (5,0).
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Define assembler macros
	only if !__GNUC_PREREQ (5,0).
	(INTERNAL_SYSCALL_MAIN_6): Optimize for GCC 5.
	(INTERNAL_SYSCALL_MAIN_INLINE): Likewise.
	(INTERNAL_SYSCALL_NCS): Likewise.
	(LOADREGS_0): New macro for GCC 5.
	(ASMARGS_0): Likewise.
	(LOADREGS_1): Likewise.
	(ASMARGS_1): Likewise.
	(LOADREGS_2): Likewise.
	(ASMARGS_2): Likewise.
	(LOADREGS_3): Likewise.
	(ASMARGS_3): Likewise.
	(LOADREGS_4): Likewise.
	(ASMARGS_4): Likewise.
	(LOADREGS_5): Likewise.
	(ASMARGS_5): Likewise.
	(LOADREGS_6): Likewise.
	(ASMARGS_6): Likewise.
2015-10-15 05:23:58 -07:00
H.J. Lu
83c01ab32b i386: Remove syscall assembly codes with 6 arguments
This patch removes i386 assembly implementation for mmap, mmap64,
semtimeop now that i386 have 6 argument syscall support from C code
and GCC 5 can inline syscalls with 6 arguments.  We also compile mmap.c,
mmap64.c and semtimedop.c with -fomit-frame-pointer since %ebp may be
used to pass the 6th argument to syscall.

Fo sysdeps/unix/sysv/linux/i386/mmap.c, with -O2 -march=i686
-mtune=generic, GCC 5.2 now generates:

<__mmap>:
   0:	sub    $0x10,%esp
   3:	mov    0x28(%esp),%eax
   7:	mov    %ebx,(%esp)
   a:	mov    0x18(%esp),%ecx
   e:	mov    %esi,0x4(%esp)
  12:	mov    0x14(%esp),%ebx
  16:	mov    %edi,0x8(%esp)
  1a:	mov    0x1c(%esp),%edx
  1e:	test   $0xfff,%eax
  23:	mov    0x20(%esp),%esi
  27:	mov    %ebp,0xc(%esp)
  2b:	mov    0x24(%esp),%edi
  2f:	jne    60 <__mmap+0x60>
  31:	shr    $0xc,%eax
  34:	mov    %eax,%ebp
  36:	mov    $0xc0,%eax
  3b:	call   *%gs:0x10
  42:	cmp    $0xfffff000,%eax
  47:	ja     65 <__mmap+0x65>
  49:	mov    (%esp),%ebx
  4c:	mov    0x4(%esp),%esi
  50:	mov    0x8(%esp),%edi
  54:	mov    0xc(%esp),%ebp
  58:	add    $0x10,%esp
  5b:	ret
  5c:	lea    0x0(%esi,%eiz,1),%esi
  60:	mov    $0xffffffea,%eax
  65:	mov    (%esp),%ebx
  68:	mov    0x4(%esp),%esi
  6c:	mov    0x8(%esp),%edi
  70:	mov    0xc(%esp),%ebp
  74:	add    $0x10,%esp
  77:	jmp    78 <__mmap+0x78>

vs sysdeps/unix/sysv/linux/i386/mmap.S:

<__mmap>:
   0:	push   %ebp
   1:	push   %ebx
   2:	push   %esi
   3:	push   %edi
   4:	mov    0x14(%esp),%ebx
   8:	mov    0x18(%esp),%ecx
   c:	mov    0x1c(%esp),%edx
  10:	mov    0x20(%esp),%esi
  14:	mov    0x24(%esp),%edi
  18:	mov    0x28(%esp),%ebp
  1c:	test   $0xfff,%ebp
  22:	mov    $0xffffffea,%eax
  27:	jne    38 <__mmap+0x38>
  29:	shr    $0xc,%ebp
  2c:	mov    $0xc0,%eax
  31:	call   *%gs:0x10
  38:	pop    %edi
  39:	pop    %esi
  3a:	pop    %ebx
  3b:	pop    %ebp
  3c:	cmp    $0xfffff000,%eax
  41:	ja     44 <__mmap+0x44>
  43:	ret
  44:	call   45 <__mmap+0x45>	45: R_386_PC32	__x86.get_pc_thunk.cx
  49:	add    $0x2,%ecx	4b: R_386_GOTPC	_GLOBAL_OFFSET_TABLE_
  4f:	mov    0x0(%ecx),%ecx	51: R_386_TLS_GOTIE	__libc_errno
  55:	neg    %eax
  57:	mov    %eax,%gs:(%ecx)
  5a:	or     $0xffffffff,%eax
  5d:	ret

The C version has:

   3:	mov    0x28(%esp),%eax
...
  1e:	test   $0xfff,%eax
...
  31:	sar    $0xc,%eax
  34:	mov    %eax,%ebp

is due to missing $ebx register constraint for inline asm.  We have
to use "r" constraint with

register unsigned int _a6 asm ("ebp") = (unsigned int) (arg6);

and compiler chose %eax for offset (arg6) in

  if (offset & (MMAP_PAGE_UNIT - 1))

	* sysdeps/unix/sysv/linux/i386/Makefile (CFLAGS-epoll_pwait.c):
	Add -fomit-frame-pointer.
	(CFLAGS-mmap.c): Likewise.
	(CFLAGS-mmap64.c): Likewise.
	(CFLAGS-semtimedop.c): Likewise.
	* sysdeps/unix/sysv/linux/i386/mmap.c: New file.
	* sysdeps/unix/sysv/linux/i386/mmap.S: Remove file.
	* sysdeps/unix/sysv/linux/i386/mmap64.S: Likewise.
	* sysdeps/unix/sysv/linux/i386/semtimedop.S: Likewise.
2015-10-15 05:03:24 -07:00
Florian Weimer
a014cecd82 Always enable pointer guard [BZ #18928]
Honoring the LD_POINTER_GUARD environment variable in AT_SECURE mode
has security implications.  This commit enables pointer guard
unconditionally, and the environment variable is now ignored.

        [BZ #18928]
        * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove
        _dl_pointer_guard member.
        * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard
        initializer.
        (security_init): Always set up pointer guard.
        (process_envvars): Do not process LD_POINTER_GUARD.
2015-10-15 09:23:32 +02:00
Joseph Myers
0c25f5b5bb Fix powerpc32 lround, lroundf spurious exceptions (bug 19134).
The powerpc32 implementation of lround and lroundf can produce
spurious exceptions from adding 0.5 then converting to integer.  This
includes "inexact" from the conversion to integer (not allowed for
integer arguments to these functions), and, for larger integer
arguments, "inexact", and "overflow" when rounding upward, from the
addition.  In addition, "inexact" is not allowed together with
"invalid" and so inexact addition must be avoided when the integer
will be out of range of 32-bit long, whether or not the argument is an
integer.

This patch fixes these problems.  As in the powerpc64 llround
implementation, a check is added for too-large arguments; in the
powerpc64 case that means arguments at least 2^52 in magnitude (so
that 0.5 cannot be added exactly), while in this case it means
arguments for which the result would overflow "long".  In those cases
a suitable overflowing value is used for the integer conversion
without adding 0.5, while for smaller arguments it's tested whether
the argument is an integer (by adding and subtracting 2^52 to the
absolute value and comparing with the original absolute value) to
avoid adding 0.5 to integers and generating spurious "inexact".

This code is not used when the power5+ sysdeps directories are used,
as there's a separate power5+ version of these functions..

Tested for powerpc.  This gets test-float (for a default powerpc32
hard-float build without any --with-cpu) back to the point where it
should pass once powerpc ulps are regenerated; test-double still needs
another problem with exceptions fixed to get back to that point (and I
haven't looked lately at what default powerpc64 results are like).

	[BZ #19134]
	* sysdeps/powerpc/powerpc32/fpu/s_lround.S (.LC1): New object.
	(.LC2): Likewise.
	(.LC3): Likewise.
	(__lround): Do not add 0.5 to integer or out-of-range arguments.
2015-10-14 21:13:42 +00:00
Szabolcs Nagy
1fae5a6800 [BZ #19129][ARM] Fix _dl_tlsdesc_resolve_hold to save r0
_dl_tlsdesc_resolve_hold calls into a C function that clobbers r0,
but it assumes the original argument is still in r0 after the call.
This can cause crash in case of concurrent TLS access when TLSDESC
is in use (-mtls-dialect=gnu2).

Run into this while fixing BZ 18572.

Both r0 and r1 are saved/restored so the stack remains 8 byte aligned.

	[BZ #19129]
	* sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_resolve_hold): Save and restore
	r0 and r1.
2015-10-14 17:01:12 +01:00
Namhyung Kim
f45e45a3e0 manual/argp.texi (Specifying Argp Parsers): Fix typo. 2015-10-14 11:49:58 -04:00
Carlos O'Donell
90b2517115 include/stap-probe.h: Fix formatting.
Fix macro indentation.
2015-10-14 11:35:31 -04:00
Florian Weimer
f463c7b183 Fix double-checked locking in _res_hconf_reorder_addrs [BZ #19074]
[BZ #19074]
	* resolv/res_hconf.c (_res_hconf_reorder_addrs): Use atomics to
	load and store num_ifs.
2015-10-14 16:43:16 +02:00
H.J. Lu
d95453ef5d Avoid PLT when calling __sched_getaffinity_new
This patch adds an internal entry for __sched_getaffinity_new so that
__sched_getaffinity_old calls __sched_getaffinity_new without going
through PLT.

	[BZ #18822]
	* sysdeps/unix/sysv/linux/sched_getaffinity.c
	(__sched_getaffinity_new): Add libc_hidden_proto and
	libc_hidden_def.
2015-10-14 06:33:48 -07:00
H.J. Lu
d3d9c95aef Support PLT and GOT references in local PIC check
Linker in binutils 2.26 and newer generate GOT references instead
PLT references when -z now is passed to linker.  We need to extend
scripts/localplt.awk to allow PLT or GOT references.

	[BZ #19007]
	* scripts/localplt.awk: Also allow GOT references.
	* sysdeps/unix/sysv/linux/i386/localplt.data: Mark
	_Unwind_Find_FDE, calloc, memalign, realloc and __libc_memalign
	with "+ REL R_386_GLOB_DAT".
	* sysdeps/x86_64/localplt.data: Mark calloc, memalign, realloc
	and __libc_memalign with "+ RELA R_X86_64_GLOB_DAT".
2015-10-14 06:00:02 -07:00
H.J. Lu
8f763b04a0 Use INTERNAL_SYSCALL and INLINE_SYSCALL_ERROR_RETURN_VALUE
This patch uses INTERNAL_SYSCALL and INLINE_SYSCALL_ERROR_RETURN_VALUE
to avoid reading and writing errno directly so that we don't need to
call __x86.get_pc_thunk.reg to load PC into reg in case there is an
error.

	* sysdeps/unix/sysv/linux/i386/brk.c (__brk): Use
	INLINE_SYSCALL_ERROR_RETURN_VALUE.
	* sysdeps/unix/sysv/linux/i386/fxstatat.c (__fxstatat):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/setegid.c (setegid): Likewise.
	* sysdeps/unix/sysv/linux/i386/seteuid.c (seteuid): Likewise.
	* sysdeps/unix/sysv/linux/i386/fxstat.c (__fxstat): Use
	INTERNAL_SYSCALLINTERNAL_SYSCALL and
	INLINE_SYSCALL_ERROR_RETURN_VALUE.
	* sysdeps/unix/sysv/linux/i386/lockf64.c (lockf64): Likewise.
	* sysdeps/unix/sysv/linux/i386/lxstat.c (__lxstat): Likewise.
	* sysdeps/unix/sysv/linux/i386/sigaction.c (__libc_sigaction):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/xstat.c (__xstat): Likewise.
2015-10-14 03:45:46 -07:00
Joseph Myers
d7025badd8 Fix powerpc32 llround, llroundf exceptions (bug 19125).
The powerpc32 implementations of llroundf and llround produce spurious
and missing exceptions (some arising from such exceptions from
conversions to long long, some present even when fctidz is used).

This patch fixes those problems in a similar way to the llrint /
llrintf fixes.  The spurious exceptions in the fctidz case for large
arguments arise from a converted value that saturated as LLONG_MAX
being converted back to float or double (the conversion back being
inexact, but "inexact" must not be raised together with "invalid"),
and from the subtraction x - xrf also being inexact for sufficiently
large arguments (whether the saturation was to LLONG_MAX or
LLONG_MIN); those are fixed by returning early if the argument is
large enough that no rounding is needed.

This code is not used for --with-cpu=power4 builds (I suspect the code
used in that case may also produce spurious "inexact" exceptions, but
that's something to investigate later).

Tested for powerpc.

	[BZ #19125]
	* sysdeps/powerpc/powerpc32/fpu/s_llround.c: Include <limits.h>,
	<math_private.h> and <stdint.h>.
	(__llround): Avoid conversions to and from long long int, and
	subtractions, where those might raise spurious exceptions.
	* sysdeps/powerpc/powerpc32/fpu/s_llroundf.c: Include
	<math_private.h> and <stdint.h>.
	(__llroundf): Avoid conversions to and from long long int, and
	subtractions, where those might raise spurious exceptions.
2015-10-13 23:30:20 +00:00
H.J. Lu
2caca60d06 Use INLINE_SYSCALL_ERROR_RETURN_VALUE
This patch replaces

  {
    __set_errno (ERRNO);
    return -1;
  }

with INLINE_SYSCALL_ERROR_RETURN_VALUE (ERRNO).

	* sysdeps/unix/sysv/linux/adjtime.c (ADJTIME): Use
	INLINE_SYSCALL_ERROR_RETURN_VALUE.
	* sysdeps/unix/sysv/linux/dl-openat64.c (openat64): Likewise.
	* sysdeps/unix/sysv/linux/eventfd.c (eventfd): Likewise.
	* sysdeps/unix/sysv/linux/faccessat.c (faccessat): Likewise.
	* sysdeps/unix/sysv/linux/fchmodat.c (fchmodat): Likewise.
	* sysdeps/unix/sysv/linux/fcntl.c (do_fcntl): Likewise.
	* sysdeps/unix/sysv/linux/futimens.c (futimens): Likewise.
	* sysdeps/unix/sysv/linux/futimes.c (__futimes): Likewise.
	* sysdeps/unix/sysv/linux/fxstat.c (__fxstat): Likewise.
	* sysdeps/unix/sysv/linux/fxstatat.c (__fxstatat): Likewise.
	* sysdeps/unix/sysv/linux/fxstatat64.c (__fxstatat64): Likewise.
	* sysdeps/unix/sysv/linux/lutimes.c (lutimes): Likewise.
	* sysdeps/unix/sysv/linux/lxstat.c (__lxstat): Likewise.
	* sysdeps/unix/sysv/linux/lxstat64.c (___lxstat64): Likewise.
	* sysdeps/unix/sysv/linux/mmap64.c (__mmap64): Likewise.
	* sysdeps/unix/sysv/linux/mq_open.c (__mq_open): Likewise.
	* sysdeps/unix/sysv/linux/mq_unlink.c (mq_unlink): Likewise.
	* sysdeps/unix/sysv/linux/prlimit.c (prlimit): Likewise.
	* sysdeps/unix/sysv/linux/readahead.c (__readahead): Likewise.
	* sysdeps/unix/sysv/linux/shmat.c (shmat): Likewise.
	* sysdeps/unix/sysv/linux/signalfd.c (signalfd): Likewise.
	* sysdeps/unix/sysv/linux/speed.c (cfsetospeed): Likewise.
	* sysdeps/unix/sysv/linux/tcsetattr.c (tcsetattr): Likewise.
	* sysdeps/unix/sysv/linux/ustat.c (ustat): Likewise.
	* sysdeps/unix/sysv/linux/utimensat.c (utimensat): Likewise.
	* sysdeps/unix/sysv/linux/xmknod.c (__xmknod): Likewise.
	* sysdeps/unix/sysv/linux/xmknodat.c (__xmknodat): Likewise.
	* sysdeps/unix/sysv/linux/xstat.c (__xstat): Likewise.
	* sysdeps/unix/sysv/linux/xstatconv.c (__xstat_conv): Likewise.
	(__xstat64_conv): Likewise.
	(__xstat32_conv): Likewise.
2015-10-13 12:01:10 -07:00
H.J. Lu
fb1cf10811 Add INLINE_SYSCALL_ERROR_RETURN_VALUE
For ia32 PIC, the first thing of many syscalls does is to call
__x86.get_pc_thunk.reg to load PC into reg in case there is an error,
which is required for setting errno.  In most cases, there are no
errors.  But we still call __x86.get_pc_thunk.reg.  This patch adds
INLINE_SYSCALL_ERROR_RETURN_VALUE so that i386 can optimize setting
errno by branching to the internal __syscall_error without PLT.

With i386 INLINE_SYSCALL_ERROR_RETURN_VALUE and i386 syscall inlining
optimization for GCC 5, for sysdeps/unix/sysv/linux/fchmodat.c with
-O2 -march=i686 -mtune=generic, GCC 5.2 now generates:

<fchmodat>:
   0:	push   %ebx
   1:	mov    0x14(%esp),%eax
   5:	mov    0x8(%esp),%ebx
   9:	mov    0xc(%esp),%ecx
   d:	mov    0x10(%esp),%edx
  11:	test   $0xfffffeff,%eax
  16:	jne    38 <fchmodat+0x38>
  18:	test   $0x1,%ah
  1b:	jne    48 <fchmodat+0x48>
  1d:	mov    $0x132,%eax
  22:	call   *%gs:0x10
  29:	cmp    $0xfffff000,%eax
  2e:	ja     58 <fchmodat+0x58>
  30:	pop    %ebx
  31:	ret
  32:	lea    0x0(%esi),%esi
  38:	pop    %ebx
  39:	mov    $0xffffffea,%eax
  3e:	jmp    3f <fchmodat+0x3f>	3f: R_386_PC32	__syscall_error
  43:	nop
  44:	lea    0x0(%esi,%eiz,1),%esi
  48:	pop    %ebx
  49:	mov    $0xffffffa1,%eax
  4e:	jmp    4f <fchmodat+0x4f>	4f: R_386_PC32	__syscall_error
  53:	nop
  54:	lea    0x0(%esi,%eiz,1),%esi
  58:	pop    %ebx
  59:	jmp    5a <fchmodat+0x5a>	5a: R_386_PC32	__syscall_error

instead of

<fchmodat>:
   0:	sub    $0x8,%esp
   3:	mov    0x18(%esp),%eax
   7:	mov    %ebx,(%esp)
   a:	call   b <fchmodat+0xb>	b: R_386_PC32	__x86.get_pc_thunk.bx
   f:	add    $0x2,%ebx	11: R_386_GOTPC	_GLOBAL_OFFSET_TABLE_
  15:	mov    %edi,0x4(%esp)
  19:	test   $0xfffffeff,%eax
  1e:	jne    70 <fchmodat+0x70>
  20:	test   $0x1,%ah
  23:	jne    88 <fchmodat+0x88>
  25:	mov    0x14(%esp),%edx
  29:	mov    0x10(%esp),%ecx
  2d:	mov    0xc(%esp),%edi
  31:	xchg   %ebx,%edi
  33:	mov    $0x132,%eax
  38:	call   *%gs:0x10
  3f:	xchg   %edi,%ebx
  41:	cmp    $0xfffff000,%eax
  46:	ja     58 <fchmodat+0x58>
  48:	mov    (%esp),%ebx
  4b:	mov    0x4(%esp),%edi
  4f:	add    $0x8,%esp
  52:	ret
  53:	nop
  54:	lea    0x0(%esi,%eiz,1),%esi
  58:	mov    0x0(%ebx),%edx	5a: R_386_TLS_GOTIE	__libc_errno
  5e:	neg    %eax
  60:	mov    %eax,%gs:(%edx)
  63:	mov    $0xffffffff,%eax
  68:	jmp    48 <fchmodat+0x48>
  6a:	lea    0x0(%esi),%esi
  70:	mov    0x0(%ebx),%eax	72: R_386_TLS_GOTIE	__libc_errno
  76:	movl   $0x16,%gs:(%eax)
  7d:	mov    $0xffffffff,%eax
  82:	jmp    48 <fchmodat+0x48>
  84:	lea    0x0(%esi,%eiz,1),%esi
  88:	mov    0x0(%ebx),%eax	8a: R_386_TLS_GOTIE	__libc_errno
  8e:	movl   $0x5f,%gs:(%eax)
  95:	mov    $0xffffffff,%eax
  9a:	jmp    48 <fchmodat+0x48>

	* sysdeps/unix/sysv/linux/sysdep.h: New file.
	* sysdeps/unix/sysv/linux/i386/sysdep.c: Likewise.
	* sysdeps/unix/sysv/linux/alpha/sysdep.h: Include
	<sysdeps/unix/sysv/linux/sysdep.h>.
	* sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/generic/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/hppa/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) == csu]
	(sysdep-dl-routines): Add sysdep.
	[$(subdir) == nptl] (libpthread-routines): Likewise.
	[$(subdir) == rt] (librt-routines): Likewise.
	* sysdeps/unix/sysv/linux/i386/clone.S (__clone): Don't check
	PIC when branching to SYSCALL_ERROR_LABEL.
	* sysdeps/unix/sysv/linux/i386/sysdep.S: Removed.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Include
	<sysdeps/unix/sysv/linux/sysdep.h>.
	(SYSCALL_ERROR_LABEL): Changed to __syscall_error.
	(SYSCALL_ERROR_ERRNO): Removed.
	(SYSCALL_ERROR_HANDLER): Changed to empty.
	(SYSCALL_ERROR_HANDLER_TLS_STORE): Likewise.
	(__syscall_error): New prototype.
	[IS_IN (libc)] (INLINE_SYSCALL): New macro.
	(INLINE_SYSCALL_ERROR_RETURN_VALUE): Likewise.
2015-10-13 11:59:15 -07:00
H.J. Lu
0a5768fe9c Support x86-64 assmebler without AVX512
When x86-64 assmebler doesn't support AVX512, we should make
_dl_runtime_resolve_avx512/_dl_runtime_profile_avx512 as aliases of
_dl_runtime_resolve_avx/_dl_runtime_profile_avx.  Tested on x86-64
using GCC 5.2 with binutils 20151008 and GCC 4.8 with binutils 20130219.
There are no differences in ld.so with binutils 20151008.  There are no
unexpected failures with binutils 20130219 and 20151008.

	[BZ #19124]
	* sysdeps/x86_64/dl-trampoline.S [!HAVE_AVX512_ASM_SUPPORT]
	(_dl_runtime_resolve_avx512): Make it a hidden alias of
	_dl_runtime_resolve_avx.
	(_dl_runtime_profile_avx512): Make it a hidden alias of
	_dl_runtime_profile_avx.
2015-10-13 10:36:27 -07:00
Joseph Myers
2020748d8e Move powerpc llround implementations to powerpc32 directory.
sysdeps/powerpc/fpu/ has versions of llround and llroundf that are
actually used only for powerpc32 because
sysdeps/powerpc/powerpc64/fpu/ has its own versions of those
functions.  This patch moves them into sysdeps/powerpc/powerpc32/fpu
to reflect where they are actually used (in preparation for fixing
other problems with those functions).

Tested for powerpc that installed stripped shared libraries are
unchanged by this patch.

	* sysdeps/powerpc/fpu/s_llround.c: Move to ....
	* sysdeps/powerpc/powerpc32/fpu/s_llround.c: ...here.
	* sysdeps/powerpc/fpu/s_llroundf.c: Move to ....
	* sysdeps/powerpc/powerpc32/fpu/s_llroundf.c: ...here.
2015-10-13 16:53:09 +00:00
Joseph Myers
e8dab9477f Fix powerpc32 llrint, llrintf bad exceptions (bug 16422).
The versions of llrint and llrintf for older powerpc32 processors
convert the results of __rint / __rintf to long long int, resulting in
spurious exceptions from such casts in certain cases.  This patch
makes glibc work around the problems with the libgcc conversions when
the compiler used to build glibc doesn't use the fctidz instruction
for them.

Tested for powerpc.

	[BZ #16422]
	* sysdeps/powerpc/powerpc32/fpu/configure.ac (libc_cv_ppc_fctidz):
	New configure test.
	* sysdeps/powerpc/powerpc32/fpu/configure: Regenerated.
	* config.h.in [_LIBC] (HAVE_PPC_FCTIDZ): New macro.
	* sysdeps/powerpc/powerpc32/fpu/s_llrint.c: Include <limits.h>,
	<math_private.h> and <stdint.h>.
	(__llrint): Avoid conversions to long long int where those might
	raise spurious exceptions.
	* sysdeps/powerpc/powerpc32/fpu/s_llrintf.c: Include
	<math_private.h> and <stdint.h>.
	(__llrintf): Avoid conversions to long long int where those might
	raise spurious exceptions.
2015-10-13 00:52:54 +00:00
Andreas Schwab
5b1766a0cd Add bug reference 2015-10-12 15:28:24 +02:00
Andreas Schwab
f881f6ff62 Add dependencies on needed locales in each subdir tests (bug 18969) 2015-10-12 15:18:08 +02:00
Samuel Thibault
c7b8939bf5 Remove unusued variable
hurd/hurd-raise.c (_hurd_raise_signal): Remove unused err variable.
2015-10-10 16:44:42 +02:00
Samuel Thibault
3fe29ca043 Make _hurd_raise_signal directly return the error
* hurd/hurd-raise.c (_hurd_raise_signal): Return error returned by
	__msg_sig_post.
2015-10-10 16:31:43 +02:00
Samuel Thibault
ee0976f7fc Make _hurd_raise_signal return errors
* hurd/hurd-raise.c (_hurd_raise_signal): Set errno to error returned
	by __msg_sig_post.
	* hurd/hurd/signal.h (_hurd_raise_signal): Add int return type.
2015-10-10 16:21:41 +02:00
Phil Blundell
39b3985bed ChangeLog: Fix incorrect email address
For reasons that are slightly unclear, the ChangeLog entry added in
67ac0f74a4 contained a mangled version
of my email address.  Replace that with the correct one.
2015-10-09 23:43:53 +01:00
Joseph Myers
368a24a0b2 Regenerate MIPS libm-test-ulps.
* sysdeps/mips/mips32/libm-test-ulps: Regenerated.
	* sysdeps/mips/mips64/libm-test-ulps: Likewise.
2015-10-09 22:39:11 +00:00
Joseph Myers
5471d141ac Regenerate ARM libm-test-ulps.
* sysdeps/arm/libm-test-ulps: Regenerated.
2015-10-09 22:30:26 +00:00
Joseph Myers
f1226a2ae3 Fix llrint, llround missing exceptions for ARM (bug 15470).
Similar to the recent fix for MIPS, ARM is also missing correct
exceptions on overflow from llrint and llround functions because casts
from floating-point types to long long do not result in correct
exceptions on overflow.  This patch enables the fix for this for ARM.

Tested for ARM.

	[BZ #15470]
	* sysdeps/arm/fix-fp-int-convert-overflow.h: New file.
2015-10-09 22:23:39 +00:00
Joseph Myers
06d97e5e61 Fix lrint, llrint, lround, llround missing exceptions for MIPS (bug 16399).
For 32-bit MIPS and some other systems, various of the lrint, llrint,
lround, llround functions can be missing exceptions on overflow
because casts do not (in current GCC) result in the proper
exceptions.  In the MIPS case there are two problems here: MIPS I code
generation uses an assembler macro that doesn't raise exceptions,
while the libgcc conversions of floating-point values to long long
also do not raise "invalid" on all overflow cases (and can raise
spurious "inexact").

This patch adds support in the generic code (only the functions for
which this problem has actually been seen) for forcing the "invalid"
exception in the problem cases, and enables that support for the
affected MIPS cases.

Tested for MIPS; also tested for x86_64 and x86 that installed
stripped shared libraries are unchanged by this patch.

	[BZ #16399]
	* sysdeps/generic/fix-fp-int-convert-overflow.h: New file.
	* sysdeps/ieee754/dbl-64/s_llrint.c: Include <fenv.h>, <limits.h>
	and <fix-fp-int-convert-overflow.h>.
	(__llrint) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/dbl-64/s_llround.c: Include <fenv.h>, <limits.h>
	and <fix-fp-int-convert-overflow.h>.
	(__llround) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/dbl-64/s_lrint.c: Include
	<fix-fp-int-convert-overflow.h>.
	(__lrint) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/dbl-64/s_lround.c: Include
	<fix-fp-int-convert-overflow.h>.
	(__lround) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/flt-32/s_llrintf.c: Include <fenv.h>, <limits.h>
	and <fix-fp-int-convert-overflow.h>.
	(__llrintf) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/flt-32/s_llroundf.c: Include <fenv.h>,
	<limits.h> and <fix-fp-int-convert-overflow.h>.
	(__llroundf) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/flt-32/s_lrintf.c: Include <fenv.h>, <limits.h>
	and <fix-fp-int-convert-overflow.h>.
	(__lrintf) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/ieee754/flt-32/s_lroundf.c: Include <fenv.h>, <limits.h>
	and <fix-fp-int-convert-overflow.h>.
	(__lroundf) [FE_INVALID]: Force FE_INVALID exception as needed if
	FIX_DBL_LLONG_CONVERT_OVERFLOW.
	* sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h: New file.
2015-10-09 21:02:19 +00:00
Carlos O'Donell
facdd9ea29 Fix typo in bug-strcoll2 (Bug 18589)
Fix the copyright year and remove contributed by in the
bug-strcoll2 test. In addition add the correct dependency
on $(gen-locales) to ensure all the test locales are generated.
2015-10-09 16:38:04 -04:00
Adhemerval Zanella
67ac0f74a4 nptl: Add NPTL cases for cancellation failures cases
This patch pthread cancellation tests to check for failures cases
wherer the syscall cancel wrapper should both set the error and
the errno values.

Tested on i686, x86_64, x32, powerpc64le, and aarch64.

	* nptl/Makefile (tests): Add tst-cancel26.c and tst-cancel27.c.
	* nptl/tst-cancel26.c: New file.
	* nptl/tst-cancel27.c: Likewise.
2015-10-09 15:50:27 -03:00
H.J. Lu
4b71ce6c1a Update lrint/lrintf/lrintl for x32
The x86_64 versions of lrint/lrintf/ lrintl are aliases for the long
long versions which isn't correct for x32, where exceptions must respect
overflow for 32-bit long.  Separate versions of the long functions for
x32 that convert to 32-bit long and raise the right exceptions for that
conversion, while keeping the aliases in the non-x32 case.

Tested on x86_64 and x32.  There are no code changes in libm.so on
x86_64.

	* sysdeps/x86_64/fpu/s_llrint.S (__lrint): Add alias only if
	__ILP32__ isn't defined.
	(lrint): Likewise.
	* sysdeps/x86_64/fpu/s_llrintf.S (__lrintf): Likewise.
	(lrintf): Likewise.
	* sysdeps/x86_64/fpu/s_llrintl.S (__lrintl): Likewise.
	(lrintl): Likewise.
	* sysdeps/x86_64/x32/fpu/s_lrint.S: New file.
	* sysdeps/x86_64/x32/fpu/s_lrintf.S: Likewise.
	* sysdeps/x86_64/x32/fpu/s_lrintl.S: Likewise.
2015-10-09 11:42:10 -07:00
Adhemerval Zanella
0fcc93bce9 Mark lseek/llseek as non-cancellable
This patch sets lseek/llseek for 64-bit, MIPS n32, and x86_32 as non-
cancelable.  This make it consistant with 32-bit platform.

Tested on i686, x86_64, and x32.

	* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (lseek): Set as
	non-cancelable.
	* sysdeps/unix/sysv/linux/wordsize-64/syscalls.list (llseek): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/lseek.S (__libc_lseek64):
	Likewise.
2015-10-09 14:26:08 -03:00
Joseph Myers
ae5d8eaed0 Remove configure tests for -mno-vzeroupper support.
GCC added support for -mno-vzeroupper in version 4.6.  Thus the
configure tests for this support are obsolete, and this patch removes
them.

Tested for x86_64 and x86 (testsuite, and that installed stripped
shared libraries are unchanged by this patch).

	* sysdeps/i386/configure.ac (libc_cv_cc_novzeroupper): Remove
	configure test.
	* sysdeps/i386/configure: Regenerated.
	* sysdeps/x86_64/configure.ac (libc_cv_cc_novzeroupper): Remove
	configure test.
	* sysdeps/x86_64/configure: Regenerated.
	* sysdeps/x86_64/Makefile [$(config-cflags-novzeroupper) = yes]:
	Make code unconditional.
2015-10-09 16:03:48 +00:00
Joseph Myers
b7848899a5 Remove configure tests for FMA4 support.
GCC added support for -mfma4 in version 4.5.  Thus the configure tests
for this support are obsolete, and this patch removes them.

Tested for x86_64 and x86 (testsuite, and that installed stripped
shared libraries are unchanged by this patch).

	* sysdeps/i386/configure.ac (libc_cv_cc_fma4): Remove configure
	test.
	* sysdeps/i386/configure: Regenerated.
	* sysdeps/x86_64/configure.ac (libc_cv_cc_fma4): Remove configure
	test.
	* sysdeps/x86_64/configure: Regenerated.
	* sysdeps/x86_64/fpu/multiarch/Makefile [$(have-mfma4) = yes]:
	Make code unconditional.
	* sysdeps/x86_64/fpu/multiarch/e_asin.c [HAVE_FMA4_SUPPORT]:
	Likewise.
	* sysdeps/x86_64/fpu/multiarch/e_atan2.c [HAVE_FMA4_SUPPORT]:
	Likewise.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/e_exp.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/e_log.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/e_pow.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	* sysdeps/x86_64/fpu/multiarch/s_atan.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/s_fma.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/s_fmaf.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/s_sin.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* sysdeps/x86_64/fpu/multiarch/s_tan.c [HAVE_FMA4_SUPPORT]: Make
	code unconditional.
	[!HAVE_FMA4_SUPPORT]: Remove conditional code.
	* config.h.in (HAVE_FMA4_SUPPORT): Remove #undef.
2015-10-09 16:02:54 +00:00
Joseph Myers
0e069029a8 Fix dbl-64 lrint for 64-bit long (bug 19095).
The dbl-64 implementation of lrint produces incorrect results for some
arguments with 64-bit long because a 32-bit (unsigned) low part of the
mantissa is shifted left, losing high bits in the process.  This patch
fixes this by casting to long int before shifting, as in lround (as
this case only applies for 64-bit long, there are no issues with
sign-extension).

Tested for mips64 (n64).

	[BZ #19095]
	* sysdeps/ieee754/dbl-64/s_lrint.c (__lrint): Cast low part of
	mantissa to long int before shifting left.
2015-10-09 00:32:14 +00:00
Joseph Myers
d0d286d32d Fix lrint, llrint missing exceptions close to overflow threshold (bug 19094).
The dbl-64, ldbl-96 and ldbl-128 implementations of lrint and llrint
fail to produce "invalid" exceptions in cases where the rounded result
overflows the target type, but truncating the floating-point argument
to the next integer towards zero does not overflow it (so in
particular casts do not produce such exceptions).  (This issue cannot
arise for float, or for double with 64-bit target type, or for ldbl-96
with 64-bit target type and negative arguments, because of
insufficient precision in the floating-point type for arguments with
the relevant property to exist.  It also obviously cannot arise in
FE_TOWARDZERO mode.)

This patch fixes these problems by inserting checks for the special
cases that can occur in each implementation, and explicitly raising
FE_INVALID (and avoiding the cast if it might raise spurious
FE_INEXACT, while raising FE_INEXACT explicitly in the cases where it
is needed; unlike lround and llround, FE_INEXACT is required, not
optional, for these functions for a within-range inexact result).

The fixes are conditional on FE_INVALID or FE_INEXACT being defined.
If any future architecture supports one but not both of those
exceptions, the code will fail to compile and need fixing to handle
that case (this seemed better than conditioning on both macros being
defined, resulting in code that would compile but quietly miss
exceptions on such a system).

Tested for x86_64, x86 and mips64.  Tested the ldbl-96 changes (only
relevant for ia64, it appears) on x86_64 by removing the x86_64
versions of lrintl / llrintl.

	[BZ #19094]
	* sysdeps/ieee754/dbl-64/s_lrint.c: Include <fenv.h> and
	<limits.h>.
	(__lrint) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
	when result overflows but exception would not result from cast.
	* sysdeps/ieee754/ldbl-128/s_llrintl.c: Include <fenv.h> and
	<limits.h>.
	(__llrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
	when result overflows but exception would not result from cast.
	* sysdeps/ieee754/ldbl-128/s_lrintl.c: Include <fenv.h> and
	<limits.h>.
	(__lrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
	when result overflows but exception would not result from cast.
	* sysdeps/ieee754/ldbl-96/s_llrintl.c: Include <fenv.h> and
	<limits.h>.
	(__llrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
	when result overflows but exception would not result from cast.
	* sysdeps/ieee754/ldbl-96/s_lrintl.c: Include <fenv.h> and
	<limits.h>.
	(__lrintl) [FE_INVALID || FE_INEXACT]: Force FE_INVALID exception
	when result overflows but exception would not result from cast.
	* math/libm-test.inc (lrint_test_data): Add more tests.
	(llrint_test_data): Likewise.
2015-10-08 22:17:45 +00:00