diff mbox

PR66870 PowerPC64 Enable gold linker with split stack

Message ID 55FB10E7.9090607@linux.vnet.ibm.com
State New
Headers show

Commit Message

Lynn A. Boger Sept. 17, 2015, 7:13 p.m. UTC
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
>
>

Comments

David Edelsohn Sept. 18, 2015, 12:48 p.m. UTC | #1
On Thu, Sep 17, 2015 at 3:13 PM, Lynn A. Boger
<laboger@linux.vnet.ibm.com> wrote:
> 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

The rs6000 bits are okay with me.

Ian needs to approve the go bits.  And Ian or a configure maintainer
needs to approve the other bits.

Thanks, David
Lynn A. Boger Sept. 30, 2015, 12:42 p.m. UTC | #2
Any update on this patch?

On 09/18/2015 07:48 AM, David Edelsohn wrote:
> On Thu, Sep 17, 2015 at 3:13 PM, Lynn A. Boger
> <laboger@linux.vnet.ibm.com> wrote:
>> 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
> The rs6000 bits are okay with me.
>
> Ian needs to approve the go bits.  And Ian or a configure maintainer
> needs to approve the other bits.
>
> Thanks, David
>
>
Ian Lance Taylor Sept. 30, 2015, 11:07 p.m. UTC | #3
On Thu, Sep 17, 2015 at 12:13 PM, Lynn A. Boger
<laboger@linux.vnet.ibm.com> wrote:
> 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

Thanks.  I had to add ATTRIBUTE_UNUSED to the new variable in
go/gospec.c.  Committed with these ChangeLog entries:

2015-10-01  Lynn Boger  <laboger@linux.vnet.ibm.com>

	PR target/66870
	* config/rs6000/sysv4.h (TARGET_CAN_SPLIT_STACK_64BIT): Define.
	* configure.ac: Define HAVE_GOLD_ALTERNATE_SPLIT_STACK on Power
	based on gold linker version.
	* gcc.c: Add -fuse-ld=gold to STACK_SPLIT_SPEC if
	HAVE_GOLD_ALTERNATE_SPLIT_STACK defined.
	* configure, config.in: Regenerate.

2015-10-01  Lynn Boger  <laboger@linux.vnet.ibm.com>

	PR target/66870
	* gospec.c (lang_specific_driver): Set appropriate split stack
	options for 64 bit compiles based on TARGET_CAN_SPLIT_STACK_64BIT.

Ian
Matthias Klose Oct. 3, 2015, 6:31 p.m. UTC | #4
On 01.10.2015 01:07, Ian Lance Taylor wrote:
> On Thu, Sep 17, 2015 at 12:13 PM, Lynn A. Boger
> <laboger@linux.vnet.ibm.com> wrote:
>> 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
>
> Thanks.  I had to add ATTRIBUTE_UNUSED to the new variable in
> go/gospec.c.  Committed with these ChangeLog entries:
>
> 2015-10-01  Lynn Boger  <laboger@linux.vnet.ibm.com>
>
> 	PR target/66870
> 	* config/rs6000/sysv4.h (TARGET_CAN_SPLIT_STACK_64BIT): Define.
> 	* configure.ac: Define HAVE_GOLD_ALTERNATE_SPLIT_STACK on Power
> 	based on gold linker version.
> 	* gcc.c: Add -fuse-ld=gold to STACK_SPLIT_SPEC if
> 	HAVE_GOLD_ALTERNATE_SPLIT_STACK defined.
> 	* configure, config.in: Regenerate.
>
> 2015-10-01  Lynn Boger  <laboger@linux.vnet.ibm.com>
>
> 	PR target/66870
> 	* gospec.c (lang_specific_driver): Set appropriate split stack
> 	options for 64 bit compiles based on TARGET_CAN_SPLIT_STACK_64BIT.
>
> Ian
>

this causes the build to fail on powerpc-linux-gnu:

make[4]: Entering directory '/home/doko/gcc/gcc-snapshot-20151003/build/gotools'
/home/doko/gcc/gcc-snapshot-20151003/build/./gcc/gccgo 
-B/home/doko/gcc/gcc-snapshot-20151003/build/./gcc/ -g -O2  -static-libstdc++ 
-static-libgcc -Wl,-z,relro -L ../powerpc-linux-gnu/libgo -L 
../powerpc-linux-gnu/libgo/.libs -o go 
../../src/gotools/../libgo/go/cmd/go/build.go 
../../src/gotools/../libgo/go/cmd/go/clean.go 
../../src/gotools/../libgo/go/cmd/go/context.go 
../../src/gotools/../libgo/go/cmd/go/discovery.go 
../../src/gotools/../libgo/go/cmd/go/env.go 
../../src/gotools/../libgo/go/cmd/go/fix.go 
../../src/gotools/../libgo/go/cmd/go/fmt.go 
../../src/gotools/../libgo/go/cmd/go/generate.go 
../../src/gotools/../libgo/go/cmd/go/get.go 
../../src/gotools/../libgo/go/cmd/go/go11.go 
../../src/gotools/../libgo/go/cmd/go/help.go 
../../src/gotools/../libgo/go/cmd/go/http.go 
../../src/gotools/../libgo/go/cmd/go/list.go 
../../src/gotools/../libgo/go/cmd/go/main.go 
../../src/gotools/../libgo/go/cmd/go/pkg.go 
../../src/gotools/../libgo/go/cmd/go/run.go 
../../src/gotools/../libgo/go/cmd/go/signal.go 
../../src/gotools/../libgo/go/cmd/go/signal_unix.go 
../../src/gotools/../libgo/go/cmd/go/test.go 
../../src/gotools/../libgo/go/cmd/go/testflag.go 
../../src/gotools/../libgo/go/cmd/go/tool.go 
../../src/gotools/../libgo/go/cmd/go/vcs.go 
../../src/gotools/../libgo/go/cmd/go/version.go 
../../src/gotools/../libgo/go/cmd/go/vet.go 
../powerpc-linux-gnu/libgo/zstdpkglist.go zdefaultcc.go
go1: error: '-fsplit-stack' currently only supported on PowerPC64 GNU/Linux with 
glibc-2.18 or later
go1: error: '-fsplit-stack' is not supported by this compiler configuration
Makefile:667: recipe for target 'go' failed
make[4]: *** [go] Error 1
make[4]: Leaving directory '/home/doko/gcc/gcc-snapshot-20151003/build/gotools'
Makefile:12908: recipe for target 'all-gotools' failed
make[3]: *** [all-gotools] Error 2
Ian Lance Taylor Oct. 7, 2015, 5:04 p.m. UTC | #5
On Wed, Oct 7, 2015 at 8:36 AM, Lynn A. Boger
<laboger@linux.vnet.ibm.com> wrote:
> Pretty sure this is the fix, but still doing some testing.

Looks good to me but I suppose David E. should approve.

Ian
David Edelsohn Oct. 7, 2015, 5:25 p.m. UTC | #6
On Wed, Oct 7, 2015 at 1:04 PM, Ian Lance Taylor <iant@golang.org> wrote:
> On Wed, Oct 7, 2015 at 8:36 AM, Lynn A. Boger
> <laboger@linux.vnet.ibm.com> wrote:
>> Pretty sure this is the fix, but still doing some testing.
>
> Looks good to me but I suppose David E. should approve.

It's fine with me.  Thanks for fixing this.

Thanks, David
diff mbox

Patch

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