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

Matthias Klose doko@ubuntu.com
Fri Nov 29 16:47:00 GMT 2013


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
-------------- next part --------------
# 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


More information about the Gcc-patches mailing list