From: "Lynn A. Boger" <laboger@linux.vnet.ibm.com>
To: Ian Lance Taylor <iant@golang.org>
Cc: David Edelsohn <dje.gcc@gmail.com>,
Matthias Klose <doko@ubuntu.com>,
gcc-patches <gcc-patches@gcc.gnu.org>,
Alan Modra <amodra@gmail.com>
Subject: Re: [PATCH] PR66870 PowerPC64 Enable gold linker with split stack
Date: Thu, 17 Sep 2015 19:15:00 -0000 [thread overview]
Message-ID: <55FB10E7.9090607@linux.vnet.ibm.com> (raw)
In-Reply-To: <CAKOQZ8zQWx4oiok0FHDxOm7pX0StLJvhS5d=8YG4NM4Zrb8PDA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1541 bytes --]
Here is my updated patch, with the changes suggested by
Ian for gcc/gospec.c and David for gcc/configure.ac.
Bootstrap built and tested on ppc64le, ppc64 multilib.
2015-09-17 Lynn Boger <laboger@linux.vnet.ibm.com>
gcc/
PR target/66870
config/rs6000/sysv4.h: Define TARGET_CAN_SPLIT_STACK_64BIT
config.in: Set up HAVE_GOLD_ALTERNATE_SPLIT_STACK
configure.ac: Define HAVE_GOLD_ALTERNATE_SPLIT_STACK
on Power based on gold linker version
configure: Regenerate
gcc.c: Add -fuse-ld=gold to STACK_SPLIT_SPEC if
HAVE_GOLD_ALTERNATE_SPLIT_STACK defined
go/gospec.c: (lang_specific_driver): Set appropriate
split stack
options for 64 bit compiles based on
TARGET_CAN_SPLIT_STACK_64BIT
On 09/15/2015 02:58 PM, Ian Lance Taylor wrote:
> On Tue, Sep 15, 2015 at 11:24 AM, Lynn A. Boger
> <laboger@linux.vnet.ibm.com> wrote:
>> I need some feedback on whether to enable the gold linker at
>> all for split stack on platforms other than Power in gcc/configure.ac.
>> I don't know if there are gold linker versions that should be verified for
>> non-Power platforms. My first patch only enabled it on Power and that
>> is what I think should be done. Those who would like to use gold
>> with split stack for other platforms can enable it under the appropriate
>> conditions.
> I think that is fine for now. If you want to enable gold for
> i386/x86_64 with -fsplit-stack, that is also fine.
>
> Ian
>
>
[-- Attachment #2: gccgo-config-gold-submit-150916.diff --]
[-- Type: text/x-patch, Size: 6115 bytes --]
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h (revision 227812)
+++ gcc/config/rs6000/sysv4.h (working copy)
@@ -940,6 +940,14 @@ ncrtn.o%s"
#undef TARGET_ASAN_SHADOW_OFFSET
#define TARGET_ASAN_SHADOW_OFFSET rs6000_asan_shadow_offset
+/* On ppc64 and ppc64le, split stack is only support for
+ 64 bit. */
+#undef TARGET_CAN_SPLIT_STACK_64BIT
+#if TARGET_GLIBC_MAJOR > 2 \
+ || (TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR >= 18)
+#define TARGET_CAN_SPLIT_STACK_64BIT
+#endif
+
/* This target uses the sysv4.opt file. */
#define TARGET_USES_SYSV4_OPT 1
Index: gcc/config.in
===================================================================
--- gcc/config.in (revision 227812)
+++ gcc/config.in (working copy)
@@ -1310,6 +1310,12 @@
#endif
+/* Define if the gold linker with split stack is available as a non-default */
+#ifndef USED_FOR_TARGET
+#undef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
+#endif
+
+
/* Define if you have the iconv() function. */
#ifndef USED_FOR_TARGET
#undef HAVE_ICONV
Index: gcc/configure.ac
===================================================================
--- gcc/configure.ac (revision 227812)
+++ gcc/configure.ac (working copy)
@@ -2247,6 +2247,42 @@ if test x$gcc_cv_ld != x; then
fi
AC_MSG_RESULT($ld_is_gold)
+AC_MSG_CHECKING(gold linker with split stack support as non default)
+# Check to see if default ld is not gold, but gold is
+# available and has support for split stack. If gcc was configured
+# with gold then no checking is done.
+#
+if test x$ld_is_gold = xno && which ${gcc_cv_ld}.gold >/dev/null 2>&1; then
+
+# For platforms other than powerpc64*, enable as appropriate.
+
+ gold_non_default=no
+ ld_gold=`which ${gcc_cv_ld}.gold`
+# Make sure this gold has minimal split stack support
+ if $ld_gold --help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then
+ ld_vers=`$ld_gold --version | sed 1q`
+ gold_vers=`echo $ld_vers | sed -n \
+ -e 's,^[[^)]]*[[ ]]\([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*[[^)]]*\)) .*$,\1,p'`
+ case $target in
+# check that the gold version contains the complete split stack support
+# on powerpc64 big and little endian
+ powerpc64*-*-*)
+ case "$gold_vers" in
+ 2.25.[[1-9]]*|2.2[[6-9]][[.0-9]]*|2.[[3-9]][[.0-9]]*|[[3-9]].[[.0-9]]*) gold_non_default=yes
+ ;;
+ *) gold_non_default=no
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gold_non_default = yes; then
+ AC_DEFINE(HAVE_GOLD_NON_DEFAULT_SPLIT_STACK, 1,
+ [Define if the gold linker supports split stack and is available as a non-default])
+ fi
+fi
+AC_MSG_RESULT($gold_non_default)
+
ORIGINAL_LD_FOR_TARGET=$gcc_cv_ld
AC_SUBST(ORIGINAL_LD_FOR_TARGET)
case "$ORIGINAL_LD_FOR_TARGET" in
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c (revision 227812)
+++ gcc/gcc.c (working copy)
@@ -666,7 +666,11 @@ proper position among the other output files. */
libgcc. This is not yet a real spec, though it could become one;
it is currently just stuffed into LINK_SPEC. FIXME: This wrapping
only works with GNU ld and gold. */
+#ifdef HAVE_GOLD_NON_DEFAULT_SPLIT_STACK
+#define STACK_SPLIT_SPEC " %{fsplit-stack: -fuse-ld=gold --wrap=pthread_create}"
+#else
#define STACK_SPLIT_SPEC " %{fsplit-stack: --wrap=pthread_create}"
+#endif
#ifndef LIBASAN_SPEC
#define STATIC_LIBASAN_LIBS \
Index: gcc/go/gospec.c
===================================================================
--- gcc/go/gospec.c (revision 227812)
+++ gcc/go/gospec.c (working copy)
@@ -106,6 +106,9 @@ lang_specific_driver (struct cl_decoded_option **i
/* The total number of arguments with the new stuff. */
int num_args = 1;
+ /* Supports split stack */
+ int supports_split_stack = 0;
+
/* Whether the -o option was used. */
bool saw_opt_o = false;
@@ -117,6 +120,9 @@ lang_specific_driver (struct cl_decoded_option **i
/* Whether the -S option was used. */
bool saw_opt_S = false;
+ /* Whether the -m32 option was used. */
+ bool saw_opt_m32 = false;
+
/* The first input file with an extension of .go. */
const char *first_go_file = NULL;
@@ -152,6 +158,10 @@ lang_specific_driver (struct cl_decoded_option **i
library = (library == 0) ? 1 : library;
break;
+ case OPT_m32:
+ saw_opt_m32 = true;
+ break;
+
case OPT_pg:
case OPT_p:
saw_profile_flag = true;
@@ -236,15 +246,22 @@ lang_specific_driver (struct cl_decoded_option **i
/* Copy the 0th argument, i.e., the name of the program itself. */
new_decoded_options[j++] = decoded_options[i++];
+#ifdef TARGET_CAN_SPLIT_STACK
+ supports_split_stack = 1;
+#endif
+
+#ifdef TARGET_CAN_SPLIT_STACK_64BIT
+ if (!saw_opt_m32)
+ supports_split_stack = 1;
+#endif
+
/* If we are linking, pass -fsplit-stack if it is supported. */
-#ifdef TARGET_CAN_SPLIT_STACK
- if (library >= 0)
+ if ((library >= 0) && supports_split_stack)
{
generate_option (OPT_fsplit_stack, NULL, 1, CL_DRIVER,
&new_decoded_options[j]);
j++;
}
-#endif
/* NOTE: We start at 1 now, not 0. */
while (i < argc)
@@ -381,19 +398,17 @@ lang_specific_driver (struct cl_decoded_option **i
generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
&new_decoded_options[j++]);
-#ifdef TARGET_CAN_SPLIT_STACK
/* libgcc wraps pthread_create to support split stack, however, due to
relative ordering of -lpthread and -lgcc, we can't just mark
__real_pthread_create in libgcc as non-weak. But we need to link in
pthread_create from pthread if we are statically linking, so we work-
around by passing -u pthread_create to the linker. */
- if (static_link)
+ if (static_link && supports_split_stack)
{
generate_option (OPT_Wl_, "-u,pthread_create", 1, CL_DRIVER,
&new_decoded_options[j]);
j++;
}
-#endif
#if defined(TARGET_SOLARIS) && !defined(USE_GLD)
/* We use a common symbol for go$zerovalue. On Solaris, when not
next prev parent reply other threads:[~2015-09-17 19:13 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-18 21:14 Lynn A. Boger
2015-08-19 19:37 ` Matthias Klose
2015-08-19 19:42 ` David Edelsohn
2015-08-19 22:07 ` Lynn A. Boger
2015-08-20 0:01 ` Lynn A. Boger
2015-08-27 21:37 ` Lynn A. Boger
2015-09-15 16:50 ` Ian Lance Taylor
2015-09-15 18:21 ` David Edelsohn
2015-09-15 18:31 ` Lynn A. Boger
2015-09-15 20:04 ` Ian Lance Taylor
2015-09-17 19:15 ` Lynn A. Boger [this message]
2015-09-18 12:59 ` David Edelsohn
2015-09-30 12:46 ` Lynn A. Boger
[not found] ` <CAOyqgcVA_zhivM0+qRFk9bDT42Sot-HX95M1NtZjLVphZy_0vg@mail.gmail.com>
2015-10-03 18:31 ` Matthias Klose
[not found] ` <56153C00.2000209@linux.vnet.ibm.com>
2015-10-07 17:04 ` Ian Lance Taylor
2015-10-07 17:25 ` David Edelsohn
2015-10-07 17:31 ` Matthias Klose
[not found] ` <5615746C.3030509@linux.vnet.ibm.com>
2015-10-07 21:58 ` David Edelsohn
2015-10-08 18:56 ` Lynn A. Boger
2015-10-08 20:46 ` Matthias Klose
2015-10-09 20:17 ` Lynn A. Boger
2015-10-10 14:00 ` David Edelsohn
2015-10-10 21:03 ` Matthias Klose
2015-10-10 21:25 ` Andreas Schwab
2015-10-11 13:07 ` Alan Modra
2015-10-11 14:43 ` Andreas Schwab
2015-10-11 18:29 ` Ian Lance Taylor
2015-10-11 23:19 ` Alan Modra
2015-10-12 15:15 ` Lynn A. Boger
2015-10-12 22:53 ` Alan Modra
2015-10-13 11:27 ` Matthias Klose
2015-10-15 18:40 ` David Edelsohn
2015-10-15 19:57 ` Lynn A. Boger
2015-10-17 0:37 ` Ian Lance Taylor
2015-08-25 23:05 ` Ian Lance Taylor
2015-08-26 14:01 ` Lynn A. Boger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55FB10E7.9090607@linux.vnet.ibm.com \
--to=laboger@linux.vnet.ibm.com \
--cc=amodra@gmail.com \
--cc=dje.gcc@gmail.com \
--cc=doko@ubuntu.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=iant@golang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).