OSDN Git Service

cosmetic. Add sync_ to all the expand_builtin defines which do not match the actual...
[pf3gnuchains/gcc-fork.git] / gcc / java / jvspec.c
index a178653..c776242 100644 (file)
@@ -1,13 +1,13 @@
 /* Specific flags and argument handling of the front-end of the 
    GNU compiler for the Java(TM) language.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GCC is distributed in the hope that it will be useful,
@@ -16,9 +16,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. 
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>. 
 
 Java and all Java-based marks are trademarks or registered trademarks
 of Sun Microsystems, Inc. in the United States and other countries.
@@ -29,14 +28,14 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 #include "coretypes.h"
 #include "tm.h"
 #include "gcc.h"
+#include "jcf.h"
+#include "opts.h"
 
 /* Name of spec file.  */
 #define SPEC_FILE "libgcj.spec"
 
 /* This bit is set if we saw a `-xfoo' language specification.  */
 #define LANGSPEC       (1<<1)
-/* True if this arg is a parameter to the previous option-taking arg. */
-#define PARAM_ARG      (1<<2)
 /* True if this arg is a .java input file name. */
 #define JAVA_FILE_ARG  (1<<3)
 /* True if this arg is a .class input file name. */
@@ -48,8 +47,8 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 /* True if this arg is a resource file.  */
 #define RESOURCE_FILE_ARG (1<<7)
 
-static char *find_spec_file    PARAMS ((const char *));
-static int verify_class_name    PARAMS ((const char *));
+static char *find_spec_file (const char *);
+static int verify_class_name (const char *);
 
 static const char *main_class_name = NULL;
 int lang_specific_extra_outfiles = 0;
@@ -58,23 +57,24 @@ int lang_specific_extra_outfiles = 0;
 int shared_libgcc = 1;
 
 static const char jvgenmain_spec[] =
-  "jvgenmain %{D*} %b %m.i |\n\
+  "jvgenmain %{findirect-dispatch} %{D*} %b %m.i |\n\
    cc1 %m.i %1 \
-                  %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
+                  %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*}\
                   %{g*} %{O*} \
                   %{v:-version} %{pg:-p} %{p}\
                   %<fbounds-check %<fno-bounds-check\
-                  %<fassume-compiled %<fno-assume-compiled\
+                  %<fassume-compiled* %<fno-assume-compiled*\
                   %<fcompile-resource* %<fassert %<fno-assert \
                   %<femit-class-file %<femit-class-files %<fencoding*\
                   %<fuse-boehm-gc %<fhash-synchronization %<fjni\
-                  %<findirect-dispatch \
+                  %<findirect-dispatch\
                   %<fno-store-check %<foutput-class-dir\
-                  %<fclasspath* %<fCLASSPATH* %<fbootclasspath*\
+                  %<fclasspath* %<fbootclasspath*\
                   %<fextdirs*\
                   %<fuse-divide-subroutine %<fno-use-divide-subroutine\
+                  %<fuse-atomic-builtins %<fno-use-atomic-builtins\
                   %<fcheck-references %<fno-check-references\
-                  %<ffilelist-file\
+                  %<ffilelist-file %<fsaw-java-file %<fsource* %<ftarget*\
                   %{f*} -fdollars-in-identifiers\
                   %{aux-info*}\
                   %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
@@ -84,27 +84,21 @@ static const char jvgenmain_spec[] =
 /* Return full path name of spec file if it is in DIR, or NULL if
    not.  */
 static char *
-find_spec_file (dir)
-     const char *dir;
+find_spec_file (const char *dir)
 {
   char *spec;
-  int x;
   struct stat sb;
 
-  spec = xmalloc (strlen (dir) + sizeof (SPEC_FILE)
-                 + sizeof ("-specs=") + 4);
-  strcpy (spec, "-specs=");
-  x = strlen (spec);
-  strcat (spec, dir);
+  spec = XNEWVEC (char, strlen (dir) + sizeof (SPEC_FILE) + 4);
+  strcpy (spec, dir);
   strcat (spec, "/");
   strcat (spec, SPEC_FILE);
-  if (! stat (spec + x, &sb))
+  if (! stat (spec, &sb))
     return spec;
   free (spec);
   return NULL;
 }
 
