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