(setjmp): Don't use __sigsetjmp code, do it here. (_setjmp): Likewise.

This commit is contained in:
Ulrich Drepper 2001-01-16 23:10:00 +00:00
parent 17b32c7409
commit 666af3799b
1 changed files with 65 additions and 18 deletions

View File

@ -1,5 +1,5 @@
/* setjmp for i386, ELF version.
Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 2000, 2001 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
@ -24,28 +24,75 @@
#include "bp-sym.h"
#include "bp-asm.h"
/* We include the BSD entry points here as well but we make
them weak. */
ENTRY (BP_SYM (setjmp))
.weak C_SYMBOL_NAME (BP_SYM (setjmp))
PUSH_SIGNAL_MASK (1)
/* Note that we have to use a non-exported symbol in the next
jump since otherwise gas will emit it as a jump through the
PLT which is what we cannot use here. */
jmp .Linternal_sigsetjmp
END (BP_SYM (setjmp))
ENTRY (BP_SYM (_setjmp))
.weak C_SYMBOL_NAME (BP_SYM (_setjmp))
PUSH_SIGNAL_MASK (0)
/* FALL THROUGH */
#define PARMS LINKAGE /* no space for saved regs */
#define JMPBUF PARMS
#define SIGMSK JMPBUF+PTR_SIZE
/* We include the BSD entry points here as well but we make
them weak. */
ENTRY (BP_SYM (setjmp))
.weak C_SYMBOL_NAME (BP_SYM (setjmp))
/* Note that we have to use a non-exported symbol in the next
jump since otherwise gas will emit it as a jump through the
PLT which is what we cannot use here. */
ENTER
movl JMPBUF(%esp), %eax
CHECK_BOUNDS_BOTH_WIDE (%eax, JMPBUF(%esp), $JB_SIZE)
/* Save registers. */
movl %ebx, (JB_BX*4)(%eax)
movl %esi, (JB_SI*4)(%eax)
movl %edi, (JB_DI*4)(%eax)
leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */
movl %ecx, (JB_SP*4)(%eax)
movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */
movl %ecx, (JB_PC*4)(%eax)
LEAVE /* pop frame pointer to prepare for tail-call. */
movl %ebp, (JB_BP*4)(%eax) /* Save caller's frame pointer. */
/* Call __sigjmp_save. */
pushl $1
pushl 8(%esp)
#ifdef PIC
/* We cannot use the PLT, because it requires that %ebx be set, but
we can't save and restore our caller's value. Instead, we do an
indirect jump through the GOT, using for the temporary register
%ecx, which is call-clobbered. */
call here2
here2: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-here2], %ecx
movl C_SYMBOL_NAME (BP_SYM (__sigjmp_save)@GOT)(%ecx), %ecx
call *%ecx
#else
call BP_SYM (__sigjmp_save)
#endif
popl %ecx
popl %edx
ret
END (BP_SYM (setjmp))
ENTRY (BP_SYM (_setjmp))
.weak C_SYMBOL_NAME (BP_SYM (_setjmp))
ENTER
movl JMPBUF(%esp), %eax
CHECK_BOUNDS_BOTH_WIDE (%eax, JMPBUF(%esp), $JB_SIZE)
/* Save registers. */
movl %ebx, (JB_BX*4)(%eax)
movl %esi, (JB_SI*4)(%eax)
movl %edi, (JB_DI*4)(%eax)
leal JMPBUF(%esp), %ecx /* Save SP as it will be after we return. */
movl %ecx, (JB_SP*4)(%eax)
movl PCOFF(%esp), %ecx /* Save PC we are returning to now. */
movl %ecx, (JB_PC*4)(%eax)
LEAVE
movl %ebp, (JB_BP*4)(%eax) /* Save caller's frame pointer. */
ret
END (BP_SYM (_setjmp))
ENTRY (BP_SYM (__sigsetjmp))
.Linternal_sigsetjmp = BP_SYM (__sigsetjmp)
ENTER
movl JMPBUF(%esp), %eax