mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 19:23:34 +08:00
setjmp: Replace jmp_buf-macros.h with jmp_buf-macros.sym
It requires less boilerplate code for newer ports. The _Static_assert checks from internal setjmp are moved to its own internal test since setjmp.h is included early by multiple headers (to generate rtld-sizes.sym). The riscv jmp_buf-macros.h check is also redundant, it is already done by riscv configure.ac. Checked with a build for the affected architectures.
This commit is contained in:
parent
5c3ece451d
commit
bc801b3a40
@ -31,39 +31,6 @@ libc_hidden_proto (__sigsetjmp)
|
||||
extern __typeof (__sigsetjmp) __sigsetjmp attribute_hidden;
|
||||
# endif
|
||||
|
||||
/* Check jmp_buf sizes, alignments and offsets. */
|
||||
# include <stddef.h>
|
||||
# include <jmp_buf-macros.h>
|
||||
|
||||
# define SJSTR_HELPER(x) #x
|
||||
# define SJSTR(x) SJSTR_HELPER(x)
|
||||
|
||||
# define TEST_SIZE(type, size) \
|
||||
_Static_assert (sizeof (type) == size, \
|
||||
"size of " #type " != " \
|
||||
SJSTR (size))
|
||||
# define TEST_ALIGN(type, align) \
|
||||
_Static_assert (__alignof__ (type) == align , \
|
||||
"align of " #type " != " \
|
||||
SJSTR (align))
|
||||
# define TEST_OFFSET(type, member, offset) \
|
||||
_Static_assert (offsetof (type, member) == offset, \
|
||||
"offset of " #member " field of " #type " != " \
|
||||
SJSTR (offset))
|
||||
|
||||
/* Check if jmp_buf have the expected sizes. */
|
||||
TEST_SIZE (jmp_buf, JMP_BUF_SIZE);
|
||||
TEST_SIZE (sigjmp_buf, SIGJMP_BUF_SIZE);
|
||||
|
||||
/* Check if jmp_buf have the expected alignments. */
|
||||
TEST_ALIGN (jmp_buf, JMP_BUF_ALIGN);
|
||||
TEST_ALIGN (sigjmp_buf, SIGJMP_BUF_ALIGN);
|
||||
|
||||
/* Check if internal fields in jmp_buf have the expected offsets. */
|
||||
TEST_OFFSET (struct __jmp_buf_tag, __mask_was_saved,
|
||||
MASK_WAS_SAVED_OFFSET);
|
||||
TEST_OFFSET (struct __jmp_buf_tag, __saved_mask,
|
||||
SAVED_MASK_OFFSET);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -31,7 +31,10 @@ routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \
|
||||
tests := tst-setjmp jmpbug bug269-setjmp tst-setjmp-fp \
|
||||
tst-sigsetjmp tst-setjmp-static
|
||||
tests-static := tst-setjmp-static
|
||||
tests-internal := \
|
||||
tst-setjmp-check
|
||||
|
||||
gen-as-const-headers += jmp_buf-macros.sym
|
||||
|
||||
include ../Rules
|
||||
|
||||
|
11
setjmp/jmp_buf-macros.sym
Normal file
11
setjmp/jmp_buf-macros.sym
Normal file
@ -0,0 +1,11 @@
|
||||
#include <setjmp.h>
|
||||
#include <stddef.h>
|
||||
|
||||
--
|
||||
|
||||
JMP_BUF_SIZE sizeof (jmp_buf)
|
||||
JMP_BUF_ALIGN _Alignof (jmp_buf)
|
||||
SIGJMP_BUF_SIZE sizeof (sigjmp_buf)
|
||||
SIGJMP_BUF_ALIGN _Alignof (sigjmp_buf)
|
||||
MASK_WAS_SAVED_OFFSET offsetof (struct __jmp_buf_tag, __mask_was_saved)
|
||||
SAVED_MASK_OFFSET offsetof (struct __jmp_buf_tag, __saved_mask)
|
57
setjmp/tst-setjmp-check.c
Normal file
57
setjmp/tst-setjmp-check.c
Normal file
@ -0,0 +1,57 @@
|
||||
/* Check jmp_buf sizes, alignments and offsets.
|
||||
Copyright (C) 2021 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <jmp_buf-macros.h>
|
||||
|
||||
#define SJSTR_HELPER(x) #x
|
||||
#define SJSTR(x) SJSTR_HELPER(x)
|
||||
|
||||
#define TEST_SIZE(type, size) \
|
||||
_Static_assert (sizeof (type) == size, \
|
||||
"size of " #type " != " \
|
||||
SJSTR (size))
|
||||
#define TEST_ALIGN(type, align) \
|
||||
_Static_assert (__alignof__ (type) == align , \
|
||||
"align of " #type " != " \
|
||||
SJSTR (align))
|
||||
#define TEST_OFFSET(type, member, offset) \
|
||||
_Static_assert (offsetof (type, member) == offset, \
|
||||
"offset of " #member " field of " #type " != " \
|
||||
SJSTR (offset))
|
||||
|
||||
/* Check if jmp_buf have the expected sizes. */
|
||||
TEST_SIZE (jmp_buf, JMP_BUF_SIZE);
|
||||
TEST_SIZE (sigjmp_buf, SIGJMP_BUF_SIZE);
|
||||
|
||||
/* Check if jmp_buf have the expected alignments. */
|
||||
TEST_ALIGN (jmp_buf, JMP_BUF_ALIGN);
|
||||
TEST_ALIGN (sigjmp_buf, SIGJMP_BUF_ALIGN);
|
||||
|
||||
/* Check if internal fields in jmp_buf have the expected offsets. */
|
||||
TEST_OFFSET (struct __jmp_buf_tag, __mask_was_saved,
|
||||
MASK_WAS_SAVED_OFFSET);
|
||||
TEST_OFFSET (struct __jmp_buf_tag, __saved_mask,
|
||||
SAVED_MASK_OFFSET);
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 32
|
||||
#define SIGJMP_BUF_SIZE 32
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 24
|
||||
#define SAVED_MASK_OFFSET 28
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 312
|
||||
#define SIGJMP_BUF_SIZE 312
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 176
|
||||
#define SAVED_MASK_OFFSET 184
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 272
|
||||
#define SIGJMP_BUF_SIZE 272
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 136
|
||||
#define SAVED_MASK_OFFSET 144
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE (32 + 1 + 64 / (8 * sizeof (unsigned long int))) * sizeof (unsigned long int)
|
||||
#define SIGJMP_BUF_SIZE (32 + 1 + 64 / (8 * sizeof (unsigned long int))) * sizeof (unsigned long int)
|
||||
#define JMP_BUF_ALIGN __alignof__ (unsigned long int)
|
||||
#define SIGJMP_BUF_ALIGN __alignof__ (unsigned long int)
|
||||
#define MASK_WAS_SAVED_OFFSET (32 * sizeof (unsigned long int))
|
||||
#define SAVED_MASK_OFFSET (33 * sizeof (unsigned long int))
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 392
|
||||
#define SIGJMP_BUF_SIZE 392
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 256
|
||||
#define SAVED_MASK_OFFSET 260
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 268
|
||||
#define SIGJMP_BUF_SIZE 268
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 136
|
||||
#define SAVED_MASK_OFFSET 140
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 304
|
||||
#define SIGJMP_BUF_SIZE 304
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 168
|
||||
#define SAVED_MASK_OFFSET 172
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 156
|
||||
#define SIGJMP_BUF_SIZE 156
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 24
|
||||
#define SAVED_MASK_OFFSET 28
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 704
|
||||
#define SIGJMP_BUF_SIZE 704
|
||||
#define JMP_BUF_ALIGN 16
|
||||
#define SIGJMP_BUF_ALIGN 16
|
||||
#define MASK_WAS_SAVED_OFFSET 560
|
||||
#define SAVED_MASK_OFFSET 568
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 256
|
||||
#define SIGJMP_BUF_SIZE 256
|
||||
#define JMP_BUF_ALIGN 2
|
||||
#define SIGJMP_BUF_ALIGN 2
|
||||
#define MASK_WAS_SAVED_OFFSET 124
|
||||
#define SAVED_MASK_OFFSET 128
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 192
|
||||
#define SIGJMP_BUF_SIZE 192
|
||||
#define JMP_BUF_ALIGN 2
|
||||
#define SIGJMP_BUF_ALIGN 2
|
||||
#define MASK_WAS_SAVED_OFFSET 60
|
||||
#define SAVED_MASK_OFFSET 64
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 288
|
||||
#define SIGJMP_BUF_SIZE 288
|
||||
#define JMP_BUF_ALIGN 2
|
||||
#define SIGJMP_BUF_ALIGN 2
|
||||
#define MASK_WAS_SAVED_OFFSET 156
|
||||
#define SAVED_MASK_OFFSET 160
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 216
|
||||
#define SIGJMP_BUF_SIZE 216
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 84
|
||||
#define SAVED_MASK_OFFSET 88
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 240
|
||||
#define SIGJMP_BUF_SIZE 240
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 104
|
||||
#define SAVED_MASK_OFFSET 108
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 288
|
||||
#define SIGJMP_BUF_SIZE 288
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 152
|
||||
#define SAVED_MASK_OFFSET 156
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 304
|
||||
#define SIGJMP_BUF_SIZE 304
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 168
|
||||
#define SAVED_MASK_OFFSET 176
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 172
|
||||
#define SIGJMP_BUF_SIZE 172
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 40
|
||||
#define SAVED_MASK_OFFSET 44
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 592
|
||||
#define SIGJMP_BUF_SIZE 592
|
||||
#define JMP_BUF_ALIGN 16
|
||||
#define SIGJMP_BUF_ALIGN 16
|
||||
#define MASK_WAS_SAVED_OFFSET 448
|
||||
#define SAVED_MASK_OFFSET 452
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 656
|
||||
#define SIGJMP_BUF_SIZE 656
|
||||
#define JMP_BUF_ALIGN 16
|
||||
#define SIGJMP_BUF_ALIGN 16
|
||||
#define MASK_WAS_SAVED_OFFSET 512
|
||||
#define SAVED_MASK_OFFSET 520
|
@ -1,55 +0,0 @@
|
||||
/* The jump buffer constants for RISC-V.
|
||||
Copyright (C) 2020-2021 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Produced by this program:
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <setjmp.h>
|
||||
#include <stddef.h>
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
|
||||
printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
|
||||
printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
|
||||
printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
|
||||
printf ("#define MASK_WAS_SAVED_OFFSET %d\n",
|
||||
offsetof (struct __jmp_buf_tag, __mask_was_saved));
|
||||
printf ("#define SAVED_MASK_OFFSET %d\n",
|
||||
offsetof (struct __jmp_buf_tag, __saved_mask));
|
||||
} */
|
||||
|
||||
#if defined __riscv_float_abi_soft
|
||||
# define JMP_BUF_SIZE 188
|
||||
# define JMP_BUF_ALIGN 4
|
||||
# define SIGJMP_BUF_SIZE 188
|
||||
# define SIGJMP_BUF_ALIGN 4
|
||||
# define MASK_WAS_SAVED_OFFSET 56
|
||||
# define SAVED_MASK_OFFSET 60
|
||||
#elif defined __riscv_float_abi_double
|
||||
# define JMP_BUF_SIZE 288
|
||||
# define JMP_BUF_ALIGN 8
|
||||
# define SIGJMP_BUF_SIZE 288
|
||||
# define SIGJMP_BUF_ALIGN 8
|
||||
# define MASK_WAS_SAVED_OFFSET 152
|
||||
# define SAVED_MASK_OFFSET 156
|
||||
#else
|
||||
# error "Unknown RISC-V floating-point ABI"
|
||||
#endif
|
@ -1,53 +0,0 @@
|
||||
/* jump buffer constants for RISC-V
|
||||
Copyright (C) 2017-2021 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Produced by this program:
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <setjmp.h>
|
||||
#include <stddef.h>
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
|
||||
printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
|
||||
printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
|
||||
printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
|
||||
printf ("#define MASK_WAS_SAVED_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __mask_was_saved));
|
||||
printf ("#define SAVED_MASK_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __saved_mask));
|
||||
} */
|
||||
|
||||
#if defined __riscv_float_abi_soft
|
||||
# define JMP_BUF_SIZE 248
|
||||
# define JMP_BUF_ALIGN 8
|
||||
# define SIGJMP_BUF_SIZE 248
|
||||
# define SIGJMP_BUF_ALIGN 8
|
||||
# define MASK_WAS_SAVED_OFFSET 112
|
||||
# define SAVED_MASK_OFFSET 120
|
||||
#elif defined __riscv_float_abi_double
|
||||
# define JMP_BUF_SIZE 344
|
||||
# define JMP_BUF_ALIGN 8
|
||||
# define SIGJMP_BUF_SIZE 344
|
||||
# define SIGJMP_BUF_ALIGN 8
|
||||
# define MASK_WAS_SAVED_OFFSET 208
|
||||
# define SAVED_MASK_OFFSET 216
|
||||
#else
|
||||
# error "Unknown RISC-V floating-point ABI"
|
||||
#endif
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 188
|
||||
#define SIGJMP_BUF_SIZE 188
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 56
|
||||
#define SAVED_MASK_OFFSET 60
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 280
|
||||
#define SIGJMP_BUF_SIZE 280
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 144
|
||||
#define SAVED_MASK_OFFSET 152
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 192
|
||||
#define SIGJMP_BUF_SIZE 192
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 60
|
||||
#define SAVED_MASK_OFFSET 64
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 144
|
||||
#define SIGJMP_BUF_SIZE 144
|
||||
#define JMP_BUF_ALIGN 4
|
||||
#define SIGJMP_BUF_ALIGN 4
|
||||
#define MASK_WAS_SAVED_OFFSET 12
|
||||
#define SAVED_MASK_OFFSET 16
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 640
|
||||
#define SIGJMP_BUF_SIZE 640
|
||||
#define JMP_BUF_ALIGN 16
|
||||
#define SIGJMP_BUF_ALIGN 16
|
||||
#define MASK_WAS_SAVED_OFFSET 496
|
||||
#define SAVED_MASK_OFFSET 504
|
@ -1,4 +1,5 @@
|
||||
#include <setjmpP.h>
|
||||
#include <stddef.h>
|
||||
#undef __saved_mask
|
||||
|
||||
--
|
||||
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 200
|
||||
#define SIGJMP_BUF_SIZE 200
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 64
|
||||
#define SAVED_MASK_OFFSET 72
|
@ -1,6 +0,0 @@
|
||||
#define JMP_BUF_SIZE 200
|
||||
#define SIGJMP_BUF_SIZE 200
|
||||
#define JMP_BUF_ALIGN 8
|
||||
#define SIGJMP_BUF_ALIGN 8
|
||||
#define MASK_WAS_SAVED_OFFSET 64
|
||||
#define SAVED_MASK_OFFSET 68
|
Loading…
Reference in New Issue
Block a user