x86: Fix -fsplit-stack feature detection via TARGET_CAN_SPLIT_STACK

Message ID 20220221075116.11790-1-soeren@soeren-tempel.net
State New
Headers
Series x86: Fix -fsplit-stack feature detection via TARGET_CAN_SPLIT_STACK |

Commit Message

Li, Pan2 via Gcc-patches Feb. 21, 2022, 7:51 a.m. UTC
  From: Sören Tempel <soeren@soeren-tempel.net>

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 where 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.cc 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 set based on the
changes performed in 2c31a8be4a5db11a0a0e97c366dded6362421086, i.e.
the new OPTION_GLIBC_P macro is now used to detect if -fsplit-stack is
supported in the x86 header files.

The proposed changes have been tested on x86_64 Alpine Linux (which uses
musl libc) and fix compilation of gccgo for this target.

Signed-off-by: Sören Tempel <soeren@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.
---
I hope this is the last fixup commit needed for the original -fsplit-stack
change. Apologizes that the integration was a bit messy, I am simply not
deeply familiar with the gcc code base. The change works fine on Alpine
and fixes gccgo compilation but please review it carefully and make sure
the macro guards for TARGET_CAN_SPLIT_STACK are aligned with the
ix86_supports_split_stack implementation.

Should we also check if TARGET_THREAD_SPLIT_STACK_OFFSET is defined?

 gcc/config/i386/gnu-user-common.h | 5 +++--
 gcc/config/i386/gnu.h             | 5 +++--
 2 files changed, 6 insertions(+), 4 deletions(-)
  

Patch

diff --git a/gcc/config/i386/gnu-user-common.h b/gcc/config/i386/gnu-user-common.h
index 23b54c5be52..bb745c2edaa 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 && defined(OPTION_GLIBC_P)
 #define TARGET_CAN_SPLIT_STACK
 #endif
diff --git a/gcc/config/i386/gnu.h b/gcc/config/i386/gnu.h
index 401e60c9a02..92a29149b2e 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 && defined(OPTION_GLIBC_P)
 #define TARGET_CAN_SPLIT_STACK
 #endif
 /* We steal the last transactional memory word.  */