[git commit] vfork: make all archs consistent
Bernhard Reutner-Fischer
rep.dot.nop at gmail.com
Fri Jun 15 12:00:40 UTC 2012
commit: http://git.uclibc.org/uClibc/commit/?id=0a043c30ee71245dfe7c9d82d654312c5e1f6127
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master
__vfork is hidden.
__GI_vfork is strong (not weak as it was).
vfork is weak.
e1 can use the generic version.
Note: libc_hidden_def(x) has different meaning in .c and .S files.
Signed-off-by: Peter S. Mazinger <ps.m at gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
---
libc/sysdeps/linux/arm/vfork.S | 2 +-
libc/sysdeps/linux/avr32/vfork.S | 4 ++--
libc/sysdeps/linux/common/vfork.c | 22 +++++++---------------
libc/sysdeps/linux/cris/sysdep.h | 8 ++++++++
libc/sysdeps/linux/cris/vfork.S | 4 ++--
libc/sysdeps/linux/e1/Makefile | 2 +-
libc/sysdeps/linux/e1/vfork.c | 14 --------------
libc/sysdeps/linux/frv/vfork.S | 8 ++------
libc/sysdeps/linux/h8300/vfork.S | 5 ++---
libc/sysdeps/linux/i386/vfork.S | 2 +-
libc/sysdeps/linux/i960/vfork.S | 3 ++-
libc/sysdeps/linux/ia64/sysdep.h | 9 +++++++++
libc/sysdeps/linux/ia64/vfork.S | 4 ++--
libc/sysdeps/linux/m68k/vfork.S | 7 ++-----
libc/sysdeps/linux/microblaze/vfork.S | 12 +++---------
libc/sysdeps/linux/mips/vfork.S | 4 +++-
libc/sysdeps/linux/nios/vfork.S | 5 +----
libc/sysdeps/linux/nios2/vfork.S | 8 ++------
libc/sysdeps/linux/powerpc/vfork.S | 2 +-
libc/sysdeps/linux/sh/vfork.S | 4 +---
libc/sysdeps/linux/sparc/vfork.S | 2 +-
libc/sysdeps/linux/v850/vfork.S | 12 +++---------
libc/sysdeps/linux/x86_64/vfork.S | 2 +-
libc/sysdeps/linux/xtensa/sysdep.h | 10 ++++++++++
libc/sysdeps/linux/xtensa/vfork.S | 5 ++---
25 files changed, 69 insertions(+), 91 deletions(-)
diff --git a/libc/sysdeps/linux/arm/vfork.S b/libc/sysdeps/linux/arm/vfork.S
index 17d6a4d..6a1c65e 100644
--- a/libc/sysdeps/linux/arm/vfork.S
+++ b/libc/sysdeps/linux/arm/vfork.S
@@ -104,5 +104,5 @@ __error:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
#endif
diff --git a/libc/sysdeps/linux/avr32/vfork.S b/libc/sysdeps/linux/avr32/vfork.S
index 03ca99f..b2c5ceb 100644
--- a/libc/sysdeps/linux/avr32/vfork.S
+++ b/libc/sysdeps/linux/avr32/vfork.S
@@ -17,10 +17,10 @@
* Fortunately, the Linux kernel preserves LR across system calls.
*/
-#include <features.h>
#include <sys/syscall.h>
.global __vfork
+ .hidden __vfork
.type __vfork, at function
.align 1
__vfork:
@@ -55,4 +55,4 @@ __vfork:
.size __vfork, . - __vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/common/vfork.c b/libc/sysdeps/linux/common/vfork.c
index e7c9208..a70ed4a 100644
--- a/libc/sysdeps/linux/common/vfork.c
+++ b/libc/sysdeps/linux/common/vfork.c
@@ -4,30 +4,22 @@
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
-#include <unistd.h>
-#include <sys/types.h>
#include <sys/syscall.h>
+#if (defined __NR_vfork || (defined __ARCH_USE_MMU__ && defined __NR_fork)) && (defined __USE_BSD || defined __USE_XOPEN_EXTENDED)
+# include <unistd.h>
extern __typeof(vfork) __vfork attribute_hidden;
-#ifdef __NR_vfork
-
-# define __NR___vfork __NR_vfork
+# ifdef __NR_vfork
+# define __NR___vfork __NR_vfork
_syscall0(pid_t, __vfork)
-
-weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
-
-#elif defined __ARCH_USE_MMU__ && defined __NR_fork
-
+# else
/* Trivial implementation for arches that lack vfork */
-
pid_t __vfork(void)
{
return fork();
}
-
-weak_alias(__vfork,vfork)
+# endif
+strong_alias(__vfork,vfork)
libc_hidden_weak(vfork)
-
#endif
diff --git a/libc/sysdeps/linux/cris/sysdep.h b/libc/sysdeps/linux/cris/sysdep.h
index 5960fe2..921dbb3 100644
--- a/libc/sysdeps/linux/cris/sysdep.h
+++ b/libc/sysdeps/linux/cris/sysdep.h
@@ -127,6 +127,14 @@
.align ALIGNARG (2) @ \
C_LABEL(name)
+#define HIDDEN_ENTRY(name) \
+ .text @ \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) @ \
+ .hidden C_SYMBOL_NAME (name) @ \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function) @ \
+ .align ALIGNARG (2) @ \
+ C_LABEL(name)
+
#undef END
#define END(name) \
ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name))
diff --git a/libc/sysdeps/linux/cris/vfork.S b/libc/sysdeps/linux/cris/vfork.S
index ea8a81d..964eca4 100644
--- a/libc/sysdeps/linux/cris/vfork.S
+++ b/libc/sysdeps/linux/cris/vfork.S
@@ -16,7 +16,7 @@
* enclosing function
*/
-ENTRY(__vfork)
+HIDDEN_ENTRY(__vfork)
movu.w __NR_vfork,$r9
break 13
cmps.w -4096,$r10
@@ -27,4 +27,4 @@ ENTRY(__vfork)
PSEUDO_END(__vfork)
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/e1/Makefile b/libc/sysdeps/linux/e1/Makefile
index c69ccb9..29d1c9e 100644
--- a/libc/sysdeps/linux/e1/Makefile
+++ b/libc/sysdeps/linux/e1/Makefile
@@ -17,7 +17,7 @@ CRT_OBJ := crt0.o
CTOR_TARGETS := $(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o
# why is crt1.c listed in CSRC ?
-CSRC := crt1.c syscalls.c longjmp.c setjmp.c vfork.c
+CSRC := crt1.c syscalls.c longjmp.c setjmp.c
OBJS := $(patsubst %.c,%.o, $(CSRC))
OBJ_LIST := ../../../obj.sysdeps.$(TARGET_ARCH)
diff --git a/libc/sysdeps/linux/e1/vfork.c b/libc/sysdeps/linux/e1/vfork.c
deleted file mode 100644
index c7caafd..0000000
--- a/libc/sysdeps/linux/e1/vfork.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
- *
- * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
-#include <sys/types.h>
-#include <sys/syscall.h>
-#include <errno.h>
-
-#define __NR___vfork __NR_vfork
-attribute_hidden _syscall0(pid_t, __vfork)
-weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
diff --git a/libc/sysdeps/linux/frv/vfork.S b/libc/sysdeps/linux/frv/vfork.S
index 8935a12..4fefffd 100644
--- a/libc/sysdeps/linux/frv/vfork.S
+++ b/libc/sysdeps/linux/frv/vfork.S
@@ -17,11 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <features.h>
-
-#include <asm/unistd.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
+#include <sys/syscall.h>
.text
.globl __vfork
@@ -44,4 +40,4 @@ __vfork:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/h8300/vfork.S b/libc/sysdeps/linux/h8300/vfork.S
index 35c04e5..9b65f4f 100644
--- a/libc/sysdeps/linux/h8300/vfork.S
+++ b/libc/sysdeps/linux/h8300/vfork.S
@@ -1,5 +1,5 @@
-#include <asm/unistd.h>
+#include <sys/syscall.h>
#ifndef __NR_vfork
#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
@@ -12,7 +12,6 @@
#endif
.text
.align 2
- .globl _errno
.globl ___vfork
.hidden ___vfork
.type ___vfork, at function
@@ -38,4 +37,4 @@ fix_errno:
jmp @er1 /* don't return, just jmp directly */
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/i386/vfork.S b/libc/sysdeps/linux/i386/vfork.S
index c9db2f4..d85726f 100644
--- a/libc/sysdeps/linux/i386/vfork.S
+++ b/libc/sysdeps/linux/i386/vfork.S
@@ -38,4 +38,4 @@ __vfork:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/i960/vfork.S b/libc/sysdeps/linux/i960/vfork.S
index 1646e1b..e43146c 100644
--- a/libc/sysdeps/linux/i960/vfork.S
+++ b/libc/sysdeps/linux/i960/vfork.S
@@ -18,6 +18,7 @@
.globl ___vfork
.hidden ___vfork
+ .type ___vfork, at function
___vfork:
mov g13, r3
ldconst __NR_vfork, g13
@@ -30,4 +31,4 @@ ___vfork:
ret
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/ia64/sysdep.h b/libc/sysdeps/linux/ia64/sysdep.h
index d10020a..bae27d1 100644
--- a/libc/sysdeps/linux/ia64/sysdep.h
+++ b/libc/sysdeps/linux/ia64/sysdep.h
@@ -49,6 +49,15 @@
C_LABEL(name) \
CALL_MCOUNT
+#define HIDDEN_ENTRY(name) \
+ .text; \
+ .align 32; \
+ .proc C_SYMBOL_NAME(name); \
+ .global C_SYMBOL_NAME(name); \
+ .hidden C_SYMBOL_NAME(name); \
+ C_LABEL(name) \
+ CALL_MCOUNT
+
#define LEAF(name) \
.text; \
.align 32; \
diff --git a/libc/sysdeps/linux/ia64/vfork.S b/libc/sysdeps/linux/ia64/vfork.S
index f233b05..ba0a862 100644
--- a/libc/sysdeps/linux/ia64/vfork.S
+++ b/libc/sysdeps/linux/ia64/vfork.S
@@ -29,7 +29,7 @@
/* pid_t vfork(void); */
/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
-ENTRY(__vfork)
+HIDDEN_ENTRY(__vfork)
alloc r2=ar.pfs,0,0,2,0
mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD
mov out1=0 /* Standard sp value. */
@@ -41,4 +41,4 @@ ENTRY(__vfork)
PSEUDO_END(__vfork)
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/m68k/vfork.S b/libc/sysdeps/linux/m68k/vfork.S
index 56d57f7..b2fe033 100644
--- a/libc/sysdeps/linux/m68k/vfork.S
+++ b/libc/sysdeps/linux/m68k/vfork.S
@@ -4,9 +4,7 @@
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
-#include <features.h>
-
-#include <asm/unistd.h>
+#include <sys/syscall.h>
#ifndef __NR_vfork
#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
@@ -16,7 +14,6 @@
.text
.align 2
- .globl errno
.globl __vfork
.hidden __vfork
.type __vfork, at function
@@ -42,4 +39,4 @@ fix_errno:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/microblaze/vfork.S b/libc/sysdeps/linux/microblaze/vfork.S
index 57db5e5..cd60128 100644
--- a/libc/sysdeps/linux/microblaze/vfork.S
+++ b/libc/sysdeps/linux/microblaze/vfork.S
@@ -13,21 +13,15 @@
* Microblaze port by John Williams
*/
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#define _SYSCALL_H
-#include <bits/sysnum.h>
-
-#include <libc-symbols.h>
+#include <sys/syscall.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. */
-.global C_SYMBOL_NAME(errno)
-
.globl __vfork
+ .hidden __vfork
.align 4
__vfork:
addi r12, r0, SYS_vfork
@@ -50,4 +44,4 @@ __vfork:
.size __vfork, .-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/mips/vfork.S b/libc/sysdeps/linux/mips/vfork.S
index 00cc675..cbf1da6 100644
--- a/libc/sysdeps/linux/mips/vfork.S
+++ b/libc/sysdeps/linux/mips/vfork.S
@@ -18,6 +18,7 @@
/* vfork() is just a special case of clone(). */
+#include <sys/syscall.h>
#include <sys/asm.h>
#include <sysdep.h>
@@ -34,6 +35,7 @@
/* int vfork() */
.text
+ .hidden __vfork
LOCALSZ= 1
FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
GPOFF= FRAMESZ-(1*SZREG)
@@ -96,6 +98,6 @@ L(error):
END(__vfork)
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
#endif
diff --git a/libc/sysdeps/linux/nios/vfork.S b/libc/sysdeps/linux/nios/vfork.S
index f8a6d03..603a07e 100644
--- a/libc/sysdeps/linux/nios/vfork.S
+++ b/libc/sysdeps/linux/nios/vfork.S
@@ -10,9 +10,6 @@
* Written by Wentao Xu <wentao at microtronix.com>
*/
-#include <features.h>
-
-#include <bits/errno.h>
#include <sys/syscall.h>
#include "NM_Macros.S"
@@ -51,4 +48,4 @@ fix_errno:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/nios2/vfork.S b/libc/sysdeps/linux/nios2/vfork.S
index 5d275ff..5d61db0 100644
--- a/libc/sysdeps/linux/nios2/vfork.S
+++ b/libc/sysdeps/linux/nios2/vfork.S
@@ -10,11 +10,7 @@
* Written by Wentao Xu <wentao at microtronix.com>
*/
-#include <features.h>
-
-#define _ERRNO_H
-#include <bits/errno.h>
-#include <asm/unistd.h>
+#include <sys/syscall.h>
#ifndef __NR_vfork
#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
@@ -53,4 +49,4 @@ fix_errno:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/powerpc/vfork.S b/libc/sysdeps/linux/powerpc/vfork.S
index 0083742..0f31eda 100644
--- a/libc/sysdeps/linux/powerpc/vfork.S
+++ b/libc/sysdeps/linux/powerpc/vfork.S
@@ -27,4 +27,4 @@ __vfork:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/sh/vfork.S b/libc/sysdeps/linux/sh/vfork.S
index d311bff..a60a7ef 100644
--- a/libc/sysdeps/linux/sh/vfork.S
+++ b/libc/sysdeps/linux/sh/vfork.S
@@ -20,11 +20,9 @@
respective copyright holders.
*/
-#include <features.h>
#include <sys/syscall.h>
#define _ERRNO_H
#include <bits/errno.h>
-#include <bits/sysnum.h>
/* Clone the calling process, but without copying the whole address space.
The calling process is suspended until the new process exits or is
@@ -109,6 +107,6 @@ __vfork:
.size __vfork, .-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
#include "syscall_error.S"
diff --git a/libc/sysdeps/linux/sparc/vfork.S b/libc/sysdeps/linux/sparc/vfork.S
index ed3e1a0..626183b 100644
--- a/libc/sysdeps/linux/sparc/vfork.S
+++ b/libc/sysdeps/linux/sparc/vfork.S
@@ -52,4 +52,4 @@ __vfork:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/v850/vfork.S b/libc/sysdeps/linux/v850/vfork.S
index 2533853..b67ebf8 100644
--- a/libc/sysdeps/linux/v850/vfork.S
+++ b/libc/sysdeps/linux/v850/vfork.S
@@ -11,12 +11,7 @@
* Written by Miles Bader <miles at gnu.org>
*/
-#include <features.h>
-#define _ERRNO_H 1
-#include <bits/errno.h>
-#define _SYSCALL_H
-#include <bits/sysnum.h>
-
+#include <sys/syscall.h>
#include <clinkage.h>
/* Clone the calling process, but without copying the whole address space.
@@ -24,8 +19,7 @@
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. */
-.global C_SYMBOL_NAME(errno)
-
+/* this should be made hidden */
C_ENTRY (__vfork):
addi SYS_vfork, r0, r12
trap 0
@@ -39,4 +33,4 @@ C_ENTRY (__vfork):
jmp [lp] /* error return */
C_END(__vfork)
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/x86_64/vfork.S b/libc/sysdeps/linux/x86_64/vfork.S
index 97c9c5b..8467fcc 100644
--- a/libc/sysdeps/linux/x86_64/vfork.S
+++ b/libc/sysdeps/linux/x86_64/vfork.S
@@ -63,4 +63,4 @@ __vfork:
.size __vfork,.-__vfork
weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
diff --git a/libc/sysdeps/linux/xtensa/sysdep.h b/libc/sysdeps/linux/xtensa/sysdep.h
index 4c32c2c..fb691f8 100644
--- a/libc/sysdeps/linux/xtensa/sysdep.h
+++ b/libc/sysdeps/linux/xtensa/sysdep.h
@@ -38,6 +38,16 @@
entry sp, FRAMESIZE; \
CALL_MCOUNT
+#define HIDDEN_ENTRY(name) \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
+ .hidden C_SYMBOL_NAME(name); \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name), @function); \
+ .align ALIGNARG(2); \
+ LITERAL_POSITION; \
+ C_LABEL(name) \
+ entry sp, FRAMESIZE; \
+ CALL_MCOUNT
+
#undef END
#define END(name) ASM_SIZE_DIRECTIVE(name)
diff --git a/libc/sysdeps/linux/xtensa/vfork.S b/libc/sysdeps/linux/xtensa/vfork.S
index 6e490fe..977064c 100644
--- a/libc/sysdeps/linux/xtensa/vfork.S
+++ b/libc/sysdeps/linux/xtensa/vfork.S
@@ -49,7 +49,7 @@
/* pid_t vfork(void);
Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */
-ENTRY (__vfork)
+HIDDEN_ENTRY (__vfork)
movi a6, .Ljumptable
extui a2, a0, 30, 2 /* call-size: call4/8/12 = 1/2/3 */
@@ -165,6 +165,5 @@ ENTRY (__vfork)
.Lpseudo_end:
retw
-libc_hidden_def (__vfork)
-
weak_alias (__vfork, vfork)
+libc_hidden_def(vfork)
More information about the uClibc-cvs
mailing list