gcc.c (combine_flag): New global variable, for new driver option.
authorCaroline Tice <ctice@apple.com>
Mon, 5 Apr 2004 19:23:27 +0000 (19:23 +0000)
committerCaroline Tice <ctice@gcc.gnu.org>
Mon, 5 Apr 2004 19:23:27 +0000 (12:23 -0700)
2004-04-05  Caroline Tice  <ctice@apple.com>

        * gcc.c (combine_flag): New global variable, for new driver option.
        (struct compiler): Add two new fields, to be used when
        combining multiple input files in a single pass (IMA).
        (default_compilers):  Add values for the new fields to all
        compiler entries. Modify the "@c" compiler entry for doing IMA
        properly with "-save-temps" and the "combine" flag.
        (option_map):  Add new driver option, "--combine", to tell driver
        to pass multiple input files to compiler at one time.
        (have_o_argbuf_index): New global variable.
        (store_arg): Modify to assign value to have_o_argbuf_index.
        (struct infile):  Add three new fields, to help with IMA.
        (display_help): Add help for new "combine" option.
        (process_command): Remove local variable have_o; add code to check
        for new "combine" option; remove assignment to combine_inputs.
        (do_spec_1):  Modify to deal with IMA better.
        (main): Make variable 'lang_n_infiles' local to entire function
        rather than to a single block.  Use flag combine_flag to
        determine whether to do IMA or not; Modify loop initializing
        infiles to deal properly with linker files.
        Add code for doing preprocessing in presence of
        IMA with "-save-temps" flag.  Modify "main" loop to handle
        multiple input files, in multiple languages, with or without
        preprocessing,  gracefully.
        * toplev.c (set_src_pwd): Modify to not complain if attempting to
        re-set it to same directory it's previously been set to (avoid
        irritating, meaningless warning messages when doing IMA with
        save-temps).
        * doc/invoke.texi: Add "-combine" to list of Overall Options;
        remove documentation about IMA that is no longer accurate; Add
        documentation explaining what "-combine" does.
        * ada/lang-specs.h: Add initialization values for new fields in
        "struct compiler".
        * cp/lang-specs.h: Likewise.
        * f/lang-specs.h: Likewise.
        * java/lang-specs.h: Likewise.
        * objc/lang-specs.h: Likewise.
        * treelang/lang-specs.h: Likewise.

Fix gcc driver to work properly with IMI.

From-SVN: r80435

gcc/ChangeLog
gcc/ada/lang-specs.h
gcc/cp/lang-specs.h
gcc/doc/invoke.texi
gcc/f/lang-specs.h
gcc/gcc.c
gcc/java/lang-specs.h
gcc/objc/lang-specs.h
gcc/toplev.c
gcc/treelang/lang-specs.h

index 5654f031f0bf8b680dc31e71df1e8dde787f3190..2704ee9a506a12e02f568235ec62eb4c75f03c0f 100644 (file)
@@ -1,3 +1,43 @@
+2004-04-05  Caroline Tice  <ctice@apple.com>
+
+        * gcc.c (combine_flag): New global variable, for new driver option.
+       (struct compiler): Add two new fields, to be used when
+       combining multiple input files in a single pass (IMA).
+       (default_compilers):  Add values for the new fields to all 
+       compiler entries. Modify the "@c" compiler entry for doing IMA 
+       properly with "-save-temps" and the "combine" flag.
+       (option_map):  Add new driver option, "--combine", to tell driver
+       to pass multiple input files to compiler at one time.
+       (have_o_argbuf_index): New global variable.
+       (store_arg): Modify to assign value to have_o_argbuf_index.
+       (struct infile):  Add three new fields, to help with IMA.
+       (display_help): Add help for new "combine" option.
+       (process_command): Remove local variable have_o; add code to check
+       for new "combine" option; remove assignment to combine_inputs.
+       (do_spec_1):  Modify to deal with IMA better.
+       (main): Make variable 'lang_n_infiles' local to entire function
+       rather than to a single block.  Use flag combine_flag to 
+       determine whether to do IMA or not; Modify loop initializing 
+       infiles to deal properly with linker files.
+       Add code for doing preprocessing in presence of
+       IMA with "-save-temps" flag.  Modify "main" loop to handle
+       multiple input files, in multiple languages, with or without
+       preprocessing,  gracefully.
+       * toplev.c (set_src_pwd): Modify to not complain if attempting to
+       re-set it to same directory it's previously been set to (avoid
+       irritating, meaningless warning messages when doing IMA with 
+       save-temps).
+       * doc/invoke.texi: Add "-combine" to list of Overall Options;
+       remove documentation about IMA that is no longer accurate; Add
+       documentation explaining what "-combine" does.
+       * ada/lang-specs.h: Add initialization values for new fields in
+       "struct compiler".
+       * cp/lang-specs.h: Likewise.
+       * f/lang-specs.h: Likewise.
+       * java/lang-specs.h: Likewise.
+       * objc/lang-specs.h: Likewise.
+       * treelang/lang-specs.h: Likewise.
+
 2004-04-05  David Edelsohn
 
        * config/rs6000/rs6000.c (VTABLE_NAME_P): Add _ZTI to special
