From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v1] package/localedef: fix host gcc-11.x compile
Date: Sat, 15 May 2021 13:30:23 +0200 [thread overview]
Message-ID: <20210515113023.GC2506@scaer> (raw)
In-Reply-To: <20210514175429.20552-1-ps.report@gmx.net>
Peter, All,
On 2021-05-14 19:54 +0200, Peter Seiderer spake thusly:
> Add two upstream patches fixing host gcc-11.x compile.
>
> Fixes:
>
> - https://bugs.busybox.net/show_bug.cgi?id=13806
>
> In file included from ../include/pthread.h:1,
> from ../sysdeps/nptl/thread_db.h:25,
> from ../nptl/descr.h:32,
> from ../sysdeps/x86_64/nptl/tls.h:130,
> from ../sysdeps/generic/libc-tsd.h:44,
> from ./localeinfo.h:224,
> from programs/ld-ctype.c:37:
> ../sysdeps/nptl/pthread.h:734:47: error: argument 1 of type ?struct __jmp_buf_tag *? declared as a pointer [-Werror=array-parameter=]
> 734 | extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROWNL;
> | ~~~~~~~~~~~~~~~~~~~~~~^~~~~
> In file included from ../include/setjmp.h:2,
> from ../nptl/descr.h:24,
> from ../sysdeps/x86_64/nptl/tls.h:130,
> from ../sysdeps/generic/libc-tsd.h:44,
> from ./localeinfo.h:224,
> from programs/ld-ctype.c:37:
> ../setjmp/setjmp.h:54:46: note: previously declared as an array ?struct __jmp_buf_tag[1]?
> 54 | extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) __THROWNL;
> | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
>
> Signed-off-by: Peter Seiderer <ps.report@gmx.net>
Applied to master, thanks.
Regards,
Yann E. MORIN.
> ---
> ...y-parameter-warning-for-__sigsetjmp-.patch | 155 ++++++++++++++++++
> ...overflow-warning-in-pthread_cleanup_.patch | 125 ++++++++++++++
> 2 files changed, 280 insertions(+)
> create mode 100644 package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0003-Fix-GCC-11-Warray-parameter-warning-for-__sigsetjmp-.patch
> create mode 100644 package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0004-Avoid-Wstringop-overflow-warning-in-pthread_cleanup_.patch
>
> diff --git a/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0003-Fix-GCC-11-Warray-parameter-warning-for-__sigsetjmp-.patch b/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0003-Fix-GCC-11-Warray-parameter-warning-for-__sigsetjmp-.patch
> new file mode 100644
> index 0000000000..888d27fe4a
> --- /dev/null
> +++ b/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0003-Fix-GCC-11-Warray-parameter-warning-for-__sigsetjmp-.patch
> @@ -0,0 +1,155 @@
> +From 44f1469daff3a0bfe67fb5839243f114ace3bad8 Mon Sep 17 00:00:00 2001
> +From: Joseph Myers <joseph@codesourcery.com>
> +Date: Mon, 5 Oct 2020 16:46:46 +0000
> +Subject: [PATCH 3/4] 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).
> +
> +[Upstream: https://github.com/bminor/glibc/commit/19302b27bdacfe87e861ff46fc0fbad60dd6602d.patch]
> +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> +---
> + include/bits/types/struct___jmp_buf_tag.h | 1 +
> + setjmp/Makefile | 3 +-
> + setjmp/bits/types/struct___jmp_buf_tag.h | 37 +++++++++++++++++++++++
> + setjmp/setjmp.h | 15 +--------
> + sysdeps/nptl/pthread.h | 5 +--
> + 5 files changed, 44 insertions(+), 17 deletions(-)
> + create mode 100644 include/bits/types/struct___jmp_buf_tag.h
> + create mode 100644 setjmp/bits/types/struct___jmp_buf_tag.h
> +
> +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 00000000..e3250150
> +--- /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 dcac5693..603f61d7 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 00000000..9d8634f1
> +--- /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 4e3443c3..c6c59f40 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 8a403cbf..d4194da7 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. */
> +--
> +2.31.1
> +
> diff --git a/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0004-Avoid-Wstringop-overflow-warning-in-pthread_cleanup_.patch b/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0004-Avoid-Wstringop-overflow-warning-in-pthread_cleanup_.patch
> new file mode 100644
> index 0000000000..83f3f15eb6
> --- /dev/null
> +++ b/package/localedef/2.32-37-g760e1d287825fa91d4d5a0cc921340c740d803e2/0004-Avoid-Wstringop-overflow-warning-in-pthread_cleanup_.patch
> @@ -0,0 +1,125 @@
> +From ea50889c35fb73ed9e140d800303aae9148c2888 Mon Sep 17 00:00:00 2001
> +From: Joseph Myers <joseph@codesourcery.com>
> +Date: Fri, 30 Oct 2020 22:25:42 +0000
> +Subject: [PATCH 4/4] Avoid -Wstringop-overflow warning in pthread_cleanup_push
> + macros
> +
> +GCC 11 introduces a -Wstringop-overflow warning for calls to functions
> +with an array argument passed as a pointer to memory not large enough
> +for that array. This includes the __sigsetjmp calls from
> +pthread_cleanup_push macros, because those use a structure in
> +__pthread_unwind_buf_t, which has a common initial subsequence with
> +jmp_buf but does not include the saved signal mask; this is OK in this
> +case because the second argument to __sigsetjmp is 0 so the signal
> +mask is not accessed.
> +
> +To avoid this warning, use a function alias __sigsetjmp_cancel with
> +first argument an array of exactly the type used in the calls to the
> +function, if using GCC 11 or later. With older compilers, continue to
> +use __sigsetjmp with a cast, to avoid any issues with compilers
> +predating the returns_twice attribute not applying the same special
> +handling to __sigsetjmp_cancel as to __sigsetjmp.
> +
> +Tested with build-many-glibcs.py for arm-linux-gnueabi that this fixes
> +the testsuite build failures.
> +
> +[Upstream: https://github.com/bminor/glibc/commit/548f467fa14ffe7d955beeb31b30e2aeae4467e0.patch]
> +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> +---
> + misc/sys/cdefs.h | 8 ++++++++
> + sysdeps/nptl/pthread.h | 37 +++++++++++++++++++++++++++----------
> + 2 files changed, 35 insertions(+), 10 deletions(-)
> +
> +diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
> +index 38221d0b..ce877487 100644
> +--- a/misc/sys/cdefs.h
> ++++ b/misc/sys/cdefs.h
> +@@ -556,4 +556,12 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
> + # define __attr_access(x)
> + #endif
> +
> ++/* Specify that a function such as setjmp or vfork may return
> ++ twice. */
> ++#if __GNUC_PREREQ (4, 1)
> ++# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
> ++#else
> ++# define __attribute_returns_twice__ /* Ignore. */
> ++#endif
> ++
> + #endif /* sys/cdefs.h */
> +diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
> +index d4194da7..3a34d823 100644
> +--- a/sysdeps/nptl/pthread.h
> ++++ b/sysdeps/nptl/pthread.h
> +@@ -512,13 +512,15 @@ extern void pthread_testcancel (void);
> +
> + /* Cancellation handling with integration into exception handling. */
> +
> ++struct __cancel_jmp_buf_tag
> ++{
> ++ __jmp_buf __cancel_jmp_buf;
> ++ int __mask_was_saved;
> ++};
> ++
> + typedef struct
> + {
> +- struct
> +- {
> +- __jmp_buf __cancel_jmp_buf;
> +- int __mask_was_saved;
> +- } __cancel_jmp_buf[1];
> ++ struct __cancel_jmp_buf_tag __cancel_jmp_buf[1];
> + void *__pad[4];
> + } __pthread_unwind_buf_t __attribute__ ((__aligned__));
> +
> +@@ -658,8 +660,8 @@ __pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame)
> + __pthread_unwind_buf_t __cancel_buf; \
> + void (*__cancel_routine) (void *) = (routine); \
> + void *__cancel_arg = (arg); \
> +- int __not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *) \
> +- __cancel_buf.__cancel_jmp_buf, 0); \
> ++ int __not_first_call = __sigsetjmp_cancel (__cancel_buf.__cancel_jmp_buf, \
> ++ 0); \
> + if (__glibc_unlikely (__not_first_call)) \
> + { \
> + __cancel_routine (__cancel_arg); \
> +@@ -693,8 +695,8 @@ extern void __pthread_unregister_cancel (__pthread_unwind_buf_t *__buf)
> + __pthread_unwind_buf_t __cancel_buf; \
> + void (*__cancel_routine) (void *) = (routine); \
> + void *__cancel_arg = (arg); \
> +- int __not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *) \
> +- __cancel_buf.__cancel_jmp_buf, 0); \
> ++ int __not_first_call = __sigsetjmp_cancel (__cancel_buf.__cancel_jmp_buf, \
> ++ 0); \
> + if (__glibc_unlikely (__not_first_call)) \
> + { \
> + __cancel_routine (__cancel_arg); \
> +@@ -730,9 +732,24 @@ extern void __pthread_unwind_next (__pthread_unwind_buf_t *__buf)
> + ;
> + #endif
> +
> +-/* Function used in the macros. */
> ++/* Function used in the macros. Calling __sigsetjmp, with its first
> ++ argument declared as an array, results in a -Wstringop-overflow
> ++ warning from GCC 11 because struct pthread_unwind_buf is smaller
> ++ than jmp_buf. The calls from the macros have __SAVEMASK set to 0,
> ++ so nothing beyond the common prefix is used and this warning is a
> ++ false positive. Use an alias with its first argument declared to
> ++ use the type in the macros if possible to avoid this warning. */
> ++#if __GNUC_PREREQ (11, 0)
> ++extern int __REDIRECT_NTHNL (__sigsetjmp_cancel,
> ++ (struct __cancel_jmp_buf_tag __env[1],
> ++ int __savemask),
> ++ __sigsetjmp) __attribute_returns_twice__;
> ++#else
> ++# define __sigsetjmp_cancel(env, savemask) \
> ++ __sigsetjmp ((struct __jmp_buf_tag *) (void *) (env), (savemask))
> + extern int __sigsetjmp (struct __jmp_buf_tag __env[1],
> + int __savemask) __THROWNL;
> ++#endif
> +
> +
> + /* Mutex handling. */
> +--
> +2.31.1
> +
> --
> 2.31.1
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
--
.-----------------.--------------------.------------------.--------------------.
| Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ |
| +33 561 099 427 `------------.-------: X AGAINST | \e/ There is no |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. |
'------------------------------^-------^------------------^--------------------'
next prev parent reply other threads:[~2021-05-15 11:30 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-14 17:54 [Buildroot] [PATCH v1] package/localedef: fix host gcc-11.x compile Peter Seiderer
2021-05-15 11:30 ` Yann E. MORIN [this message]
2021-05-17 21:17 ` Peter Korsgaard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210515113023.GC2506@scaer \
--to=yann.morin.1998@free.fr \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.