change jmp_buf to share an underlying type and struct tag with sigjmp_buf
authorRich Felker <dalias@aerifal.cx>
Wed, 24 Jul 2013 06:17:02 +0000 (02:17 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 24 Jul 2013 06:17:02 +0000 (02:17 -0400)
this is necessary to meet the C++ ABI target. alternatives were
considered to avoid the size increase for non-sig jmp_buf objects, but
they seemed to have worse properties. moreover, the relative size
increase is only extreme on x86[_64]; one way of interpreting this is
that, if the size increase from this patch makes jmp_buf use too much
memory, then the program was already using too much memory when built
for non-x86 archs.

arch/arm/bits/setjmp.h
arch/i386/bits/setjmp.h
arch/microblaze/bits/setjmp.h
arch/mips/bits/setjmp.h
arch/powerpc/bits/setjmp.h
arch/x86_64/bits/setjmp.h
include/setjmp.h
src/signal/siglongjmp.c
src/signal/sigsetjmp.c

index 3938cb8..55e3a95 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf[32];
+typedef unsigned long long __jmp_buf[32];
index 5610be9..decd26d 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[6];
+typedef unsigned long __jmp_buf[6];
index 8f0376b..b2bd974 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[18];
+typedef unsigned long __jmp_buf[18];
index 6bb1546..467872e 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf [15];
+typedef unsigned long long __jmp_buf[15];
index ab583ab..1cb0f26 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf [56];
+typedef unsigned long long __jmp_buf[56];
index 81d4968..63973a8 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[8];
+typedef unsigned long __jmp_buf[8];
index 5456d8f..0da27de 100644 (file)
@@ -9,27 +9,26 @@ extern "C" {
 
 #include <bits/setjmp.h>
 
 
 #include <bits/setjmp.h>
 
+typedef struct __jmp_buf_tag {
+       __jmp_buf __jb;
+       unsigned long __fl;
+       unsigned long __ss[128/sizeof(long)];
+} jmp_buf[1];
 
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
  || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
  || defined(_BSD_SOURCE)
 
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
  || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
  || defined(_BSD_SOURCE)
-typedef struct __sigjmp_buf {
-       jmp_buf __jb;
-       unsigned long __fl;
-       unsigned long __ss[128/sizeof(long)];
-} sigjmp_buf[1];
+typedef jmp_buf sigjmp_buf;
 int sigsetjmp (sigjmp_buf, int);
 _Noreturn void siglongjmp (sigjmp_buf, int);
 #endif
 
 int sigsetjmp (sigjmp_buf, int);
 _Noreturn void siglongjmp (sigjmp_buf, int);
 #endif
 
-
 #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
  || defined(_BSD_SOURCE)
 int _setjmp (jmp_buf);
 _Noreturn void _longjmp (jmp_buf, int);
 #endif
 
 #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
  || defined(_BSD_SOURCE)
 int _setjmp (jmp_buf);
 _Noreturn void _longjmp (jmp_buf, int);
 #endif
 
-
 int setjmp (jmp_buf);
 _Noreturn void longjmp (jmp_buf, int);
 
 int setjmp (jmp_buf);
 _Noreturn void longjmp (jmp_buf, int);
 
index a7bcca2..2974ff7 100644 (file)
@@ -7,5 +7,5 @@
 _Noreturn void siglongjmp(sigjmp_buf buf, int ret)
 {
        if (buf->__fl) __restore_sigs(buf->__ss);
 _Noreturn void siglongjmp(sigjmp_buf buf, int ret)
 {
        if (buf->__fl) __restore_sigs(buf->__ss);
-       longjmp(buf->__jb, ret);
+       longjmp(buf, ret);
 }
 }
index 01ba0df..6a5f6f1 100644 (file)
@@ -11,5 +11,5 @@ int sigsetjmp(sigjmp_buf buf, int save)
 {
        if ((buf->__fl = save))
                pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
 {
        if ((buf->__fl = save))
                pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
-       return setjmp(buf->__jb);
+       return setjmp(buf);
 }
 }