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 3938cb8a4f45e2df710cfbab81c3c3f28b3167c3..55e3a95bbbeb26ca32ff2147c0b84585b084d3d8 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf[32];
+typedef unsigned long long __jmp_buf[32];
index 5610be9bc82baebbd3ae1b11a36ad1171856ac38..decd26dca07a092b1e864c0a819a6b3b86df62b1 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[6];
+typedef unsigned long __jmp_buf[6];
index 8f0376b25a45533cbebbe1434a33f585f6da1555..b2bd9748c5d1db4134ac9a4fb78a7e16e96c3f86 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[18];
+typedef unsigned long __jmp_buf[18];
index 6bb15464763e72b41b15fd72aefc71de64546c83..467872e954cce442dcda75a775c2b9b9162f7d6c 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf [15];
+typedef unsigned long long __jmp_buf[15];
index ab583abafd93b6c92e2e548824a83f9fd45091e9..1cb0f26d1d5601096fc361390c304bd8c0ac22d7 100644 (file)
@@ -1 +1 @@
-typedef unsigned long long jmp_buf [56];
+typedef unsigned long long __jmp_buf[56];
index 81d4968a1fcc5b8116a53e198bce1c094d3b48ae..63973a8001168472c1acc8ba1df81f59e8f7b583 100644 (file)
@@ -1 +1 @@
-typedef unsigned long jmp_buf[8];
+typedef unsigned long __jmp_buf[8];
index 5456d8f8faf9a2a69669c1732fac8721526974f9..0da27de6e5c67efd98875cbf54d9f82a71f347a9 100644 (file)
@@ -9,27 +9,26 @@ extern "C" {
 
 #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)
-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
 
-
 #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);
 
index a7bcca2439e67575c1317bb76e4862d183b58db8..2974ff7fc49f9067139db95c72c99f5859121b19 100644 (file)
@@ -7,5 +7,5 @@
 _Noreturn void siglongjmp(sigjmp_buf buf, int ret)
 {
        if (buf->__fl) __restore_sigs(buf->__ss);
-       longjmp(buf->__jb, ret);
+       longjmp(buf, ret);
 }
index 01ba0dffeddf4f7502c4db31fc251f1bdb00226a..6a5f6f158e3756c3a9f3ba70f0a19806968a1be5 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);
-       return setjmp(buf->__jb);
+       return setjmp(buf);
 }