This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Go patch committed: Add -o option when linking


The Go compiler needs to see all input files at once, rather than be
invoked separately on each one.  The gcc driver will only do that if the
static combine_inputs variable is set.  And combine_inputs is only set
if the -o option is used (or LTO-specific -fwpa option is used).  The
gccgo driver currently automatically adds a -o option when compiling
when no -o option is seen.  That is sufficient for the normal case, but
does not handle the case of linking without a -o option.  Linking
without a -o option is unusual but of course it ought to work correctly.
I don't want to mess with the general driver code in stage 4, so I have
modified the gccgo driver to add a -o option even when linking.
Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.

Ian


2012-02-17  Ian Lance Taylor  <iant@google.com>

	* gospec.c (lang_specific_driver): If linking, and no -o option
	was used, add one.


Index: gcc/go/gospec.c
===================================================================
--- gcc/go/gospec.c	(revision 184188)
+++ gcc/go/gospec.c	(working copy)
@@ -109,6 +109,11 @@ lang_specific_driver (struct cl_decoded_
   /* Whether the -o option was used.  */
   bool saw_opt_o = false;
 
+  /* Whether the -c option was used.  Also used for -E, -fsyntax-only,
+     in general anything which implies only compilation and not
+     linking.  */
+  bool saw_opt_c = false;
+
   /* Whether the -S option was used.  */
   bool saw_opt_S = false;
 
@@ -172,6 +177,7 @@ lang_specific_driver (struct cl_decoded_
 	case OPT_fsyntax_only:
 	  /* Don't specify libraries if we won't link, since that would
 	     cause a warning.  */
+	  saw_opt_c = true;
 	  library = -1;
 	  break;
 
@@ -272,31 +278,39 @@ lang_specific_driver (struct cl_decoded_
       j++;
     }
 
-  /* If we are not linking, add a -o option.  This is because we need
+  /* If we didn't see a -o option, add one.  This is because we need
      the driver to pass all .go files to go1.  Without a -o option the
-     driver will invoke go1 separately for each input file.  */
-  if (library < 0 && first_go_file != NULL && !saw_opt_o)
+     driver will invoke go1 separately for each input file.  FIXME:
+     This should probably use some other interface to force the driver
+     to set combine_inputs.  */
+  if (first_go_file != NULL && !saw_opt_o)
     {
-      const char *base;
-      int baselen;
-      int alen;
-      char *out;
-
-      base = lbasename (first_go_file);
-      baselen = strlen (base) - 3;
-      alen = baselen + 3;
-      out = XNEWVEC (char, alen);
-      memcpy (out, base, baselen);
-      /* The driver will convert .o to some other suffix (e.g., .obj)
-	 if appropriate.  */
-      out[baselen] = '.';
-      if (saw_opt_S)
-	out[baselen + 1] = 's';
+      if (saw_opt_c || saw_opt_S)
+	{
+	  const char *base;
+	  int baselen;
+	  int alen;
+	  char *out;
+
+	  base = lbasename (first_go_file);
+	  baselen = strlen (base) - 3;
+	  alen = baselen + 3;
+	  out = XNEWVEC (char, alen);
+	  memcpy (out, base, baselen);
+	  /* The driver will convert .o to some other suffix (e.g.,
+	     .obj) if appropriate.  */
+	  out[baselen] = '.';
+	  if (saw_opt_S)
+	    out[baselen + 1] = 's';
+	  else
+	    out[baselen + 1] = 'o';
+	  out[baselen + 2] = '\0';
+	  generate_option (OPT_o, out, 1, CL_DRIVER,
+			   &new_decoded_options[j]);
+	}
       else
-	out[baselen + 1] = 'o';
-      out[baselen + 2] = '\0';
-      generate_option (OPT_o, out, 1, CL_DRIVER,
-		       &new_decoded_options[j]);
+	generate_option (OPT_o, "a.out", 1, CL_DRIVER,
+			 &new_decoded_options[j]);
       j++;
     }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]