Message ID | 55FB10E7.9090607@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
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
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 > >
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
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
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
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
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