* sysdeps/i386/elf/bsd-setjmp.S: Real implementation.
	* sysdeps/i386/elf/bsd-_setjmp.S: Removed.
	* sysdeps/i386/elf/setjmp.S (setjmp): Removed here.
	* sysdeps/i386/bsd-_setjmp.S: Real implementation.
	* sysdeps/i386/bsd-setjmp.S: Real implementation.
	* sysdeps/i386/bits/setjmp.h: Remove PUSH_SIGNAL_MASK definition.
	* sysdeps/i386/setjmp.S: Remove PIC support.  This is the non-ELF
	version.
	* stdio-common/tstscanf.c (main): Add two testcases for '*' modifier.
This commit is contained in:
Ulrich Drepper 2001-01-16 23:37:51 +00:00
parent f806546c56
commit 376c348c91
9 changed files with 135 additions and 141 deletions

View File

@ -1,8 +1,14 @@
2001-01-16 Ulrich Drepper <drepper@redhat.com>
* sysdeps/i386/elf/setjmp.S (setjmp): Don't use __sigsetjmp code,
do it here.
* sysdeps/i386/elf/bsd-setjmp.S: Real implementation.
* sysdeps/i386/elf/bsd-_setjmp.S: Removed.
* sysdeps/i386/elf/setjmp.S (setjmp): Removed here.
(_setjmp): Likewise.
* sysdeps/i386/bsd-_setjmp.S: Real implementation.
* sysdeps/i386/bsd-setjmp.S: Real implementation.
* sysdeps/i386/bits/setjmp.h: Remove PUSH_SIGNAL_MASK definition.
* sysdeps/i386/setjmp.S: Remove PIC support. This is the non-ELF
version.
2001-01-16 Andreas Jaeger <aj@suse.de>
@ -21,8 +27,7 @@
* sysdeps/unix/sysv/linux/sys/sendfile.h: Fix typo.
* stdio-common/tstscanf.c (main): Add two testcases for '*'
modifier.
* stdio-common/tstscanf.c (main): Add two testcases for '*' modifier.
2001-01-14 Jakub Jelinek <jakub@redhat.com>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1998, 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
@ -32,28 +32,7 @@
# define JB_SIZE 24
#endif
#ifdef _ASM
/* We internally convert all setjmp (buf) calls to sigsetjmp (buf, mask),
so we must shift with the call frame to insert the mask argument. */
# if __BOUNDED_POINTERS__
# define PUSH_SIGNAL_MASK(MASK) \
popl %eax; /* return address */ \
popl %ecx; /* jmp_buf value */ \
popl %edx; /* jmp_buf low bound */ \
pushl 0(%esp); /* jmp_buf high bound */ \
movl $MASK, 4(%esp); \
pushl %edx; \
pushl %ecx; \
pushl %eax
# else
# define PUSH_SIGNAL_MASK(MASK) \
popl %eax; /* return address */ \
popl %ecx; /* jmp_buf */ \
pushl $MASK; \
pushl %ecx; \
pushl %eax
# endif
#else
#ifndef _ASM
typedef int __jmp_buf[6];
#endif

View File

@ -1,5 +1,5 @@
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. i386 version.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
Copyright (C) 1994,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
@ -28,19 +28,25 @@
#include "bp-sym.h"
#include "bp-asm.h"
#define PARMS LINKAGE /* no space for saved regs */
#define JMPBUF PARMS
#define SIGMSK JMPBUF+PTR_SIZE
ENTRY (BP_SYM (_setjmp))
PUSH_SIGNAL_MASK (0)
#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 here
here: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
movl C_SYMBOL_NAME (BP_SYM (__sigsetjmp)@GOT)(%ecx), %ecx
jmp *%ecx
#else
jmp BP_SYM (__sigsetjmp)
#endif
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))

View File

@ -1,5 +1,5 @@
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. i386 version.
Copyright (C) 1994, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
Copyright (C) 1994,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
@ -29,18 +29,30 @@
#include "bp-asm.h"
ENTRY (BP_SYM (setjmp))
PUSH_SIGNAL_MASK (1)
#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 here
here: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
movl C_SYMBOL_NAME (BP_SYM (__sigsetjmp)@GOT)(%ecx), %ecx
jmp *%ecx
#else
jmp BP_SYM (__sigsetjmp)
#endif
/* 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)
call BP_SYM (__sigjmp_save)
popl %ecx
popl %edx
ret
END (BP_SYM (setjmp))

View File

@ -1 +0,0 @@
/* We don't need any code here since the setjmp.S file contains it. */

View File

@ -1 +1,70 @@
/* We don't need any code here since the setjmp.S file contains it. */
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. i386 version.
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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _ASM
#define _SETJMP_H
#include <bits/setjmp.h>
#include "bp-sym.h"
#include "bp-asm.h"
#define PARMS LINKAGE /* no space for saved regs */
#define JMPBUF PARMS
#define SIGMSK JMPBUF+PTR_SIZE
ENTRY (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))

View File

@ -28,70 +28,6 @@
#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))
ENTER
@ -115,9 +51,10 @@ ENTRY (BP_SYM (__sigsetjmp))
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 here
here: popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
call L(here)
L(here):
popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx
movl C_SYMBOL_NAME (BP_SYM (__sigjmp_save)@GOT)(%ecx), %ecx
jmp *%ecx
#else

View File

@ -1,5 +1,5 @@
/* setjmp for i386.
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
@ -47,18 +47,5 @@ ENTRY (BP_SYM (__sigsetjmp))
movl %ebp, (JB_BP*4)(%eax) /* Save caller's frame pointer. */
/* Make a tail call to __sigjmp_save; it takes the same args. */
#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 L(here)
L(here):
popl %ecx
addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx
movl C_SYMBOL_NAME (BP_SYM (__sigjmp_save)@GOT)(%ecx), %ecx
jmp *%ecx
#else
jmp BP_SYM (__sigjmp_save)
#endif
END (BP_SYM (__sigsetjmp))

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993, 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1991,1993,1995,1996,1997,2000 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