summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorctice <ctice@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-05 19:23:27 +0000
committerctice <ctice@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-05 19:23:27 +0000
commitdc1dd09bb3af8958e470da36dea9cb9085a2ffb1 (patch)
tree54ddbad12efc3bc6774bcd0268a91392513224da
parent5e016e74046c113b230056dd4674eef736b322bb (diff)
downloadppe42-gcc-dc1dd09bb3af8958e470da36dea9cb9085a2ffb1.tar.gz
ppe42-gcc-dc1dd09bb3af8958e470da36dea9cb9085a2ffb1.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80435 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog40
-rw-r--r--gcc/ada/lang-specs.h6
-rw-r--r--gcc/cp/lang-specs.h24
-rw-r--r--gcc/doc/invoke.texi21
-rw-r--r--gcc/f/lang-specs.h20
-rw-r--r--gcc/gcc.c210
-rw-r--r--gcc/java/lang-specs.h10
-rw-r--r--gcc/objc/lang-specs.h10
-rw-r--r--gcc/toplev.c7
-rw-r--r--gcc/treelang/lang-specs.h10
10 files changed, 265 insertions, 93 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5654f031f0b..2704ee9a506 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ada/lang-specs.h b/gcc/ada/lang-specs.h
index b68e78d098b..c1ad1ae36f8 100644
--- a/gcc/ada/lang-specs.h
+++ b/gcc/ada/lang-specs.h
@@ -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},
diff --git a/gcc/cp/lang-specs.h b/gcc/cp/lang-specs.h
index 5815ea57896..836ea3407f5 100644
--- a/gcc/cp/lang-specs.h
+++ b/gcc/cp/lang-specs.h
@@ -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},
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 2a9779b5288..8afebf5fcbb 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -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
diff --git a/gcc/f/lang-specs.h b/gcc/f/lang-specs.h
index 9ed51ef5a60..f1281d67672 100644
--- a/gcc/f/lang-specs.h
+++ b/gcc/f/lang-specs.h
@@ -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},
diff --git a/gcc/gcc.c b/gcc/gcc.c
index d69d78a0d03..f90cba3d136 100644
--- 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;
+ }
}
}
diff --git a/gcc/java/lang-specs.h b/gcc/java/lang-specs.h
index 35a88656370..6449ec3309e 100644
--- a/gcc/java/lang-specs.h
+++ b/gcc/java/lang-specs.h
@@ -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},
diff --git a/gcc/objc/lang-specs.h b/gcc/objc/lang-specs.h
index fe34bed83fc..eb9e63713a9 100644
--- a/gcc/objc/lang-specs.h
+++ b/gcc/objc/lang-specs.h
@@ -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},
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 650a260dc55..fcfb99d2e66 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -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;
diff --git a/gcc/treelang/lang-specs.h b/gcc/treelang/lang-specs.h
index 4bf8e5df927..1ca9c8cc89b 100644
--- a/gcc/treelang/lang-specs.h
+++ b/gcc/treelang/lang-specs.h
@@ -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
},
OpenPOWER on IntegriCloud