Patchwork Go patch committed: Add -o option if compiling and not already present

login
register
mail settings
Submitter Ian Taylor
Date Dec. 13, 2010, 11:14 p.m.
Message ID <mcr1v5l2rkg.fsf@google.com>
Download mbox | patch
Permalink /patch/75438/
State New
Headers show

Comments

Ian Taylor - Dec. 13, 2010, 11:14 p.m.
When compiling Go, it is necessary to pass all input files to the
compiler at once.  When using -c 1.go 2.go, the driver program will pass
all input files at once if a -o option is used, and will not do it if no
-o option is used.  This patch changes gccgo to add a -o option if
appropriate to ensure that all input files are passed together.
Bootstrapped on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian


2010-12-13  Ian Lance Taylor  <iant@google.com>

	* gospec.c (lang_specific_driver): Add a -o option if not linking
	and there is no -o option already.

Patch

Index: gospec.c
===================================================================
--- gospec.c	(revision 167736)
+++ gospec.c	(working copy)
@@ -106,6 +106,12 @@  lang_specific_driver (struct cl_decoded_
   /* The total number of arguments with the new stuff.  */
   int num_args = 1;
 
+  /* Whether the -o option was used.  */
+  bool saw_opt_o = false;
+
+  /* The first input file with an extension of .go.  */
+  const char *first_go_file = NULL;  
+
   argc = *in_decoded_options_count;
   decoded_options = *in_decoded_options;
   added_libraries = *in_added_libraries;
@@ -167,6 +173,10 @@  lang_specific_driver (struct cl_decoded_
 	  library = -1;
 	  break;
 
+	case OPT_o:
+	  saw_opt_o = true;
+	  break;
+
 	case OPT_static:
 	  static_link = 1;
 	  break;
@@ -183,6 +193,16 @@  lang_specific_driver (struct cl_decoded_
 	case OPT_SPECIAL_input_file:
 	  if (library == 0)
 	    library = 1;
+
+	  if (first_go_file == NULL)
+	    {
+	      int len;
+
+	      len = strlen (arg);
+	      if (len > 3 && strcmp (arg + len - 3, ".go") == 0)
+		first_go_file = arg;
+	    }
+
 	  break;
 	}
     }
@@ -245,6 +265,31 @@  lang_specific_driver (struct cl_decoded_
       j++;
     }
 
+  /* If we are not linking, add a -o option.  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)
+    {
+      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 if
+	 appropriate.  */
+      out[baselen] = '.';
+      out[baselen + 1] = 'o';
+      out[baselen + 2] = '\0';
+      generate_option (OPT_o, out, 1, CL_DRIVER,
+		       &new_decoded_options[j]);
+      j++;
+    }
+
   /* Add `-lgo' if we haven't already done so.  */
   if (library > 0)
     {