diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-01-11 22:18:24 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-01-11 22:18:24 +0000 |
commit | d9266ea02f482e39904260d5add5d68c4508de38 (patch) | |
tree | f6f6320fd9758d0eebb5c7730edd4a9ab246d41f /sysdeps/alpha/setjmp.S | |
parent | 3baf2e9b75d110f47394e41127f8a4983c9d35c3 (diff) | |
download | glibc-d9266ea02f482e39904260d5add5d68c4508de38.tar.gz glibc-d9266ea02f482e39904260d5add5d68c4508de38.tar.xz glibc-d9266ea02f482e39904260d5add5d68c4508de38.zip |
* Makerules: Define build-module-asneeded.
* iconvdata/extra-module.mk: Use build-module-asneeded. needed. 2006-01-09 Richard Henderson <rth@redhat.com> * iconvdata/extra-module.mk ($(objpfx)$(mod).so): Depend on ld.so. * sysdeps/alpha/__longjmp.S: Use PTR_DEMANGLE. * sysdeps/alpha/setjmp.S: Likewise. Avoid __sigjmp_save for rtld; tailcall in libc.so. * sysdeps/unix/sysv/linux/alpha/sysdep.h (PTR_MANGLE): Define. (PTR_MANGLE2): Define. 2006-01-11 Ulrich Drepper <drepper@redhat.com>
Diffstat (limited to 'sysdeps/alpha/setjmp.S')
-rw-r--r-- | sysdeps/alpha/setjmp.S | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/sysdeps/alpha/setjmp.S b/sysdeps/alpha/setjmp.S index 14a0320cd3..1b352f346d 100644 --- a/sysdeps/alpha/setjmp.S +++ b/sysdeps/alpha/setjmp.S @@ -23,16 +23,22 @@ #define _SETJMP_H #include <bits/setjmp.h> - .ent __sigsetjmp - .global __sigsetjmp + .ent __sigsetjmp + .global __sigsetjmp __sigsetjmp: - ldgp gp, 0(pv) + ldgp gp, 0(pv) $sigsetjmp_local: - subq sp, 16, sp - .frame sp, 16, ra, 0 - stq ra, 0(sp) - .mask 0x04000000, -16 +#ifndef PIC +#define FRAME 16 + subq sp, FRAME, sp + .frame sp, FRAME, ra, 0 + stq ra, 0(sp) + .mask 0x04000000, -FRAME +#else +#define FRAME 0 + .frame sp, FRAME, ra, 0 +#endif #ifdef PROF .set noat lda AT, _mcount @@ -47,10 +53,27 @@ $sigsetjmp_local: stq s3, JB_S3*8(a0) stq s4, JB_S4*8(a0) stq s5, JB_S5*8(a0) +#ifdef PTR_MANGLE + PTR_MANGLE(t1, ra, t0) + stq t1, JB_PC*8(a0) +#else stq ra, JB_PC*8(a0) - addq sp, 16, t0 +#endif +#if defined(PTR_MANGLE) && FRAME == 0 + PTR_MANGLE2(t1, sp, t0) +#else + addq sp, FRAME, t1 +# ifdef PTR_MANGLE + PTR_MANGLE2(t1, t1, t0) +# endif +#endif + stq t1, JB_SP*8(a0) +#ifdef PTR_MANGLE + PTR_MANGLE2(t1, fp, t0) + stq t1, JB_FP*8(a0) +#else stq fp, JB_FP*8(a0) - stq t0, JB_SP*8(a0) +#endif stt $f2, JB_F2*8(a0) stt $f3, JB_F3*8(a0) stt $f4, JB_F4*8(a0) @@ -60,12 +83,20 @@ $sigsetjmp_local: stt $f8, JB_F8*8(a0) stt $f9, JB_F9*8(a0) +#ifndef PIC /* Call to C to (potentially) save our signal mask. */ jsr ra, __sigjmp_save - ldq ra, 0(sp) addq sp, 16, sp ret +#elif defined NOT_IN_libc && defined IS_IN_rtld + /* In ld.so we never save the signal mask. */ + mov 0, v0 + ret +#else + /* Tailcall to save the signal mask. */ + br $31, __sigjmp_save !samegp +#endif END(__sigsetjmp) |