mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 02:40:08 +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>
|
||||
|
||||
[BZ #16400]
|
||||
|
@ -106,6 +106,7 @@ libpthread {
|
||||
GLIBC_2.11
|
||||
GLIBC_2.12
|
||||
GLIBC_2.18
|
||||
GLIBC_2.19
|
||||
GLIBC_PRIVATE
|
||||
}
|
||||
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 {
|
||||
GLIBC_2.3 {
|
||||
# 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. */
|
||||
long __fpregs[4];
|
||||
# endif
|
||||
#ifndef __V1_JMPBUF
|
||||
unsigned long __flags;
|
||||
char __reserved[128];
|
||||
#endif
|
||||
} __jmp_buf[1];
|
||||
|
||||
#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
|
||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||
void
|
||||
attribute_hidden void
|
||||
__longjmp (__jmp_buf env, int val)
|
||||
{
|
||||
#ifdef PTR_DEMANGLE
|
@ -27,24 +27,24 @@
|
||||
ENTRY (setjmp)
|
||||
.weak C_SYMBOL_NAME (setjmp)
|
||||
lhi %r3,1 /* second argument of one */
|
||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
||||
j 0f /* 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 .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
||||
j 0f /* branch relativ to __sigsetjmp */
|
||||
END (_setjmp)
|
||||
libc_hidden_def (_setjmp)
|
||||
|
||||
ENTRY(__setjmp)
|
||||
lhi %r3,0 /* second argument of zero */
|
||||
j .Linternal_sigsetjmp /* branch relativ to __sigsetjmp */
|
||||
j 0f /* branch relativ to __sigsetjmp */
|
||||
END (__setjmp)
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
.Linternal_sigsetjmp:
|
||||
0:
|
||||
#ifdef PTR_MANGLE
|
||||
stm %r6,%r13,0(%r2) /* store registers in jmp_buf */
|
||||
lr %r4,%r14
|
||||
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
|
||||
stm %r4,%r5,32(%r2)
|
||||
#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)
|
||||
@ -66,15 +70,15 @@ ENTRY(__sigsetjmp)
|
||||
we can't save and restore our caller's value. Instead, we do an
|
||||
indirect jump through the GOT. */
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
0: al %r1,1f-0b(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||
br %r1
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
1: .long _GLOBAL_OFFSET_TABLE_ - 0b
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */
|
||||
br %r1 /* tail-call __sigjmp_save */
|
||||
.L1: .long __sigjmp_save
|
||||
0: l %r1,1f-0b(0,%r1) /* load address of __sigjmp_save */
|
||||
br %r1 /* tail-call __sigjmp_save */
|
||||
1: .long __sigjmp_save
|
||||
#endif
|
||||
END (__sigsetjmp)
|
@ -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. */
|
||||
void
|
||||
attribute_hidden void
|
||||
__longjmp (__jmp_buf env, int val)
|
||||
{
|
||||
#ifdef PTR_DEMANGLE
|
@ -27,24 +27,24 @@
|
||||
ENTRY (setjmp)
|
||||
.weak C_SYMBOL_NAME (setjmp)
|
||||
lghi %r3,1 /* Second argument of one. */
|
||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
||||
j 0f /* Branch relativ to __sigsetjmp. */
|
||||
END (setjmp)
|
||||
|
||||
/* Binary compatibility entry point. */
|
||||
ENTRY(_setjmp)
|
||||
.weak C_SYMBOL_NAME (_setjmp)
|
||||
slgr %r3,%r3 /* Second argument of zero. */
|
||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
||||
END (setjmp)
|
||||
j 0f /* Branch relativ to __sigsetjmp. */
|
||||
END (_setjmp)
|
||||
libc_hidden_def (_setjmp)
|
||||
|
||||
ENTRY(__setjmp)
|
||||
slgr %r3,%r3 /* Second argument of zero. */
|
||||
j .Linternal_sigsetjmp /* Branch relativ to __sigsetjmp. */
|
||||
END (setjmp)
|
||||
j 0f /* Branch relativ to __sigsetjmp. */
|
||||
END (__setjmp)
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
.Linternal_sigsetjmp:
|
||||
0:
|
||||
#ifdef PTR_MANGLE
|
||||
stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */
|
||||
lgr %r4,%r14
|
||||
@ -54,6 +54,10 @@ ENTRY(__sigsetjmp)
|
||||
stmg %r4,%r5,64(%r2)
|
||||
#else
|
||||
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
|
||||
std %f8,80(%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)
|
||||
sysdep_routines += dl-vdso
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),debug)
|
||||
ifeq (yes,$(build-shared))
|
||||
sysdep_routines += v1-longjmp_chk
|
||||
endif
|
||||
endif
|
||||
|
@ -1,4 +1,7 @@
|
||||
libc {
|
||||
GLIBC_2.19 {
|
||||
__longjmp_chk;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__vdso_clock_gettime;
|
||||
__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 <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
#include <libc-symbols.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
@ -51,4 +51,22 @@
|
||||
} \
|
||||
} 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 A
|
||||
__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 A
|
||||
_IO_adjust_wcolumn F
|
||||
|
@ -178,6 +178,10 @@ GLIBC_2.18
|
||||
GLIBC_2.18 A
|
||||
pthread_getattr_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 A
|
||||
__open64 F
|
||||
|
@ -26,8 +26,8 @@
|
||||
#include <stdint.h>
|
||||
#include <signal.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define __longjmp ____longjmp_chk
|
||||
#include <libc-symbols.h>
|
||||
#include <shlib-compat.h>
|
||||
|
||||
#define CHECK_SP(env, guard) \
|
||||
do \
|
||||
@ -51,4 +51,23 @@
|
||||
} \
|
||||
} 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 A
|
||||
__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 A
|
||||
_Exit F
|
||||
|
@ -12,6 +12,10 @@ GLIBC_2.18
|
||||
GLIBC_2.18 A
|
||||
pthread_getattr_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 A
|
||||
_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