index b68e78d098b6ded62fac471f118bc3d15d5965c8..c1ad1ae36f8f6b7db4c23250eea273d407f59d11 100644 (file)
@@ -27,8 +27,8 @@
 /* This is the contribution to the `default_compilers' array in gcc.c for
    GNAT.  */
 
-  {".ads", "@ada", 0},
-  {".adb", "@ada", 0},
+  {".ads", "@ada", 0, 0, 0},
+  {".adb", "@ada", 0, 0, 0},
   {"@ada",
    "\
  %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
@@ -40,4 +40,4 @@
     %{g*} %{O*} %{W*} %{w} %{p} %{pg:-p} %{m*} %{a} %{f*} %{d*}\
     %{!S:%{o*:%w%*-gnatO}} \
     %i %{S:%W{o*}%{!o*:-o %b.s}} \
-    %{!gnatc*:%{!gnatz*:%{!gnats*:%(invoke_as)}}}", 0},
+    %{!gnatc*:%{!gnatz*:%{!gnats*:%(invoke_as)}}}", 0, 0, 0},
index 5815ea57896e1e23e7ed8eedd235a7c58e59e2c9..836ea3407f5f825686a04d66fefac8636575294a 100644 (file)
@@ -26,15 +26,15 @@ Boston, MA 02111-1307, USA.  */
 #define CPLUSPLUS_CPP_SPEC 0
 #endif
 
-  {".cc",  "@c++", 0},
-  {".cp",  "@c++", 0},
-  {".cxx", "@c++", 0},
-  {".cpp", "@c++", 0},
-  {".c++", "@c++", 0},
-  {".C",   "@c++", 0},
-  {".CPP", "@c++", 0},
-  {".H",   "@c++-header", 0},
-  {".hh",  "@c++-header", 0},
+  {".cc",  "@c++", 0, 0, 0},
+  {".cp",  "@c++", 0, 0, 0},
+  {".cxx", "@c++", 0, 0, 0},
+  {".cpp", "@c++", 0, 0, 0},
+  {".c++", "@c++", 0, 0, 0},
+  {".C",   "@c++", 0, 0, 0},
+  {".CPP", "@c++", 0, 0, 0},
+  {".H",   "@c++-header", 0, 0, 0},
+  {".hh",  "@c++-header", 0, 0, 0},
   {"@c++-header",
     "%{E|M|MM:cc1plus -E %(cpp_options) %2 %(cpp_debug_options)}\
      %{!E:%{!M:%{!MM:\
@@ -44,7 +44,7 @@ Boston, MA 02111-1307, USA.  */
              %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\
        %(cc1_options) %2 %{+e1*}\
         -o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
-     CPLUSPLUS_CPP_SPEC},
+     CPLUSPLUS_CPP_SPEC, 0, 0},
   {"@c++",
     "%{E|M|MM:cc1plus -E %(cpp_options) %2 %(cpp_debug_options)}\
      %{!E:%{!M:%{!MM:\
@@ -54,9 +54,9 @@ Boston, MA 02111-1307, USA.  */
              %{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\
        %(cc1_options) %2 %{+e1*}\
        %{!fsyntax-only:%(invoke_as)}}}}",
