On Sun, May 1, 2022 at 4:20 PM Sören Tempel <soe...@soeren-tempel.net> wrote:
>
> Pinging this again. This time with i386 port maintainers in CC.
>
> Summary: The macro guards for TARGET_CAN_SPLIT_STACK on i386 are not
> aligned with the implementation of ix86_supports_split_stack. That is,
> on systems using musl libc ix86_supports_split_stack errors-out (since
> -fsplit-stack is not supported in conjunction with musl) but the feature
> test macro TARGET_CAN_SPLIT_STACK is still defined on these systems.
> This prevents gccgo from compiling on musl-based systems. On other
> architectures which support -fsplit-stack TARGET_CAN_SPLIT_STACK
> seems to be defined correctly.
>
> See: https://gcc.gnu.org/pipermail/gcc-patches/2022-February/590688.html
>
> Greetings,
> Sören Tempel
>
> Sören Tempel <soe...@soeren-tempel.net> wrote:
> > Ping.
> >
> > Summary: Currently, the macro guards for TARGET_CAN_SPLIT_STACK are not
> > aligned with the implementation of ix86_supports_split_stack on x86.
> > That is, on musl systems TARGET_CAN_SPLIT_STACK is defined even though
> > -fsplit-stack is not supported (via ix86_supports_split_stack). This
> > prevents gccgo (which uses TARGET_CAN_SPLIT_STACK) from compiling on
> > musl systems. The proposed patch attempts to align the behavior of
> > ix86_supports_split_stack and TARGET_CAN_SPLIT_STACK.
> >
> > See: https://gcc.gnu.org/pipermail/gcc-patches/2022-February/590688.html
> >
> > Greetings,
> > Sören
> >
> > Sören Tempel <soe...@soeren-tempel.net> wrote:
> > > Since commit c163647ffbc9a20c8feb6e079dbecccfe016c82e -fsplit-stack
> > > is only supported on glibc targets. However, this original commit
> > > required some fixups. As part of the fixup, the changes to the
> > > gnu-user-common.h and gnu.h were partially reverted in commit
> > > 60953a23d57b13a672f751bec0c6eefc059eb1ab thus causing 
> > > TARGET_CAN_SPLIT_STACK
> > > to be defined for non-glibc targets even though -fsplit-stack is
> > > actually not supported and attempting to use it causes a runtime error.
> > >
> > > This causes gcc internal code, such as ./gcc/go/gospec.c to not
> > > correctly detect that -fsplit-stack is not supported and thus causes
> > > gccgo to fail compilation on non-glibc targets.
> > >
> > > This commit ensures that TARGET_CAN_SPLIT_STACK is only set if the
> > > default libc is glibc. It is presently unclear to me if there is a
> > > better way to detect glibc at pre-processor time.
> > >
> > > The proposed changes have been tested on x86 and x86_64 Alpine Linux
> > > (which uses musl libc) and fix compilation of gccgo for this target.
> > >
> > > Signed-off-by: Sören Tempel <soe...@soeren-tempel.net>
> > >
> > > gcc/ChangeLog:
> > >
> > >     * config/i386/gnu-user-common.h (defined): Only define
> > >         TARGET_CAN_SPLIT_STACK for glibc targets.
> > >     * config/i386/gnu.h (defined): Ditto.

This looks good to me, so OK.

Thanks,
Uros.

> > > ---
> > > Changes since v1: Use (DEFAULT_LIBC == LIBC_GLIBC) instead of
> > > OPTION_GLIBC_P to detect use of glibc in a pre-processor context.
> > >
> > > Is there a better way to detect use of glibc in the config header?
> > >
> > >  gcc/config/i386/gnu-user-common.h | 5 +++--
> > >  gcc/config/i386/gnu.h             | 5 +++--
> > >  2 files changed, 6 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/gcc/config/i386/gnu-user-common.h 
> > > b/gcc/config/i386/gnu-user-common.h
> > > index 00226f5a455..e126c3fa9fa 100644
> > > --- a/gcc/config/i386/gnu-user-common.h
> > > +++ b/gcc/config/i386/gnu-user-common.h
> > > @@ -66,7 +66,8 @@ along with GCC; see the file COPYING3.  If not see
> > >  #define STACK_CHECK_STATIC_BUILTIN 1
> > >
> > >  /* We only build the -fsplit-stack support in libgcc if the
> > > -   assembler has full support for the CFI directives.  */
> > > -#if HAVE_GAS_CFI_PERSONALITY_DIRECTIVE
> > > +   assembler has full support for the CFI directives.  Also
> > > +   we only support -fsplit-stack on glibc targets.  */
> > > +#if HAVE_GAS_CFI_PERSONALITY_DIRECTIVE && (DEFAULT_LIBC == LIBC_GLIBC)
> > >  #define TARGET_CAN_SPLIT_STACK
> > >  #endif
> > > diff --git a/gcc/config/i386/gnu.h b/gcc/config/i386/gnu.h
> > > index 25fbc07f58c..17494333bb9 100644
> > > --- a/gcc/config/i386/gnu.h
> > > +++ b/gcc/config/i386/gnu.h
> > > @@ -41,8 +41,9 @@ along with GCC.  If not, see 
> > > <http://www.gnu.org/licenses/>.
> > >  #define TARGET_THREAD_SSP_OFFSET        0x14
> > >
> > >  /* We only build the -fsplit-stack support in libgcc if the
> > > -   assembler has full support for the CFI directives.  */
> > > -#if HAVE_GAS_CFI_PERSONALITY_DIRECTIVE
> > > +   assembler has full support for the CFI directives.  Also
> > > +   we only support -fsplit-stack on glibc targets.  */
> > > +#if HAVE_GAS_CFI_PERSONALITY_DIRECTIVE && (DEFAULT_LIBC == LIBC_GLIBC)
> > >  #define TARGET_CAN_SPLIT_STACK
> > >  #endif
> > >  /* We steal the last transactional memory word.  */

Reply via email to