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.
> > ---
> > 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