Am 18.01.2014 03:03, schrieb Ian Lance Taylor: > On Fri, Nov 29, 2013 at 5:29 AM, Matthias Klose <d...@ubuntu.com> wrote: >> 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. > > The change to libgo/configure.ac seems unrelated.
No, it is required. Without it you would check (with ld.bfd as the default) the help text of the ld.bfd linker, and not the one used for gccgo ($LD vs. $GOC). The quoting fix to fix the underquoting is now required because the argument has a comma now. > I don't think you can use "which" in a configure script. You need to > use something like AC_PATH_PROG. Ok, but I cannot do this directly. gcc_cv_ld may already be an absolute path. So now I'm checking the very same location as gcc_cv_ld first, then fall back to AC_PATH_PROG. updated patch attached. 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: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 206924) +++ gcc/configure.ac (working copy) @@ -2105,6 +2105,19 @@ 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; then + if test -x ${gcc_cv_ld}.gold; then + gcc_cv_ld_gold=${gcc_cv_ld}.gold + else + AC_PATH_PROG(gcc_cv_ld_gold,${gcc_cv_ld}.gold,no) + fi + if test x$gcc_cv_ld_gold != xno; then + AC_DEFINE(HAVE_GOLD_NON_DEFAULT, 1, + [Define if the gold linker is available as a non-default]) + fi +fi + ORIGINAL_LD_FOR_TARGET=$gcc_cv_ld AC_SUBST(ORIGINAL_LD_FOR_TARGET) case "$ORIGINAL_LD_FOR_TARGET" in Index: gcc/go/gospec.c =================================================================== --- gcc/go/gospec.c (revision 206924) +++ gcc/go/gospec.c (working copy) @@ -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 ATTRIBUTE_UNUSED = 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,7 +259,15 @@ &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. */ while (i < argc) Index: libgo/configure.ac =================================================================== --- libgo/configure.ac (revision 206924) +++ libgo/configure.ac (working copy) @@ -357,10 +357,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])