mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-24 03:31:07 +00:00
Fix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647)
This patch fixes part of bug 26647 (-Werror=array-parameter error building with GCC 11 because of __sigsetjmp being declared using an array parameter in one header and a pointer parameter in another). The fix is to split the struct __jmp_buf_tag definition out to a separate bits/types/ header so it can be included in pthread.h, so that pthread.h can declare __sigsetjmp with the type contents visible, so can use an array (as in setjmp.h) rather than a pointer in the declaration. Note that several other build failures with GCC 11 remain. This does not fix the jmp_buf-related -Wstringop-overflow errors (also discussed in bug 26647), or -Warray-parameter errors for other functions (bug 26686), or -Warray-bounds errors (bug 26687). Tested, with older compilers, natively for x86_64 and with build-many-glibc.py for aarch64-linux-gnu. Tested with build-many-glibcs.py with GCC mainline for aarch64-linux-gnu that this gets past the -Warray-parameter issue for __sigsetjmp (with the next build failure being the other one discussed in bug 26647).
This commit is contained in:
parent
5bb2e5300b
commit
19302b27bd
1
include/bits/types/struct___jmp_buf_tag.h
Normal file
1
include/bits/types/struct___jmp_buf_tag.h
Normal file
@ -0,0 +1 @@
|
||||
#include <setjmp/bits/types/struct___jmp_buf_tag.h>
|
@ -22,7 +22,8 @@ subdir := setjmp
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
headers := setjmp.h bits/setjmp.h bits/setjmp2.h
|
||||
headers := setjmp.h bits/setjmp.h bits/setjmp2.h \
|
||||
bits/types/struct___jmp_buf_tag.h
|
||||
|
||||
routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \
|
||||
longjmp __longjmp jmp-unwind
|
||||
|
37
setjmp/bits/types/struct___jmp_buf_tag.h
Normal file
37
setjmp/bits/types/struct___jmp_buf_tag.h
Normal file
@ -0,0 +1,37 @@
|
||||
/* Define struct __jmp_buf_tag.
|
||||
Copyright (C) 1991-2020 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/>. */
|
||||
|
||||
#ifndef __jmp_buf_tag_defined
|
||||
#define __jmp_buf_tag_defined 1
|
||||
|
||||
#include <bits/setjmp.h> /* Get `__jmp_buf'. */
|
||||
#include <bits/types/__sigset_t.h>
|
||||
|
||||
/* Calling environment, plus possibly a saved signal mask. */
|
||||
struct __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. */
|
||||
};
|
||||
|
||||
#endif
|
@ -27,20 +27,7 @@
|
||||
__BEGIN_DECLS
|
||||
|
||||
#include <bits/setjmp.h> /* Get `__jmp_buf'. */
|
||||
#include <bits/types/__sigset_t.h>
|
||||
|
||||
/* Calling environment, plus possibly a saved signal mask. */
|
||||
struct __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. */
|
||||
};
|
||||
|
||||
#include <bits/types/struct___jmp_buf_tag.h>
|
||||
|
||||
typedef struct __jmp_buf_tag jmp_buf[1];
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <bits/wordsize.h>
|
||||
#include <bits/types/struct_timespec.h>
|
||||
#include <bits/types/__sigset_t.h>
|
||||
#include <bits/types/struct___jmp_buf_tag.h>
|
||||
|
||||
|
||||
/* Detach state. */
|
||||
@ -730,8 +731,8 @@ extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf)
|
||||
#endif
|
||||
|
||||
/* Function used in the macros. */
|
||||
struct __jmp_buf_tag;
|
||||
extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROWNL;
|
||||
extern int __sigsetjmp (struct __jmp_buf_tag __env[1],
|
||||
int __savemask) __THROWNL;
|
||||
|
||||
|
||||
/* Mutex handling. */
|
||||
|
Loading…
Reference in New Issue
Block a user