glibc:zack/elf-builtin-expect-conversion

Last commit made on 2018-06-12
Get this branch:
git clone -b zack/elf-builtin-expect-conversion https://git.launchpad.net/glibc

Branch merges

Branch information

Name:
zack/elf-builtin-expect-conversion
Repository:
lp:glibc

Recent commits

2ba9f2e... by Zack Weinberg

Convert __builtin_expect to __glibc_(un)likely throughout elf/.

In the previous patch I didn't change a use of __builtin_expect to
__glibc_(un)likely that happened to be right next to the code I was
actually working on; Andreas asked why not, and I said that there were
a bunch more uses of __builtin_expect in that file and I would convert
them all in a separate patch. This is that patch, converting all of
elf/.

I would appreciate someone checking over this patch very carefully
indeed. In a whole bunch of places, __builtin_expect was used in a
way that did not map mechanically to the newer convention. The test
suite caught one mistake; I'm not confident I didn't make any more.

Writing this patch gave me a deeper appreciation for why we _want_ to
switch to __glibc_(un)likely, but also for how difficult it can be. I
now think that people should _not_ be asked to change existing uses of
__builtin_expect in a patch whose purpose is something else.

 * elf/dl-addr.c, elf/dl-cache.c, elf/dl-close.c, elf/dl-deps.c
 * elf/dl-environ.c, elf/dl-error-skeleton.c, elf/dl-fini.c
 * elf/dl-fptr.c, elf/dl-init.c, elf/dl-libc.c, elf/dl-minimal.c
 * elf/dl-open.c, elf/dl-reloc.c, elf/dl-runtime.c
 * elf/dl-sysdep.c, elf/dl-tls.c, elf/dl-version.c, elf/ldconfig.c
 * elf/rtld.c: Replace __builtin_expect with __glibc_likely or
 __glibc_unlikely, as appropriate, throughout.

329ea51... by Zack Weinberg

Avoid cancellable I/O primitives in ld.so.

Neither the <dlfcn.h> entry points, nor lazy symbol resolution, nor
initial shared library load-up, are cancellation points, so ld.so
should exclusively use I/O primitives that are not cancellable. We
currently achieve this by having the cancellation hooks compile as
no-ops when IS_IN(rtld); this patch changes to using exclusively
_nocancel primitives in the source code instead, which makes the
intent clearer and significantly reduces the amount of code compiled
under IS_IN(rtld) as well as IS_IN(libc) -- in particular,
elf/Makefile no longer thinks we require a copy of unwind.c in
rtld-libc.a. (The older mechanism is preserved as a backstop.)

The bulk of the change is splitting up the files that define the
_nocancel I/O functions, so they don't also define the variants that
*are* cancellation points; after which, the existing logic for picking
out the bits of libc that need to be recompiled as part of ld.so Just
Works. I did this for all of the _nocancel functions, not just the
ones used by ld.so, for consistency.

fcntl was a little tricky because it's only a cancellation point for
certain opcodes (F_SETLKW(64), which can block), and the existing
__fcntl_nocancel wasn't applying the FCNTL_ADJUST_CMD hook, which
strikes me as asking for trouble, especially as the only nontrivial
definition of FCNTL_ADJUST_CMD (for powerpc64) changes F_*LK* opcodes.
To fix this, fcntl_common moves to fcntl_nocancel.c along with
__fcntl_nocancel, and changes its name to the extern (but hidden)
symbol __fcntl_nocancel_adjusted, so that regular fcntl can continue
calling it. __fcntl_nocancel now applies FCNTL_ADJUST_CMD; so that
both both fcntl.c and fcntl_nocancel.c can see it, the only nontrivial
definition moves from sysdeps/u/s/l/powerpc/powerpc64/fcntl.c to
.../powerpc64/sysdep.h and becomes entirely a macro, instead of a macro
that calls an inline function.

The nptl version of libpthread also changes a little, because its
"compat-routines" formerly included files that defined all the
_nocancel functions it uses; instead of continuing to duplicate them,
I exported the relevant ones from libc.so as GLIBC_PRIVATE. Since the
Linux fcntl.c calls a function defined by fcntl_nocancel.c, it can no
longer be used from libpthread.so; instead, introduce a custom
forwarder, pt-fcntl.c, and export __libc_fcntl from libc.so as
GLIBC_PRIVATE. The nios2-linux ABI doesn't include a copy of vfork()
in libpthread, and it was handling that by manipulating
libpthread-routines in .../linux/nios2/Makefile; it is cleaner to do
what other such ports do, and have a pt-vfork.S that defines no symbols.

