cancellation \
lowlevellock \
lll_timedlock_wait lll_timedwait_tid \
- pt-fork pt-vfork \
+ pt-fork \
$(pthread-compat-wrappers) \
pt-raise pt-system \
+ pt-compat-stubs \
flockfile ftrylockfile funlockfile \
sigaction \
herrno res pt-allocrtsig \
# pthread_setresgid
libpthread-shared-only-routines = version pt-interp pt-allocrtsig \
- unwind-forcedunwind
+ pt-compat-stubs unwind-forcedunwind
# Since cancellation handling is in large parts handled using exceptions
# we have to compile some files with exception handling enabled, some
+++ /dev/null
-/* vfork ABI-compatibility entry points for libpthread.
- Copyright (C) 2014-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <unistd.h>
-#include <shlib-compat.h>
-
-/* libpthread used to have its own vfork implementation that differed
- from libc's only in having a pointless micro-optimization. There
- is no longer any use to having a separate copy in libpthread, but
- the historical ABI requires it. For static linking, there is no
- need to provide anything here--the libc version will be linked in.
- For shared library ABI compatibility, there must be __vfork and
- vfork symbols in libpthread.so; so we define them using IFUNC to
- redirect to the libc function. */
-
-/* Note! If the architecture doesn't support IFUNC, then we need an
- alternate target-specific mechanism to implement this. So we just
- assume IFUNC here and require that the target override this file
- if necessary.
-
- If the architecture can assume all supported versions of gcc will
- produce a tail-call to __libc_vfork, consider including the version
- in sysdeps/unix/sysv/linux/aarch64/pt-vfork.c. */
-
-#if !HAVE_IFUNC
-# error "must write pt-vfork for this machine or get IFUNC support"
-#endif
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
- || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
-
-extern __typeof (vfork) __libc_vfork; /* Defined in libc. */
-
-# undef INIT_ARCH
-# define INIT_ARCH()
-# define DEFINE_VFORK(name) libc_ifunc (name, &__libc_vfork)
-
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
-extern __typeof(vfork) vfork_ifunc;
-DEFINE_VFORK (vfork_ifunc)
-compat_symbol (libpthread, vfork_ifunc, vfork, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
-extern __typeof(vfork) __vfork_ifunc;
-DEFINE_VFORK (__vfork_ifunc)
-compat_symbol (libpthread, __vfork_ifunc, __vfork, GLIBC_2_1_2);
-#endif
/* If we don't have vfork, fork is close enough. */
__pid_t
-__vfork (void)
+__libc_vfork (void)
{
return __fork ();
}
+strong_alias (__libc_vfork, __vfork)
libc_hidden_def (__vfork)
-
-weak_alias (__vfork, vfork)
+weak_alias (__libc_vfork, vfork)
movk PTR_REG (R), #:abs_g0_nc:NAME;
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ b JUMPTARGET(dest)
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
#define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ b PLTJMP(dest)
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
--- /dev/null
+/* Compatibility stubs for functions formerly exposed by libpthread.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* The functions defined by this file used to have two different
+ definitions, one in libc.so and one in libpthread.so. Nowadays,
+ only the version in libc is necessary, but libpthread must continue
+ to expose these symbols for compatibility's sake. The stubs just
+ jump to the definition in libc.
+
+ This file is written in heavily macro-ized assembly language
+ because one of the stubs that it needs to define is vfork, and the
+ implementation of vfork must not touch the stack. Having done the
+ work to handle that, we may as well reuse the mechanism for all of
+ the stubs. */
+
+#include <shlib-compat.h>
+#include <sysdep.h>
+
+ compat_text_section
+
+#ifndef SIBCALL_ENTRY
+# define SIBCALL_ENTRY(name) ENTRY(name)
+#endif
+
+#define define_stub(name) \
+ define_stub_1(__pstub_##name, __libc_##name)
+#define define_stub_1(pstub_name, libc_name) \
+ SIBCALL_ENTRY(pstub_name) ASM_LINE_SEP \
+ SIBCALL(libc_name) ASM_LINE_SEP \
+ END(pstub_name)
+
+#define compat_stub(base, sym, ver) \
+ compat_stub_1(base, sym, ver, __COUNTER__)
+#define compat_stub_1(base, sym, ver, tag) \
+ compat_stub_2(base, sym, ver, tag)
+#define compat_stub_2(base, sym, ver, tag) \
+ compat_stub_3(__pstub_##base, __pstub_##base##_##tag, sym, ver)
+#define compat_stub_3(base, nonce, sym, ver) \
+ weak_alias(base, nonce) ASM_LINE_SEP \
+ compat_symbol(libpthread, nonce, sym, ver)
+
+#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
+ || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
+
+ define_stub(vfork)
+# if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
+ compat_stub(vfork, vfork, GLIBC_2_0)
+# endif
+# if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
+ compat_stub(vfork, __vfork, GLIBC_2_1_2)
+# endif
+
+#endif
# ifndef JUMPTARGET
# define JUMPTARGET(sym) sym
# endif
+
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+# ifndef SIBCALL
+# define SIBCALL(dest) \
+ .error "Missing definition of SIBCALL"
+# endif
#endif
-/* Makros to generate eh_frame unwind information. */
+
+/* Macros to generate eh_frame unwind information. */
#ifdef __ASSEMBLER__
# define cfi_startproc .cfi_startproc
# define cfi_endproc .cfi_endproc
#define PSEUDO_END(name) \
END (name)
+
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ b JUMPTARGET(dest)
+
#undef JUMPTARGET
#define JUMPTARGET(name) name
#define SYSCALL_PIC_SETUP /* Nothing. */
#undef END
#define END(sym) .endp C_SYMBOL_NAME(sym)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ .mib; nop 0; nop 0; br.sptk.many C_SYMBOL_NAME(dest);;
+
#endif /* ASSEMBLER */
# define JUMPTARGET(name) name
# endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ jbra JUMPTARGET(dest)
+
#endif /* __ASSEMBLER__ */
# define PSEUDO_END(name) \
END (name)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ brid JUMPTARGET(dest); nop
+
# undef JUMPTARGET
# ifdef PIC
# define JUMPTARGET(name) name##@PLTPC
# else
# define CALL_MCOUNT \
mov r8, ra; \
- call _mount; \
+ call _mcount; \
mov ra, r8; \
ret;
# endif
# define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#ifdef __PIC__
+#define SIBCALL(dest) \
+ nextpc r2; \
+1: \
+ movhi r3, %hiadj(_gp_got - 1b); \
+ addi r3, r3, %lo(_gp_got - 1b); \
+ addi r2, r2, r3; \
+ ldw r2, %call(dest)(r2); \
+ jmp r2
+#else
+#define SIBCALL(dest) \
+ jmpi dest
+#endif
+
+
#endif /* __ASSEMBLER__ */
cfi_endproc; \
ASM_SIZE_DIRECTIVE(name)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#define SIBCALL(dest) \
+ b JUMPTARGET(dest)
+
#if !IS_IN(rtld) && !defined(__SPE__)
# define ABORT_TRANSACTION_IMPL \
cmpwi 2,0; \
#define PSEUDO_END_ERRVAL(name) \
END (name)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers.
+
+ The linker will not allow sibling calls through the PLT on
+ PowerPC-64, and even if it did, it wouldn't be safe, because the
+ PLT stub would clobber our caller's save slot for r2. Instead we
+ must perform a manual indirect jump. Even this is only safe
+ because the functions that use SIBCALL are never called from within
+ their own shared object; if they were, DEST would return to code
+ that wasn't expecting to need to restore r2. */
+#define SIBCALL_ENTRY(name) ENTRY_TOCLESS(name)
+#undef SIBCALL
+#if _CALL_ELF != 2
+#define SIBCALL(dest) \
+ addis 11, 2, 1f@toc@ha; \
+ ld 11, 1f@toc@l(11); \
+ ld 12, 0(11); \
+ ld 2, 8(11); \
+ mtctr 12; \
+ ld 11, 16(11); \
+ bctr; \
+ .section ".toc","aw"; \
+1: .quad dest; \
+ .previous
+#else
+#define SIBCALL(dest) \
+0: addis 12, 12, 1f-0b @ha; \
+ addi 12, 12, 1f-0b @l; \
+ ld 12, 0(12); \
+ mtctr 12; \
+ bctr; \
+ .section ".data.rel.ro","aw",@progbits; \
+1: .quad dest; \
+ .previous
+
+#endif
+
#else /* !__ASSEMBLER__ */
#if _CALL_ELF != 2
#define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ jg JUMPTARGET(dest)
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
#define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ jg JUMPTARGET(dest)
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
#define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ mov.l 1f, r1; \
+ braf r1; \
+ nop; \
+0: .align 2; \
+1: .long dest@PLT+(.-0b)
+
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */
#undef LOC
#define LOC(name) .L##name
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ jmp dest
+
#endif /* __ASSEMBLER__ */
#define CALL_MCOUNT /* Do nothing. */
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ j plt(dest)
+
/* Local label name for asm code. */
#define L(name) .L##name
#undef PSEUDO_END_ERRVAL
#define PSEUDO_END_ERRVAL(sym) END(sym)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#define SIBCALL(dest) \
+ ldgp gp, 0(pv); \
+ lda pv, dest; \
+ jmp (pv), dest
+
#define ret_ERRVAL ret
#define r0 v0
bne a3, zero, 99b; \
L(syse1):
#endif
+
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#ifdef __PIC__
+#define SIBCALL(dest) \
+ .set nomips16; \
+ .set noreorder; \
+ .cpload $25; \
+ .set nomacro; \
+ lw $25, %call16(dest)($28); \
+ nop; \
+ .reloc 1f, R_MIPS_JALR, dest; \
+1: jr $25; \
+ nop
+#else
+#define SIBCALL(dest) \
+ .set nomips16; \
+ .set noreorder; \
+ .set nomacro; \
+ j dest; \
+ nop
+#endif
L(syse1):
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#ifdef __PIC__
+/* There's no PLT on MIPS/n32, we are expected to load the address by
+ hand, but the usual gp register on MIPS ($28) is call-saved so we
+ can't use it. Use $at ($1) instead. */
+#define SIBCALL(dest) \
+ .set nomips16; \
+ .set noreorder; \
+ .set nomacro; \
+ .set noat; \
+0: lui $1, %hi(%neg(%gp_rel(0b))); \
+ addiu $1, $1, %lo(%neg(%gp_rel(0b))); \
+ addu $1, $1, $25; \
+ lw $1, %call16(dest)($1); \
+ nop; \
+ .reloc 1f, R_MIPS_JALR, dest; \
+1: jr $25; \
+ nop
+#else
+#define SIBCALL(dest) \
+ .set nomips16; \
+ .set noreorder; \
+ .set nomacro; \
+ j dest; \
+ nop
#endif
+
+#endif /* __ASSEMBLER__ */
L(syse1):
#endif
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#define SIBCALL(dest) \
+/* There's no PLT on MIPS/n64, we are expected to load the address by
+ hand, but the usual gp register on MIPS ($28) is call-saved so we
+ can't use it. Use $at ($1) instead. */
+#define SIBCALL(dest) \
+ .set nomips16; \
+ .set noreorder; \
+ .set nomacro; \
+ .set noat; \
+0: lui $1, %hi(%neg(%gp_rel(0b))); \
+ daddiu $1, $1, %lo(%neg(%gp_rel(0b))); \
+ daddu $1, $1, $25; \
+ ld $1, %call16(dest)($1); \
+ nop; \
+ .reloc 1f, R_MIPS_JALR, dest; \
+1: jr $25; \
+ nop
+
#endif
+++ /dev/null
-/* vfork ABI-compatibility entry points for libpthread.
- Copyright (C) 2014-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <shlib-compat.h>
-
-/* libpthread used to have its own vfork implementation that differed
- from libc's only in having a pointless micro-optimization. There
- is no longer any use to having a separate copy in libpthread, but
- the historical ABI requires it. For static linking, there is no
- need to provide anything here--the libc version will be linked in.
- For shared library ABI compatibility, there must be __vfork and
- vfork symbols in libpthread.so. */
-
-#if HAVE_IFUNC
-# include <nptl/pt-vfork.c>
-#elif (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
- || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
-
-/* Thankfully, on AArch64 we can rely on the compiler generating
- a tail call here. */
-
-extern void __libc_vfork (void);
-
-void
-vfork_compat (void)
-{
- __libc_vfork ();
-}
-
-# if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
-# endif
-
-# if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
-strong_alias (vfork_compat, vfork_compat2)
-compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2);
-# endif
-
-#endif
+++ /dev/null
-/* vfork ABI-compatibility entry points for libpthread.
- Copyright (C) 2014-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <shlib-compat.h>
-
-/* libpthread used to have its own vfork implementation that differed
- from libc's only in having a pointless micro-optimization. There
- is no longer any use to having a separate copy in libpthread, but
- the historical ABI requires it. For static linking, there is no
- need to provide anything here--the libc version will be linked in.
- For shared library ABI compatibility, there must be __vfork and
- vfork symbols in libpthread.so. */
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
- || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
-
-#include <vfork.S>
-
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
-compat_symbol (libpthread, __libc_vfork, vfork, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
-strong_alias (__libc_vfork, __vfork_compat)
-compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
-#endif
+++ /dev/null
-/* Copyright (C) 2005-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#include <tcb-offsets.h>
-
-/* Clone the calling process, but without copying the whole address space.
- The calling process is suspended until the new process exits or is
- replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
- and the process ID of the new process to the old process. */
-
-.Lthread_start: ASM_LINE_SEP
-
- /* r26, r25, r24, r23 are free since vfork has no arguments */
-ENTRY(__vfork)
- /* We must not create a frame. When the child unwinds to call
- exec it will clobber the same frame that the parent
- needs to unwind. */
-
- /* Save the PIC register. */
-#ifdef PIC
- copy %r19, %r25 /* parent */
-#endif
-
- /* Syscall saves and restores all register states */
- ble 0x100(%sr2,%r0)
- ldi __NR_vfork,%r20
-
- /* Check for error */
- ldi -4096,%r1
- comclr,>>= %r1,%ret0,%r0 /* Note: unsigned compare. */
- b,n .Lerror
-
- /* Return, and DO NOT restore rp. The child may have called
- functions that updated the frame's rp. This works because
- the kernel ensures rp is preserved across the vfork
- syscall. */
- bv,n %r0(%rp)
-
-.Lerror:
- /* Now we need a stack to call a function. We are assured
- that there is no child now, so it's safe to create
- a frame. */
- stw %rp, -20(%sp)
- .cfi_offset 2, -20
- stwm %r3, 64(%sp)
- .cfi_def_cfa_offset -64
- .cfi_offset 3, 0
- stw %sp, -4(%sp)
-
- sub %r0,%ret0,%r3
- SYSCALL_ERROR_HANDLER
- /* Restore the PIC register (in delay slot) on error */
-#ifdef PIC
- copy %r25, %r19 /* parent */
-#else
- nop
-#endif
- /* Write syscall return into errno location */
- stw %r3, 0(%ret0)
- ldw -84(%sp), %rp
- bv %r0(%rp)
- ldwm -64(%sp), %r3
-PSEUDO_END (__vfork)
-libc_hidden_def (__vfork)
-weak_alias (__vfork, vfork)
+++ /dev/null
-/* vfork ABI-compatibility entry points for libpthread. IA64 version.
- Copyright (C) 2014-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <shlib-compat.h>
-
-/* libpthread used to have its own vfork implementation that differed
- from libc's only in having a pointless micro-optimization. There
- is no longer any use to having a separate copy in libpthread, but
- the historical ABI requires it. For static linking, there is no
- need to provide anything here--the libc version will be linked in.
- For shared library ABI compatibility, there must be __vfork and
- vfork symbols in libpthread.so. */
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
- || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
-
-LOCAL_LEAF (vfork_compat)
- br __libc_vfork
- ;;
-END (vfork_compat)
-
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
-weak_alias (vfork_compat, vfork)
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0);
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
-strong_alias (vfork_compat, __vfork_compat)
-compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
-#endif
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/aarch64/pt-vfork.c>
+++ /dev/null
-/* vfork ABI-compatibility entry points for libpthread.
- Copyright (C) 2014-2018 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <shlib-compat.h>
-
-/* libpthread used to have its own vfork implementation that differed
- from libc's only in having a pointless micro-optimization. There
- is no longer any use to having a separate copy in libpthread, but
- the historical ABI requires it. For static linking, there is no
- need to provide anything here--the libc version will be linked in.
- For shared library ABI compatibility, there must be __vfork and
- vfork symbols in libpthread.so.
-
- As of GCC 7, microblaze can *not* rely on the compiler to generate
- a tail call from this vfork to __libc_vfork. */
-
-#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
- || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
-
-ENTRY (vfork_compat)
- bri __libc_vfork@PLT
-END (vfork_compat)
-
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
-compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0)
-#endif
-
-#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
-strong_alias (vfork_compat, vfork_compat2)
-compat_symbol (libpthread, vfork_compat2, __vfork, GLIBC_2_1_2)
-#endif
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
+++ /dev/null
-/* Not needed. */
# undef ret_ERRVAL
# define ret_ERRVAL ret
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ tail JUMPTARGET(dest)
+
#endif /* __ASSEMBLER__ */
/* In order to get __set_errno() definition in INLINE_SYSCALL. */
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
+++ /dev/null
-#include <sysdeps/unix/sysv/linux/aarch64/pt-vfork.c>
#define ENTRY_CHK(name) ENTRY (name)
#define END_CHK(name) END (name)
+/* Make a "sibling call" to DEST -- that is, transfer control to DEST
+ as-if it had been the function called by the caller of this function.
+ DEST is likely to be defined in a different shared object. Only
+ ever used immediately after ENTRY. Must not touch the stack at
+ all, and must preserve all argument and call-saved registers. */
+#undef SIBCALL
+#define SIBCALL(dest) \
+ jmp JUMPTARGET(dest)
+
/* Since C identifiers are not normally prefixed with an underscore
on this system, the asm identifier `syscall_error' intrudes on the
C name space. Make sure we use an innocuous name. */