-     CPLUSPLUS_CPP_SPEC},
+     CPLUSPLUS_CPP_SPEC, 0, 0},
   {".ii", "@c++-cpp-output", 0},
   {"@c++-cpp-output",
    "%{!M:%{!MM:%{!E:\
     cc1plus -fpreprocessed %i %(cc1_options) %2 %{+e*}\
-    %{!fsyntax-only:%(invoke_as)}}}}", 0},
+    %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
index 2a9779b5288003bedc7f302cd71bea69cc8b0188..8afebf5fcbb8e510b7d2db95eb40b5b778a3f65b 100644 (file)
@@ -155,7 +155,7 @@ in the following sections.
 @table @emph
 @item Overall Options
 @xref{Overall Options,,Options Controlling the Kind of Output}.
-@gccoptlist{-c  -S  -E  -o @var{file}  -pipe  -pass-exit-codes  @gol
+@gccoptlist{-c  -S  -E  -o @var{file}  -combine -pipe  -pass-exit-codes  @gol
 -x @var{language}  -v  -###  --help  --target-help  --version}
 
 @item C Language Options
@@ -868,10 +868,6 @@ Place output in file @var{file}.  This applies regardless to whatever
 sort of output is being produced, whether it be an executable file,
 an object file, an assembler file or preprocessed C code.
 
-If you specify @option{-o} when compiling more than one input file, or
-you are producing an executable file as output, all the source files
-on the command line will be compiled at once.
-
 If @option{-o} is not specified, the default is to put an executable file
 in @file{a.out}, the object file for @file{@var{source}.@var{suffix}} in
 @file{@var{source}.o}, its assembler file in @file{@var{source}.s}, and
@@ -896,6 +892,21 @@ various stages of compilation.  This fails to work on some systems where
 the assembler is unable to read from a pipe; but the GNU assembler has
 no trouble.
 
+@item -combine
+@opindex combine
+If you are compiling multiple source files, this option tells the driver
+to pass all the source files to the compiler at once (for those 
+languages for which the compiler can handle this).  This will allow
+intermodule analysis (IMA) to be performed by the compiler.  Currently the only
+language for which this is supported is C.  If you pass source files for
+multiple languages to the driver, using this option, the driver will invoke
+the compiler(s) that support IMA once each, passing each compiler all the
+source files appropriate for it.  For those languages that do not support
+IMA this option will be ignored, and the compiler will be invoked once for
+each source file in that language.  If you use this option in conjunction
+with -save-temps, the compiler will generate multiple pre-processed files
+(one for each source file), but only one (combined) .o or .s file. 
+
 @item --help
 @opindex help
 Print (on the standard output) a description of the command line options
index 9ed51ef5a60c015d874fdda83f4afcbf66068565..f1281d6767293412815af60faece1bcc9d02857e 100644 (file)
@@ -25,23 +25,23 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* This is the contribution to the `default_compilers' array in gcc.c for
    g77.  */
 
-  {".F",   "@f77-cpp-input", 0},
-  {".fpp", "@f77-cpp-input", 0},
-  {".FPP", "@f77-cpp-input", 0},
+  {".F",   "@f77-cpp-input", 0, 0, 0},
+  {".fpp", "@f77-cpp-input", 0, 0, 0},
+  {".FPP", "@f77-cpp-input", 0, 0, 0},
   {"@f77-cpp-input",
    "cc1 -E -traditional-cpp -D_LANGUAGE_FORTRAN %(cpp_options) \
         %{E|M|MM:%(cpp_debug_options)}\
         %{!M:%{!MM:%{!E: -o %|.f |\n\
-    f771 %|.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}}}", 0},
-  {".r", "@ratfor", 0},
+    f771 %|.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
+  {".r", "@ratfor", 0, 0, 0},
   {"@ratfor",
    "%{C:%{!E:%eGCC does not support -C without using -E}}\
     %{CC:%{!E:%eGCC does not support -CC without using -E}}\
     ratfor %{C} %{CC} %{v} %{E:%W{o*}} %{!E: %{!pipe:-o %g.f} %i |\n\
-    f771 %m.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}", 0},
-  {".f",   "@f77", 0},
-  {".for", "@f77", 0},
-  {".FOR", "@f77", 0},
+    f771 %m.f %(cc1_options) %{I*} %{!fsyntax-only:%(invoke_as)}}", 0, 0, 0},
+  {".f",   "@f77", 0, 0, 0},
+  {".for", "@f77", 0, 0, 0},
+  {".FOR", "@f77", 0, 0, 0},
   {"@f77",
    "%{!M:%{!MM:%{!E:f771 %i %(cc1_options) %{I*}\
-       %{!fsyntax-only:%(invoke_as)}}}}", 0},
+       %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
index d69d78a0d030515674b2cf800716e8d5aa243078..f90cba3d1368c3c0e53691be5fee83a0a4d7ed74 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -218,6 +218,10 @@ static const char *target_sysroot_hdrs_suffix = 0;
 
 static int save_temps_flag;
 
+/* Nonzero means pass multiple source files to the compiler at one time.  */
+
+static int combine_flag = 0;
+
 /* Nonzero means use pipes to communicate between subprocesses.
    Overridden by either of the above two flags.  */
 
@@ -861,6 +865,10 @@ struct compiler
   const char *cpp_spec;         /* If non-NULL, substitute this spec
                                   for `%C', rather than the usual
                                   cpp_spec.  */
+  const int combinable;          /* If non-zero, compiler can deal with
+                                   multiple source files at once (IMA).  */
+  const int needs_preprocessing; /* If non-zero, source files need to
+                                   be run through a preprocessor.  */
 };
 
 /* Pointer to a vector of `struct compiler' that gives the spec for
@@ -886,19 +894,21 @@ static const struct compiler default_compilers[] =
      were not present when we built the driver, we will hit these copies
      and be given a more meaningful error than "file not used since
      linking is not done".  */
-  {".m",  "#Objective-C", 0}, {".mi",  "#Objective-C", 0},
-  {".cc", "#C++", 0}, {".cxx", "#C++", 0}, {".cpp", "#C++", 0},
-  {".cp", "#C++", 0}, {".c++", "#C++", 0}, {".C", "#C++", 0},
-  {".CPP", "#C++", 0}, {".ii", "#C++", 0},
-  {".ads", "#Ada", 0}, {".adb", "#Ada", 0},
-  {".f", "#Fortran", 0}, {".for", "#Fortran", 0}, {".fpp", "#Fortran", 0},
-  {".F", "#Fortran", 0}, {".FOR", "#Fortran", 0}, {".FPP", "#Fortran", 0},
-  {".r", "#Ratfor", 0},
-  {".p", "#Pascal", 0}, {".pas", "#Pascal", 0},
-  {".java", "#Java", 0}, {".class", "#Java", 0},
-  {".zip", "#Java", 0}, {".jar", "#Java", 0},
+  {".m",  "#Objective-C", 0, 0, 0}, {".mi",  "#Objective-C", 0, 0, 0},
+  {".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0}, 
+  {".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0}, 
+  {".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},
+  {".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},
+  {".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},
+  {".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0}, 
+  {".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0}, 
+  {".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},
+  {".r", "#Ratfor", 0, 0, 0},
+  {".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},
+  {".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},
+  {".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},
   /* Next come the entries for C.  */
-  {".c", "@c", 0},
+  {".c", "@c", 0, 1, 1},
   {"@c",
    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
       external preprocessor if -save-temps is given.  */
@@ -906,17 +916,24 @@ static const struct compiler default_compilers[] =
       %{!E:%{!M:%{!MM:\
           %{traditional|ftraditional:\
 %eGNU C no longer supports -traditional without -E}\
+       %{!combine:\
          %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
                %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\
                    cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \
                        %(cc1_options)}\
          %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
                cc1 %(cpp_unique_options) %(cc1_options)}}}\
-        %{!fsyntax-only:%(invoke_as)}}}}", 0},
+          %{!fsyntax-only:%(invoke_as)}} \
+      %{combine:\
+         %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \
+               %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\
+         %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
+               cc1 %(cpp_unique_options) %(cc1_options)}}\
+                %{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},
   {"-",
    "%{!E:%e-E required when input is from standard input}\
-    %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0},
-  {".h", "@c-header", 0},
+    %(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},
+  {".h", "@c-header", 0, 0, 0},
   {"@c-header",
    /* cc1 has an integrated ISO C preprocessor.  We should invoke the
       external preprocessor if -save-temps is given.  */
@@ -931,14 +948,14 @@ static const struct compiler default_compilers[] =
          %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\
                cc1 %(cpp_unique_options) %(cc1_options)\
                     -o %g.s %{!o*:--output-pch=%i.gch}\
-                    %W{o*:--output-pch=%*}%V}}}}}}", 0},
-  {".i", "@cpp-output", 0},
+                    %W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},
+  {".i", "@cpp-output", 0, 1, 0},
   {"@cpp-output",
    "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0},
-  {".s", "@assembler", 0},
+  {".s", "@assembler", 0, 1, 0},
   {"@assembler",
-   "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0},
-  {".S", "@assembler-with-cpp", 0},
+   "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},
+  {".S", "@assembler-with-cpp", 0, 1, 0},
   {"@assembler-with-cpp",
 #ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT
    "%(trad_capable_cpp) -lang-asm %(cpp_options)\
@@ -951,11 +968,11 @@ static const struct compiler default_compilers[] =
       %{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\
        as %(asm_debug) %(asm_options) %m.s %A }}}}"
 #endif
-   , 0},
+   , 0, 1, 0},
 
 #include "specs.h"
   /* Mark end of table.  */
-  {0, 0, 0}
+  {0, 0, 0, 0, 0}
 };
 
 /* Number of elements in default_compilers, not counting the terminator.  */