Right now, it appears that Hurd does not implement _nocancel I/O, so
sysdeps/generic/not-cancel.h will forward everything back to the
regular functions. This changed the names of some of the functions
that sysdeps/mach/hurd/dl-sysdep.c needs to interpose.

 * elf/dl-load.c, elf/dl-misc.c, elf/dl-profile.c, elf/rtld.c
 * sysdeps/unix/sysv/linux/dl-sysdep.c
 Include not-cancel.h. Use __close_nocancel instead of __close,
 __open64_nocancel instead of __open, __read_nocancel instead of
 __libc_read, and __write_nocancel instead of __libc_write.

 * csu/check_fds.c (check_one_fd)
 * sysdeps/posix/fdopendir.c (__fdopendir)
 * sysdeps/posix/opendir.c (__alloc_dir): Use __fcntl_nocancel
        instead of __fcntl and/or __libc_fcntl.

 * sysdeps/unix/sysv/linux/pthread_setname.c (pthread_setname_np)
 * sysdeps/unix/sysv/linux/pthread_getname.c (pthread_getname_np)
        * sysdeps/unix/sysv/linux/i386/smp.h (is_smp_system):
 Use __open64_nocancel instead of __open_nocancel.

 * sysdeps/unix/sysv/linux/not-cancel.h: Move all of the
 hidden_proto declarations to the end and issue them if either
 IS_IN(libc) or IS_IN(rtld).
 * sysdeps/unix/sysv/linux/Makefile [subdir=io] (sysdep_routines):
 Add close_nocancel, fcntl_nocancel, nanosleep_nocancel,
 open_nocancel, open64_nocancel, openat_nocancel, pause_nocancel,
 read_nocancel, waitpid_nocancel, write_nocancel.

        * io/Versions [GLIBC_PRIVATE]: Add __libc_fcntl,
        __fcntl_nocancel, __open64_nocancel, __write_nocancel.
        * posix/Versions: Add __nanosleep_nocancel, __pause_nocancel.

        * nptl/pt-fcntl.c: New file.
        * nptl/Makefile (pthread-compat-wrappers): Remove fcntl.
        (libpthread-routines): Add pt-fcntl.
        * include/fcntl.h (__fcntl_nocancel_adjusted): New function.
        (__libc_fcntl): Remove attribute_hidden.
 * sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Call
 __fcntl_nocancel_adjusted, not fcntl_common.
        (__fcntl_nocancel): Move to new file fcntl_nocancel.c.
 (fcntl_common): Rename to __fcntl_nocancel_adjusted; also move
 to fcntl_nocancel.c.
 * sysdeps/unix/sysv/linux/fcntl_nocancel.c: New file.
 * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Remove file.
 * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h:
 Define FCNTL_ADJUST_CMD here, as a self-contained macro.

 * sysdeps/unix/sysv/linux/close.c: Move __close_nocancel to...
 * sysdeps/unix/sysv/linux/close_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/nanosleep.c: Move __nanosleep_nocancel to...
 * sysdeps/unix/sysv/linux/nanosleep_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/open.c: Move __open_nocancel to...
 * sysdeps/unix/sysv/linux/open_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/open64.c: Move __open64_nocancel to...
 * sysdeps/unix/sysv/linux/open64_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/openat.c: Move __openat_nocancel to...
 * sysdeps/unix/sysv/linux/openat_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/openat64.c: Move __openat64_nocancel to...
 * sysdeps/unix/sysv/linux/openat64_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/pause.c: Move __pause_nocancel to...
 * sysdeps/unix/sysv/linux/pause_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/read.c: Move __read_nocancel to...
 * sysdeps/unix/sysv/linux/read_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/waitpid.c: Move __waitpid_nocancel to...
 * sysdeps/unix/sysv/linux/waitpid_nocancel.c: ...this new file.
 * sysdeps/unix/sysv/linux/write.c: Move __write_nocancel to...
 * sysdeps/unix/sysv/linux/write_nocancel.c: ...this new file.

        * sysdeps/unix/sysv/linux/nios2/Makefile: Don't override
        libpthread-routines.
        * sysdeps/unix/sysv/linux/nios2/pt-vfork.S: New file which
        defines nothing.

        * sysdeps/mach/hurd/dl-sysdep.c: Define __read instead of
        __libc_read, and __write instead of __libc_write. Define
        __open64 in addition to __open.

