This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] PPC enable Altivec for setjmp/longjmp part 1 of 5
- From: Steve Munroe <sjmunroe at us dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com
- Date: Fri, 13 Feb 2004 18:22:16 -0600
- Subject: [PATCH] PPC enable Altivec for setjmp/longjmp part 1 of 5
- Organization: IBM LTC
- Reply-to: sjmunroe at vnet dot ibm dot com
Updated patch per Ulrich Drepper comments. Parts 2, and 3 to follow.
Parts 4 and 5 did not change.
2004-02-13 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/powerpc/Dist: New File.
* sysdeps/powerpc/Makefile(sysdep_routines): Add novmx-longjmp.c
and novmx-sigjmp.c
* sysdeps/powerpc/Versions(libc): To GLIBC_2.3_4 add _longjmp,
__sigsetjmp, _setjmp, longjmp, and setjmp. To GLIBC_PRIVATE add
__novmx__libc_longjmp, __novmx__libc_siglongjmp, __vmx__libc_longjmp,
and __vmx__libc_siglongjmp.
* sysdeps/powerpc/bits/setjmp.h: Define JB_VRSAVE, JB_VRS, and adjust
JB_SIZE to add VMX regs to __jmp_buf.
* sysdeps/powerpc/longjmp.c: New file.
* sysdeps/powerpc/novmxsetjmp.h: New file.
* sysdeps/powerpc/novmx-longjmp.c: New file.
* sysdeps/powerpc/novmx-sigjmp.c: New file.
* sysdeps/powerpc/sigjmp.c: New file.
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/Dist libc23/sysdeps/powerpc/Dist
--- libc23-cvstip-20040210/sysdeps/powerpc/Dist Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/Dist Tue Feb 10 17:26:50 2004
@@ -0,0 +1,2 @@
+novmx-longjmp.c
+novmx-sigjmp.c
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/Makefile libc23/sysdeps/powerpc/Makefile
--- libc23-cvstip-20040210/sysdeps/powerpc/Makefile 2004-01-15 22:42:35.000000000 -0600
+++ libc23/sysdeps/powerpc/Makefile 2004-02-10 17:26:50.000000000 -0600
@@ -15,7 +15,13 @@
sysdep-dl-routines += dl-machine
sysdep_routines += dl-machine
# extra shared linker files to link only into dl-allobjs.so
-sysdep-rtld-routines += dl-machine
+sysdep-rtld-routines += dl-machine
+endif
+
+ifeq ($(subdir),setjmp)
+ifeq (yes,$(build-shared))
+sysdep_routines += novmx-longjmp novmx-sigjmp
+endif
endif
ifeq ($(subdir),csu)
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/Versions libc23/sysdeps/powerpc/Versions
--- libc23-cvstip-20040210/sysdeps/powerpc/Versions 2002-09-05 04:54:59.000000000 -0500
+++ libc23/sysdeps/powerpc/Versions 2004-02-10 17:26:50.000000000 -0600
@@ -4,3 +4,15 @@
__fe_dfl_env; __fe_enabled_env; __fe_nonieee_env; __fe_nomask_env;
}
}
+
+libc {
+ GLIBC_2.3.4 {
+ _longjmp; __sigsetjmp; _setjmp;
+ longjmp; setjmp;
+ }
+ GLIBC_PRIVATE {
+ __novmx__libc_longjmp; __novmx__libc_siglongjmp;
+ __vmx__libc_longjmp; __vmx__libc_siglongjmp;
+ }
+}
+
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/bits/setjmp.h libc23/sysdeps/powerpc/bits/setjmp.h
--- libc23-cvstip-20040210/sysdeps/powerpc/bits/setjmp.h 2003-04-11 19:53:57.000000000 -0500
+++ libc23/sysdeps/powerpc/bits/setjmp.h 2004-02-13 15:32:37.000000000 -0600
@@ -37,22 +37,38 @@
# define JB_LR 2 /* The address we will return to */
# if __WORDSIZE == 64
# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18*2 words total. */
-# define JB_CR 21 /* Condition code registers. */
+# define JB_CR 21 /* Condition code registers with the VRSAVE at */
+ /* offset 172 (low half of the double word. */
# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total. */
-# define JB_SIZE (40*8)
+# define JB_SIZE (64*8) /* As per PPC64-VMXabi.txt */
+# define JB_VRSAVE 21 /* VRSAVE shares a double word with the CR at offset */
+ /* 168 (high half of the double word). */
+# define JB_VRS 40 /* VRs 20 through 31 are saved, 12*4 words total. */
# else
# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total. */
# define JB_CR 21 /* Condition code registers. */
# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total. */
-# define JB_SIZE (58*4)
+# define JB_SIZE ((64+(12*4))*4)
+# define JB_VRSAVE 62
+# define JB_VRS 64
# endif
#endif
+
+/* The current powerpc 32-bit Altivec ABI specifies for SVR4 ABI and EABI
+ the vrsave must be at byte 248 & v20 at byte 256. So we must pad this
+ correctly on 32 bit. It also insists that vecregs are only gauranteed
+ 4 byte alignment so we need to use vperm in the setjmp/longjmp routines.
+ We have to version the code because members like int __mask_was_saved
+ in the jmp_buf will move as jmp_buf is now larger than 248 bytes. We
+ cannot keep the altivec jmp_buf backward compatible with the jmp_buf. */
#ifndef _ASM
# if __WORDSIZE == 64
-typedef long int __jmp_buf[40];
+typedef long int __jmp_buf[64] __attribute__((aligned(16)));
# else
-typedef long int __jmp_buf[58];
+/* The alignment is not essential, i.e.the buffer can be copied to a 4 byte
+ aligned buffer as per the ABI it is just added for performance reasons. */
+typedef long int __jmp_buf[64+(12*4)] __attribute__((aligned(16)));
# endif
#endif
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/longjmp.c libc23/sysdeps/powerpc/longjmp.c
--- libc23-cvstip-20040210/sysdeps/powerpc/longjmp.c Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/longjmp.c Fri Feb 13 16:21:29 2004
@@ -0,0 +1,61 @@
+/* Copyright (C) 1991,92,94,95,97,98,2000,2002 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+/*
+ Versioned copy of sysdeps/generic/longjmp.c modified for AltiVec support.
+ */
+#include <shlib-compat.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <signal.h>
+
+extern void __vmx__longjmp (__jmp_buf __env, int __val);
+ __attribute__ ((noreturn));
+extern void __vmx__libc_longjmp (sigjmp_buf env, int val);
+ __attribute__ ((noreturn));
+libc_hidden_proto (__vmx__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
+__vmx__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. */
+ __vmx__longjmp (env[0].__jmpbuf, val ?: 1);
+}
+
+strong_alias (__vmx__libc_siglongjmp, __vmx__libc_longjmp)
+libc_hidden_def (__vmx__libc_longjmp)
+weak_alias (__vmx__libc_siglongjmp, __vmx_longjmp)
+weak_alias (__vmx__libc_siglongjmp, __vmxlongjmp)
+weak_alias (__vmx__libc_siglongjmp, __vmxsiglongjmp)
+
+
+default_symbol_version (__vmx__libc_longjmp, __libc_longjmp, GLIBC_2.3.4);
+default_symbol_version (__vmx__libc_siglongjmp, __libc_siglongjmp, GLIBC_2.3.4);
+default_symbol_version (__vmx_longjmp, _longjmp, GLIBC_2.3.4);
+default_symbol_version (__vmxlongjmp, longjmp, GLIBC_2.3.4);
+default_symbol_version (__vmxsiglongjmp, siglongjmp, GLIBC_2.3.4);
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/novmx-longjmp.c libc23/sysdeps/powerpc/novmx-longjmp.c
--- libc23-cvstip-20040210/sysdeps/powerpc/novmx-longjmp.c Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/novmx-longjmp.c Fri Feb 13 16:57:22 2004
@@ -0,0 +1,67 @@
+/* Copyright (C) 1991,92,94,95,97,98,2000,2002,2003 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+/*
+ Copy of sysdeps/generic/longjmp.c modified for backward compatibility
+ with old non AltiVec/VMX longjmp.
+ */
+#include <bits/wordsize.h>
+#include <shlib-compat.h>
+#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+# include <stddef.h>
+# include <novmxsetjmp.h>
+# include <signal.h>
+
+
+/* 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
+__novmx__libc_siglongjmp (__novmx__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. */
+ __novmx__longjmp (env[0].__jmpbuf, val ?: 1);
+}
+
+strong_alias (__novmx__libc_siglongjmp, __novmx__libc_longjmp)
+libc_hidden_def (__novmx__libc_longjmp)
+weak_alias (__novmx__libc_siglongjmp, __novmx_longjmp)
+weak_alias (__novmx__libc_siglongjmp, __novmxlongjmp)
+weak_alias (__novmx__libc_siglongjmp, __novmxsiglongjmp)
+
+# if __WORDSIZE == 64
+symbol_version (__novmx__libc_longjmp,__libc_longjmp,GLIBC_2.3);
+symbol_version (__novmx__libc_siglongjmp,__libc_siglongjmp,GLIBC_2.3);
+symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.3);
+symbol_version (__novmxlongjmp,longjmp,GLIBC_2.3);
+symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.3);
+# else
+symbol_version (__novmx__libc_longjmp,__libc_longjmp,GLIBC_2.0);
+symbol_version (__novmx__libc_siglongjmp,__libc_siglongjmp,GLIBC_2.0);
+symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.0);
+symbol_version (__novmxlongjmp,longjmp,GLIBC_2.0);
+symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.0);
+# endif
+#endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)) */
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/novmx-sigjmp.c libc23/sysdeps/powerpc/novmx-sigjmp.c
--- libc23-cvstip-20040210/sysdeps/powerpc/novmx-sigjmp.c Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/novmx-sigjmp.c Fri Feb 13 16:57:45 2004
@@ -0,0 +1,49 @@
+/* Copyright (C) 1992, 1994, 1997, 2003 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Copy of sysdeps/generic/sigjmp.c modified for backward compatibility
+ with old non AltiVec/VMX setjmp. */
+#include <bits/wordsize.h>
+#include <shlib-compat.h>
+#if !defined NOT_IN_libc && defined SHARED
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+# include <stddef.h>
+# include <novmxsetjmp.h>
+# include <signal.h>
+
+/* This function is called by the `sigsetjmp' macro
+ before doing a `__setjmp' on ENV[0].__jmpbuf.
+ Always return zero. */
+
+int
+__novmx__sigjmp_save (__novmx__sigjmp_buf env, int savemask)
+{
+ env[0].__mask_was_saved = (savemask &&
+ __sigprocmask (SIG_BLOCK, (sigset_t *) NULL,
+ &env[0].__saved_mask) == 0);
+
+ return 0;
+}
+
+# if __WORDSIZE == 64
+symbol_version (__novmx__sigjmp_save,__sigjmp_save,GLIBC_2.3);
+# else
+symbol_version (__novmx__sigjmp_save,__sigjmp_save,GLIBC_2.0);
+# endif /* __WORDSIZE == 64 */
+# endif /* SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) */
+#endif /* !NOT_IN_libc && SHARED */
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/novmxsetjmp.h libc23/sysdeps/powerpc/novmxsetjmp.h
--- libc23-cvstip-20040210/sysdeps/powerpc/novmxsetjmp.h Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/novmxsetjmp.h Fri Feb 13 18:08:57 2004
@@ -0,0 +1,132 @@
+/* Copyright (C) 1991-1999, 2001, 2002, 2004 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* copied from setjmp/setjmp.h, powerpc/bits/setjmp.h and modified
+ appropriately to keep backward compatible with setjmp without
+ AltiVec/VMX support.
+
+ This file is not exported and the interfaces are private to libc. */
+
+#ifndef __NOVMX_SETJMP_H
+#define __NOVMX_SETJMP_H 1
+
+#include <bits/wordsize.h>
+
+/* The following definitions are needed by ASM implementations of the old
+ (novmx) __longjmp/__setjmp functions. */
+
+# define JB_GPR1 0 /* Also known as the stack pointer */
+# define JB_GPR2 1
+# define JB_LR 2 /* The address we will return to */
+# if __WORDSIZE == 64
+# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18*2 words total. */
+# define JB_CR 21 /* Condition code registers. */
+# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total. */
+# define JB_SIZE (40*8)
+# else
+# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total. */
+# define JB_CR 21 /* Condition code registers. */
+# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total. */
+# define JB_SIZE (58*4)
+# endif
+
+#ifndef _ASM
+/* The following definitions are needed by the novmx* implementations of
+ setjmp/longjmp/sigsetjmp/etc that wrapper __setjmp/__longjmp. */
+
+# if __WORDSIZE == 64
+typedef long int __jmp_buf[40];
+# else
+typedef long int __jmp_buf[58];
+# endif
+
+# include <bits/sigset.h> /* Get `__sigset_t'. */
+
+/* Calling environment, plus possibly a saved signal mask. */
+typedef struct __novmx__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. */
+ } __novmx__jmp_buf[1];
+
+
+/* Store the calling environment in ENV, also saving the signal mask.
+ Return 0. */
+extern int __novmxsetjmp (__novmx__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 __novmx__sigsetjmp (struct __novmx__jmp_buf_tag __env[1], int __savemask);
+
+/* Store the calling environment in ENV, not saving the signal mask.
+ Return 0. */
+extern int __novmx_setjmp (struct __novmx__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 __novmxlongjmp (struct __novmx__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 __novmx_longjmp (struct __novmx__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 __novmx__jmp_buf_tag __novmx__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 __novmxsiglongjmp (__novmx__sigjmp_buf __env, int __val)
+ __attribute__ ((__noreturn__));
+
+/* Internal machine-dependent function to restore context sans signal mask. */
+extern void __novmx__longjmp (__novmx__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 __novmx__sigjmp_save (__novmx__jmp_buf __env, int __savemask);
+
+extern void _longjmp_unwind (__novmx__jmp_buf env, int val);
+
+extern void __novmx__libc_siglongjmp (__novmx__sigjmp_buf env, int val)
+ __attribute__ ((noreturn));
+
+extern void __novmx__libc_longjmp (__novmx__sigjmp_buf env, int val)
+ __attribute__ ((noreturn));
+
+libc_hidden_proto (__novmx__libc_longjmp)
+libc_hidden_proto (__novmx_setjmp)
+libc_hidden_proto (__novmx__sigsetjmp)
+#endif /* !_ASM */
+
+#endif
diff -urN libc23-cvstip-20040210/sysdeps/powerpc/sigjmp.c libc23/sysdeps/powerpc/sigjmp.c
--- libc23-cvstip-20040210/sysdeps/powerpc/sigjmp.c Wed Dec 31 17:00:00 1969
+++ libc23/sysdeps/powerpc/sigjmp.c Tue Feb 10 17:26:50 2004
@@ -0,0 +1,47 @@
+/* Copyright (C) 1992, 1994, 1997 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+/*
+ Versioned copy of sysdeps/generic/sigjmp.c modified for AltiVec support.
+ */
+#include <shlib-compat.h>
+#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
+__vmx__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;
+}
+
+#if defined NOT_IN_libc
+/* Build a none versioned object for rtld-*. */
+strong_alias (__vmx__sigjmp_save,__sigjmp_save)
+#else
+/* Build a versioned object for libc. */
+default_symbol_version (__vmx__sigjmp_save,__sigjmp_save,GLIBC_2.3.4);
+#endif
+