Patchwork [gccgo] Update gospec for merge with gcc mainline

login
register
mail settings
Submitter Ian Taylor
Date Oct. 8, 2010, 8:53 p.m.
Message ID <mcrpqvk1k5v.fsf@google.com>
Download mbox | patch
Permalink /patch/67287/
State New
Headers show

Comments

Ian Taylor - Oct. 8, 2010, 8:53 p.m.
This patch updates gospec.c, the driver program, for the merge with gcc
mainline.  The driver program support has been rewritten to use
cl_decoded_option instead of char*, and that makes the change to the Go
support.

This patch also makes gccgo link against -lpthread when linking
statically with libgo, which is required since libgo depend on
-lpthread.  It's not necessary when linking dynamically against libgo
since in that case the libgo shared library can express the dependency
on -lpthread directly.

Committed to gccgo branch.  The gccgo branch won't build until the merge
from mainline is complete.

Ian

Patch

diff -r 2bac95632b8b go/gospec.c
--- a/go/gospec.c	Fri Oct 08 13:48:24 2010 -0700
+++ b/go/gospec.c	Fri Oct 08 13:50:11 2010 -0700
@@ -9,45 +9,53 @@ 
 #include "coretypes.h"
 #include "tm.h"
 #include "gcc.h"
+#include "opts.h"
 
 /* This bit is set if we saw a `-xfoo' language specification.  */
 #define LANGSPEC	(1<<1)
 /* This bit is set if they did `-lm' or `-lmath'.  */
 #define MATHLIB		(1<<2)
+/* This bit is set if they did `-lpthread'.  */
+#define THREADLIB	(1<<3)
 /* This bit is set if they did `-lc'.  */
-#define WITHLIBC	(1<<3)
+#define WITHLIBC	(1<<4)
 /* Skip this option.  */
-#define SKIPOPT		(1<<4)
+#define SKIPOPT		(1<<5)
 
 #ifndef MATH_LIBRARY
-#define MATH_LIBRARY "-lm"
+#define MATH_LIBRARY "m"
 #endif
 #ifndef MATH_LIBRARY_PROFILE
 #define MATH_LIBRARY_PROFILE MATH_LIBRARY
 #endif
 
+#ifndef THREAD_LIBRARY
+#define THREAD_LIBRARY "pthread"
+#endif
+#ifndef THREAD_LIBRARY_PROFILE
+#define THREAD_LIBRARY_PROFILE THREAD_LIBRARY
+#endif
+
 #ifndef LIBGO
-#define LIBGO "-lgo"
+#define LIBGO "go"
 #endif
 #ifndef LIBGOBEGIN
-#define LIBGOBEGIN "-lgobegin"
+#define LIBGOBEGIN "gobegin"
 #endif
 #ifndef LIBGO_PROFILE
 #define LIBGO_PROFILE LIBGO
 #endif
 
 void
