diff options
author | Stefan Liebler <stli@linux.vnet.ibm.com> | 2014-07-31 20:04:54 +0200 |
---|---|---|
committer | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2014-07-31 20:04:54 +0200 |
commit | 2f438e20ab591641760e97458d5d1569942eced5 (patch) | |
tree | 3fb25d366c77a51ecfbf1c79d4b0b02521573443 /sysdeps/s390/s390-32 | |
parent | 6c9578a24b5c4182d1c475a32a147478bc757bf3 (diff) | |
download | glibc-2f438e20ab591641760e97458d5d1569942eced5.tar.gz |
S/390: Revert the jmp_buf/ucontext_t ABI change.
Diffstat (limited to 'sysdeps/s390/s390-32')
-rw-r--r-- | sysdeps/s390/s390-32/__longjmp.c (renamed from sysdeps/s390/s390-32/__longjmp-common.c) | 2 | ||||
-rw-r--r-- | sysdeps/s390/s390-32/setjmp.S (renamed from sysdeps/s390/s390-32/setjmp-common.S) | 55 |
2 files changed, 42 insertions, 15 deletions
diff --git a/sysdeps/s390/s390-32/__longjmp-common.c b/sysdeps/s390/s390-32/__longjmp.c index f78ef656e5..5d46e21923 100644 --- a/sysdeps/s390/s390-32/__longjmp-common.c +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -25,7 +25,7 @@ /* Jump to the position specified by ENV, causing the setjmp call there to return VAL, or 1 if VAL is 0. */ -attribute_hidden void +void __longjmp (__jmp_buf env, int val) { #ifdef PTR_DEMANGLE diff --git a/sysdeps/s390/s390-32/setjmp-common.S b/sysdeps/s390/s390-32/setjmp.S index d7bb720454..e940d71a9e 100644 --- a/sysdeps/s390/s390-32/setjmp-common.S +++ b/sysdeps/s390/s390-32/setjmp.S @@ -21,30 +21,38 @@ #define _ASM #define _SETJMP_H #include <bits/setjmp.h> +#include <shlib-compat.h> + +#if !defined IS_IN_rtld +# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) + /* we need a unique name in case of symbol versioning. */ +# define __sigsetjmp __v1__sigsetjmp +# endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) */ +#endif /* !defined IS_IN_rtld */ /* We include the BSD entry points here as well but we make them weak. */ ENTRY (setjmp) .weak C_SYMBOL_NAME (setjmp) lhi %r3,1 /* second argument of one */ - j 0f /* branch relativ to __sigsetjmp */ + j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ END (setjmp) /* Binary compatibility entry point. */ ENTRY(_setjmp) .weak C_SYMBOL_NAME (_setjmp) lhi %r3,0 /* second argument of zero */ - j 0f /* branch relativ to __sigsetjmp */ + j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ END (_setjmp) libc_hidden_def (_setjmp) ENTRY(__setjmp) lhi %r3,0 /* second argument of zero */ - j 0f /* branch relativ to __sigsetjmp */ + j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */ END (__setjmp) ENTRY(__sigsetjmp) -0: +.Linternal_sigsetjmp: #ifdef PTR_MANGLE stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ lr %r4,%r14 @@ -55,10 +63,6 @@ ENTRY(__sigsetjmp) #else stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ #endif -#ifndef __V1_JMPBUF - lhi %r4,0 - st %r4,56(%r2) /* Set __flags to 0. */ -#endif std %f4,40(%r2) std %f6,48(%r2) #if defined NOT_IN_libc && defined IS_IN_rtld @@ -70,15 +74,38 @@ ENTRY(__sigsetjmp) we can't save and restore our caller's value. Instead, we do an indirect jump through the GOT. */ basr %r1,0 -0: al %r1,1f-0b(0,%r1) /* get address of global offset table */ - /* get address of __sigjmp_save from got */ +.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */ + /* get address of __sigjmp_save from got */ l %r1,__sigjmp_save@GOT12(0,%r1) br %r1 -1: .long _GLOBAL_OFFSET_TABLE_ - 0b +.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0 #else basr %r1,0 -0: l %r1,1f-0b(0,%r1) /* load address of __sigjmp_save */ - br %r1 /* tail-call __sigjmp_save */ -1: .long __sigjmp_save +.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */ + br %r1 /* tail-call __sigjmp_save */ +.L1: .long __sigjmp_save #endif END (__sigsetjmp) + +#if !defined IS_IN_rtld +# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) +/* In glibc release 2.19 new versions of setjmp-functions were introduced, + but were reverted before 2.20. Thus both versions are the same function. */ + +# undef __sigsetjmp + +weak_alias (setjmp, __v1setjmp); +weak_alias (setjmp, __v2setjmp); +versioned_symbol (libc, __v1setjmp, setjmp, GLIBC_2_0); +compat_symbol (libc, __v2setjmp, setjmp, GLIBC_2_19); + +weak_alias (_setjmp, __v1_setjmp); +weak_alias (_setjmp, __v2_setjmp); +versioned_symbol (libc, __v1_setjmp, _setjmp, GLIBC_2_0); +compat_symbol (libc, __v2_setjmp, _setjmp, GLIBC_2_19); + +strong_alias (__v1__sigsetjmp, __v2__sigsetjmp); +versioned_symbol (libc, __v1__sigsetjmp, __sigsetjmp, GLIBC_2_0); +compat_symbol (libc, __v2__sigsetjmp, __sigsetjmp, GLIBC_2_19); +# endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20) */ +#endif /* if !defined IS_IN_rtld */ |