X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Fgcc.c;h=6bc8e150a6798e54e21214b68a5c144888e8a0de;hp=d94462d9ac59eead720bf9749374bcf9ff982f5b;hb=06b9e52b8e4c071a2846fdf9931e48b640230cff;hpb=48e61da922ae61b8e3bf3b3ad605940e557e7e6b diff --git a/gcc/gcc.c b/gcc/gcc.c index d94462d9ac5..6bc8e150a67 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -684,9 +684,15 @@ proper position among the other output files. */ #endif /* config.h can define SWITCHES_NEED_SPACES to control which options - require spaces between the option and the argument. */ + require spaces between the option and the argument. + + We define SWITCHES_NEED_SPACES to include "o" by default. This + causes "-ofoo.o" to be split into "-o foo.o" during the initial + processing of the command-line, before being seen by the specs + machinery. This makes sure we record "foo.o" as the temporary file + to be deleted in the case of error, rather than "-ofoo.o". */ #ifndef SWITCHES_NEED_SPACES -#define SWITCHES_NEED_SPACES "" +#define SWITCHES_NEED_SPACES "o" #endif /* config.h can define ENDFILE_SPEC to override the default crtn files. */ @@ -770,11 +776,12 @@ proper position among the other output files. */ #define LINK_COMMAND_SPEC "\ %{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker) \ - %{use-linker-plugin: \ + %{fuse-linker-plugin: \ -plugin %(linker_plugin_file) \ -plugin-opt=%(lto_wrapper) \ -plugin-opt=%(lto_gcc) \ %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)} \ + %{static:-plugin-opt=-pass-through=-lc} \ %{O*:-plugin-opt=-O%*} \ %{w:-plugin-opt=-w} \ %{f*:-plugin-opt=-f%*} \ @@ -983,7 +990,7 @@ static struct user_specs *user_specs_head, *user_specs_tail; #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX /* This defines which switches stop a full compilation. */ #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \ - ((CHAR) == 'c' || (CHAR) == 'S') + ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E') #ifndef SWITCH_CURTAILS_COMPILATION #define SWITCH_CURTAILS_COMPILATION(CHAR) \ @@ -1999,7 +2006,7 @@ static int argbuf_index; static int have_o_argbuf_index = 0; -/* Were the options -c or -S passed. */ +/* Were the options -c, -S or -E passed. */ static int have_c = 0; /* Was the option -o passed. */ @@ -4141,6 +4148,7 @@ process_command (int argc, const char **argv) case 'S': case 'c': + case 'E': if (p[1] == 0) { have_c = 1; @@ -4156,7 +4164,7 @@ process_command (int argc, const char **argv) { int skip; - /* Forward scan, just in case -S or -c is specified + /* Forward scan, just in case -S, -E or -c is specified after -o. */ int j = i + 1; if (p[1] == 0) @@ -4560,20 +4568,32 @@ process_command (int argc, const char **argv) } else { + const char *p = strchr (argv[i], '@'); + char *fname; #ifdef HAVE_TARGET_OBJECT_SUFFIX argv[i] = convert_filename (argv[i], 0, access (argv[i], F_OK)); #endif + if (!p) + fname = xstrdup (argv[i]); + else + { + fname = (char *)xmalloc (p - argv[i] + 1); + memcpy (fname, argv[i], p - argv[i]); + fname[p - argv[i]] = '\0'; + } + + if (strcmp (fname, "-") != 0 && access (fname, F_OK) < 0) + { + perror_with_name (fname); + error_count++; + } + else + { + infiles[n_infiles].language = spec_lang; + infiles[n_infiles++].name = argv[i]; + } - if (strcmp (argv[i], "-") != 0 && access (argv[i], F_OK) < 0) - { - perror_with_name (argv[i]); - error_count++; - } - else - { - infiles[n_infiles].language = spec_lang; - infiles[n_infiles++].name = argv[i]; - } + free (fname); } } @@ -7303,7 +7323,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" } if (!combine_inputs && have_c && have_o && lang_n_infiles > 1) - fatal ("cannot specify -o with -c or -S with multiple files"); + fatal ("cannot specify -o with -c, -S or -E with multiple files"); if (combine_flag && save_temps_flag) { @@ -7511,7 +7531,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" if (num_linker_inputs > 0 && error_count == 0 && print_subprocess_help < 2) { int tmp = execution_count; - const char *use_linker_plugin = "use-linker-plugin"; + const char *fuse_linker_plugin = "fuse-linker-plugin"; /* We'll use ld if we can't find collect2. */ if (! strcmp (linker_name_spec, "collect2")) @@ -7521,19 +7541,19 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" linker_name_spec = "ld"; } - if (switch_matches (use_linker_plugin, - use_linker_plugin + strlen (use_linker_plugin), 0)) + if (switch_matches (fuse_linker_plugin, + fuse_linker_plugin + strlen (fuse_linker_plugin), 0)) { linker_plugin_file_spec = find_a_file (&exec_prefixes, "liblto_plugin.so", X_OK, false); if (!linker_plugin_file_spec) - fatal ("-use-linker-plugin, but liblto_plugin.so not found."); + fatal ("-fuse-linker-plugin, but liblto_plugin.so not found"); lto_libgcc_spec = find_a_file (&startfile_prefixes, "libgcc.a", R_OK, true); if (!lto_libgcc_spec) - fatal ("could not find libgcc.a."); + fatal ("could not find libgcc.a"); } lto_gcc_spec = argv[0];