Browse Source

vfork: make all archs consistent

__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@gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Peter S. Mazinger 13 years ago
parent
commit
0a043c30ee

+ 1 - 1
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

+ 2 - 2
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,@function
 	.align	1
 __vfork:
@@ -55,4 +55,4 @@ __vfork:
 	.size	__vfork, . - __vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)

+ 7 - 15
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

+ 8 - 0
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))

+ 2 - 2
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)

+ 1 - 1
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)

+ 0 - 14
libc/sysdeps/linux/e1/vfork.c

@@ -1,14 +0,0 @@
-/*
- * Copyright (C) 2000-2006 Erik Andersen <andersen@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)

+ 2 - 6
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)

+ 2 - 3
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,@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)

+ 1 - 1
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)

+ 2 - 1
libc/sysdeps/linux/i960/vfork.S

@@ -18,6 +18,7 @@
      
         .globl	___vfork
         .hidden	___vfork
+	.type	___vfork,@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)

+ 9 - 0
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;					\

+ 2 - 2
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)

+ 2 - 5
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,@function
@@ -42,4 +39,4 @@ fix_errno:
 
 .size __vfork,.-__vfork
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)

+ 3 - 9
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)

+ 3 - 1
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

+ 1 - 4
libc/sysdeps/linux/nios/vfork.S

@@ -10,9 +10,6 @@
  * Written by Wentao Xu <wentao@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)

+ 2 - 6
libc/sysdeps/linux/nios2/vfork.S

@@ -10,11 +10,7 @@
  * Written by Wentao Xu <wentao@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)

+ 1 - 1
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)

+ 1 - 3
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"

+ 1 - 1
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)

+ 3 - 9
libc/sysdeps/linux/v850/vfork.S

@@ -11,12 +11,7 @@
  * Written by Miles Bader <miles@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)

+ 1 - 1
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)

+ 10 - 0
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)
 

+ 2 - 3
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)