-/* FIXME: these should come from lex.h.  */
 #define JAVA_START_CHAR_P(c) (c < 128 && (ISIDST (c) || c == '$'))
 #define JAVA_PART_CHAR_P(c) (c < 128                                         \
                             && (ISIDNUM (c)                                  \
@@ -116,8 +110,7 @@ find_spec_file (dir)
 /* Verify that NAME is a valid Java class name that might contain
    `main'.  Return 0 on failure.  */
 static int
-verify_class_name (name)
-     const char *name;
+verify_class_name (const char *name)
 {
   /* FIXME: what encoding do we use for command-line arguments?  For
      now we assume plain ASCII, which of course is wrong.  */
@@ -144,15 +137,11 @@ verify_class_name (name)
 }
 
 void
-lang_specific_driver (in_argc, in_argv, in_added_libraries)
-     int *in_argc;
-     const char *const **in_argv;
-     int *in_added_libraries;
+lang_specific_driver (struct cl_decoded_option **in_decoded_options,
+                     unsigned int *in_decoded_options_count,
+                     int *in_added_libraries)
 {
-  int i, j;
-
-  /* If nonzero, the user gave us the `-v' flag.  */
-  int saw_verbose_flag = 0;
+  unsigned int i, j;
 
   int saw_save_temps = 0;
 
@@ -181,35 +170,14 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
      libraries.  */
   int added = 2;
 
-  /* Used to track options that take arguments, so we don't go wrapping
-     those with -xc++/-xnone.  */
-  const char *quote = NULL;
-
   /* The new argument list will be contained in this.  */
-  const char **arglist;
+  struct cl_decoded_option *new_decoded_options;
 
   /* Nonzero if we saw a `-xfoo' language specification on the
      command line.  Used to avoid adding our own -xc++ if the user
      already gave a language for the file.  */
   int saw_speclang = 0;
 
-#if 0
-  /* "-lm" or "-lmath" if it appears on the command line.  */
-  const char *saw_math ATTRIBUTE_UNUSED = 0;
-
-  /* "-lc" if it appears on the command line.  */
-  const char *saw_libc ATTRIBUTE_UNUSED = 0;
-
-  /* "-lgcjgc" if it appears on the command line.  */
-  const char *saw_gc ATTRIBUTE_UNUSED = 0;
-
-  /* Saw `-l' option for the thread library.  */
-  const char *saw_threadlib ATTRIBUTE_UNUSED = 0;
-
-  /* Saw `-lgcj' on command line.  */
-  int saw_libgcj ATTRIBUTE_UNUSED = 0;
-#endif
-
   /* Saw --resource, -C or -o options, respectively. */
   int saw_resource = 0;
   int saw_C = 0;
@@ -227,16 +195,16 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
   int *args;
 
   /* 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;
 
   /* The total number of arguments with the new stuff.  */
-  int num_args = 1;
+  unsigned int num_args = 1;
 
   /* Nonzero if linking is supposed to happen.  */
   int will_link = 1;
@@ -247,202 +215,208 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
   /* The argument we use to specify the spec file.  */
   char *spec_file = NULL;
 
-  argc = *in_argc;
-  argv = *in_argv;
+  /* If linking, nonzero if the BC-ABI is in use.  */
+  int link_for_bc_abi = 0;
+
+  argc = *in_decoded_options_count;
+  decoded_options = *in_decoded_options;
   added_libraries = *in_added_libraries;
 
-  args = xcalloc (argc, sizeof (int));
+  args = XCNEWVEC (int, argc);
 
   for (i = 1; i < argc; i++)
     {
-      /* If the previous option took an argument, we swallow it here.  */
-      if (quote)
-       {
-         quote = NULL;
-         args[i] |= PARAM_ARG;
-         continue;
-       }
-
-      /* 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] == '-')
+      switch (decoded_options[i].opt_index)
        {
-         if (library != 0 && (strcmp (argv[i], "-nostdlib") == 0
-                              || strcmp (argv[i], "-nodefaultlibs") == 0))
+       case OPT_nostdlib:
+       case OPT_nodefaultlibs:
+         library = 0;
+         break;
+
+       case OPT_fmain_:
+         main_class_name = decoded_options[i].arg;
+         added--;
+         break;
+
+       case OPT__help:
+         want_spec_file = 0;
+         break;
+
+       case OPT_v:
+         if (argc == 2)
            {
+             /* If they only gave us `-v', don't try to link
+                in libgcj.  */ 
              library = 0;
            }
-         else if (strncmp (argv[i], "-fmain=", 7) == 0)
-           {
-             main_class_name = argv[i] + 7;
-             added--;
-           }
-         else if (strcmp (argv[i], "-fhelp") == 0)
-           want_spec_file = 0;
-         else if (strcmp (argv[i], "-v") == 0)
-           {
-             saw_verbose_flag = 1;
-             if (argc == 2)
-               {
-                 /* If they only gave us `-v', don't try to link
-                    in libgcj.  */ 
-                 library = 0;
-               }
-           }
-         else if (strncmp (argv[i], "-x", 2) == 0)
-           saw_speclang = 1;
-         else if (strcmp (argv[i], "-C") == 0)
-           {
-             saw_C = 1;
-             want_spec_file = 0;
-             if (library != 0)
-               added -= 2;
-             library = 0;
-             will_link = 0;
-           }
-         else if (strncmp (argv[i], "-fcompile-resource=", 19) == 0)
-           {
-             saw_resource = 1;
-             want_spec_file = 0;
-             if (library != 0)
-               --added;
-             library = 0;
-             will_link = 0;
-           }
-         else if (argv[i][1] == 'D')
-           saw_D = 1;
-         else if (argv[i][1] == 'g')
-           saw_g = 1;
-         else if (argv[i][1] == 'O')
-           saw_O = 1;
-         else if ((argv[i][2] == '\0'
-                   && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL)
-                  || strcmp (argv[i], "-Tdata") == 0
-                  || strcmp (argv[i], "-MT") == 0
-                  || strcmp (argv[i], "-MF") == 0)
-           {
-             if (strcmp (argv[i], "-o") == 0)
-               saw_o = 1;
-             quote = argv[i];
-           }
-         else if (strcmp(argv[i], "-classpath") == 0
-                  || strcmp(argv[i], "-bootclasspath") == 0
-                  || strcmp(argv[i], "-CLASSPATH") == 0)
-           {
-             quote = argv[i];
-             added -= 1;
-           }
-         else if (library != 0 
-                  && ((argv[i][2] == '\0'
-                       && (char *) strchr ("cSEM", argv[i][1]) != NULL)
-                      || strcmp (argv[i], "-MM") == 0))
-           {
-             /* Don't specify libraries if we won't link, since that would
-                cause a warning.  */
-             library = 0;
-             added -= 2;
+         break;
+
+       case OPT_x:
+         saw_speclang = 1;
+         break;
+
+       case OPT_C:
+         saw_C = 1;
+         want_spec_file = 0;
+         if (library != 0)
+           added -= 2;
+         library = 0;
+         will_link = 0;
+         break;
+
+       case OPT_fcompile_resource_:
+         saw_resource = 1;
+         want_spec_file = 0;
+         if (library != 0)
+           --added;
+         library = 0;
+         will_link = 0;
+         break;
+
+       case OPT_D:
+         saw_D = 1;
+         break;
+
+       case OPT_g:
+       case OPT_gcoff:
+       case OPT_gdwarf_:
+       case OPT_ggdb:
+       case OPT_gstabs:
+       case OPT_gstabs_:
+       case OPT_gvms:
+       case OPT_gxcoff:
+       case OPT_gxcoff_:
+         saw_g = 1;
+         break;
+
+       case OPT_O:
+       case OPT_Os:
+       case OPT_Ofast:
+         saw_O = 1;
+         break;
+
+       case OPT_o:
+         saw_o = 1;
+         break;
+
+       case OPT_fclasspath_:
+       case OPT_fbootclasspath_:
+       case OPT_extdirs:
+         added -= 1;
+         break;
+
+       case OPT_c:
+       case OPT_S:
+       case OPT_E:
+       case OPT_M:
+       case OPT_MM:
+         /* Don't specify libraries if we won't link, since that would
+            cause a warning.  */
+         library = 0;
+         added -= 2;
+
+         /* Remember this so we can confirm -fmain option.  */
+         will_link = 0;
+         break;
+
+       case OPT_fsyntax_only:
+         library = 0;
+         will_link = 0;
+         continue;
 
-             /* Remember this so we can confirm -fmain option.  */
-             will_link = 0;
-           }
-         else if (strcmp (argv[i], "-d") == 0)
-           {
-             /* `-d' option is for javac compatibility.  */
-             quote = argv[i];
-             added -= 1;
-           }
-         else if (strcmp (argv[i], "-fsyntax-only") == 0
-                  || strcmp (argv[i], "--syntax-only") == 0)
-           {
-             want_spec_file = 0;
-             library = 0;
-             will_link = 0;
-             continue;
-           }
-          else if (strcmp (argv[i], "-save-temps") == 0)
-           saw_save_temps = 1;
-          else if (strcmp (argv[i], "-static-libgcc") == 0
-                   || strcmp (argv[i], "-static") == 0)
-           shared_libgcc = 0;
-         else
-           /* Pass other options through.  */
-           continue;
-       }
-      else
-       {
-         int len; 
+       case OPT_save_temps:
+         saw_save_temps = 1;
+         break;
 
-         if (saw_speclang)
-           {
-             saw_speclang = 0;
-             continue;
-           }
+       case OPT_static_libgcc:
+       case OPT_static:
+         shared_libgcc = 0;
+         break;
 
-         if (saw_resource)
-           {
-             args[i] |= RESOURCE_FILE_ARG;
-             added += 2;  /* for -xjava and -xnone */
-           }
+       case OPT_findirect_dispatch:
+         link_for_bc_abi = 1;
+         break;
 
-         if (argv[i][0] == '@')
-           {
-             args[i] |= INDIRECT_FILE_ARG;
-             indirect_files_count++;
-             added += 2;  /* for -xjava and -xnone */
-           }
+       case OPT_SPECIAL_input_file:
+         {
+           const char *arg = decoded_options[i].arg;
+           int len;
 
-         len = strlen (argv[i]);
-         if (len > 5 && strcmp (argv[i] + len - 5, ".java") == 0)
-           {
-             args[i] |= JAVA_FILE_ARG;
-             java_files_count++;
-           }
-         if (len > 6 && strcmp (argv[i] + len - 6, ".class") == 0)
-           {
-             args[i] |= CLASS_FILE_ARG;
-             class_files_count++;
-           }
-         if (len > 4
-             && (strcmp (argv[i] + len - 4, ".zip") == 0
-                 || strcmp (argv[i] + len - 4, ".jar") == 0))
-           {
-             args[i] |= ZIP_FILE_ARG;
-             zip_files_count++;
-           }
+           /* We don't do this anymore, since we don't get them with minus
+              signs on them.  */
+           if (arg[0] == '\0' || arg[1] == '\0')
+             continue;
+
+           if (saw_speclang)
+             {
+               saw_speclang = 0;
+               continue;
+             }
+
+           if (saw_resource)
+             {
+               args[i] |= RESOURCE_FILE_ARG;
+               added += 2;  /* for -xjava and -xnone */
+             }
+
+           if (arg[0] == '@')
+             {
+               args[i] |= INDIRECT_FILE_ARG;
+               indirect_files_count++;
+               added += 2;  /* for -xjava and -xnone */
+             }
+
+           len = strlen (arg);
+           if (len > 5 && strcmp (arg + len - 5, ".java") == 0)
+             {
+               args[i] |= JAVA_FILE_ARG;
+               java_files_count++;
+             }
+           if (len > 6 && strcmp (arg + len - 6, ".class") == 0)
+             {
+               args[i] |= CLASS_FILE_ARG;
+               class_files_count++;
+             }
+           if (len > 4
+               && (strcmp (arg + len - 4, ".zip") == 0
+                   || strcmp (arg + len - 4, ".jar") == 0))
+             {
+               args[i] |= ZIP_FILE_ARG;
+               zip_files_count++;
+             }
+         }
+
+       default:
+         /* Pass other options through.  */
+         continue;
        }
     }
 
