mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
S/390: Make jmp_buf extendible.
This commit is contained in:
parent
d5780febe6
commit
93a45ff1ca
44
ChangeLog
44
ChangeLog
@ -1,3 +1,47 @@
|
|||||||
|
2014-01-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||||
|
|
||||||
|
* Versions.def: Add GLIBC_2.19 for libpthread.
|
||||||
|
* nptl/sysdeps/unix/sysv/linux/s390/Versions: Add longjmp and
|
||||||
|
siglongjmp for libpthread with GLIBC_2.19 symver.
|
||||||
|
* nptl/sysdeps/unix/sysv/linux/s390/pt-longjmp.c: New file.
|
||||||
|
* sysdeps/s390/Makefile: Build v1-longjmp.c and v1-sigjmp.c.
|
||||||
|
* sysdeps/s390/Versions: New GLIBC_2.19 and GLIBC_PRIVATE symbols.
|
||||||
|
* sysdeps/s390/__longjmp.c: New file.
|
||||||
|
* sysdeps/s390/bits/setjmp.h: Add new fields to __s390_jmp_buf.
|
||||||
|
* sysdeps/s390/longjmp.c: New file.
|
||||||
|
* sysdeps/s390/setjmp.S: New file.
|
||||||
|
* sysdeps/s390/sigjmp.S: New file.
|
||||||
|
* sysdeps/s390/v1-longjmp.c: New file.
|
||||||
|
* sysdeps/s390/v1-setjmp.h: New file.
|
||||||
|
* sysdeps/s390/v1-sigjmp.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/Makefile: Build __longjmp_chk.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/Versions: Add __longjmp_chk with
|
||||||
|
GLIBC_2.19 version.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/longjmp_chk.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/____longjmp_chk.c: Provide
|
||||||
|
versioned symbols for ____longjmp_chk.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/____longjmp_chk.c:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/nptl/libc.abilist:
|
||||||
|
Regenerate.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/nptl/libpthread.abilist:
|
||||||
|
Regenerate.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/nptl/libc.abilist:
|
||||||
|
Regenerate.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-64/nptl/libpthread.abilist:
|
||||||
|
Regenerate.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c: New file.
|
||||||
|
* sysdeps/s390/s390-32/__longjmp.c: Rename to ...
|
||||||
|
* sysdeps/s390/s390-32/__longjmp-common.c: ... this.
|
||||||
|
* sysdeps/s390/s390-32/setjmp.S: Rename and adjust to ...
|
||||||
|
* sysdeps/s390/s390-32/setjmp-common.S: ... this.
|
||||||
|
* sysdeps/s390/s390-64/__longjmp.c: Rename to ...
|
||||||
|
* sysdeps/s390/s390-64/__longjmp-common.c: ... this.
|
||||||
|
* sysdeps/s390/s390-64/setjmp.S: Rename and adjust to ...
|
||||||
|
* sysdeps/s390/s390-64/setjmp-common.S: ... this.
|
||||||
|
* sysdeps/s390/rtld-__longjmp.c: New file.
|
||||||
|
* sysdeps/s390/rtld-setjmp.S: New file.
|
||||||
|
|
||||||
2014-01-06 Joseph Myers <joseph@codesourcery.com>
|
2014-01-06 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
[BZ #16400]
|
[BZ #16400]
|
||||||
|
@ -106,6 +106,7 @@ libpthread {
|
|||||||
GLIBC_2.11
|
GLIBC_2.11
|
||||||
GLIBC_2.12
|
GLIBC_2.12
|
||||||
GLIBC_2.18
|
GLIBC_2.18
|
||||||
|
GLIBC_2.19
|
||||||
GLIBC_PRIVATE
|
GLIBC_PRIVATE
|
||||||
}
|
}
|
||||||
libresolv {
|
libresolv {
|
||||||
|
5
nptl/sysdeps/unix/sysv/linux/s390/Versions
Normal file
5
nptl/sysdeps/unix/sysv/linux/s390/Versions
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
libpthread {
|
||||||
|
GLIBC_2.19 {
|
||||||
|
longjmp; siglongjmp;
|
||||||
|
}
|
||||||
|
}
|
63
nptl/sysdeps/unix/sysv/linux/s390/pt-longjmp.c
Normal file
63
nptl/sysdeps/unix/sysv/linux/s390/pt-longjmp.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
This is a copy of pthread/pt-longjmp.c made for extending the
|
||||||
|
jmpbuf structure on System z. */
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <bits/wordsize.h>
|
||||||
|
#include "pthreadP.h"
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#if defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_19)
|
||||||
|
|
||||||
|
/* The __v1 version prototypes are declared in v1-setjmp.h which
|
||||||
|
cannot be included together with setjmp.h. So we put the
|
||||||
|
prototypes here manually. */
|
||||||
|
extern void __v1__libc_siglongjmp (sigjmp_buf env, int val)
|
||||||
|
__attribute__ ((noreturn));
|
||||||
|
extern void __v1__libc_longjmp (sigjmp_buf env, int val)
|
||||||
|
__attribute__ ((noreturn));
|
||||||
|
|
||||||
|
void __v1_siglongjmp (sigjmp_buf env, int val)
|
||||||
|
{
|
||||||
|
__v1__libc_siglongjmp (env, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __v1_longjmp (jmp_buf env, int val)
|
||||||
|
{
|
||||||
|
__v1__libc_longjmp (env, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
compat_symbol (libpthread, __v1_longjmp, longjmp, GLIBC_2_0);
|
||||||
|
compat_symbol (libpthread, __v1_siglongjmp, siglongjmp, GLIBC_2_0);
|
||||||
|
#endif /* defined SHARED && SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_19)) */
|
||||||
|
|
||||||
|
void
|
||||||
|
__v2_longjmp (jmp_buf env, int val)
|
||||||
|
{
|
||||||
|
__libc_longjmp (env, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
__v2_siglongjmp (jmp_buf env, int val)
|
||||||
|
{
|
||||||
|
__libc_siglongjmp (env, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
versioned_symbol (libpthread, __v2_longjmp, longjmp, GLIBC_2_19);
|
||||||
|
versioned_symbol (libpthread, __v2_siglongjmp, siglongjmp, GLIBC_2_19);
|
5
sysdeps/s390/Makefile
Normal file
5
sysdeps/s390/Makefile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
ifeq ($(subdir),setjmp)
|
||||||
|
ifeq (yes,$(build-shared))
|
||||||
|
sysdep_routines += v1-longjmp v1-sigjmp
|
||||||
|
endif
|
||||||
|
endif
|
@ -1,3 +1,14 @@
|
|||||||
|
libc {
|
||||||
|
GLIBC_2.19 {
|
||||||
|
setjmp; _setjmp; __setjmp; __sigsetjmp;
|
||||||
|
longjmp; _longjmp; siglongjmp;
|
||||||
|
}
|
||||||
|
GLIBC_PRIVATE {
|
||||||
|
__v1__libc_longjmp; __v1__libc_siglongjmp;
|
||||||
|
__v2__libc_longjmp; __v2__libc_siglongjmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ld {
|
ld {
|
||||||
GLIBC_2.3 {
|
GLIBC_2.3 {
|
||||||
# runtime interface to TLS
|
# runtime interface to TLS
|
||||||
|
31
sysdeps/s390/__longjmp.c
Normal file
31
sysdeps/s390/__longjmp.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <libc-symbols.h>
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
#define __longjmp __v2__longjmp
|
||||||
|
#include "__longjmp-common.c"
|
||||||
|
#undef __longjmp
|
||||||
|
strong_alias (__v2__longjmp, __longjmp)
|
||||||
|
|
||||||
|
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
|
||||||
|
# undef __longjmp
|
||||||
|
# define __V1_JMPBUF
|
||||||
|
# define __longjmp __v1__longjmp
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
#endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
|
@ -40,6 +40,10 @@ typedef struct __s390_jmp_buf
|
|||||||
/* We save fpu registers 4 and 6. */
|
/* We save fpu registers 4 and 6. */
|
||||||
long __fpregs[4];
|
long __fpregs[4];
|
||||||
# endif
|
# endif
|
||||||
|
#ifndef __V1_JMPBUF
|
||||||
|
unsigned long __flags;
|
||||||
|
char __reserved[128];
|
||||||
|
#endif
|
||||||
} __jmp_buf[1];
|
} __jmp_buf[1];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
64
sysdeps/s390/longjmp.c
Normal file
64
sysdeps/s390/longjmp.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Versioned copy of sysdeps/generic/longjmp.c modified for extended
|
||||||
|
jmpbuf. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
extern void __v2__longjmp (__jmp_buf __env, int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
extern void __v2__libc_longjmp (sigjmp_buf env, int val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
libc_hidden_proto (__v2__libc_longjmp)
|
||||||
|
|
||||||
|
/* Set the signal mask to the one specified in ENV, and jump
|
||||||
|
to the position specified in ENV, causing the setjmp
|
||||||
|
call there to return VAL, or 1 if VAL is 0. */
|
||||||
|
void
|
||||||
|
__v2__libc_siglongjmp (sigjmp_buf env, int val)
|
||||||
|
{
|
||||||
|
/* Perform any cleanups needed by the frames being unwound. */
|
||||||
|
_longjmp_unwind (env, val);
|
||||||
|
|
||||||
|
if (env[0].__mask_was_saved)
|
||||||
|
/* Restore the saved signal mask. */
|
||||||
|
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
|
||||||
|
(sigset_t *) NULL);
|
||||||
|
|
||||||
|
/* Call the machine-dependent function to restore machine state. */
|
||||||
|
__v2__longjmp (env[0].__jmpbuf, val ?: 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef __v2__longjmp
|
||||||
|
strong_alias (__v2__libc_siglongjmp, __v2__libc_longjmp)
|
||||||
|
libc_hidden_def (__v2__libc_longjmp)
|
||||||
|
weak_alias (__v2__libc_siglongjmp, __v2_longjmp)
|
||||||
|
weak_alias (__v2__libc_siglongjmp, __v2longjmp)
|
||||||
|
weak_alias (__v2__libc_siglongjmp, __v2siglongjmp)
|
||||||
|
|
||||||
|
/* These will be used by libpthread only. */
|
||||||
|
versioned_symbol (libc, __v2__libc_longjmp, __libc_longjmp, GLIBC_PRIVATE);
|
||||||
|
versioned_symbol (libc, __v2__libc_siglongjmp, __libc_siglongjmp, GLIBC_PRIVATE);
|
||||||
|
|
||||||
|
versioned_symbol (libc, __v2_longjmp, _longjmp, GLIBC_2_19);
|
||||||
|
versioned_symbol (libc, __v2longjmp, longjmp, GLIBC_2_19);
|
||||||
|
versioned_symbol (libc, __v2siglongjmp, siglongjmp, GLIBC_2_19);
|
||||||
|
#endif /* ifndef __v2__longjmp */
|
19
sysdeps/s390/rtld-__longjmp.c
Normal file
19
sysdeps/s390/rtld-__longjmp.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Build a non-versioned object for rtld-*. */
|
||||||
|
# include "__longjmp-common.c"
|
20
sysdeps/s390/rtld-setjmp.S
Normal file
20
sysdeps/s390/rtld-setjmp.S
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/* Extendible version of setjmp for System z
|
||||||
|
Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Build a non-versioned object for rtld-*. */
|
||||||
|
# include "setjmp-common.S"
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
/* Jump to the position specified by ENV, causing the
|
/* Jump to the position specified by ENV, causing the
|
||||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||||
void
|
attribute_hidden void
|
||||||
__longjmp (__jmp_buf env, int val)
|
__longjmp (__jmp_buf env, int val)
|
||||||
{
|
{
|
||||||
#ifdef PTR_DEMANGLE
|
#ifdef PTR_DEMANGLE
|
@ -27,24 +27,24 @@
|
|||||||
ENTRY (setjmp)
|
ENTRY (setjmp)
|
||||||
.weak C_SYMBOL_NAME (setjmp)
|
.weak C_SYMBOL_NAME (setjmp)
|
||||||
lhi %r3,1 /* second argument of one */
|
lhi %r3,1 /* second argument of one */
|
||||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
j 0f /* branch relativ to __sigsetjmp */
|
||||||
END (setjmp)
|
END (setjmp)
|
||||||
|
|
||||||
/* Binary compatibility entry point. */
|
/* Binary compatibility entry point. */
|
||||||
ENTRY(_setjmp)
|
ENTRY(_setjmp)
|
||||||
.weak C_SYMBOL_NAME (_setjmp)
|
.weak C_SYMBOL_NAME (_setjmp)
|
||||||
lhi %r3,0 /* second argument of zero */
|
lhi %r3,0 /* second argument of zero */
|
||||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
j 0f /* branch relativ to __sigsetjmp */
|
||||||
END (_setjmp)
|
END (_setjmp)
|
||||||
libc_hidden_def (_setjmp)
|
libc_hidden_def (_setjmp)
|
||||||
|
|
||||||
ENTRY(__setjmp)
|
ENTRY(__setjmp)
|
||||||
lhi %r3,0 /* second argument of zero */
|
lhi %r3,0 /* second argument of zero */
|
||||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
j 0f /* branch relativ to __sigsetjmp */
|
||||||
END (__setjmp)
|
END (__setjmp)
|
||||||
|
|
||||||
ENTRY(__sigsetjmp)
|
ENTRY(__sigsetjmp)
|
||||||
.Linternal_sigsetjmp:
|
0:
|
||||||
#ifdef PTR_MANGLE
|
#ifdef PTR_MANGLE
|
||||||
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
|
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
|
||||||
lr %r4,%r14
|
lr %r4,%r14
|
||||||
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
|
|||||||
stm %r4,%r5,32(%r2)
|
stm %r4,%r5,32(%r2)
|
||||||
#else
|
#else
|
||||||
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
|
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
|
#endif
|
||||||
std %f4,40(%r2)
|
std %f4,40(%r2)
|
||||||
std %f6,48(%r2)
|
std %f6,48(%r2)
|
||||||
@ -66,15 +70,15 @@ ENTRY(__sigsetjmp)
|
|||||||
we can't save and restore our caller's value. Instead, we do an
|
we can't save and restore our caller's value. Instead, we do an
|
||||||
indirect jump through the GOT. */
|
indirect jump through the GOT. */
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
0: al %r1,1f-0b(0,%r1) /* get address of global offset table */
|
||||||
/* get address of __sigjmp_save from got */
|
/* get address of __sigjmp_save from got */
|
||||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||||
br %r1
|
br %r1
|
||||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
1: .long _GLOBAL_OFFSET_TABLE_ - 0b
|
||||||
#else
|
#else
|
||||||
basr %r1,0
|
basr %r1,0
|
||||||
.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */
|
0: l %r1,1f-0b(0,%r1) /* load address of __sigjmp_save */
|
||||||
br %r1 /* tail-call __sigjmp_save */
|
br %r1 /* tail-call __sigjmp_save */
|
||||||
.L1: .long __sigjmp_save
|
1: .long __sigjmp_save
|
||||||
#endif
|
#endif
|
||||||
END (__sigsetjmp)
|
END (__sigsetjmp)
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
/* Jump to the position specified by ENV, causing the
|
/* Jump to the position specified by ENV, causing the
|
||||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||||
void
|
attribute_hidden void
|
||||||
__longjmp (__jmp_buf env, int val)
|
__longjmp (__jmp_buf env, int val)
|
||||||
{
|
{
|
||||||
#ifdef PTR_DEMANGLE
|
#ifdef PTR_DEMANGLE
|
@ -27,24 +27,24 @@
|
|||||||
ENTRY (setjmp)
|
ENTRY (setjmp)
|
||||||
.weak C_SYMBOL_NAME (setjmp)
|
.weak C_SYMBOL_NAME (setjmp)
|
||||||
lghi %r3,1 /* Second argument of one. */
|
lghi %r3,1 /* Second argument of one. */
|
||||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
j 0f /* Branch relativ to __sigsetjmp. */
|
||||||
END (setjmp)
|
END (setjmp)
|
||||||
|
|
||||||
/* Binary compatibility entry point. */
|
/* Binary compatibility entry point. */
|
||||||
ENTRY(_setjmp)
|
ENTRY(_setjmp)
|
||||||
.weak C_SYMBOL_NAME (_setjmp)
|
.weak C_SYMBOL_NAME (_setjmp)
|
||||||
slgr %r3,%r3 /* Second argument of zero. */
|
slgr %r3,%r3 /* Second argument of zero. */
|
||||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
j 0f /* Branch relativ to __sigsetjmp. */
|
||||||
END (setjmp)
|
END (_setjmp)
|
||||||
libc_hidden_def (_setjmp)
|
libc_hidden_def (_setjmp)
|
||||||
|
|
||||||
ENTRY(__setjmp)
|
ENTRY(__setjmp)
|
||||||
slgr %r3,%r3 /* Second argument of zero. */
|
slgr %r3,%r3 /* Second argument of zero. */
|
||||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
j 0f /* Branch relativ to __sigsetjmp. */
|
||||||
END (setjmp)
|
END (__setjmp)
|
||||||
|
|
||||||
ENTRY(__sigsetjmp)
|
ENTRY(__sigsetjmp)
|
||||||
.Linternal_sigsetjmp:
|
0:
|
||||||
#ifdef PTR_MANGLE
|
#ifdef PTR_MANGLE
|
||||||
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
|
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
|
||||||
lgr %r4,%r14
|
lgr %r4,%r14
|
||||||
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
|
|||||||
stmg %r4,%r5,64(%r2)
|
stmg %r4,%r5,64(%r2)
|
||||||
#else
|
#else
|
||||||
stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
|
stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */
|
||||||
|
#endif
|
||||||
|
#ifndef __V1_JMPBUF
|
||||||
|
lghi %r4,0
|
||||||
|
stg %r4,144(%r2) /* Set __flags to 0. */
|
||||||
#endif
|
#endif
|
||||||
std %f8,80(%r2)
|
std %f8,80(%r2)
|
||||||
std %f9,88(%r2)
|
std %f9,88(%r2)
|
64
sysdeps/s390/setjmp.S
Normal file
64
sysdeps/s390/setjmp.S
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* Extendible version of setjmp for System z
|
||||||
|
Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <libc-symbols.h>
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
versioned_symbol (libc, __v2setjmp, setjmp, GLIBC_2_19)
|
||||||
|
versioned_symbol (libc, __v2_setjmp, _setjmp, GLIBC_2_19)
|
||||||
|
versioned_symbol (libc, __v2__setjmp, __setjmp, GLIBC_2_19)
|
||||||
|
versioned_symbol (libc, __v2__sigsetjmp, __sigsetjmp, GLIBC_2_19)
|
||||||
|
#define setjmp __v2setjmp
|
||||||
|
#define _setjmp __v2_setjmp
|
||||||
|
#define __setjmp __v2__setjmp
|
||||||
|
#define __sigsetjmp __v2__sigsetjmp
|
||||||
|
#define __sigjmp_save __v2__sigjmp_save
|
||||||
|
|
||||||
|
#include "setjmp-common.S"
|
||||||
|
|
||||||
|
#undef setjmp
|
||||||
|
#undef _setjmp
|
||||||
|
#undef __setjmp
|
||||||
|
#undef __sigsetjmp
|
||||||
|
#undef __sigjmp_save
|
||||||
|
libc_hidden_ver (__v2setjmp, setjmp)
|
||||||
|
libc_hidden_ver (__v2_setjmp, _setjmp)
|
||||||
|
libc_hidden_ver (__v2__setjmp, __setjmp)
|
||||||
|
libc_hidden_ver (__v2__sigsetjmp, __sigsetjmp)
|
||||||
|
|
||||||
|
#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
|
||||||
|
compat_symbol (libc, __v1setjmp, setjmp, GLIBC_2_0)
|
||||||
|
compat_symbol (libc, __v1_setjmp, _setjmp, GLIBC_2_0)
|
||||||
|
compat_symbol (libc, __v1__setjmp, __setjmp, GLIBC_2_0)
|
||||||
|
compat_symbol (libc, __v1__sigsetjmp, __sigsetjmp, GLIBC_2_0)
|
||||||
|
# define setjmp __v1setjmp
|
||||||
|
# define _setjmp __v1_setjmp
|
||||||
|
# define __setjmp __v1__setjmp
|
||||||
|
# define __sigsetjmp __v1__sigsetjmp
|
||||||
|
# define __sigjmp_save __v1__sigjmp_save
|
||||||
|
# define __V1_JMPBUF
|
||||||
|
|
||||||
|
# include "setjmp-common.S"
|
||||||
|
|
||||||
|
# undef setjmp
|
||||||
|
# undef _setjmp
|
||||||
|
# undef __setjmp
|
||||||
|
# undef __sigsetjmp
|
||||||
|
# undef __sigjmp_save
|
||||||
|
|
||||||
|
#endif /* if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
|
34
sysdeps/s390/sigjmp.c
Normal file
34
sysdeps/s390/sigjmp.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/* Copyright (C) 1992-2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
/* This function is called by the `sigsetjmp' macro
|
||||||
|
before doing a `__setjmp' on ENV[0].__jmpbuf.
|
||||||
|
Always return zero. */
|
||||||
|
|
||||||
|
int
|
||||||
|
__v2__sigjmp_save (sigjmp_buf env, int savemask)
|
||||||
|
{
|
||||||
|
env[0].__mask_was_saved = (savemask &&
|
||||||
|
__sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
|
||||||
|
&env[0].__saved_mask) == 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
57
sysdeps/s390/v1-longjmp.c
Normal file
57
sysdeps/s390/v1-longjmp.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Versioned copy of sysdeps/generic/longjmp.c modified for extended
|
||||||
|
jmpbuf. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include "v1-setjmp.h"
|
||||||
|
|
||||||
|
#if !defined NOT_INT_libc && defined SHARED
|
||||||
|
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
|
||||||
|
|
||||||
|
void
|
||||||
|
__v1__libc_siglongjmp (__v1__sigjmp_buf env, int val)
|
||||||
|
{
|
||||||
|
/* Perform any cleanups needed by the frames being unwound. */
|
||||||
|
_longjmp_unwind (env, val);
|
||||||
|
|
||||||
|
if (env[0].__mask_was_saved)
|
||||||
|
/* Restore the saved signal mask. */
|
||||||
|
(void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask,
|
||||||
|
(sigset_t *) NULL);
|
||||||
|
|
||||||
|
/* Call the machine-dependent function to restore machine state. */
|
||||||
|
__v1__longjmp (env[0].__jmpbuf, val ?: 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifndef __v1__longjmp
|
||||||
|
strong_alias (__v1__libc_siglongjmp, __v1__libc_longjmp)
|
||||||
|
libc_hidden_def (__v1__libc_longjmp)
|
||||||
|
weak_alias (__v1__libc_siglongjmp, __v1_longjmp)
|
||||||
|
weak_alias (__v1__libc_siglongjmp, __v1longjmp)
|
||||||
|
weak_alias (__v1__libc_siglongjmp, __v1siglongjmp)
|
||||||
|
|
||||||
|
compat_symbol (libc, __v1_longjmp, _longjmp, GLIBC_2_0);
|
||||||
|
compat_symbol (libc, __v1longjmp, longjmp, GLIBC_2_0);
|
||||||
|
compat_symbol (libc, __v1siglongjmp, siglongjmp, GLIBC_2_0);
|
||||||
|
|
||||||
|
# endif /* ifndef __v1__longjmp */
|
||||||
|
# endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
|
||||||
|
#endif /* if !defined NOT_INT_libc && defined SHARED */
|
111
sysdeps/s390/v1-setjmp.h
Normal file
111
sysdeps/s390/v1-setjmp.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/* Copyright (C) 1991-2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISO C99 Standard: 7.13 Nonlocal jumps <setjmp.h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _V1_SETJMP_H
|
||||||
|
#define _V1_SETJMP_H 1
|
||||||
|
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
#define __V1_JMPBUF
|
||||||
|
#define _SETJMP_H
|
||||||
|
#include <bits/setjmp.h> /* Get `__jmp_buf'. */
|
||||||
|
|
||||||
|
#ifndef _ASM
|
||||||
|
|
||||||
|
#include <bits/sigset.h> /* Get `__sigset_t'. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Calling environment, plus possibly a saved signal mask. */
|
||||||
|
typedef struct __v1__jmp_buf_tag
|
||||||
|
{
|
||||||
|
/* NOTE: The machine-dependent definitions of `__sigsetjmp'
|
||||||
|
assume that a `jmp_buf' begins with a `__jmp_buf' and that
|
||||||
|
`__mask_was_saved' follows it. Do not move these members
|
||||||
|
or add others before it. */
|
||||||
|
__jmp_buf __jmpbuf; /* Calling environment. */
|
||||||
|
int __mask_was_saved; /* Saved the signal mask? */
|
||||||
|
__sigset_t __saved_mask; /* Saved signal mask. */
|
||||||
|
} __v1__jmp_buf[1];
|
||||||
|
|
||||||
|
|
||||||
|
/* Store the calling environment in ENV, also saving the signal mask.
|
||||||
|
Return 0. */
|
||||||
|
extern int __v1setjmp (__v1__jmp_buf __env);
|
||||||
|
|
||||||
|
/* Store the calling environment in ENV, also saving the
|
||||||
|
signal mask if SAVEMASK is nonzero. Return 0.
|
||||||
|
This is the internal name for `sigsetjmp'. */
|
||||||
|
extern int __v1__sigsetjmp (struct __v1__jmp_buf_tag __env[1],
|
||||||
|
int __savemask);
|
||||||
|
|
||||||
|
/* Store the calling environment in ENV, not saving the signal mask.
|
||||||
|
Return 0. */
|
||||||
|
extern int __v1_setjmp (struct __v1__jmp_buf_tag __env[1]);
|
||||||
|
|
||||||
|
/* Jump to the environment saved in ENV, making the
|
||||||
|
`setjmp' call there return VAL, or 1 if VAL is 0. */
|
||||||
|
extern void __v1longjmp (struct __v1__jmp_buf_tag __env[1], int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
/* Same. Usually `_longjmp' is used with `_setjmp', which does not save
|
||||||
|
the signal mask. But it is how ENV was saved that determines whether
|
||||||
|
`longjmp' restores the mask; `_longjmp' is just an alias. */
|
||||||
|
extern void __v1_longjmp (struct __v1__jmp_buf_tag __env[1], int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
/* Use the same type for `jmp_buf' and `sigjmp_buf'.
|
||||||
|
The `__mask_was_saved' flag determines whether
|
||||||
|
or not `longjmp' will restore the signal mask. */
|
||||||
|
typedef struct __v1__jmp_buf_tag __v1__sigjmp_buf[1];
|
||||||
|
|
||||||
|
/* Jump to the environment saved in ENV, making the
|
||||||
|
sigsetjmp call there return VAL, or 1 if VAL is 0.
|
||||||
|
Restore the signal mask if that sigsetjmp call saved it.
|
||||||
|
This is just an alias `longjmp'. */
|
||||||
|
extern void __v1siglongjmp (__v1__sigjmp_buf __env, int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
/* Internal machine-dependent function to restore context sans signal mask. */
|
||||||
|
extern void __v1__longjmp (__jmp_buf __env, int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
/* Internal function to possibly save the current mask of blocked signals
|
||||||
|
in ENV, and always set the flag saying whether or not it was saved.
|
||||||
|
This is used by the machine-dependent definition of `__sigsetjmp'.
|
||||||
|
Always returns zero, for convenience. */
|
||||||
|
extern int __v1__sigjmp_save (__v1__jmp_buf __env, int __savemask);
|
||||||
|
|
||||||
|
extern void _longjmp_unwind (__v1__jmp_buf env, int val);
|
||||||
|
|
||||||
|
extern void __v1__libc_siglongjmp (__v1__sigjmp_buf env, int val)
|
||||||
|
__attribute__ ((noreturn));
|
||||||
|
|
||||||
|
extern void __v1__libc_longjmp (__v1__sigjmp_buf env, int val)
|
||||||
|
__attribute__ ((noreturn));
|
||||||
|
|
||||||
|
libc_hidden_proto (__v1__libc_longjmp)
|
||||||
|
libc_hidden_proto (__v1_setjmp)
|
||||||
|
libc_hidden_proto (__v1__sigsetjmp)
|
||||||
|
#endif /* !_ASM */
|
||||||
|
|
||||||
|
#endif /* ifndef _V1_SETJMP_H */
|
44
sysdeps/s390/v1-sigjmp.c
Normal file
44
sysdeps/s390/v1-sigjmp.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/* Copyright (C) 1992-2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Copied from setjmp/sigjmp.c for extending jmp_buf. */
|
||||||
|
|
||||||
|
#include <bits/wordsize.h>
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
#if !defined NOT_IN_libc && defined SHARED
|
||||||
|
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19)
|
||||||
|
# include <stddef.h>
|
||||||
|
# include <v1-setjmp.h>
|
||||||
|
# include <signal.h>
|
||||||
|
|
||||||
|
/* This function is called by the `sigsetjmp' macro
|
||||||
|
before doing a `__setjmp' on ENV[0].__jmpbuf.
|
||||||
|
Always return zero. */
|
||||||
|
|
||||||
|
int
|
||||||
|
__v1__sigjmp_save (__v1__sigjmp_buf env, int savemask)
|
||||||
|
{
|
||||||
|
env[0].__mask_was_saved = (savemask &&
|
||||||
|
__sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
|
||||||
|
&env[0].__saved_mask) == 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_19) */
|
||||||
|
#endif /* !NOT_IN_libc && SHARED */
|
@ -16,3 +16,9 @@ endif
|
|||||||
ifeq ($(subdir),elf)
|
ifeq ($(subdir),elf)
|
||||||
sysdep_routines += dl-vdso
|
sysdep_routines += dl-vdso
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),debug)
|
||||||
|
ifeq (yes,$(build-shared))
|
||||||
|
sysdep_routines += v1-longjmp_chk
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
libc {
|
libc {
|
||||||
|
GLIBC_2.19 {
|
||||||
|
__longjmp_chk;
|
||||||
|
}
|
||||||
GLIBC_PRIVATE {
|
GLIBC_PRIVATE {
|
||||||
__vdso_clock_gettime;
|
__vdso_clock_gettime;
|
||||||
__vdso_clock_getres;
|
__vdso_clock_getres;
|
||||||
|
44
sysdeps/unix/sysv/linux/s390/longjmp_chk.c
Normal file
44
sysdeps/unix/sysv/linux/s390/longjmp_chk.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
This is a copy of debug/longjmp_chk.c extended for symbol
|
||||||
|
versioning. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
/* This place is the only user of these functions. */
|
||||||
|
extern void ____v2__longjmp_chk (__jmp_buf __env, int __val)
|
||||||
|
__attribute__ ((__noreturn__));
|
||||||
|
|
||||||
|
#if defined NOT_IN_libc
|
||||||
|
|
||||||
|
# define __v2__longjmp ____longjmp_chk
|
||||||
|
# define __v2__libc_siglongjmp __longjmp_chk
|
||||||
|
|
||||||
|
# include <longjmp.c>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define __v2__longjmp ____v2__longjmp_chk
|
||||||
|
# define __v2__libc_siglongjmp __v2__libc_siglongjmp_chk
|
||||||
|
|
||||||
|
# include <longjmp.c>
|
||||||
|
|
||||||
|
versioned_symbol (libc, __v2__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_19);
|
||||||
|
|
||||||
|
#endif
|
@ -26,8 +26,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
#include <libc-symbols.h>
|
||||||
#define __longjmp ____longjmp_chk
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
#define CHECK_SP(env, guard) \
|
#define CHECK_SP(env, guard) \
|
||||||
do \
|
do \
|
||||||
@ -51,4 +51,22 @@
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#include "__longjmp.c"
|
|
||||||
|
#if defined NOT_IN_libc
|
||||||
|
/* Build a non-versioned object for rtld-*. */
|
||||||
|
# define __longjmp ____longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
|
||||||
|
#else /* !NOT_IN_libc */
|
||||||
|
# define __longjmp ____v2__longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
|
||||||
|
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
|
||||||
|
# undef __longjmp
|
||||||
|
# define __V1_JMPBUF
|
||||||
|
# define __longjmp ____v1__longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
# undef __longjmp
|
||||||
|
|
||||||
|
# endif
|
||||||
|
#endif /* !NOT_IN_libc */
|
||||||
|
@ -1774,6 +1774,16 @@ GLIBC_2.17
|
|||||||
GLIBC_2.18
|
GLIBC_2.18
|
||||||
GLIBC_2.18 A
|
GLIBC_2.18 A
|
||||||
__cxa_thread_atexit_impl F
|
__cxa_thread_atexit_impl F
|
||||||
|
GLIBC_2.19
|
||||||
|
GLIBC_2.19 A
|
||||||
|
__longjmp_chk F
|
||||||
|
__setjmp F
|
||||||
|
__sigsetjmp F
|
||||||
|
_longjmp F
|
||||||
|
_setjmp F
|
||||||
|
longjmp F
|
||||||
|
setjmp F
|
||||||
|
siglongjmp F
|
||||||
GLIBC_2.2
|
GLIBC_2.2
|
||||||
GLIBC_2.2 A
|
GLIBC_2.2 A
|
||||||
_IO_adjust_wcolumn F
|
_IO_adjust_wcolumn F
|
||||||
|
@ -178,6 +178,10 @@ GLIBC_2.18
|
|||||||
GLIBC_2.18 A
|
GLIBC_2.18 A
|
||||||
pthread_getattr_default_np F
|
pthread_getattr_default_np F
|
||||||
pthread_setattr_default_np F
|
pthread_setattr_default_np F
|
||||||
|
GLIBC_2.19
|
||||||
|
GLIBC_2.19 A
|
||||||
|
longjmp F
|
||||||
|
siglongjmp F
|
||||||
GLIBC_2.2
|
GLIBC_2.2
|
||||||
GLIBC_2.2 A
|
GLIBC_2.2 A
|
||||||
__open64 F
|
__open64 F
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
#include <libc-symbols.h>
|
||||||
#define __longjmp ____longjmp_chk
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
#define CHECK_SP(env, guard) \
|
#define CHECK_SP(env, guard) \
|
||||||
do \
|
do \
|
||||||
@ -51,4 +51,23 @@
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#include "__longjmp.c"
|
|
||||||
|
#if defined NOT_IN_libc
|
||||||
|
/* Build a non-versioned object for rtld-*. */
|
||||||
|
# define __longjmp ____longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
|
||||||
|
#else /* !NOT_IN_libc */
|
||||||
|
# define __longjmp ____v2__longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
# undef __longjmp
|
||||||
|
|
||||||
|
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
|
||||||
|
# undef __longjmp
|
||||||
|
# define __V1_JMPBUF
|
||||||
|
# define __longjmp ____v1__longjmp_chk
|
||||||
|
# include "__longjmp-common.c"
|
||||||
|
# undef __longjmp
|
||||||
|
|
||||||
|
# endif
|
||||||
|
#endif /* !NOT_IN_libc */
|
||||||
|
@ -95,6 +95,16 @@ GLIBC_2.17
|
|||||||
GLIBC_2.18
|
GLIBC_2.18
|
||||||
GLIBC_2.18 A
|
GLIBC_2.18 A
|
||||||
__cxa_thread_atexit_impl F
|
__cxa_thread_atexit_impl F
|
||||||
|
GLIBC_2.19
|
||||||
|
GLIBC_2.19 A
|
||||||
|
__longjmp_chk F
|
||||||
|
__setjmp F
|
||||||
|
__sigsetjmp F
|
||||||
|
_longjmp F
|
||||||
|
_setjmp F
|
||||||
|
longjmp F
|
||||||
|
setjmp F
|
||||||
|
siglongjmp F
|
||||||
GLIBC_2.2
|
GLIBC_2.2
|
||||||
GLIBC_2.2 A
|
GLIBC_2.2 A
|
||||||
_Exit F
|
_Exit F
|
||||||
|
@ -12,6 +12,10 @@ GLIBC_2.18
|
|||||||
GLIBC_2.18 A
|
GLIBC_2.18 A
|
||||||
pthread_getattr_default_np F
|
pthread_getattr_default_np F
|
||||||
pthread_setattr_default_np F
|
pthread_setattr_default_np F
|
||||||
|
GLIBC_2.19
|
||||||
|
GLIBC_2.19 A
|
||||||
|
longjmp F
|
||||||
|
siglongjmp F
|
||||||
GLIBC_2.2
|
GLIBC_2.2
|
||||||
GLIBC_2.2 A
|
GLIBC_2.2 A
|
||||||
_IO_flockfile F
|
_IO_flockfile F
|
||||||
|
35
sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c
Normal file
35
sysdeps/unix/sysv/linux/s390/v1-longjmp_chk.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* Copyright (C) 2013 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 Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 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
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
This went into a separate source file since we would otherwise be
|
||||||
|
needed to include two different versions of setjmp.h into the same
|
||||||
|
file. */
|
||||||
|
|
||||||
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
|
#if !defined NOT_IN_libc && defined SHARED
|
||||||
|
# if SHLIB_COMPAT (libc, GLIBC_2_11, GLIBC_2_19)
|
||||||
|
|
||||||
|
# define __v1__longjmp ____v1__longjmp_chk
|
||||||
|
# define __v1__libc_siglongjmp __v1__libc_siglongjmp_chk
|
||||||
|
|
||||||
|
# include <v1-longjmp.c>
|
||||||
|
|
||||||
|
compat_symbol (libc, __v1__libc_siglongjmp_chk, __longjmp_chk, GLIBC_2_11);
|
||||||
|
|
||||||
|
# endif
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user