OSDN Git Service

vfork: make all archs consistent
authorPeter S. Mazinger <ps.m@gmx.net>
Sat, 16 Apr 2011 13:40:50 +0000 (15:40 +0200)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Fri, 15 Jun 2012 12:00:40 +0000 (14:00 +0200)
__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>
25 files changed:
libc/sysdeps/linux/arm/vfork.S
libc/sysdeps/linux/avr32/vfork.S
libc/sysdeps/linux/common/vfork.c
libc/sysdeps/linux/cris/sysdep.h
libc/sysdeps/linux/cris/vfork.S
libc/sysdeps/linux/e1/Makefile
libc/sysdeps/linux/e1/vfork.c [deleted file]
libc/sysdeps/linux/frv/vfork.S
libc/sysdeps/linux/h8300/vfork.S
libc/sysdeps/linux/i386/vfork.S
libc/sysdeps/linux/i960/vfork.S
libc/sysdeps/linux/ia64/sysdep.h
libc/sysdeps/linux/ia64/vfork.S
libc/sysdeps/linux/m68k/vfork.S
libc/sysdeps/linux/microblaze/vfork.S
libc/sysdeps/linux/mips/vfork.S
libc/sysdeps/linux/nios/vfork.S
libc/sysdeps/linux/nios2/vfork.S
libc/sysdeps/linux/powerpc/vfork.S
libc/sysdeps/linux/sh/vfork.S
libc/sysdeps/linux/sparc/vfork.S
libc/sysdeps/linux/v850/vfork.S
libc/sysdeps/linux/x86_64/vfork.S
libc/sysdeps/linux/xtensa/sysdep.h
libc/sysdeps/linux/xtensa/vfork.S

index 17d6a4d..6a1c65e 100644 (file)
@@ -104,5 +104,5 @@ __error:
 .size __vfork,.-__vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
 #endif
index 03ca99f..b2c5ceb 100644 (file)
  * 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)
index e7c9208..a70ed4a 100644 (file)
@@ -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
index 5960fe2..921dbb3 100644 (file)
   .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))
index ea8a81d..964eca4 100644 (file)
@@ -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)
index c69ccb9..29d1c9e 100644 (file)
@@ -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 (file)
index c7caafd..0000000
+++ /dev/null
@@ -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)
index 8935a12..4fefffd 100644 (file)
    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)
index 35c04e5..9b65f4f 100644 (file)
@@ -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)
index c9db2f4..d85726f 100644 (file)
@@ -38,4 +38,4 @@ __vfork:
 .size __vfork,.-__vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
index 1646e1b..e43146c 100644 (file)
@@ -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)
index d10020a..bae27d1 100644 (file)
        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;                                   \
index f233b05..ba0a862 100644 (file)
@@ -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)
index 56d57f7..b2fe033 100644 (file)
@@ -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)
index 57db5e5..cd60128 100644 (file)
  * 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)
index 00cc675..cbf1da6 100644 (file)
@@ -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
index f8a6d03..603a07e 100644 (file)
@@ -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)
index 5d275ff..5d61db0 100644 (file)
  * 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)
index 0083742..0f31eda 100644 (file)
@@ -27,4 +27,4 @@ __vfork:
 .size __vfork,.-__vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
index d311bff..a60a7ef 100644 (file)
  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"
index ed3e1a0..626183b 100644 (file)
@@ -52,4 +52,4 @@ __vfork:
 .size __vfork,.-__vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
index 2533853..b67ebf8 100644 (file)
  * 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)
index 97c9c5b..8467fcc 100644 (file)
@@ -63,4 +63,4 @@ __vfork:
 .size __vfork,.-__vfork
 
 weak_alias(__vfork,vfork)
-libc_hidden_weak(vfork)
+libc_hidden_def(vfork)
index 4c32c2c..fb691f8 100644 (file)
   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)
 
index 6e490fe..977064c 100644 (file)
@@ -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)