-lang_specific_driver (int *in_argc, const char *const **in_argv,
+lang_specific_driver (struct cl_decoded_option **in_decoded_options,
+		      unsigned int *in_decoded_options_count,
 		      int *in_added_libraries)
 {
-  int i, j;
+  unsigned int i, j;
 
   /* If nonzero, the user gave us the `-p' or `-pg' flag.  */
   int saw_profile_flag = 0;
 
-  /* If nonzero, the user gave us the `-v' flag.  */
-  int saw_verbose_flag = 0;
-
   /* This is a tristate:
      -1 means we should not link in libgo
      0  means we should link in libgo if it is needed
@@ -55,26 +63,25 @@ 
      2  means libgo is needed and should be linked statically.  */
   int library = 0;
 
-  /* Used to track options that take arguments.  */
-  const char *quote = NULL;
-
   /* The new argument list will be contained in this.  */
-  const char **arglist;
-
-  /* Nonzero if we saw a `-xfoo' language specification on the command
-     line.  */
-  int saw_speclang = 0;
+  struct cl_decoded_option *new_decoded_options;
 
   /* "-lm" or "-lmath" if it appears on the command line.  */
-  const char *saw_math = 0;
+  const struct cl_decoded_option *saw_math = 0;
+
+  /* "-lpthread" if it appears on the command line.  */
+  const struct cl_decoded_option *saw_thread = 0;
 
   /* "-lc" if it appears on the command line.  */
-  const char *saw_libc = 0;
+  const struct cl_decoded_option *saw_libc = 0;
 
   /* An array used to flag each argument that needs a bit set for
      LANGSPEC, MATHLIB, or WITHLIBC.  */
   int *args;
 
+  /* Whether we need the thread library.  */
+  int need_thread = 0;
+
   /* By default, we throw on the math library if we have one.  */
   int need_math = (MATH_LIBRARY[0] != '\0');
 
@@ -85,10 +92,10 @@ 
   int shared_libgcc = 1;
 
   /* The total number of arguments with the new stuff.  */
-  int argc;
+  unsigned int argc;
 
   /* The argument list.  */
-  const char *const *argv;
+  struct cl_decoded_option *decoded_options;
 
   /* The number of libraries added in.  */
   int added_libraries;
@@ -96,116 +103,87 @@ 
   /* The total number of arguments with the new stuff.  */
   int num_args = 1;
 
-  argc = *in_argc;
-  argv = *in_argv;
+  argc = *in_decoded_options_count;
+  decoded_options = *in_decoded_options;
   added_libraries = *in_added_libraries;
 
   args = XCNEWVEC (int, argc);
 
   for (i = 1; i < argc; i++)
     {
-      /* If the previous option took an argument, we swallow it here.  */
-      if (quote)
+      const char *arg = decoded_options[i].arg;
+
+      switch (decoded_options[i].opt_index)
 	{
-	  quote = NULL;
-	  continue;
-	}
+	case OPT_nostdlib:
+	case OPT_nodefaultlibs:
+	  library = -1;
+	  break;
 
-      /* We don't do this anymore, since we don't get them with minus
-	 signs on them.  */
-      if (argv[i][0] == '\0' || argv[i][1] == '\0')
-	continue;
-
-      if (argv[i][0] == '-')
-	{
-	  if (strcmp (argv[i], "-nostdlib") == 0
-	      || strcmp (argv[i], "-nodefaultlibs") == 0)
-	    {
-	      library = -1;
-	    }
-	  else if (strcmp (argv[i], MATH_LIBRARY) == 0)
+	case OPT_l:
+	  if (strcmp (arg, MATH_LIBRARY) == 0)
 	    {
 	      args[i] |= MATHLIB;
 	      need_math = 0;
 	    }
-	  else if (strcmp (argv[i], "-lc") == 0)
+	  else if (strcmp (arg, THREAD_LIBRARY) == 0)
+	    args[i] |= THREADLIB;
+	  else if (strcmp (arg, "c") == 0)
 	    args[i] |= WITHLIBC;
-	  else if (strcmp (argv[i], "-pg") == 0 || strcmp (argv[i], "-p") == 0)
-	    saw_profile_flag++;
-	  else if (strcmp (argv[i], "-v") == 0)
-	    saw_verbose_flag = 1;
-	  else if (strncmp (argv[i], "-x", 2) == 0)
-	    {
-	      const char * arg;
-	      if (argv[i][2] != '\0')
-		arg = argv[i]+2;
-	      else if ((argv[i+1]) != NULL)
-		/* We need to swallow arg on next loop.  */
-		quote = arg = argv[i+1];
-  	      else  /* Error condition, message will be printed later.  */
-		arg = "";
-	      if (library == 0 && strcmp (arg, "go") == 0)
-		library = 1;
+	  else
+	    /* Unrecognized libraries (e.g. -lfoo) may require libgo.  */
+	    library = (library == 0) ? 1 : library;
+	  break;
 
-	      saw_speclang = 1;
-	    }
+	case OPT_pg:
+	case OPT_p:
+	  saw_profile_flag++;
+	  break;
+
+	case OPT_x:
+	  if (library == 0 && strcmp (arg, "go") == 0)
+	    library = 1;
+	  break;
+
+	case OPT_Xlinker:
+	case OPT_Wl_:
 	  /* Arguments that go directly to the linker might be .o files,
 	     or something, and so might cause libgo to be needed.  */
-	  else if (strcmp (argv[i], "-Xlinker") == 0)
-	    {
-	      quote = argv[i];
-	      if (library == 0)
-		library = 1;
-	    }
-	  else if (strncmp (argv[i], "-Wl,", 4) == 0)
-	    library = (library == 0) ? 1 : library;
-	  /* Unrecognized libraries (e.g. -lfoo) may require libgo.  */
-	  else if (strncmp (argv[i], "-l", 2) == 0)
-	    library = (library == 0) ? 1 : library;
-	  else if (((argv[i][2] == '\0'
-		     && strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL)
-		    || strcmp (argv[i], "-Tdata") == 0))
-	    quote = argv[i];
-	  else if ((argv[i][2] == '\0'
-		    && strchr ("cSEM", argv[i][1]) != NULL)
-		   || strcmp (argv[i], "-MM") == 0
-		   || strcmp (argv[i], "-fsyntax-only") == 0)
-	    {
-	      /* Don't specify libraries if we won't link, since that would
-		 cause a warning.  */
-	      library = -1;
-	    }
-	  else if (strcmp (argv[i], "-static") == 0)
-	    static_link = 1;
-	  else if (strcmp (argv[i], "-static-libgcc") == 0)
-	    shared_libgcc = 0;
-	  else if (strcmp (argv[i], "-static-libgo") == 0)
-	    {
-	      library = library >= 0 ? 2 : library;
-	      args[i] |= SKIPOPT;
-	    }
-	  else if (DEFAULT_WORD_SWITCH_TAKES_ARG (&argv[i][1]))
-	    i++;
-	  else
-	    /* Pass other options through.  */
-	    continue;
-	}
-      else
-	{
-	  if (saw_speclang)
-	    {
-	      saw_speclang = 0;
-	      continue;
-	    }
-
 	  if (library == 0)
 	    library = 1;
+	  break;
+
+	case OPT_c:
+	case OPT_S:
+	case OPT_E:
+	case OPT_M:
+	case OPT_MM:
+	case OPT_fsyntax_only:
+	  /* Don't specify libraries if we won't link, since that would
+	     cause a warning.  */
+	  library = -1;
+	  break;
+
+	case OPT_static:
+	  static_link = 1;
+	  break;
+
+	case OPT_static_libgcc:
+	  shared_libgcc = 0;
+	  break;
+
+	case OPT_static_libgo:
+	  library = library >= 0 ? 2 : library;
+	  args[i] |= SKIPOPT;
+	  break;
+
+	case OPT_SPECIAL_input_file:
+	  if (library == 0)
+	    library = 1;
+	  break;
 	}
     }
 
-  if (quote)
-    fatal ("argument to '%s' missing\n", quote);
-
   /* There's no point adding -shared-libgcc if we don't have a shared
      libgcc.  */
 #ifndef ENABLE_SHARED_LIBGCC
@@ -214,40 +192,47 @@ 
 
   /* Make sure to have room for the trailing NULL argument.  */
   num_args = argc + need_math + shared_libgcc + (library > 0) * 5 + 5;
-  arglist = XNEWVEC (const char *, num_args);
+  new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
 
   i = 0;
   j = 0;
 
   /* Copy the 0th argument, i.e., the name of the program itself.  */
-  arglist[i++] = argv[j++];
-
-  /* We always combine all input files.  */
-  arglist[j++] = "-combine";
+  new_decoded_options[j++] = decoded_options[i++];
 
   /* If we are linking, pass -fsplit-stack if it is supported.  */
 #ifdef TARGET_CAN_SPLIT_STACK
   if (library >= 0)
-    arglist[j++] = "-fsplit-stack";
+    {
+      generate_option (OPT_fsplit_stack, NULL, 1, CL_DRIVER,
+		       &new_decoded_options[j]);
+      j++;
+    }
 #endif
 
   /* NOTE: We start at 1 now, not 0.  */
   while (i < argc)
     {
-      arglist[j] = argv[i];
+      new_decoded_options[j] = decoded_options[i];
 
       /* Make sure -lgo is before the math library, since libgo itself
 	 uses those math routines.  */
       if (!saw_math && (args[i] & MATHLIB) && library > 0)
 	{
 	  --j;
-	  saw_math = argv[i];
+	  saw_math = &decoded_options[i];
+	}
+
+      if (!saw_thread && (args[i] & THREADLIB) && library > 0)
+	{
+	  --j;
+	  saw_thread = &decoded_options[i];
 	}
 
       if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
 	{
 	  --j;
-	  saw_libc = argv[i];
+	  saw_libc = &decoded_options[i];
 	}
 
       if ((args[i] & SKIPOPT) != 0)
@@ -260,43 +245,72 @@ 
   /* Add `-lgo' if we haven't already done so.  */
   if (library > 0)
     {
-      arglist[j] = LIBGOBEGIN;
-      if (arglist[j][0] != '-' || arglist[j][1] == 'l')
-	added_libraries++;
+      generate_option (OPT_l, LIBGOBEGIN, 1, CL_DRIVER,
+		       &new_decoded_options[j]);
+      added_libraries++;
       j++;
+
+#ifdef HAVE_LD_STATIC_DYNAMIC
       if (library > 1 && !static_link)
 	{
-	  arglist[j] = "-Wl,-Bstatic";
+	  generate_option (OPT_Wl_, "-Bstatic", 1, CL_DRIVER,
+			   &new_decoded_options[j]);
 	  j++;
 	}
-      arglist[j] = saw_profile_flag ? LIBGO_PROFILE : LIBGO;
-      if (arglist[j][0] != '-' || arglist[j][1] == 'l')
-	added_libraries++;
+#endif
+
+      generate_option (OPT_l, saw_profile_flag ? LIBGO_PROFILE : LIBGO, 1,
+		       CL_DRIVER, &new_decoded_options[j]);
+      added_libraries++;
       j++;
+
+#ifdef HAVE_LD_STATIC_DYNAMIC
       if (library > 1 && !static_link)
 	{
-	  arglist[j] = "-Wl,-Bdynamic";
+	  generate_option (OPT_Wl_, "-Bdynamic", 1, CL_DRIVER,
+			   &new_decoded_options[j]);
 	  j++;
 	}
+#endif
+
+      /* When linking libgo statically we also need to link with the
+	 pthread library.  */
+      if (library > 1 || static_link)
+	need_thread = 1;
     }
+
+  if (saw_thread)
+    new_decoded_options[j++] = *saw_thread;
+  else if (library > 0 && need_thread)
+    {
+      generate_option (OPT_l,
+		       (saw_profile_flag
+			? THREAD_LIBRARY_PROFILE
+			: THREAD_LIBRARY),
+		       1, CL_DRIVER, &new_decoded_options[j]);
+      added_libraries++;
+      j++;
+    }
+
   if (saw_math)
-    arglist[j++] = saw_math;
+    new_decoded_options[j++] = *saw_math;
   else if (library > 0 && need_math)
     {
-      arglist[j] = saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY;
-      if (arglist[j][0] != '-' || arglist[j][1] == 'l')
-	added_libraries++;
+      generate_option (OPT_l,
+		       saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
+		       1, CL_DRIVER, &new_decoded_options[j]);
+      added_libraries++;
       j++;
     }
+
   if (saw_libc)
-    arglist[j++] = saw_libc;
+    new_decoded_options[j++] = *saw_libc;
   if (shared_libgcc && !static_link)
-    arglist[j++] = "-shared-libgcc";
+    generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
+		     &new_decoded_options[j++]);
 
-  arglist[j] = NULL;
-
-  *in_argc = j;
-  *in_argv = arglist;
+  *in_decoded_options_count = j;
+  *in_decoded_options = new_decoded_options;
   *in_added_libraries = added_libraries;
 }
 
diff -r 2bac95632b8b go/lang.opt
--- a/go/lang.opt	Fri Oct 08 13:48:24 2010 -0700
+++ b/go/lang.opt	Fri Oct 08 13:50:11 2010 -0700
@@ -35,4 +35,8 @@ 
 Go Var(go_require_return_statement) Init(1) Warning
 Functions which return values must end with return statements
 
+o
+Go Joined Separate
+; Documented in common.opt
+
 ; This comment is to ensure we retain the blank line above.