@@ -1009,6 +1026,7 @@ static const struct option_map option_map[] =
    {"--classpath", "-fclasspath=", "aj"},
    {"--bootclasspath", "-fbootclasspath=", "aj"},
    {"--CLASSPATH", "-fclasspath=", "aj"},
+   {"--combine", "-combine", 0},
    {"--comments", "-C", 0},
    {"--comments-in-macros", "-CC", 0},
    {"--compile", "-c", 0},
@@ -1778,6 +1796,11 @@ static int argbuf_length;
 
 static int argbuf_index;
 
+/* Position in the argbuf array containing the name of the output file
+   (the value associated with the "-o" flag).  */
+
+static int have_o_argbuf_index = 0;
+
 /* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
    temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
    it here.  */
@@ -1836,6 +1859,8 @@ store_arg (const char *arg, int delete_always, int delete_failure)
   argbuf[argbuf_index++] = arg;
   argbuf[argbuf_index] = 0;
 
+  if (strcmp (arg, "-o") == 0)
+    have_o_argbuf_index = argbuf_index;
   if (delete_always || delete_failure)
     record_temp_file (arg, delete_always, delete_failure);
 }
@@ -2891,6 +2916,9 @@ struct infile
 {
   const char *name;
   const char *language;
+  struct compiler *incompiler;
+  bool compiled;
+  bool preprocessed;
 };
 
 /* Also a vector of input files specified.  */
