Don't tail-call to __fork if !SHARED.
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / unix / sysv / linux / alpha / vfork.S
1 /* Copyright (C) 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19
20 #include <sysdep-cancel.h>
21
22         .globl __vfork
23         .align 4
24         .ent __vfork,0
25 __LABEL(__vfork)
26         ldgp    gp, 0(pv)
27         .prologue 1
28         PSEUDO_PROF
29
30         SINGLE_THREAD_P(t0)
31 #ifdef SHARED
32         bne     t0, HIDDEN_JUMPTARGET (__fork) !samegp
33 #else
34         bne     t0, $do_fork
35 #endif
36
37         lda     v0, SYS_ify(vfork)
38         call_pal PAL_callsys
39         bne     a3, SYSCALL_ERROR_LABEL
40         ret
41
42 #ifndef SHARED
43         /* Can't tail-call due to possible mismatch between GP in
44            fork and vfork object files.  */
45 $do_fork:
46         subq    sp, 16, sp
47         stq     ra, 0(sp)
48         jsr     ra, HIDDEN_JUMPTARGET (__fork)
49         ldgp    gp, 0(ra)
50         ldq     ra, 0(sp)
51         addq    sp, 16, sp
52         ret
53
54 $syscall_error:
55         SYSCALL_ERROR_HANDLER
56 #endif
57
58 PSEUDO_END(__vfork)
59 libc_hidden_def (__vfork)
60
61 weak_alias (__vfork, vfork)