commit dc258ce62ae0bbb456c6a855dbb6b384ecf7e988 Author: Florian Weimer Date: Thu Aug 3 13:59:17 2017 +0200 getaddrinfo: Release resolver context on error in gethosts [BZ #21885] (cherry picked from commit 964263bb8d650f1681665c55704fb01a8e725621) diff --git a/ChangeLog b/ChangeLog index 8dbfc7eaff..28ce9c8479 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-08-03 Florian Weimer + + [BZ #21885] + * sysdeps/posix/getaddrinfo.c (gethosts): Release resolver context + on memory allocation failure. + 2017-08-02 Siddhesh Poyarekar * version.h (RELEASE): Set to "stable" diff --git a/NEWS b/NEWS index 8295f20c0a..9a64579658 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,12 @@ See the end for copying conditions. Please send GNU C library bug reports via using `glibc' in the "product" field. +Version 2.26.1 + +The following bugs are resolved with this release: + + [21885] getaddrinfo: Release resolver context on error in gethosts + Version 2.26 Major new features: diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index efa7118498..699411cc92 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -255,6 +255,8 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, break; \ if (!scratch_buffer_grow (tmpbuf)) \ { \ + __resolv_context_enable_inet6 (res_ctx, res_enable_inet6); \ + __resolv_context_put (res_ctx); \ result = -EAI_MEMORY; \ goto free_and_return; \ } \ commit 665ce88d68fd13c5c4cbaf2808434c618745137c Author: Aurelien Jarno Date: Thu Aug 3 22:33:19 2017 +0000 i686/multiarch: Regenerate ulps This comes from running “make regen-ulps” on an AMD Opteron 2378 CPU. Changelog: * sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Regenerated. (cherry picked from commit 144bdab050bdd78c327d98a79b15c5b164e1d56f) diff --git a/ChangeLog b/ChangeLog index 28ce9c8479..3478699b10 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-08-03 Aurelien Jarno + + * sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Regenerated. + 2017-08-03 Florian Weimer [BZ #21885] diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps index 81dd1a09ea..053f5ec972 100644 --- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps +++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps @@ -58,7 +58,7 @@ double: 1 float128: 2 idouble: 1 ifloat128: 2 -ildouble: 4 +ildouble: 5 ldouble: 3 Function: "asin": @@ -1154,8 +1154,8 @@ float128: 4 idouble: 3 ifloat: 3 ifloat128: 4 -ildouble: 7 -ldouble: 7 +ildouble: 8 +ldouble: 8 Function: Imaginary part of "clog10_upward": double: 1 @@ -2013,8 +2013,8 @@ double: 3 float: 4 idouble: 3 ifloat: 4 -ildouble: 5 -ldouble: 5 +ildouble: 6 +ldouble: 6 Function: "hypot": double: 1 @@ -2205,8 +2205,8 @@ float128: 8 idouble: 3 ifloat: 4 ifloat128: 8 -ildouble: 5 -ldouble: 5 +ildouble: 6 +ldouble: 6 Function: "log": double: 1 commit a4e5aa1a443cfad09bc98f9bb527995371a53a88 Author: Aurelien Jarno Date: Thu Aug 3 22:35:48 2017 +0000 Fix the return type of the getentropy stub The return type of the getentropy stub is wrongly defined as ssize_t, while both the header and the Linux implementation define it as int. This patch fixes that. Changelog: * stdlib/getentropy.c (getentropy): Change return type to int. (cherry picked from commit 2b34e2716f1e84b2c3457ffc868c3dc775b55845) diff --git a/ChangeLog b/ChangeLog index 3478699b10..4357ad1eb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2017-08-03 Aurelien Jarno + + * stdlib/getentropy.c (getentropy): Change return type to int. + 2017-08-03 Aurelien Jarno * sysdeps/i386/i686/fpu/multiarch/libm-test-ulps: Regenerated. diff --git a/stdlib/getentropy.c b/stdlib/getentropy.c index a71d4cd8f5..a88bbf8de3 100644 --- a/stdlib/getentropy.c +++ b/stdlib/getentropy.c @@ -21,7 +21,7 @@ /* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on success and -1 on failure. */ -ssize_t +int getentropy (void *buffer, size_t length) { __set_errno (ENOSYS); commit 799859f6635d68487ea2472bd79d96a7639a1ab1 Author: H.J. Lu Date: Sun Aug 6 10:44:30 2017 -0700 x86-64: Use _dl_runtime_resolve_opt only with AVX512F [BZ #21871] On AVX machines with XGETBV (ECX == 1) like Skylake processors, (gdb) disass _dl_runtime_resolve_avx_opt Dump of assembler code for function _dl_runtime_resolve_avx_opt: 0x0000000000015890 <+0>: push %rax 0x0000000000015891 <+1>: push %rcx 0x0000000000015892 <+2>: push %rdx 0x0000000000015893 <+3>: mov $0x1,%ecx 0x0000000000015898 <+8>: xgetbv 0x000000000001589b <+11>: mov %eax,%r11d 0x000000000001589e <+14>: pop %rdx 0x000000000001589f <+15>: pop %rcx 0x00000000000158a0 <+16>: pop %rax 0x00000000000158a1 <+17>: and $0x4,%r11d 0x00000000000158a5 <+21>: bnd je 0x16200 <_dl_runtime_resolve_sse_vex> End of assembler dump. is slower than: (gdb) disass _dl_runtime_resolve_avx_slow Dump of assembler code for function _dl_runtime_resolve_avx_slow: 0x0000000000015850 <+0>: vorpd %ymm0,%ymm1,%ymm8 0x0000000000015854 <+4>: vorpd %ymm2,%ymm3,%ymm9 0x0000000000015858 <+8>: vorpd %ymm4,%ymm5,%ymm10 0x000000000001585c <+12>: vorpd %ymm6,%ymm7,%ymm11 0x0000000000015860 <+16>: vorpd %ymm8,%ymm9,%ymm9 0x0000000000015865 <+21>: vorpd %ymm10,%ymm11,%ymm10 0x000000000001586a <+26>: vpcmpeqd %xmm8,%xmm8,%xmm8 0x000000000001586f <+31>: vorpd %ymm9,%ymm10,%ymm10 0x0000000000015874 <+36>: vptest %ymm10,%ymm8 0x0000000000015879 <+41>: bnd jae 0x158b0 <_dl_runtime_resolve_avx> 0x000000000001587c <+44>: vzeroupper 0x000000000001587f <+47>: bnd jmpq 0x16200 <_dl_runtime_resolve_sse_vex> End of assembler dump. (gdb) since xgetbv takes much more cycles than single cycle operations like vpord/vvpcmpeq/ptest. _dl_runtime_resolve_opt should be used only with AVX512 where AVX512 instructions lead to lower CPU frequency on Skylake server. [BZ #21871] * sysdeps/x86/cpu-features.c (init_cpu_features): Set bit_arch_Use_dl_runtime_resolve_opt only with AVX512F. (cherry picked from commit d2cf37c0a2a375cf2fde69f1afbcc49e45368fc4) diff --git a/ChangeLog b/ChangeLog index 4357ad1eb8..764c827161 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-08-06 H.J. Lu + + [BZ #21871] + * sysdeps/x86/cpu-features.c (init_cpu_features): Set + bit_arch_Use_dl_runtime_resolve_opt only with AVX512F. + 2017-08-03 Aurelien Jarno * stdlib/getentropy.c (getentropy): Change return type to int. diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c index 1d087ea732..6f900840d4 100644 --- a/sysdeps/x86/cpu-features.c +++ b/sysdeps/x86/cpu-features.c @@ -244,10 +244,13 @@ init_cpu_features (struct cpu_features *cpu_features) |= bit_arch_Prefer_No_AVX512; /* To avoid SSE transition penalty, use _dl_runtime_resolve_slow. - If XGETBV suports ECX == 1, use _dl_runtime_resolve_opt. */ + If XGETBV suports ECX == 1, use _dl_runtime_resolve_opt. + Use _dl_runtime_resolve_opt only with AVX512F since it is + slower than _dl_runtime_resolve_slow with AVX. */ cpu_features->feature[index_arch_Use_dl_runtime_resolve_slow] |= bit_arch_Use_dl_runtime_resolve_slow; - if (cpu_features->max_cpuid >= 0xd) + if (CPU_FEATURES_ARCH_P (cpu_features, AVX512F_Usable) + && cpu_features->max_cpuid >= 0xd) { unsigned int eax; commit 82efa1ffd43bed1494d20a4b86f6b15ac6bb5545 Author: Adhemerval Zanella Date: Mon Jul 17 10:59:59 2017 -0300 posix: Set p{read,write}v2 to return ENOTSUP (BZ#21780) Different than other architectures hppa-linux-gnu define different values for ENOTSUP and EOPNOTSUPP, where the later is a Linux specific one. This leads to tst-preadwritev{64}v2 tests failures: $ ./testrun.sh misc/tst-preadvwritev2 error: tst-preadvwritev2-common.c:35: preadv2 failure did not set errno to ENOTSUP (223) error: 1 test failures The straightforward fix is to return the POSIX defined ENOTSUP on all p{read,write}v{64}v2 implementations instead of Linux specific one. Checked on x86_64-linux-gnu and the tst-preadwritev{64}v2 on hppa-linux-gnu (although due the installed kernel on my testing system the pwritev{64}v2 with an invalid flag still fails due a known kernel issue [1]). [BZ #21780] * sysdeps/posix/preadv2.c (preadv2): Use ENOTSUP instead of EOPNOTSUPP. * sysdeps/posix/preadv64v2.c (preadv64v2): Likewise. * sysdeps/posix/pwritev2.c (pwritev2): Likewise. * sysdeps/posix/pwritev64v2.c (pwritev64v2): Likewise. * sysdeps/unix/sysv/linux/preadv2.c (preadv2): Likewise. * sysdeps/unix/sysv/linux/preadv64v2.c (preadv64v2): Likewise. * sysdeps/unix/sysv/linux/pwritev2.c (pwritev2): Likewise. * sysdeps/unix/sysv/linux/pwritev64v2.c (pwritev64v2): Likewise. [1] https://sourceware.org/ml/libc-alpha/2017-06/msg00726.html Cherry-pick of 852d63120783fae5bf85a067320dc4ba1ed59f11 diff --git a/ChangeLog b/ChangeLog index 764c827161..459062cc20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2017-08-09 Adhemerval Zanella + + [BZ #21780] + * sysdeps/posix/preadv2.c (preadv2): Use ENOTSUP instead of + EOPNOTSUPP. + * sysdeps/posix/preadv64v2.c (preadv64v2): Likewise. + * sysdeps/posix/pwritev2.c (pwritev2): Likewise. + * sysdeps/posix/pwritev64v2.c (pwritev64v2): Likewise. + * sysdeps/unix/sysv/linux/preadv2.c (preadv2): Likewise. + * sysdeps/unix/sysv/linux/preadv64v2.c (preadv64v2): Likewise. + * sysdeps/unix/sysv/linux/pwritev2.c (pwritev2): Likewise. + * sysdeps/unix/sysv/linux/pwritev64v2.c (pwritev64v2): Likewise. + 2017-08-06 H.J. Lu [BZ #21871] diff --git a/sysdeps/posix/preadv2.c b/sysdeps/posix/preadv2.c index 2a7cf11e27..d27f7028ed 100644 --- a/sysdeps/posix/preadv2.c +++ b/sysdeps/posix/preadv2.c @@ -28,7 +28,7 @@ preadv2 (int fd, const struct iovec *vector, int count, OFF_T offset, { if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } diff --git a/sysdeps/posix/preadv64v2.c b/sysdeps/posix/preadv64v2.c index e084f3f9e1..ce7cb40bf2 100644 --- a/sysdeps/posix/preadv64v2.c +++ b/sysdeps/posix/preadv64v2.c @@ -25,7 +25,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, OFF_T offset, { if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } diff --git a/sysdeps/posix/pwritev2.c b/sysdeps/posix/pwritev2.c index 5b7650c4fc..7ec8cbc407 100644 --- a/sysdeps/posix/pwritev2.c +++ b/sysdeps/posix/pwritev2.c @@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, OFF_T offset, { if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } diff --git a/sysdeps/posix/pwritev64v2.c b/sysdeps/posix/pwritev64v2.c index 0f2f9ef863..be98aeed9d 100644 --- a/sysdeps/posix/pwritev64v2.c +++ b/sysdeps/posix/pwritev64v2.c @@ -26,7 +26,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, OFF_T offset, { if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } diff --git a/sysdeps/unix/sysv/linux/preadv2.c b/sysdeps/unix/sysv/linux/preadv2.c index 11fe85eaa8..137e2dd791 100644 --- a/sysdeps/unix/sysv/linux/preadv2.c +++ b/sysdeps/unix/sysv/linux/preadv2.c @@ -32,7 +32,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset, # ifdef __NR_preadv2 ssize_t result = SYSCALL_CANCEL (preadv2, fd, vector, count, LO_HI_LONG (offset), flags); - if (result >= 0 || errno != ENOSYS) + if (result >= 0) return result; # endif /* Trying to emulate the preadv2 syscall flags is troublesome: @@ -46,7 +46,7 @@ preadv2 (int fd, const struct iovec *vector, int count, off_t offset, if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } return preadv (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/preadv64v2.c b/sysdeps/unix/sysv/linux/preadv64v2.c index 9d7f8c9893..8f413253f4 100644 --- a/sysdeps/unix/sysv/linux/preadv64v2.c +++ b/sysdeps/unix/sysv/linux/preadv64v2.c @@ -30,7 +30,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, off64_t offset, #ifdef __NR_preadv64v2 ssize_t result = SYSCALL_CANCEL (preadv64v2, fd, vector, count, LO_HI_LONG (offset), flags); - if (result >= 0 || errno != ENOSYS) + if (result >= 0) return result; #endif /* Trying to emulate the preadv2 syscall flags is troublesome: @@ -44,7 +44,7 @@ preadv64v2 (int fd, const struct iovec *vector, int count, off64_t offset, if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } return preadv64 (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/pwritev2.c b/sysdeps/unix/sysv/linux/pwritev2.c index 72f0471f96..8e5032fe2f 100644 --- a/sysdeps/unix/sysv/linux/pwritev2.c +++ b/sysdeps/unix/sysv/linux/pwritev2.c @@ -28,7 +28,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, off_t offset, # ifdef __NR_pwritev2 ssize_t result = SYSCALL_CANCEL (pwritev2, fd, vector, count, LO_HI_LONG (offset), flags); - if (result >= 0 || errno != ENOSYS) + if (result >= 0) return result; # endif /* Trying to emulate the pwritev2 syscall flags is troublesome: @@ -42,7 +42,7 @@ pwritev2 (int fd, const struct iovec *vector, int count, off_t offset, if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } return pwritev (fd, vector, count, offset); diff --git a/sysdeps/unix/sysv/linux/pwritev64v2.c b/sysdeps/unix/sysv/linux/pwritev64v2.c index def9a0bc57..d2800c6657 100644 --- a/sysdeps/unix/sysv/linux/pwritev64v2.c +++ b/sysdeps/unix/sysv/linux/pwritev64v2.c @@ -30,7 +30,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, off64_t offset, #ifdef __NR_pwritev64v2 ssize_t result = SYSCALL_CANCEL (pwritev64v2, fd, vector, count, LO_HI_LONG (offset), flags); - if (result >= 0 || errno != ENOSYS) + if (result >= 0) return result; #endif /* Trying to emulate the pwritev2 syscall flags is troublesome: @@ -44,7 +44,7 @@ pwritev64v2 (int fd, const struct iovec *vector, int count, off64_t offset, if (flags != 0) { - __set_errno (EOPNOTSUPP); + __set_errno (ENOTSUP); return -1; } return pwritev64 (fd, vector, count, offset); commit 302434688d925134065498b4a5574f6ee6bfb9fd Author: Florian Weimer Date: Thu Aug 10 09:10:36 2017 +0200 nss: Call __resolv_context_put before early return in get*_r [BZ #21932] This corrects an oversight introduced in commit 352f4ff9a268b81ef5d4b2413f582565806e4790 (resolv: Introduce struct resolv_context). (cherry picked from commit 3016149819268b14660f791b971910ccc2cc13e5) diff --git a/ChangeLog b/ChangeLog index 459062cc20..3127648626 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-08-09 Florian Weimer + + [BZ #21932] + * nss/getXXbyYY_r.c (REENTRANT_NAME): Call __resolv_context_put + before early return. + 2017-08-09 Adhemerval Zanella [BZ #21780] diff --git a/NEWS b/NEWS index 9a64579658..ec6cf34122 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ Version 2.26.1 The following bugs are resolved with this release: [21885] getaddrinfo: Release resolver context on error in gethosts + [21932] Unpaired __resolv_context_get in generic get*_r implementation Version 2.26 diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 6c547ea1ca..bce80e05dd 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -234,6 +234,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, H_ERRNO_VAR_P)) { case -1: +# ifdef NEED__RES + __resolv_context_put (res_ctx); +# endif return errno; case 1: #ifdef NEED_H_ERRNO @@ -253,7 +256,12 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, nscd_status = NSCD_NAME (ADD_VARIABLES, resbuf, buffer, buflen, result H_ERRNO_VAR); if (nscd_status >= 0) - return nscd_status; + { +# ifdef NEED__RES + __resolv_context_put (res_ctx); +# endif + return nscd_status; + } } #endif commit c55ad6452e2d63ebf6fcaabb00bfd27aae02ffb6 Author: Florian Weimer Date: Thu Aug 10 15:58:28 2017 +0200 malloc: Avoid optimizer warning with GCC 7 and -O3 (cherry picked from commit eac43cbb8d808a40004aa0a4a286f5c5155beccb) diff --git a/ChangeLog b/ChangeLog index 3127648626..5ea9b8baa7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-08-10 Florian Weimer + + * malloc/malloc.c (get_max_fast): Reimplement as an inline + function which calls __builtin_unreachable. + 2017-08-09 Florian Weimer [BZ #21932] diff --git a/malloc/malloc.c b/malloc/malloc.c index 54e406bcb6..e3ff778113 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1658,6 +1658,9 @@ typedef struct malloc_chunk *mfastbinptr; #define arena_is_corrupt(A) (((A)->flags & ARENA_CORRUPTION_BIT)) #define set_arena_corrupt(A) ((A)->flags |= ARENA_CORRUPTION_BIT) +/* Maximum size of memory handled in fastbins. */ +static INTERNAL_SIZE_T global_max_fast; + /* Set value of max_fast. Use impossibly small value if 0. @@ -1668,8 +1671,20 @@ typedef struct malloc_chunk *mfastbinptr; #define set_max_fast(s) \ global_max_fast = (((s) == 0) \ ? SMALLBIN_WIDTH : ((s + SIZE_SZ) & ~MALLOC_ALIGN_MASK)) -#define get_max_fast() global_max_fast +static inline INTERNAL_SIZE_T +get_max_fast (void) +{ + /* Tell the GCC optimizers that global_max_fast is never larger + than MAX_FAST_SIZE. This avoids out-of-bounds array accesses in + _int_malloc after constant propagation of the size parameter. + (The code never executes because malloc preserves the + global_max_fast invariant, but the optimizers may not recognize + this.) */ + if (global_max_fast > MAX_FAST_SIZE) + __builtin_unreachable (); + return global_max_fast; +} /* ----------- Internal state representation and initialization ----------- @@ -1797,9 +1812,6 @@ static struct malloc_par mp_ = #endif }; -/* Maximum size of memory handled in fastbins. */ -static INTERNAL_SIZE_T global_max_fast; - /* Initialize a malloc_state struct. commit 2aa1a7a8f8b9b7879bc6eb1c34d1580f992c406d Author: Florian Weimer Date: Fri Aug 11 15:48:14 2017 +0200 assert: Suppress pedantic warning caused by statement expression [BZ #21242] (cherry picked from commit 8b2c63e4e2ad1fd161f80004ed30624f2a37b57b) diff --git a/ChangeLog b/ChangeLog index 5ea9b8baa7..0057c0902a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-08-11 Florian Weimer + + [BZ #21242] + * assert/assert.h [__GNUC__ && !__STRICT_ANSI__] (assert): + Suppress pedantic warning resulting from statement expression. + (__ASSERT_FUNCTION): Add missing __extension__. + 2017-08-10 Florian Weimer * malloc/malloc.c (get_max_fast): Reimplement as an inline diff --git a/NEWS b/NEWS index ec6cf34122..d57c4052cf 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Version 2.26.1 The following bugs are resolved with this release: + [21242] assert: Suppress pedantic warning caused by statement expression [21885] getaddrinfo: Release resolver context on error in gethosts [21932] Unpaired __resolv_context_get in generic get*_r implementation diff --git a/assert/assert.h b/assert/assert.h index 22f019537c..6801cfeb10 100644 --- a/assert/assert.h +++ b/assert/assert.h @@ -91,13 +91,19 @@ __END_DECLS ? __ASSERT_VOID_CAST (0) \ : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION)) # else +/* The first occurrence of EXPR is not evaluated due to the sizeof, + but will trigger any pedantic warnings masked by the __extension__ + for the second occurrence. The explicit comparison against zero is + required to support function pointers and bit fields in this + context, and to suppress the evaluation of variable length + arrays. */ # define assert(expr) \ - ({ \ + ((void) sizeof ((expr) == 0), __extension__ ({ \ if (expr) \ ; /* empty */ \ else \ __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION); \ - }) + })) # endif # ifdef __USE_GNU @@ -113,7 +119,7 @@ __END_DECLS C9x has a similar variable called __func__, but prefer the GCC one since it demangles C++ function names. */ # if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4) -# define __ASSERT_FUNCTION __PRETTY_FUNCTION__ +# define __ASSERT_FUNCTION __extension__ __PRETTY_FUNCTION__ # else # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L # define __ASSERT_FUNCTION __func__ commit 645b7635ba8fd58062245419e8bb668ab90cd3ec Author: Gabriel F. T. Gomes Date: Mon Aug 7 09:14:14 2017 -0300 powerpc: Restrict xssqrtqp operands to Vector Registers (bug 21941) POWER ISA 3.0 introduces the xssqrtqp instructions, which expects operands to be in Vector Registers (Altivec/VMX), even though this instruction belongs to the Vector-Scalar Instruction Set. In GCC's Extended Assembly for POWER, the 'wq' register constraint is provided for use with IEEE 754 128-bit floating-point values. However, this constraint does not limit the register allocation to Vector Registers (Altivec/VMX) and could assign a Vector-Scalar Register (VSX) to the operands of the instruction. This patch changes the register constraint used in sqrtf128 from 'wq' to 'v', in order to request a Vector Register (Altivec/VMX) for use with the xssqrtqp instruction. Tested for powerpc64le and --with-cpu=power9. [BZ #21941] * sysdeps/powerpc/fpu/math_private.h (__ieee754_sqrtf128): Since xssqrtqp requires operands to be in Vector Registers (Altivec/VMX), replace the register constraint 'wq' with 'v'. * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c (__ieee754_sqrtf128): Likewise. (cherry picked from commit 4d98ace9de3183309cb394cd0110eda5ad2d2531) diff --git a/ChangeLog b/ChangeLog index 0057c0902a..6886cd9361 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2017-08-10 Gabriel F. T. Gomes + + [BZ #21941] + * sysdeps/powerpc/fpu/math_private.h (__ieee754_sqrtf128): Since + xssqrtqp requires operands to be in Vector Registers + (Altivec/VMX), replace the register constraint 'wq' with 'v'. + * sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c + (__ieee754_sqrtf128): Likewise. + 2017-08-11 Florian Weimer [BZ #21242] diff --git a/sysdeps/powerpc/fpu/math_private.h b/sysdeps/powerpc/fpu/math_private.h index d8fd4923ac..396fd0562e 100644 --- a/sysdeps/powerpc/fpu/math_private.h +++ b/sysdeps/powerpc/fpu/math_private.h @@ -30,7 +30,7 @@ extern __always_inline _Float128 __ieee754_sqrtf128 (_Float128 __x) { _Float128 __z; - asm ("xssqrtqp %0,%1" : "=wq" (__z) : "wq" (__x)); + asm ("xssqrtqp %0,%1" : "=v" (__z) : "v" (__x)); return __z; } #endif diff --git a/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c index 769d3f8922..59fd8269f5 100644 --- a/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c +++ b/sysdeps/powerpc/powerpc64le/power9/fpu/e_sqrtf128.c @@ -30,7 +30,7 @@ __float128 __ieee754_sqrtf128 (__float128 a) { __float128 z; - asm ("xssqrtqp %0,%1" : "=wq" (z) : "wq" (a)); + asm ("xssqrtqp %0,%1" : "=v" (z) : "v" (a)); return z; } strong_alias (__ieee754_sqrtf128, __sqrtf128_finite) commit c2921b17a37e887b8a5ca9d84b875b9ba702b79c Author: Gabriel F. T. Gomes Date: Mon Aug 21 14:23:27 2017 +0200 Do not use __builtin_types_compatible_p in C++ mode (bug 21930) The logic to define isinf for float128 depends on the availability of __builtin_types_compatible_p, which is only available in C mode, however, the conditionals do not check for C or C++ mode. This lead to an error in libstdc++ configure, as reported by bug 21930. This patch adds a conditional for C mode in the definition of isinf for float128. No definition is provided in C++ mode, since libstdc++ headers undefine isinf. Tested for powerpc64le (glibc test suite and libstdc++-v3 configure). [BZ #21930] * math/math.h (isinf): Check if in C or C++ mode before using __builtin_types_compatible_p, since this is a C mode feature. (cherry picked from commit 47a67213a9f51c5f8816d240500b10db605d8b77) diff --git a/ChangeLog b/ChangeLog index 6886cd9361..415fa3cc79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-08-18 Gabriel F. T. Gomes + + [BZ #21930] + * math/math.h (isinf): Check if in C or C++ mode before using + __builtin_types_compatible_p, since this is a C mode feature. + 2017-08-10 Gabriel F. T. Gomes [BZ #21941] diff --git a/NEWS b/NEWS index d57c4052cf..75b82c899e 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ The following bugs are resolved with this release: [21242] assert: Suppress pedantic warning caused by statement expression [21885] getaddrinfo: Release resolver context on error in gethosts + [21930] Do not use __builtin_types_compatible_p in C++ mode [21932] Unpaired __resolv_context_get in generic get*_r implementation Version 2.26 diff --git a/math/math.h b/math/math.h index e21708045a..dea8dbe1ae 100644 --- a/math/math.h +++ b/math/math.h @@ -442,8 +442,12 @@ enum /* Return nonzero value if X is positive or negative infinity. */ # if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \ - && !defined __SUPPORT_SNAN__ - /* __builtin_isinf_sign is broken for float128 only before GCC 7.0. */ + && !defined __SUPPORT_SNAN__ && !defined __cplusplus + /* Since __builtin_isinf_sign is broken for float128 before GCC 7.0, + use the helper function, __isinff128, with older compilers. This is + only provided for C mode, because in C++ mode, GCC has no support + for __builtin_types_compatible_p (and when in C++ mode, this macro is + not used anyway, because libstdc++ headers undefine it). */ # define isinf(x) \ (__builtin_types_compatible_p (__typeof (x), _Float128) \ ? __isinff128 (x) : __builtin_isinf_sign (x)) commit 5e989c36934d0f0cf13b7a53ef2fa440bce39210 Author: Gabriel F. T. Gomes Date: Mon Aug 14 17:51:51 2017 -0300 Do not use generic selection in C++ mode The logic to protect the use of generic selection (_Generic) does not check for C or C++ mode, however, generic selection is a C-only feature. Tested for powerpc64le. * misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): Define to 0, if in C++ mode. (cherry picked from commit 6913ad65e00bb32417ad39c41d292b976171e27e) diff --git a/ChangeLog b/ChangeLog index 415fa3cc79..23c00aed09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-08-18 Gabriel F. T. Gomes + + * misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): Define to 0, if + in C++ mode. + 2017-08-18 Gabriel F. T. Gomes [BZ #21930] diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 06523bfe9c..0c808216a4 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -464,17 +464,18 @@ # define __glibc_macro_warning(msg) #endif -/* Support for generic selection (ISO C11) is available in GCC since - version 4.9. Previous versions do not provide generic selection, - even though they might set __STDC_VERSION__ to 201112L, when in - -std=c11 mode. Thus, we must check for !defined __GNUC__ when - testing __STDC_VERSION__ for generic selection support. +/* Generic selection (ISO C11) is a C-only feature, available in GCC + since version 4.9. Previous versions do not provide generic + selection, even though they might set __STDC_VERSION__ to 201112L, + when in -std=c11 mode. Thus, we must check for !defined __GNUC__ + when testing __STDC_VERSION__ for generic selection support. On the other hand, Clang also defines __GNUC__, so a clang-specific check is required to enable the use of generic selection. */ -#if __GNUC_PREREQ (4, 9) \ - || __glibc_clang_has_extension (c_generic_selections) \ - || (!defined __GNUC__ && defined __STDC_VERSION__ \ - && __STDC_VERSION__ >= 201112L) +#if !defined __cplusplus \ + && (__GNUC_PREREQ (4, 9) \ + || __glibc_clang_has_extension (c_generic_selections) \ + || (!defined __GNUC__ && defined __STDC_VERSION__ \ + && __STDC_VERSION__ >= 201112L)) # define __HAVE_GENERIC_SELECTION 1 #else # define __HAVE_GENERIC_SELECTION 0 commit fb9a781e9d62c5d7a1f4196915cdfb7c6db59a0c Author: Florian Weimer Date: Mon Aug 21 16:13:49 2017 +0200 assert: Support types without operator== (int) [BZ #21972] (cherry picked from commit b5889d25e9bf944a89fdd7bcabf3b6c6f6bb6f7c) diff --git a/ChangeLog b/ChangeLog index 23c00aed09..8bc3ad9a46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2017-08-21 Florian Weimer + + [BZ #21972] + * assert/assert.h (assert): Use static_cast (bool) for C++. + Use the ternary operator in the warning branch for GNU C. + * assert/Makefile (tests): Add tst-assert-c++, tst-assert-g++. + (CFLAGS-tst-assert-c++.o): Compile in C++11 mode. + (CFLAGS-tst-assert-g++.o): Compile in GnU C++11 mode. + (LDLIBS-tst-assert-c++, LDLIBS-tst-assert-g++): Link with libstdc++. + * assert/tst-assert-c++.cc, assert/tst-assert-g++.cc: New files. + 2017-08-18 Gabriel F. T. Gomes * misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): Define to 0, if diff --git a/NEWS b/NEWS index 75b82c899e..1996e5fbef 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ The following bugs are resolved with this release: [21885] getaddrinfo: Release resolver context on error in gethosts [21930] Do not use __builtin_types_compatible_p in C++ mode [21932] Unpaired __resolv_context_get in generic get*_r implementation + [21972] assert macro requires operator== (int) for its argument type Version 2.26 diff --git a/assert/Makefile b/assert/Makefile index 1c3be9b01f..9ec1be81a9 100644 --- a/assert/Makefile +++ b/assert/Makefile @@ -25,6 +25,15 @@ include ../Makeconfig headers := assert.h routines := assert assert-perr __assert -tests := test-assert test-assert-perr +tests := test-assert test-assert-perr tst-assert-c++ tst-assert-g++ include ../Rules + +ifeq ($(have-cxx-thread_local),yes) +CFLAGS-tst-assert-c++.o = -std=c++11 +LDLIBS-tst-assert-c++ = -lstdc++ +CFLAGS-tst-assert-g++.o = -std=gnu++11 +LDLIBS-tst-assert-g++ = -lstdc++ +else +tests-unsupported += tst-assert-c++ tst-assert-g++ +endif diff --git a/assert/assert.h b/assert/assert.h index 6801cfeb10..640c95c063 100644 --- a/assert/assert.h +++ b/assert/assert.h @@ -85,7 +85,12 @@ __END_DECLS /* When possible, define assert so that it does not add extra parentheses around EXPR. Otherwise, those added parentheses would suppress warnings we'd expect to be detected by gcc's -Wparentheses. */ -# if !defined __GNUC__ || defined __STRICT_ANSI__ +# if defined __cplusplus +# define assert(expr) \ + (static_cast (expr) \ + ? void (0) \ + : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION)) +# elif !defined __GNUC__ || defined __STRICT_ANSI__ # define assert(expr) \ ((expr) \ ? __ASSERT_VOID_CAST (0) \ @@ -93,12 +98,11 @@ __END_DECLS # else /* The first occurrence of EXPR is not evaluated due to the sizeof, but will trigger any pedantic warnings masked by the __extension__ - for the second occurrence. The explicit comparison against zero is - required to support function pointers and bit fields in this - context, and to suppress the evaluation of variable length - arrays. */ + for the second occurrence. The ternary operator is required to + support function pointers and bit fields in this context, and to + suppress the evaluation of variable length arrays. */ # define assert(expr) \ - ((void) sizeof ((expr) == 0), __extension__ ({ \ + ((void) sizeof ((expr) ? 1 : 0), __extension__ ({ \ if (expr) \ ; /* empty */ \ else \ diff --git a/assert/tst-assert-c++.cc b/assert/tst-assert-c++.cc new file mode 100644 index 0000000000..12a5e690cb --- /dev/null +++ b/assert/tst-assert-c++.cc @@ -0,0 +1,78 @@ +/* Tests for interactions between C++ and assert. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +/* The C++ standard requires that if the assert argument is a constant + subexpression, then the assert itself is one, too. */ +constexpr int +check_constexpr () +{ + return (assert (true), 1); +} + +/* Objects of this class can be contextually converted to bool, but + cannot be compared to int. */ +struct no_int +{ + no_int () = default; + no_int (const no_int &) = delete; + + explicit operator bool () const + { + return true; + } + + bool operator! () const; /* No definition. */ + template bool operator== (T) const; /* No definition. */ + template bool operator!= (T) const; /* No definition. */ +}; + +/* This class tests that operator== is not used by assert. */ +struct bool_and_int +{ + bool_and_int () = default; + bool_and_int (const no_int &) = delete; + + explicit operator bool () const + { + return true; + } + + bool operator! () const; /* No definition. */ + template bool operator== (T) const; /* No definition. */ + template bool operator!= (T) const; /* No definition. */ +}; + +static int +do_test () +{ + { + no_int value; + assert (value); + } + + { + bool_and_int value; + assert (value); + } + + return 0; +} + +#include diff --git a/assert/tst-assert-g++.cc b/assert/tst-assert-g++.cc new file mode 100644 index 0000000000..8c06402825 --- /dev/null +++ b/assert/tst-assert-g++.cc @@ -0,0 +1,19 @@ +/* Tests for interactions between C++ and assert. GNU C++11 version. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include commit 3aeab55ee17ca527e4597bc8397c0434c3f8b34e Author: Gabriel F. T. Gomes Date: Mon Aug 21 15:45:57 2017 -0300 Add missing bug fixes to NEWS diff --git a/NEWS b/NEWS index 1996e5fbef..0534c5296e 100644 --- a/NEWS +++ b/NEWS @@ -10,9 +10,12 @@ Version 2.26.1 The following bugs are resolved with this release: [21242] assert: Suppress pedantic warning caused by statement expression + [21780] posix: Set p{read,write}v2 to return ENOTSUP + [21871] x86-64: Use _dl_runtime_resolve_opt only with AVX512F [21885] getaddrinfo: Release resolver context on error in gethosts [21930] Do not use __builtin_types_compatible_p in C++ mode [21932] Unpaired __resolv_context_get in generic get*_r implementation + [21941] powerpc: Restrict xssqrtqp operands to Vector Registers [21972] assert macro requires operator== (int) for its argument type Version 2.26 commit 77db8772bd3f6f2bbad697dcf46861ce310f5b95 Author: Florian Weimer Date: Thu Aug 10 16:06:52 2017 +0200 __inet6_scopeid_pton: Remove attribute_hidden, internal_function The hidden attribute was overridden by libc_hidden_proto on GNU/Linux. It is incorrect because the function is used from nscd. internal_function is not supposed to be used across DSO boundaries, so this commit removes it (again, due to the use in nscd). (cherry picked from commit f87cc2bfba9b844da48a63441c6099342b1551c7) diff --git a/ChangeLog b/ChangeLog index 8bc3ad9a46..ad05da8ade 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-08-10 Florian Weimer + + * inet/net-internal.h (__inet6_scopeid_pton): Remove + attribute_hidden, internal_function. + * inet/inet6_scopeid_pton.c (__inet6_scopeid_pton): Remove + internal_function. + 2017-08-21 Florian Weimer [BZ #21972] diff --git a/inet/inet6_scopeid_pton.c b/inet/inet6_scopeid_pton.c index e09b1cb34d..cc8803fa10 100644 --- a/inet/inet6_scopeid_pton.c +++ b/inet/inet6_scopeid_pton.c @@ -28,7 +28,7 @@ /* Parse SOURCE as a scope ID for ADDRESS. Return 0 on success and -1 on error. */ -internal_function int +int __inet6_scopeid_pton (const struct in6_addr *address, const char *scope, uint32_t *result) { diff --git a/inet/net-internal.h b/inet/net-internal.h index 2b2632c7ba..b2135893e8 100644 --- a/inet/net-internal.h +++ b/inet/net-internal.h @@ -25,8 +25,7 @@ #include int __inet6_scopeid_pton (const struct in6_addr *address, - const char *scope, uint32_t *result) - internal_function attribute_hidden; + const char *scope, uint32_t *result); libc_hidden_proto (__inet6_scopeid_pton)