Browse Source

change jmp_buf to share an underlying type and struct tag with sigjmp_buf

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.
Rich Felker 11 years ago
parent
commit
9693501c15

+ 1 - 1
arch/arm/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long long jmp_buf[32];
+typedef unsigned long long __jmp_buf[32];

+ 1 - 1
arch/i386/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long jmp_buf[6];
+typedef unsigned long __jmp_buf[6];

+ 1 - 1
arch/microblaze/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long jmp_buf[18];
+typedef unsigned long __jmp_buf[18];

+ 1 - 1
arch/mips/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long long jmp_buf [15];
+typedef unsigned long long __jmp_buf[15];

+ 1 - 1
arch/powerpc/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long long jmp_buf [56];
+typedef unsigned long long __jmp_buf[56];

+ 1 - 1
arch/x86_64/bits/setjmp.h

@@ -1 +1 @@
-typedef unsigned long jmp_buf[8];
+typedef unsigned long __jmp_buf[8];

+ 6 - 7
include/setjmp.h

@@ -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);
 

+ 1 - 1
src/signal/siglongjmp.c

@@ -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);
 }

+ 1 - 1
src/signal/sigsetjmp.c

@@ -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);
 }