@@ -3005,6 +3033,7 @@ display_help (void)
   fputs (_("  -Xassembler <arg>        Pass <arg> on to the assembler\n"), stdout);
   fputs (_("  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor\n"), stdout);
   fputs (_("  -Xlinker <arg>           Pass <arg> on to the linker\n"), stdout);
+  fputs (_("  -combine                 Pass multiple source files to compiler at once\n"), stdout);
   fputs (_("  -save-temps              Do not delete intermediate files\n"), stdout);
   fputs (_("  -pipe                    Use pipes rather than intermediate files\n"), stdout);
   fputs (_("  -time                    Time the execution of each subprocess\n"), stdout);
@@ -3091,7 +3120,6 @@ process_command (int argc, const char **argv)
   const char *spec_lang = 0;
   int last_language_n_infiles;
   int have_c = 0;
-  int have_o = 0;
   int lang_n_infiles = 0;
 #ifdef MODIFY_TARGET_NAME
   int is_modify_target_name;
@@ -3493,6 +3521,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
          save_temps_flag = 1;
          n_switches++;
        }
+      else if (strcmp (argv[i], "-combine") == 0)
+       {
+         combine_flag = 1;
+         n_switches++;
+       }
       else if (strcmp (argv[i], "-specs") == 0)
        {
          struct user_specs *user = xmalloc (sizeof (struct user_specs));
@@ -3635,7 +3668,6 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
              goto normal_switch;
 
            case 'o':
-             have_o = 1;
 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
              if (! have_c)
                {
@@ -3728,8 +3760,6 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
        }
     }
 
