This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
>>>>> "Ulrich" == Ulrich Drepper <drepper@redhat.com> writes: Ulrich> Jes Sorensen <jes@trained-monkey.org> writes: >> Is that a reasonable requirement to say that setjmp() just doesn't >> work when compiled with -fomit-frame-pointer? Ulrich> The implementation should be as general as possible. If you Ulrich> patch helps to do it it should be used. It's up to Andreas to Ulrich> decide (and apply). Ok, here is a patch that seems to pass my test case (cpp0 in gcc-2.95.4 build by gcc-2.95.4's stage1 compiler). The tests in the setjmp directory pass as well. I have gone through it several times to verify the filling in of the __jmp_buf structure is correct, but it's of course possible I screwed up. Andreas, what do you think? Cheers, Jes 2001-10-15 Jes Sorensen <jes@trained-monkey.org> * sysdeps/m68k/bsd-setjmp.S: Implement setjmp() inline in order not having to enlarge the stack frame and clobber the stack pointer. This makes setjmp() work for code compiled without a frame pointer. * sysdeps/m68k/bsd-_setjmp.S: Likewise for _setjmp(). --- glibc-2.2.4/sysdeps/m68k/bsd-_setjmp.S~ Mon Jul 9 14:58:12 2001 +++ glibc-2.2.4/sysdeps/m68k/bsd-_setjmp.S Mon Oct 15 22:13:50 2001 @@ -1,6 +1,7 @@ /* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. m68k version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. + Contributed by Jes Sorensen <jes@trained-monkey.org>. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,33 +18,33 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. - We cannot do it in C because it must be a tail-call, so frame-unwinding - in setjmp doesn't clobber the state restored by longjmp. */ +/* This cannot just call __sigsetjmp (ARG, 0) since it would require us + to enlarge the stack frame frame to add the extra argument which results + in clobbering the stack pointer. */ #include <sysdep.h> - -#ifdef MOTOROLA_SYNTAX -#define d0 %d0 -#define d1 %d1 -#define PUSH(reg) move.l reg, -(%sp) -#define POP(reg) move.l (%sp)+, reg -#define PUSH0 clr.l -(%sp) -#else -#define PUSH(reg) movel reg, sp@- -#define POP(reg) movel sp@+, reg -#define PUSH0 clrl sp@- -#endif +#include "asm-syntax.h" ENTRY (_setjmp) - POP (d0) /* Pop return PC. */ - POP (d1) /* Pop jmp_buf argument. */ - PUSH0 /* Push second argument of zero. */ - PUSH (d1) /* Push back first argument. */ - PUSH (d0) /* Push back return PC. */ + movel MEM_DISP(sp, 4), R(a0) /* Pointer to env */ + moveml R(d1)-R(d7), MEM(a0) /* Store regs d1-d7 */ + moveq #28, R(d0) + addl R(d0), R(a0) + movel MEM(sp), MEM_POSTINC(a0) /* Save return address */ + moveml R(a1)-R(fp), MEM(a0) /* Save regs a1-a6 (fp) */ + moveq #24, R(d0) + addl R(d0), R(a0) + movel R(sp), MEM_POSTINC(a0) /* Save caller's SP */ +#if defined(__HAVE_68881__) || defined(__HAVE_FPU__) + fmovemx R(fp0)-R(fp7), MEM(a0) +#endif + clrl MEM_PREDEC(sp) + movel MEM_DISP(sp, 8), MEM_PREDEC(sp) #ifdef PIC - bra.l C_SYMBOL_NAME (__sigsetjmp@PLTPC) + bsrl C_SYMBOL_NAME (__sigjmp_save@PLTPC) #else - jmp C_SYMBOL_NAME (__sigsetjmp) + jsr C_SYMBOL_NAME (__sigjmp_save) #endif + addl #8, R(sp) + rts END (_setjmp) --- glibc-2.2.4/sysdeps/m68k/bsd-setjmp.S~ Mon Jul 9 14:58:12 2001 +++ glibc-2.2.4/sysdeps/m68k/bsd-setjmp.S Mon Oct 15 22:14:01 2001 @@ -1,6 +1,7 @@ /* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. m68k version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Copyright (C) 1994, 1997, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. + Contributed by Jes Sorensen <jes@trained-monkey.org>. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,31 +18,33 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. - We cannot do it in C because it must be a tail-call, so frame-unwinding - in setjmp doesn't clobber the state restored by longjmp. */ +/* This cannot just call __sigsetjmp (ARG, 1) since it would require us + to enlarge the stack frame frame to add the extra argument which results + in clobbering the stack pointer. */ #include <sysdep.h> - -#ifdef MOTOROLA_SYNTAX -#define d0 %d0 -#define d1 %d1 -#define PUSH(reg) move.l reg, -(%sp) -#define POP(reg) move.l (%sp)+, reg -#else -#define PUSH(reg) movel reg, sp@- -#define POP(reg) movel sp@+, reg -#endif +#include "asm-syntax.h" ENTRY (setjmp) - POP (d0) /* Pop return PC. */ - POP (d1) /* Pop jmp_buf argument. */ - pea 1 /* Push second argument of one. */ - PUSH (d1) /* Push back first argument. */ - PUSH (d0) /* Push back return PC. */ + movel MEM_DISP(sp, 4), R(a0) /* Pointer to env */ + moveml R(d1)-R(d7), MEM(a0) /* Store regs d1-d7 */ + moveq #28, R(d0) + addl R(d0), R(a0) + movel MEM(sp), MEM_POSTINC(a0) /* Save return address */ + moveml R(a1)-R(fp), MEM(a0) /* Save regs a1-a6 (fp) */ + moveq #24, R(d0) + addl R(d0), R(a0) + movel R(sp), MEM_POSTINC(a0) /* Save caller's SP */ +#if defined(__HAVE_68881__) || defined(__HAVE_FPU__) + fmovemx R(fp0)-R(fp7), MEM(a0) +#endif + pea 1 + movel MEM_DISP(sp, 8), MEM_PREDEC(sp) #ifdef PIC - bra.l C_SYMBOL_NAME (__sigsetjmp@PLTPC) + bsrl C_SYMBOL_NAME (__sigjmp_save@PLTPC) #else - jmp C_SYMBOL_NAME (__sigsetjmp) + jsr C_SYMBOL_NAME (__sigjmp_save) #endif + addl #8, R(sp) + rts END (setjmp)
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |