diff mbox

Pass -fuse-ld=gold to gccgo on targets supporting -fsplit-stack

Message ID 529896C7.6040905@ubuntu.com
State New
Headers show

Commit Message

Matthias Klose Nov. 29, 2013, 1:29 p.m. UTC
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.

Comments

Matthias Klose Jan. 9, 2014, 5:54 p.m. UTC | #1
ping patch

Am 29.11.2013 14:29, schrieb Matthias Klose:
> 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
>
Ian Lance Taylor Jan. 18, 2014, 2:03 a.m. UTC | #2
On Fri, Nov 29, 2013 at 5:29 AM, Matthias Klose <doko@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.

I don't think you can use "which" in a configure script.  You need to
use something like AC_PATH_PROG.

Ian
diff mbox

Patch

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