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