0221ce2... by "H.J. Lu" <email address hidden>

i386: Change offset of __private_ss to 0x30 [BZ #23250]

sysdeps/i386/nptl/tls.h has

typedef struct
{
  void *tcb; /* Pointer to the TCB. Not necessarily the
                           thread descriptor used by libpthread. */
  dtv_t *dtv;
  void *self; /* Pointer to the thread descriptor. */
  int multiple_threads;
  uintptr_t sysinfo;
  uintptr_t stack_guard;
  uintptr_t pointer_guard;
  int gscope_flag;
  int __glibc_reserved1;
  /* Reservation of some values for the TM ABI. */
  void *__private_tm[4];
  /* GCC split stack support. */
  void *__private_ss;
} tcbhead_t;

The offset of __private_ss is 0x34. But GCC defines

/* We steal the last transactional memory word. */
 #define TARGET_THREAD_SPLIT_STACK_OFFSET 0x30

and libgcc/config/i386/morestack.S has

 cmpl %gs:0x30,%eax # See if we have enough space.
 movl %eax,%gs:0x30 # Save the new stack boundary.
 movl %eax,%gs:0x30 # Save the new stack boundary.
 movl %ecx,%gs:0x30 # Save new stack boundary.
 movl %eax,%gs:0x30
 movl %gs:0x30,%eax
 movl %eax,%gs:0x30

Since update TARGET_THREAD_SPLIT_STACK_OFFSET changes split stack ABI,
this patch updates tcbhead_t to match GCC.

 [BZ #23250]
 [BZ #10686]
 * sysdeps/i386/nptl/tls.h (tcbhead_t): Change __private_tm[4]
 to _private_tm[3] and add __glibc_reserved2.
 Add _Static_assert of offset of __private_ss == 0x30.
 * sysdeps/x86_64/nptl/tls.h: Add _Static_assert of offset of
 __private_ss == 0x40 for ILP32 and == 0x70 for LP64.

e826574... by Florian Weimer

x86: Make strncmp usable from rtld

Due to the way the conditions were written, the rtld build of strncmp
ended up with no definition of the strncmp symbol at all: The
implementations were renamed for use within an IFUNC resolver, but the
IFUNC resolver itself was missing (because rtld does not use IFUNCs).

Reviewed-by: Carlos O'Donell <email address hidden>

c4ad578... by Rafal Luzynski <email address hidden>

gd_GB, hsb_DE, wa_BE: Add alternative month names (bug 23140).

As a followup of fixing bug 10871, these three languages now support two
grammatical cases of the month names.

This commit does not resolve the bug because there are more languages
to be committed.

 [BZ #23140]
 * localedata/locales/gd_GB (mon): Rename to...
 (alt_mon): This.
 (mon): Import from CLDR (genitive case).
 * localedata/locales/hsb_DE (mon): Rename to...
 (alt_mon): This.
 (mon): Import from CLDR (genitive case).
 * localedata/locales/wa_BE (mon): Rename to...
 (alt_mon): This.
 (mon): Add, fill with the proper genitive forms, but CLDR data
 is incomplete; completed according to the comments in this file.
 (d_t_fmt): Do not use "di" before the month name, no longer needed.

 * localedata/locales/wa_BE (country_name): Reword
 "Beljike" -> "Beldjike".

ca121b1... by Joseph Myers <email address hidden>

Fix ldbl-96 fma (Inf, Inf, finite) (bug 23272).

As reported in bug 23272, the ldbl-96 implementation of fma (fma for
double, in terms of ldbl-96 as the internal arithmetic type, as used
on 32-bit x86) is missing some of the special-case handling for
non-finite arguments, resulting in incorrect NaN results when the
first two arguments are infinities, the third is finite and so the
infinities go through the logic for finite arguments. This patch
fixes it by handling all cases of non-finite arguments up front, with
additional fma tests for the problem cases being added to the
testsuite.

Tested for x86_64 and x86.

 [BZ #23272]
 * sysdeps/ieee754/ldbl-96/s_fma.c (__fma): Start by handling all
 cases of non-finite arguments.
 * math/libm-test-fma.inc (fma_test_data): Add more tests.

2b69fec... by John David Anglin <email address hidden>

The hppa-linux target still requires an executable stack for kernel
syscall restarts and signal returns. Thus, we need to xfail the
check-execstack test.

        [BZ #23174]
        * sysdeps/unix/sysv/linux/hppa/Makefile: xfail check-execstack.

283d985... by Adhemerval Zanella

posix: Fix posix_spawnp to not execute invalid binaries in non compat mode (BZ#23264)

Current posix_spawnp implementation wrongly tries to execute invalid
binaries (for instance script without shebang) as a shell script in
non compat mode. It was a regression introduced by
9ff72da471a509a8c19791efe469f47fa6977410 when __spawni started to use
__execvpe instead of __execve (glibc __execvpe try to execute ENOEXEC
as shell script regardless).

This patch fixes it by using an internal symbol (__execvpex) with the
faulty semantic (since compat mode is handled by spawni.c itself).

It was reported by Daniel Drake on libc-help [1].

Checked on x86_64-linux-gnu and i686-linux-gnu.

 [BZ #23264]
 * include/unistd.h (__execvpex): New prototype.
 * posix/Makefile (tests): Add tst-spawn4.
 (tests-internal): Add tst-spawn4-compat.
 * posix/execvpe.c (__execvpe_common, __execvpex): New functions.
 * posix/tst-spawn4-compat.c: New file.
 * posix/tst-spawn4.c: Likewise.
 * sysdeps/unix/sysv/linux/spawni.c (__spawni): Do not interpret invalid
 binaries as shell scripts.
 * sysdeps/posix/spawni.c (__spawni): Likewise.

[1] https://sourceware.org/ml/libc-help/2018-06/msg00012.html

67c0579... by "H.J. Lu" <email address hidden>

Mark _init and _fini as hidden [BZ #23145]

_init and _fini are special functions provided by glibc for linker to
define DT_INIT and DT_FINI in executable and shared library. They
should never be put in dynamic symbol table. This patch marks them as
hidden to remove them from dynamic symbol table.

Tested with build-many-glibcs.py.

 [BZ #23145]
 * elf/Makefile (tests-special): Add $(objpfx)check-initfini.out.
 ($(all-built-dso:=.dynsym): New target.
 (common-generated): Add $(all-built-dso:$(common-objpfx)%=%.dynsym).
 ($(objpfx)check-initfini.out): New target.
 (generated): Add check-initfini.out.
 * scripts/check-initfini.awk: New file.
 * sysdeps/aarch64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/alpha/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/arm/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/hppa/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/i386/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/ia64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/m68k/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/microblaze/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/mips/mips32/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/mips/mips64/n32/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/mips/mips64/n64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/nios2/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/powerpc/powerpc32/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/powerpc/powerpc64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/s390/s390-32/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/s390/s390-64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/sh/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/sparc/crti.S (_init): Mark as hidden.
 (_fini): Likewise.
 * sysdeps/x86_64/crti.S (_init): Mark as hidden.
 (_fini): Likewise.

1c09524... by Tulio Magno Quites Machado Filho <email address hidden>

powerpc64le: Fix TFtype in sqrtf128 when using -mabi=ieeelongdouble

When building with -mlong-double-128 or -mabi=ibmlongdouble, TFtype
represents the IBM 128-bit extended floating point type, while KFtype
represents the IEEE 128-bit floating point type.
The soft float implementation of e_sqrtf128 had to redefine TFtype and
TF in order to workaround this issue. However, this behavior changes
when -mabi=ieeelongdouble is used and the macros are not necessary.

 * sysdeps/powerpc/powerpc64/le/fpu/e_sqrtf128.c
 [__HAVE_FLOAT128_UNLIKE_LDBL] (TFtype, TF): Restrict TFtype
 and TF redirection to KFtype and KF only when the default
 long double type is not the IEEE 128-bit floating point type.

Signed-off-by: Tulio Magno Quites Machado Filho <email address hidden>