Message ID | alpine.DEB.2.21.2010012246520.4323@digraph.polyomino.org.uk |
---|---|
State | New |
Headers | show |
Series | Fix GCC 11 -Warray-parameter warning for __sigsetjmp (bug 26647) | expand |
Ping. This patch <https://sourceware.org/pipermail/libc-alpha/2020-October/118237.html> is pending review.
On 01/10/2020 19:47, Joseph Myers wrote: > 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). As a side note I am checking on bz#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). LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > diff --git a/include/bits/types/struct___jmp_buf_tag.h b/include/bits/types/struct___jmp_buf_tag.h > new file mode 100644 > index 0000000000..e3250150da > --- /dev/null > +++ b/include/bits/types/struct___jmp_buf_tag.h > @@ -0,0 +1 @@ > +#include <setjmp/bits/types/struct___jmp_buf_tag.h> > diff --git a/setjmp/Makefile b/setjmp/Makefile > index dcac56932d..603f61d76e 100644 > --- a/setjmp/Makefile > +++ b/setjmp/Makefile > @@ -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 Ok. > diff --git a/setjmp/bits/types/struct___jmp_buf_tag.h b/setjmp/bits/types/struct___jmp_buf_tag.h > new file mode 100644 > index 0000000000..9d8634f1e4 > --- /dev/null > +++ b/setjmp/bits/types/struct___jmp_buf_tag.h > @@ -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 Ok. > diff --git a/setjmp/setjmp.h b/setjmp/setjmp.h > index 4e3443c37e..c6c59f4094 100644 > --- a/setjmp/setjmp.h > +++ b/setjmp/setjmp.h > @@ -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]; > Ok. > diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h > index 8a403cbf36..d4194da776 100644 > --- a/sysdeps/nptl/pthread.h > +++ b/sysdeps/nptl/pthread.h > @@ -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. */ > Ok.
diff --git a/include/bits/types/struct___jmp_buf_tag.h b/include/bits/types/struct___jmp_buf_tag.h new file mode 100644 index 0000000000..e3250150da --- /dev/null +++ b/include/bits/types/struct___jmp_buf_tag.h @@ -0,0 +1 @@ +#include <setjmp/bits/types/struct___jmp_buf_tag.h> diff --git a/setjmp/Makefile b/setjmp/Makefile index dcac56932d..603f61d76e 100644 --- a/setjmp/Makefile +++ b/setjmp/Makefile @@ -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 diff --git a/setjmp/bits/types/struct___jmp_buf_tag.h b/setjmp/bits/types/struct___jmp_buf_tag.h new file mode 100644 index 0000000000..9d8634f1e4 --- /dev/null +++ b/setjmp/bits/types/struct___jmp_buf_tag.h @@ -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 diff --git a/setjmp/setjmp.h b/setjmp/setjmp.h index 4e3443c37e..c6c59f4094 100644 --- a/setjmp/setjmp.h +++ b/setjmp/setjmp.h @@ -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]; diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h index 8a403cbf36..d4194da776 100644 --- a/sysdeps/nptl/pthread.h +++ b/sysdeps/nptl/pthread.h @@ -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. */