-  combine_inputs = (have_c && have_o && lang_n_infiles > 1);
-
   if ((save_temps_flag || report_times) && use_pipes)
     {
       /* -save-temps overrides -pipe, so that temp files are produced */
@@ -4777,7 +4807,12 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
            if (combine_inputs)
              {
                for (i = 0; (int) i < n_infiles; i++)
-                 store_arg (infiles[i].name, 0, 0);
+                 if ((!infiles[i].language) || (infiles[i].language[0] != '*'))
+                   if (infiles[i].incompiler == input_file_compiler)
+                     {
+                       store_arg (infiles[i].name, 0, 0);
+                       infiles[i].compiled = true;
+                     }
              }
            else
              {
@@ -5919,6 +5954,7 @@ main (int argc, const char **argv)
   size_t i;
   int value;
   int linker_was_run = 0;
+  int lang_n_infiles = 0;
   int num_linker_inputs = 0;
   char *explicit_link_files;
   char *specs_file;
@@ -6314,28 +6350,99 @@ main (int argc, const char **argv)
 
   explicit_link_files = xcalloc (1, n_infiles);
 
-  if (combine_inputs)
+  if (combine_flag)
+    combine_inputs = true;
+  else
+    combine_inputs = false;
+
+  for (i = 0; (int) i < n_infiles; i++)
     {
-       int lang_n_infiles = 0;
-       for (i = 0; (int) i < n_infiles; i++)
-        {
-          const char *name = infiles[i].name;
-          struct compiler *compiler
-            = lookup_compiler (name, strlen (name), infiles[i].language);
-          if (compiler == NULL)
-            error ("%s: linker input file unused because linking not done",
-                   name);
-          else if (lang_n_infiles > 0 && compiler != input_file_compiler)
-            fatal ("cannot specify -o with -c or -S and multiple languages");
-          else
-            {
-              lang_n_infiles++;
-              input_file_compiler = compiler;
-            }
-        }
+      const char *name = infiles[i].name;
+      struct compiler *compiler = lookup_compiler (name, 
+                                                  strlen (name), 
+                                                  infiles[i].language);
+      
+      if (compiler && !(compiler->combinable))
+       combine_inputs = false;
+      
+      if (lang_n_infiles > 0 && compiler != input_file_compiler
+         && infiles[i].language && infiles[i].language[0] != '*')
+       infiles[i].incompiler = compiler;
+      else if (compiler)
+       {
+         lang_n_infiles++;
+         input_file_compiler = compiler;
+         infiles[i].incompiler = compiler;
+       }
+      else
+       {
+         /* Since there is no compiler for this input file, assume it is a
+            linker file. */
+         explicit_link_files[i] = 1;
+         infiles[i].incompiler = NULL;
+       }
+      infiles[i].compiled = false;
+      infiles[i].preprocessed = false;
     }
   
-  for (i = 0; (int) i < (combine_inputs ? 1 : n_infiles); i++)
+  if (combine_flag && save_temps_flag)
+    {
+      bool save_combine_inputs = combine_inputs;
+      /* Must do a separate pre-processing pass for C & Objective-C files, to
+        obtain individual .i files.  */
+
+      combine_inputs = false;
+      for (i = 0; (int) i < n_infiles; i++)
+       {
+         int this_file_error = 0;
+         
+         input_file_number = i;
+         set_input (infiles[i].name);
+         if (infiles[i].incompiler
+             && (infiles[i].incompiler)->needs_preprocessing)
+           input_file_compiler = infiles[i].incompiler;
+         else
+           continue;
+
+         if (input_file_compiler)
+           {
+             if (input_file_compiler->spec[0] == '#')
+               {
+                 error ("%s: %s compiler not installed on this system",
+                        input_filename, &input_file_compiler->spec[1]);
+                 this_file_error = 1;
+               }
+             else
+               {
+                 value = do_spec (input_file_compiler->spec);
+                 infiles[i].preprocessed = true;
+                 if (have_o_argbuf_index)
+                   infiles[i].name = argbuf[have_o_argbuf_index];
+                 else
+                   abort ();
+                 infiles[i].incompiler = lookup_compiler (infiles[i].name,
+                                                      strlen (infiles[i].name),
+                                                      infiles[i].language);
+
+                 if (value < 0)
+                   {
+                     this_file_error = 1;
+                     break;
+                   }
+               }
+           }
+
+         if (this_file_error)
+           {
+             delete_failure_queue ();
+             error_count++;
+           }
+         clear_failure_queue ();
+       }
+      combine_inputs = save_combine_inputs;
+    }
+
+  for (i = 0; (int) i < n_infiles; i++)
     {
       int this_file_error = 0;
 
@@ -6344,6 +6451,9 @@ main (int argc, const char **argv)
       input_file_number = i;
       set_input (infiles[i].name);
 
+      if (infiles[i].compiled)
+       continue;
+
       /* Use the same thing in %o, unless cp->spec says otherwise.  */
 
       outfiles[i] = input_filename;
@@ -6354,6 +6464,8 @@ main (int argc, const char **argv)
        input_file_compiler
          = lookup_compiler (infiles[i].name, input_filename_length,
                             infiles[i].language);
+      else
+       input_file_compiler = infiles[i].incompiler;
 
       if (input_file_compiler)
        {
@@ -6368,8 +6480,12 @@ main (int argc, const char **argv)
          else
            {
              value = do_spec (input_file_compiler->spec);
+             infiles[i].compiled = true;
              if (value < 0)
-               this_file_error = 1;
+               {
+                 this_file_error = 1;
+                 break;
+               }
            }
        }
 
index 35a88656370a36e94ae0edffba5f771dde7ede8a..6449ec3309ecf2c9d87dfa6b2d4e5cc0cbb01a1e 100644 (file)
@@ -26,10 +26,10 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 /* This is the contribution to the `default_compilers' array in gcc.c for
    Java.  */
 
-  {".java",   "@java" , 0},
-  {".class",  "@java" , 0},
-  {".zip",    "@java" , 0},
-  {".jar",    "@java" , 0},
+  {".java",   "@java" , 0, 0, 0},
+  {".class",  "@java" , 0, 0, 0},
+  {".zip",    "@java" , 0, 0, 0},
+  {".jar",    "@java" , 0, 0, 0},
   {"@java",
    "%{fjni:%{femit-class-files:%e-fjni and -femit-class-files are incompatible}}\
     %{fjni:%{femit-class-file:%e-fjni and -femit-class-file are incompatible}}\
@@ -37,5 +37,5 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
     %{femit-class-files:%{!fsyntax-only:%e-femit-class-file should used along with -fsyntax-only}}\
     %{!E:jc1 %i %(jc1) %(cc1_options) %{+e*} %{I*}\
              %{MD:-MD_} %{MMD:-MMD_} %{M} %{MM} %{MA} %{MT*} %{MF*}\
-             %{!fsyntax-only:%(invoke_as)}}", 0},
+             %{!fsyntax-only:%(invoke_as)}}", 0, 0, 0},
 
index fe34bed83fca96832ee9dd7bfb298bb5f067517b..eb9e63713a90724edf2053a0590398d14224a1b8 100644 (file)
@@ -22,7 +22,7 @@ Boston, MA 02111-1307, USA.  */
 /* This is the contribution to the `default_compilers' array in gcc.c for
    objc.  */
 
-  {".m", "@objective-c", 0},
+  {".m", "@objective-c", 0, 0, 0},
   {"@objective-c",
      "%{E|M|MM:%(trad_capable_cpp)\
           -lang-objc %(cpp_options) %(cpp_debug_options)}\
@@ -33,11 +33,11 @@ Boston, MA 02111-1307, USA.  */
            cc1obj -fpreprocessed %{save-temps:%b.mi} %{!save-temps:%g.mi} %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}\
        %{!save-temps:%{!no-integrated-cpp:\
            cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}}}\
-        %{!fsyntax-only:%(invoke_as)}}}}", 0},
-  {".mi", "@objc-cpp-output", 0},
+        %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
+  {".mi", "@objc-cpp-output", 0, 0, 0},
   {"@objc-cpp-output",
      "%{!M:%{!MM:%{!E:cc1obj -fpreprocessed %i %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
-                            %{!fsyntax-only:%(invoke_as)}}}}", 0},
+                            %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
   {"@objective-c-header",
      "%{E|M|MM:cc1obj -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}\
           %(cpp_options) %(cpp_debug_options)}\
@@ -51,4 +51,4 @@ Boston, MA 02111-1307, USA.  */
        %{!save-temps:%{!no-integrated-cpp:\
            cc1obj %(cpp_unique_options) %(cc1_options) %{print-objc-runtime-info} %{gen-decls}\
                         -o %g.s %{!o*:--output-pch=%i.gch}\
-                        %W{o*:--output-pch=%*}%V}}}}}", 0},
+                        %W{o*:--output-pch=%*}%V}}}}}", 0, 0, 0},
index 650a260dc55e44c747a5ded5503fcb0eb80c2746..fcfb99d2e66b297b707f19717740a1c9fe17eb38 100644 (file)
@@ -1056,7 +1056,12 @@ bool
 set_src_pwd (const char *pwd)
 {
   if (src_pwd)
-    return false;
+    {
+      if (strcmp (src_pwd, pwd) == 0)
+       return true;
+      else
+       return false;
+    }
 
   src_pwd = xstrdup (pwd);
   return true;
index 4bf8e5df927549405790e9ec08d2e2c48d6f8077..1ca9c8cc89b07e5d720a03190ee7b7b1a6c41352 100644 (file)
@@ -29,10 +29,10 @@ Boston, MA 02111-1307, USA.  */
    
 */
 
-{".tree", "@treelang", NULL},
-{".TREE", "@treelang", NULL},
-{".tre", "@treelang", NULL},
-{".TRE", "@treelang", NULL},
+{".tree", "@treelang", NULL, 0, 0},
+{".TREE", "@treelang", NULL, 0, 0},
+{".tre", "@treelang", NULL, 0, 0},
+{".TRE", "@treelang", NULL, 0, 0},
 {"@treelang",
     "tree1\
        %{!Q:-quiet}\
@@ -59,5 +59,5 @@ Boston, MA 02111-1307, USA.  */
        %{!c:-o %d%w%u%O}\
        %g.s\
        %A\n}\
-       ", NULL
+       ", NULL , 0, 0
 },