re PR java/227 (mips-tfile:internal error (when compiling java code))
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>
Thu, 2 Aug 2001 12:26:00 +0000 (12:26 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Thu, 2 Aug 2001 12:26:00 +0000 (12:26 +0000)
* gcc.c (set_collect_gcc_options): New function, split out from
main.
Ignore elided switches.
(do_spec_1): Invoke before executing command.
(set_input): Export.
Move declaration ...
* gcc.h (set_input): ... here.
* config/alpha/osf.h (ASM_FINAL_SPEC): Use %U.s to refer to input
file.

java:
* jvspec.c (jvgenmain_spec): Cannot use %umain, breaks
ASM_FINAL_SPEC.
(lang_specific_pre_link): Use set_input to set input_filename.
Append `main' here.
* jvgenmain.c (usage): Append literal `main' to CLASSNAME.
(main): Fix definition.
Strip `main' from classname.
Fixes PR java/227.

From-SVN: r44572

gcc/ChangeLog
gcc/config/alpha/osf.h
gcc/gcc.c
gcc/gcc.h
gcc/java/ChangeLog
gcc/java/jvgenmain.c
gcc/java/jvspec.c

index ee75869..59f1526 100644 (file)
@@ -1,3 +1,15 @@
+2001-08-02  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+       * gcc.c (set_collect_gcc_options): New function, split out from
+       main.
+       Ignore elided switches.
+       (do_spec_1): Invoke before executing command.
+       (set_input): Export.
+       Move declaration ...
+       * gcc.h (set_input): ... here.
+       * config/alpha/osf.h (ASM_FINAL_SPEC): Use %U.s to refer to input
+       file.
+
 2001-08-02  Nathan Sidwell  <nathan@codesourcery.com>
 
        Kill -fhonor-std.
index 250974c..4386f56 100644 (file)
@@ -121,7 +121,7 @@ Boston, MA 02111-1307, USA.  */
                %{K: -I %b.o~} \
                %{!K: %{save-temps: -I %b.o~}} \
                %{c:%W{o*}%{!o*:-o %b.o}}%{!c:-o %U.o} \
-               %{.s:%i} %{!.s:%g.s}}}"
+               %{.s:%i} %{!.s:%U.s}}}"
 
 #else
 #define ASM_FINAL_SPEC "\
@@ -130,7 +130,7 @@ Boston, MA 02111-1307, USA.  */
                %{K: -I %b.o~} \
                %{!K: %{save-temps: -I %b.o~}} \
                %{c:%W{o*}%{!o*:-o %b.o}}%{!c:-o %U.o} \
-               %{.s:%i} %{!.s:%g.s}}}"
+               %{.s:%i} %{!.s:%U.s}}}"
 
 #endif
 
index 409ac2b..ed86fa0 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -289,6 +289,7 @@ static void clear_failure_queue PARAMS ((void));
 static int check_live_switch   PARAMS ((int, int));
 static const char *handle_braces PARAMS ((const char *));
 static char *save_string       PARAMS ((const char *, int));
+static void set_collect_gcc_options PARAMS ((void));
 static int do_spec_1           PARAMS ((const char *, int, const char *));
 static const char *find_file   PARAMS ((const char *));
 static int is_directory                PARAMS ((const char *, const char *, int));
@@ -312,7 +313,6 @@ static void process_command         PARAMS ((int, const char *const *));
 static int execute                     PARAMS ((void));
 static void clear_args                 PARAMS ((void));
 static void fatal_error                        PARAMS ((int));
-static void set_input                  PARAMS ((const char *));
 static void init_gcc_specs              PARAMS ((struct obstack *,
                                                 const char *,
                                                 const char *));
@@ -3960,6 +3960,63 @@ process_command (argc, argv)
   switches[n_switches].part1 = 0;
   infiles[n_infiles].name = 0;
 }
+
+/* Store switches not filtered out but %{<S} in spec in COLLECT_GCC_OPTIONS
+   and place that in the environment.  */
+
+static void
+set_collect_gcc_options ()
+{
+  int i;
+  int first_time;
+
+  /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
+     the compiler.  */
+  obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
+               sizeof ("COLLECT_GCC_OPTIONS=") - 1);
+
+  first_time = TRUE;
+  for (i = 0; (int) i < n_switches; i++)
+    {
+      const char *const *args;
+      const char *p, *q;
+      if (!first_time)
+       obstack_grow (&collect_obstack, " ", 1);
+
+      first_time = FALSE;
+
+      /* Ignore elided switches.  */
+      if (switches[i].live_cond == SWITCH_IGNORE)
+       continue;
+
+      obstack_grow (&collect_obstack, "'-", 2);
+      q = switches[i].part1;
+      while ((p = strchr (q, '\'')))
+       {
+         obstack_grow (&collect_obstack, q, p - q);
+         obstack_grow (&collect_obstack, "'\\''", 4);
+         q = ++p;
+       }
+      obstack_grow (&collect_obstack, q, strlen (q));
+      obstack_grow (&collect_obstack, "'", 1);
+
+      for (args = switches[i].args; args && *args; args++)
+       {
+         obstack_grow (&collect_obstack, " '", 2);
+         q = *args;
+         while ((p = strchr (q, '\'')))
+           {
+             obstack_grow (&collect_obstack, q, p - q);
+             obstack_grow (&collect_obstack, "'\\''", 4);
+             q = ++p;
+           }
+         obstack_grow (&collect_obstack, q, strlen (q));
+         obstack_grow (&collect_obstack, "'", 1);
+       }
+    }
+  obstack_grow (&collect_obstack, "\0", 1);
+  putenv (obstack_finish (&collect_obstack));
+}
 \f
 /* Process a spec string, accumulating and running commands.  */
 
@@ -4103,6 +4160,8 @@ do_spec_1 (spec, inswitch, soft_matched_part)
              argbuf_index--;
          }
 
+       set_collect_gcc_options ();
+
        if (argbuf_index > 0)
          {
            value = execute ();
@@ -5486,7 +5545,7 @@ is_directory (path1, path2, linker)
 /* Set up the various global variables to indicate that we're processing
    the input file named FILENAME.  */
 
-static void
+void
 set_input (filename)
      const char *filename;
 {
@@ -5659,52 +5718,6 @@ main (argc, argv)
 
   process_command (argc, argv);
 
-  {
-    int first_time;
-
-    /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
-       the compiler.  */
-    obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
-                 sizeof ("COLLECT_GCC_OPTIONS=") - 1);
-
-    first_time = TRUE;
-    for (i = 0; (int) i < n_switches; i++)
-      {
-       const char *const *args;
-       const char *p, *q;
-       if (!first_time)
-         obstack_grow (&collect_obstack, " ", 1);
-
-       first_time = FALSE;
-       obstack_grow (&collect_obstack, "'-", 2);
-       q = switches[i].part1;
-       while ((p = strchr (q, '\'')))
-         {
-           obstack_grow (&collect_obstack, q, p - q);
-           obstack_grow (&collect_obstack, "'\\''", 4);
-           q = ++p;
-         }
-       obstack_grow (&collect_obstack, q, strlen (q));
-       obstack_grow (&collect_obstack, "'", 1);
-
-       for (args = switches[i].args; args && *args; args++)
-         {
-           obstack_grow (&collect_obstack, " '", 2);
-           q = *args;
-           while ((p = strchr (q, '\'')))
-             {
-               obstack_grow (&collect_obstack, q, p - q);
-               obstack_grow (&collect_obstack, "'\\''", 4);
-               q = ++p;
-             }
-           obstack_grow (&collect_obstack, q, strlen (q));
-           obstack_grow (&collect_obstack, "'", 1);
-         }
-      }
-    obstack_grow (&collect_obstack, "\0", 1);
-    putenv (obstack_finish (&collect_obstack));
-  }
-
   /* Initialize the vector of specs to just the default.
      This means one element containing 0s, as a terminator.  */
 
index 6252676..55a79a9 100644 (file)
--- a/gcc/gcc.h
+++ b/gcc/gcc.h
@@ -1,5 +1,5 @@
 /* Header file for modules that link with gcc.c
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -33,6 +33,7 @@ extern void fatal PARAMS ((const char *, ...))
      ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
 extern void error PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1;
 extern void pfatal_with_name PARAMS ((const char *)) ATTRIBUTE_NORETURN;
+extern void set_input PARAMS ((const char *));
 
 /* Spec files linked with gcc.c must provide definitions for these. */
 
index 3c02e80..24f5c40 100644 (file)
        syntax error encountered during class definition.
        Fixes PR java/2956
 
+2001-08-02  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+       * jvspec.c (jvgenmain_spec): Cannot use %umain, breaks
+       ASM_FINAL_SPEC.
+       (lang_specific_pre_link): Use set_input to set input_filename.
+       Append `main' here.
+       * jvgenmain.c (usage): Append literal `main' to CLASSNAME.
+       (main): Fix definition.
+       Strip `main' from classname.
+       Fixes PR java/227.
+
 2001-07-18  Tom Tromey  <tromey@redhat.com>
 
        For PR java/2812:
index ab43ddd..9a42571 100644 (file)
@@ -61,14 +61,14 @@ static void usage (const char *) ATTRIBUTE_NORETURN;
 static void
 usage (const char *name)
 {
-  fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAME [OUTFILE]\n", name);
+  fprintf (stderr, "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n", name);
   exit (1);
 }
 
 int
-main (int argc, const char **argv)
+main (int argc, char **argv)
 {
-  const char *classname;
+  char *classname, *p;
   FILE *stream;
   const char *mangled_classname;
   int i, last_arg;
@@ -92,6 +92,13 @@ main (int argc, const char **argv)
 
   classname = argv[i];
 
+  /* gcj always appends `main' to classname.  We need to strip this here.  */
+  p = strrchr (classname, 'm');
+  if (p == NULL || p == classname || strcmp (p, "main") != 0)
+    usage (argv[0]);
+  else
+    *p = '\0';
+
   gcc_obstack_init (mangle_obstack);
   mangled_classname = do_mangle_classname (classname);
 
index 44342cf..761c580 100644 (file)
@@ -52,8 +52,8 @@ int lang_specific_extra_outfiles = 0;
 int shared_libgcc = 1;
 
 const char jvgenmain_spec[] =
-  "jvgenmain %{D*} %i %{!pipe:%umain.i} |\n\
-   cc1 %{!pipe:%Umain.i} %1 \
+  "jvgenmain %{D*} %b %{!pipe:%u.i} |\n\
+   cc1 %{!pipe:%U.i} %1 \
                   %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
                   %{g*} %{O*} \
                   %{v:-version} %{pg:-p} %{p}\
@@ -68,8 +68,8 @@ const char jvgenmain_spec[] =
                   %{f*} -fdollars-in-identifiers\
                   %{aux-info*}\
                   %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
-                  %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%Umain.s}} |\n\
-              %{!S:as %a %Y -o %d%w%umain%O %{!pipe:%Umain.s} %A\n }";
+                  %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%U.s}} |\n\
+              %{!S:as %a %Y -o %d%w%u%O %{!pipe:%U.s} %A\n }";
 
 /* Return full path name of spec file if it is in DIR, or NULL if
    not.  */
@@ -529,8 +529,14 @@ lang_specific_pre_link ()
   int err;
   if (main_class_name == NULL)
     return 0;
-  input_filename = main_class_name;
-  input_filename_length = strlen (main_class_name);
+  /* Append `main' to make the filename unique and allow
+
+       gcj --main=hello -save-temps hello.java
+
+     to work.  jvgenmain needs to strip this `main' to arrive at the correct
+     class name.  Append dummy `.c' that can be stripped by set_input so %b
+     is correct.  */ 
+  set_input (concat (main_class_name, "main.c", NULL));
   err = do_spec (jvgenmain_spec);
   if (err == 0)
     {