to get full advantage of the -fsplit-stack option, gccgo binaries have to be linked with gold, not the bfd linker. When the system linker defaults to the bfd linker, then gccgo should explicitly use the gold linker, passing fuse-ld=gold, unless another -fuse-ld option is present. Tested with and without having ld.gold on the system.
Matthias
# DP: Pass -fuse-ld=gold to gccgo on targets supporting -fsplit-stack gcc/go/ * gospec.c (lang_specific_driver): Pass -fuse-ld=gold on targets supporting -fsplit-stack, unless overwritten. gcc/ * configure.ac: New define HAVE_GOLD_NON_DEFAULT. * config.in: Regenerate. libgo/ * configure.ac (libgo_cv_c_linker_supports_split_stack): Fix quoting. Check the linker used by the gccgo driver. Index: b/src/gcc/go/gospec.c =================================================================== --- a/src/gcc/go/gospec.c +++ b/src/gcc/go/gospec.c @@ -117,6 +117,10 @@ /* Whether the -S option was used. */ bool saw_opt_S = false; + /* "-fuse-ld=" if it appears on the command line. */ + bool saw_use_ld = false; + int need_gold = 0; + /* The first input file with an extension of .go. */ const char *first_go_file = NULL; @@ -217,6 +221,11 @@ } break; + + case OPT_fuse_ld_bfd: + case OPT_fuse_ld_gold: + saw_use_ld = true; + break; } } @@ -226,8 +235,14 @@ shared_libgcc = 0; #endif +#if defined(TARGET_CAN_SPLIT_STACK) && defined(HAVE_GOLD_NON_DEFAULT) + if (!saw_use_ld) + need_gold = 1; +#endif + /* Make sure to have room for the trailing NULL argument. */ - num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 10; + num_args = argc + need_math + shared_libgcc + need_gold + + (library > 0) * 5 + 10; new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args); i = 0; @@ -244,6 +259,14 @@ &new_decoded_options[j]); j++; } +#ifdef HAVE_GOLD_NON_DEFAULT + if (need_gold) + { + generate_option (OPT_fuse_ld_gold, NULL, 1, CL_DRIVER, + &new_decoded_options[j]); + j++; + } +#endif #endif /* NOTE: We start at 1 now, not 0. */ Index: b/src/libgo/configure.ac =================================================================== --- a/src/libgo/configure.ac +++ b/src/libgo/configure.ac @@ -348,10 +348,10 @@ dnl others. AC_CACHE_CHECK([whether linker supports split stack], [libgo_cv_c_linker_supports_split_stack], -libgo_cv_c_linker_supports_split_stack=no -if $LD --help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then +[libgo_cv_c_linker_supports_split_stack=no +if $GOC -Wl,--help 2>/dev/null | grep split-stack-adjust-size >/dev/null 2>&1; then libgo_cv_c_linker_supports_split_stack=yes -fi) +fi]) if test "$libgo_cv_c_linker_supports_split_stack" = yes; then AC_DEFINE(LINKER_SUPPORTS_SPLIT_STACK, 1, [Define if the linker support split stack adjustments]) Index: b/src/gcc/config.in =================================================================== --- a/src/gcc/config.in +++ b/src/gcc/config.in @@ -1133,6 +1133,12 @@ #endif +/* Define if the gold linker is available as a non-default */ +#ifndef USED_FOR_TARGET +#undef HAVE_GOLD_NON_DEFAULT +#endif + + /* Define if you have the iconv() function. */ #ifndef USED_FOR_TARGET #undef HAVE_ICONV Index: b/src/gcc/configure.ac =================================================================== --- a/src/gcc/configure.ac +++ b/src/gcc/configure.ac @@ -2060,6 +2060,12 @@ fi AC_MSG_RESULT($ld_is_gold) +# Check to see if ld is used, and gold is available +if test x$ld_is_gold = xno && which ${gcc_cv_ld}.gold >/dev/null 2>&1; then + AC_DEFINE(HAVE_GOLD_NON_DEFAULT, 1, + [Define if the gold linker is available as a non-default]) +fi + ORIGINAL_LD_FOR_TARGET=$gcc_cv_ld AC_SUBST(ORIGINAL_LD_FOR_TARGET) case "$ORIGINAL_LD_FOR_TARGET" in