-  if (quote)
-    fatal ("argument to `%s' missing\n", quote);
-
   if (saw_D && ! main_class_name)
-    fatal ("can't specify `-D' without `--main'\n");
+    fatal_error ("can%'t specify %<-D%> without %<--main%>");
 
   if (main_class_name && ! verify_class_name (main_class_name))
-    fatal ("`%s' is not a valid class name", main_class_name);
+    fatal_error ("%qs is not a valid class name", main_class_name);
 
   num_args = argc + added;
   if (saw_resource)
     {
       if (! saw_o)
-       fatal ("--resource requires -o");
+       fatal_error ("--resource requires -o");
     }
   if (saw_C)
     {
       num_args += 3;
       if (class_files_count + zip_files_count > 0)
        {
-         error ("warning: already-compiled .class files ignored with -C"); 
+         warning (0, "already-compiled .class files ignored with -C"); 
          num_args -= class_files_count + zip_files_count;
          class_files_count = 0;
          zip_files_count = 0;
        }
       num_args += 2;  /* For -o NONE. */
       if (saw_o)
-       fatal ("cannot specify both -C and -o");
+       fatal_error ("cannot specify both -C and -o");
     }
   if ((saw_o && java_files_count + class_files_count + zip_files_count > 1)
       || (saw_C && java_files_count > 1)
@@ -454,22 +428,14 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
     {
       filelist_filename = make_temp_file ("jx");
       if (filelist_filename == NULL)
-       fatal ("cannot create temporary file");
+       fatal_error ("cannot create temporary file");
       record_temp_file (filelist_filename, ! saw_save_temps, 0);
       filelist_file = fopen (filelist_filename, "w");
       if (filelist_file == NULL)
        pfatal_with_name (filelist_filename);
       num_args -= java_files_count + class_files_count + zip_files_count;
-      num_args += 2;  /* for the combined arg and "-xjava" */
-    }
-  /* If we know we don't have to do anything, bail now.  */
-#if 0
-  if (! added && ! library && main_class_name == NULL && ! saw_C)
-    {
-      free (args);
-      return;
+      num_args += 3;  /* for the combined arg "-xjava", and "-xnone" */
     }
-#endif
 
   if (main_class_name)
     {
@@ -478,11 +444,13 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
   if (saw_g + saw_O == 0)
     num_args++;
   num_args++;
+  /* An additional entry for the classpath.  */
+  num_args++;
 
   if (combine_inputs || indirect_files_count > 0)
     num_args += 1; /* for "-ffilelist-file" */
   if (combine_inputs && indirect_files_count > 0)
-    fatal("using both @FILE with multiple files not implemented");
+    fatal_error ("using both @FILE with multiple files not implemented");
 
   /* There's no point adding -shared-libgcc if we don't have a shared
      libgcc.  */
@@ -490,57 +458,96 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
   shared_libgcc = 0;
 #endif  
   
+  if (java_files_count > 0)
+    ++num_args;
+
   num_args += shared_libgcc;
 
-  arglist = xmalloc ((num_args + 1) * sizeof (char *));
+  num_args += link_for_bc_abi;
+
+  new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
   j = 0;
 
-  for (i = 0; i < argc; i++, j++)
+  new_decoded_options[j++] = decoded_options[0];
+
+  if (combine_inputs || indirect_files_count > 0)
+    generate_option (OPT_ffilelist_file, NULL, 1, CL_DRIVER,
+                    &new_decoded_options[j++]);
+
+  if (combine_inputs)
+    {
+      generate_option (OPT_x, "java", 1, CL_DRIVER,
+                      &new_decoded_options[j++]);
+      generate_option_input_file (filelist_filename,
+                                 &new_decoded_options[j++]);
+      generate_option (OPT_x, "none", 1, CL_DRIVER,
+                      &new_decoded_options[j++]);
+    }
+
+  if (java_files_count > 0)
+    generate_option (OPT_fsaw_java_file, NULL, 1, CL_DRIVER,
+                    &new_decoded_options[j++]);
+
+  jcf_path_init ();
+  for (i = 1; i < argc; i++, j++)
     {
-      arglist[j] = argv[i];
+      new_decoded_options[j] = decoded_options[i];
 
-      if ((args[i] & PARAM_ARG) || i == 0)
+      if (decoded_options[i].errors & CL_ERR_MISSING_ARG)
        continue;
 
       if ((args[i] & RESOURCE_FILE_ARG) != 0)
        {
-         arglist[j++] = "-xjava";
-         arglist[j++] = argv[i];
-         arglist[j] = "-xnone";
+         generate_option (OPT_x, "java", 1, CL_DRIVER,
+                          &new_decoded_options[j++]);
+         new_decoded_options[j++] = decoded_options[i];
+         generate_option (OPT_x, "none", 1, CL_DRIVER,
+                          &new_decoded_options[j]);
        }
 
-      if (strcmp (argv[i], "-classpath") == 0
-         || strcmp (argv[i], "-bootclasspath") == 0
-         || strcmp (argv[i], "-CLASSPATH") == 0)
+      switch (decoded_options[i].opt_index)
        {
-         arglist[j] = concat ("-f", argv[i]+1, "=", argv[i+1], NULL);
-         i++;
+       case OPT_I:
+         jcf_path_include_arg (decoded_options[i].arg);
+         --j;
          continue;
-       }
 
-      if (strcmp (argv[i], "-d") == 0)
-       {
-         arglist[j] = concat ("-foutput-class-dir=", argv[i + 1], NULL);
-         ++i;
+       case OPT_fclasspath_:
+         jcf_path_classpath_arg (decoded_options[i].arg);
+         --j;
          continue;
-       }
 
-      if (spec_file == NULL && strncmp (argv[i], "-L", 2) == 0)
-       spec_file = find_spec_file (argv[i] + 2);
+       case OPT_fbootclasspath_:
+         jcf_path_bootclasspath_arg (decoded_options[i].arg);
+         --j;
+         continue;
 
-      if (strncmp (argv[i], "-fmain=", 7) == 0)
-       {
+       case OPT_extdirs:
+         jcf_path_extdirs_arg (decoded_options[i].arg);
+         --j;
+         continue;
+
+       case OPT_L:
+         if (spec_file == NULL)
+           spec_file = find_spec_file (decoded_options[i].arg);
+         break;
+
+       case OPT_fmain_:
          if (! will_link)
-           fatal ("cannot specify `main' class when not linking");
+           fatal_error ("cannot specify %<main%> class when not linking");
          --j;
          continue;
        }
 
       if ((args[i] & INDIRECT_FILE_ARG) != 0)
        {
-         arglist[j++] = "-xjava";
-         arglist[j++] = argv[i]+1;  /* Drop '@'. */
-         arglist[j] = "-xnone";
+         generate_option (OPT_x, "java", 1, CL_DRIVER,
+                          &new_decoded_options[j++]);
+         /* Drop '@'.  */
+         generate_option_input_file (decoded_options[i].arg + 1,
+                                     &new_decoded_options[j++]);
+         generate_option (OPT_x, "none", 1, CL_DRIVER,
+                          &new_decoded_options[j]);
        }
 
       if ((args[i] & (CLASS_FILE_ARG|ZIP_FILE_ARG)) && saw_C)
@@ -552,55 +559,62 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
       if (combine_inputs
          && (args[i] & (CLASS_FILE_ARG|JAVA_FILE_ARG|ZIP_FILE_ARG)) != 0)
        {
-         fputs (argv[i], filelist_file);
+         fputs (decoded_options[i].arg, filelist_file);
          fputc ('\n', filelist_file);
          --j;
          continue;
        }
   }
 
-  if (combine_inputs || indirect_files_count > 0)
-    arglist[j++] = "-ffilelist-file";
+  /* Handle classpath setting.  We specify the bootclasspath since
+     that requires the fewest changes to our existing code...  */
+  jcf_path_seal (0);
+  generate_option (OPT_fbootclasspath_, jcf_path_compute (""), 1,
+                  CL_DRIVER, &new_decoded_options[j++]);
 
   if (combine_inputs)
     {
       if (fclose (filelist_file))
        pfatal_with_name (filelist_filename);
-      arglist[j++] = "-xjava";
-      arglist[j++] = filelist_filename;
     }
 
   /* If we saw no -O or -g option, default to -g1, for javac compatibility. */
   if (saw_g + saw_O == 0)
-    arglist[j++] = "-g1";
+    generate_option (OPT_g, "1", 1, CL_DRIVER, &new_decoded_options[j++]);
 
   /* Read the specs file corresponding to libgcj.
      If we didn't find the spec file on the -L path, then we hope it
      is somewhere in the standard install areas.  */
   if (want_spec_file)
-    arglist[j++] = spec_file == NULL ? "-specs=libgcj.spec" : spec_file;
+    generate_option (OPT_specs_, spec_file == NULL ? "libgcj.spec" : spec_file,
+                    1, CL_DRIVER, &new_decoded_options[j++]);
 
   if (saw_C)
     {
-      arglist[j++] = "-fsyntax-only";
-      arglist[j++] = "-femit-class-files";
-      arglist[j++] = "-S";
-      arglist[j++] = "-o";
-      arglist[j++] = "NONE";
+      generate_option (OPT_fsyntax_only, NULL, 1, CL_DRIVER,
+                      &new_decoded_options[j++]);
+      generate_option (OPT_femit_class_files, NULL, 1, CL_DRIVER,
+                      &new_decoded_options[j++]);
+      generate_option (OPT_S, NULL, 1, CL_DRIVER, &new_decoded_options[j++]);
+      generate_option (OPT_o, "NONE", 1, CL_DRIVER,
+                      &new_decoded_options[j++]);
     }
   
   if (shared_libgcc)
-    arglist[j++] = "-shared-libgcc";
+    generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
+                    &new_decoded_options[j++]);
 
-  arglist[j] = NULL;
+  if (link_for_bc_abi)
+    generate_option (OPT_s_bc_abi, NULL, 1, CL_DRIVER,
+                    &new_decoded_options[j++]);
 
-  *in_argc = j;
-  *in_argv = arglist;
+  *in_decoded_options_count = j;
+  *in_decoded_options = new_decoded_options;
   *in_added_libraries = added_libraries;
 }
 
 int
-lang_specific_pre_link ()
+lang_specific_pre_link (void)
 {
   int err;
   if (main_class_name == NULL)
@@ -628,9 +642,3 @@ lang_specific_pre_link ()
     }
   return err;
 }
-
-/* Table of language-specific spec functions.  */ 
-const struct spec_function lang_specific_spec_functions[] =
-{
-  { 0, 0 }
-};