2013-04-03 Marc Glisse <marc.glisse@inria.fr>
[official-gcc.git] / gcc / lto-wrapper.c
blob15a34dd69569a2a39652cafab6689b26d65d2de9
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2013 Free Software Foundation, Inc.
4 Factored out of collect2 by Rafael Espindola <espindola@google.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* This program is passed a gcc, a list of gcc arguments and a list of
24 object files containing IL. It scans the argument list to check if
25 we are in whopr mode or not modifies the arguments and needed and
26 prints a list of output files on stdout.
28 Example:
30 $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto
32 The above will print something like
33 /tmp/ccwbQ8B2.lto.o
35 If WHOPR is used instead, more than one file might be produced
36 ./ccXj2DTk.lto.ltrans.o
37 ./ccCJuXGv.lto.ltrans.o
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "intl.h"
44 #include "diagnostic.h"
45 #include "obstack.h"
46 #include "opts.h"
47 #include "options.h"
48 #include "simple-object.h"
50 /* From lto-streamer.h which we cannot include with -fkeep-inline-functions.
51 ??? Split out a lto-streamer-core.h. */
53 #define LTO_SECTION_NAME_PREFIX ".gnu.lto_"
55 /* End of lto-streamer.h copy. */
57 int debug; /* true if -save-temps. */
58 int verbose; /* true if -v. */
60 enum lto_mode_d {
61 LTO_MODE_NONE, /* Not doing LTO. */
62 LTO_MODE_LTO, /* Normal LTO. */
63 LTO_MODE_WHOPR /* WHOPR. */
66 /* Current LTO mode. */
67 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
69 static char *ltrans_output_file;
70 static char *flto_out;
71 static char *args_name;
72 static unsigned int nr;
73 static char **input_names;
74 static char **output_names;
75 static char *makefile;
77 static void maybe_unlink_file (const char *);
79 /* Delete tempfiles. */
81 static void
82 lto_wrapper_cleanup (void)
84 static bool cleanup_done = false;
85 unsigned int i;
87 if (cleanup_done)
88 return;
90 /* Setting cleanup_done prevents an infinite loop if one of the
91 calls to maybe_unlink_file fails. */
92 cleanup_done = true;
94 if (ltrans_output_file)
95 maybe_unlink_file (ltrans_output_file);
96 if (flto_out)
97 maybe_unlink_file (flto_out);
98 if (args_name)
99 maybe_unlink_file (args_name);
100 if (makefile)
101 maybe_unlink_file (makefile);
102 for (i = 0; i < nr; ++i)
104 maybe_unlink_file (input_names[i]);
105 if (output_names[i])
106 maybe_unlink_file (output_names[i]);
110 static void
111 fatal_signal (int signum)
113 signal (signum, SIG_DFL);
114 lto_wrapper_cleanup ();
115 /* Get the same signal again, this time not handled,
116 so its normal effect occurs. */
117 kill (getpid (), signum);
120 /* Just die. CMSGID is the error message. */
122 static void __attribute__ ((format (printf, 1, 2)))
123 fatal (const char * cmsgid, ...)
125 va_list ap;
127 va_start (ap, cmsgid);
128 fprintf (stderr, "lto-wrapper: ");
129 vfprintf (stderr, _(cmsgid), ap);
130 fprintf (stderr, "\n");
131 va_end (ap);
133 lto_wrapper_cleanup ();
134 exit (FATAL_EXIT_CODE);
138 /* Die when sys call fails. CMSGID is the error message. */
140 static void __attribute__ ((format (printf, 1, 2)))
141 fatal_perror (const char *cmsgid, ...)
143 int e = errno;
144 va_list ap;
146 va_start (ap, cmsgid);
147 fprintf (stderr, "lto-wrapper: ");
148 vfprintf (stderr, _(cmsgid), ap);
149 fprintf (stderr, ": %s\n", xstrerror (e));
150 va_end (ap);
152 lto_wrapper_cleanup ();
153 exit (FATAL_EXIT_CODE);
157 /* Execute a program, and wait for the reply. ARGV are the arguments. The
158 last one must be NULL. */
160 static struct pex_obj *
161 collect_execute (char **argv)
163 struct pex_obj *pex;
164 const char *errmsg;
165 int err;
167 if (verbose)
169 char **p_argv;
170 const char *str;
172 for (p_argv = argv; (str = *p_argv) != (char *) 0; p_argv++)
173 fprintf (stderr, " %s", str);
175 fprintf (stderr, "\n");
178 fflush (stdout);
179 fflush (stderr);
181 pex = pex_init (0, "lto-wrapper", NULL);
182 if (pex == NULL)
183 fatal_perror ("pex_init failed");
185 /* Do not use PEX_LAST here, we use our stdout for communicating with
186 collect2 or the linker-plugin. Any output from the sub-process
187 will confuse that. */
188 errmsg = pex_run (pex, PEX_SEARCH, argv[0], argv, NULL,
189 NULL, &err);
190 if (errmsg != NULL)
192 if (err != 0)
194 errno = err;
195 fatal_perror (errmsg);
197 else
198 fatal (errmsg);
201 return pex;
205 /* Wait for a process to finish, and exit if a nonzero status is found.
206 PROG is the program name. PEX is the process we should wait for. */
208 static int
209 collect_wait (const char *prog, struct pex_obj *pex)
211 int status;
213 if (!pex_get_status (pex, 1, &status))
214 fatal_perror ("can't get program status");
215 pex_free (pex);
217 if (status)
219 if (WIFSIGNALED (status))
221 int sig = WTERMSIG (status);
222 if (WCOREDUMP (status))
223 fatal ("%s terminated with signal %d [%s], core dumped",
224 prog, sig, strsignal (sig));
225 else
226 fatal ("%s terminated with signal %d [%s]",
227 prog, sig, strsignal (sig));
230 if (WIFEXITED (status))
231 fatal ("%s returned %d exit status", prog, WEXITSTATUS (status));
234 return 0;
238 /* Unlink a temporary LTRANS file unless requested otherwise. */
240 static void
241 maybe_unlink_file (const char *file)
243 if (! debug)
245 if (unlink_if_ordinary (file)
246 && errno != ENOENT)
247 fatal_perror ("deleting LTRANS file %s", file);
249 else
250 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
254 /* Execute program ARGV[0] with arguments ARGV. Wait for it to finish. */
256 static void
257 fork_execute (char **argv)
259 struct pex_obj *pex;
260 char *new_argv[3];
261 char *at_args;
262 FILE *args;
263 int status;
265 args_name = make_temp_file (".args");
266 at_args = concat ("@", args_name, NULL);
267 args = fopen (args_name, "w");
268 if (args == NULL)
269 fatal ("failed to open %s", args_name);
271 status = writeargv (&argv[1], args);
273 if (status)
274 fatal ("could not write to temporary file %s", args_name);
276 fclose (args);
278 new_argv[0] = argv[0];
279 new_argv[1] = at_args;
280 new_argv[2] = NULL;
282 pex = collect_execute (new_argv);
283 collect_wait (new_argv[0], pex);
285 maybe_unlink_file (args_name);
286 args_name = NULL;
287 free (at_args);
290 /* Template of LTRANS dumpbase suffix. */
291 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
293 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
294 environment according to LANG_MASK. */
296 static void
297 get_options_from_collect_gcc_options (const char *collect_gcc,
298 const char *collect_gcc_options,
299 unsigned int lang_mask,
300 struct cl_decoded_option **decoded_options,
301 unsigned int *decoded_options_count)
303 struct obstack argv_obstack;
304 char *argv_storage;
305 const char **argv;
306 int j, k, argc;
308 argv_storage = xstrdup (collect_gcc_options);
309 obstack_init (&argv_obstack);
310 obstack_ptr_grow (&argv_obstack, collect_gcc);
312 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
314 if (argv_storage[j] == '\'')
316 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
317 ++j;
320 if (argv_storage[j] == '\0')
321 fatal ("malformed COLLECT_GCC_OPTIONS");
322 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
324 argv_storage[k++] = '\'';
325 j += 4;
327 else if (argv_storage[j] == '\'')
328 break;
329 else
330 argv_storage[k++] = argv_storage[j++];
332 while (1);
333 argv_storage[k++] = '\0';
337 obstack_ptr_grow (&argv_obstack, NULL);
338 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
339 argv = XOBFINISH (&argv_obstack, const char **);
341 decode_cmdline_options_to_array (argc, (const char **)argv,
342 lang_mask,
343 decoded_options, decoded_options_count);
344 obstack_free (&argv_obstack, NULL);
347 /* Append OPTION to the options array DECODED_OPTIONS with size
348 DECODED_OPTIONS_COUNT. */
350 static void
351 append_option (struct cl_decoded_option **decoded_options,
352 unsigned int *decoded_options_count,
353 struct cl_decoded_option *option)
355 ++*decoded_options_count;
356 *decoded_options
357 = (struct cl_decoded_option *)
358 xrealloc (*decoded_options,
359 (*decoded_options_count
360 * sizeof (struct cl_decoded_option)));
361 memcpy (&(*decoded_options)[*decoded_options_count - 1], option,
362 sizeof (struct cl_decoded_option));
365 /* Try to merge and complain about options FDECODED_OPTIONS when applied
366 ontop of DECODED_OPTIONS. */
368 static void
369 merge_and_complain (struct cl_decoded_option **decoded_options,
370 unsigned int *decoded_options_count,
371 struct cl_decoded_option *fdecoded_options,
372 unsigned int fdecoded_options_count)
374 unsigned int i, j;
376 /* ??? Merge options from files. Most cases can be
377 handled by either unioning or intersecting
378 (for example -fwrapv is a case for unioning,
379 -ffast-math is for intersection). Most complaints
380 about real conflicts between different options can
381 be deferred to the compiler proper. Options that
382 we can neither safely handle by intersection nor
383 unioning would need to be complained about here.
384 Ideally we'd have a flag in the opt files that
385 tells whether to union or intersect or reject.
386 In absence of that it's unclear what a good default is.
387 It's also difficult to get positional handling correct. */
389 /* The following does what the old LTO option code did,
390 union all target and a selected set of common options. */
391 for (i = 0; i < fdecoded_options_count; ++i)
393 struct cl_decoded_option *foption = &fdecoded_options[i];
394 switch (foption->opt_index)
396 case OPT_SPECIAL_unknown:
397 case OPT_SPECIAL_ignore:
398 case OPT_SPECIAL_program_name:
399 case OPT_SPECIAL_input_file:
400 break;
402 default:
403 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
404 break;
406 /* Fallthru. */
407 case OPT_fPIC:
408 case OPT_fpic:
409 case OPT_fpie:
410 case OPT_fcommon:
411 case OPT_fexceptions:
412 case OPT_fgnu_tm:
413 /* Do what the old LTO code did - collect exactly one option
414 setting per OPT code, we pick the first we encounter.
415 ??? This doesn't make too much sense, but when it doesn't
416 then we should complain. */
417 for (j = 0; j < *decoded_options_count; ++j)
418 if ((*decoded_options)[j].opt_index == foption->opt_index)
419 break;
420 if (j == *decoded_options_count)
421 append_option (decoded_options, decoded_options_count, foption);
422 break;
424 case OPT_freg_struct_return:
425 case OPT_fpcc_struct_return:
426 for (j = 0; j < *decoded_options_count; ++j)
427 if ((*decoded_options)[j].opt_index == foption->opt_index)
428 break;
429 if (j == *decoded_options_count)
430 fatal ("Option %s not used consistently in all LTO input files",
431 foption->orig_option_with_args_text);
432 break;
437 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
439 static void
440 run_gcc (unsigned argc, char *argv[])
442 unsigned i, j;
443 const char **new_argv;
444 const char **argv_ptr;
445 char *list_option_full = NULL;
446 const char *linker_output = NULL;
447 const char *collect_gcc, *collect_gcc_options;
448 int parallel = 0;
449 int jobserver = 0;
450 bool no_partition = false;
451 struct cl_decoded_option *fdecoded_options = NULL;
452 unsigned int fdecoded_options_count = 0;
453 struct cl_decoded_option *decoded_options;
454 unsigned int decoded_options_count;
455 struct obstack argv_obstack;
456 int new_head_argc;
458 /* Get the driver and options. */
459 collect_gcc = getenv ("COLLECT_GCC");
460 if (!collect_gcc)
461 fatal ("environment variable COLLECT_GCC must be set");
462 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
463 if (!collect_gcc_options)
464 fatal ("environment variable COLLECT_GCC_OPTIONS must be set");
465 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
466 CL_LANG_ALL,
467 &decoded_options,
468 &decoded_options_count);
470 /* Look at saved options in the IL files. */
471 for (i = 1; i < argc; ++i)
473 char *data, *p;
474 char *fopts;
475 int fd;
476 const char *errmsg;
477 int err;
478 off_t file_offset = 0, offset, length;
479 long loffset;
480 simple_object_read *sobj;
481 int consumed;
482 struct cl_decoded_option *f2decoded_options;
483 unsigned int f2decoded_options_count;
484 char *filename = argv[i];
485 if ((p = strrchr (argv[i], '@'))
486 && p != argv[i]
487 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
488 && strlen (p) == (unsigned int) consumed)
490 filename = XNEWVEC (char, p - argv[i] + 1);
491 memcpy (filename, argv[i], p - argv[i]);
492 filename[p - argv[i]] = '\0';
493 file_offset = (off_t) loffset;
495 fd = open (argv[i], O_RDONLY);
496 if (fd == -1)
497 continue;
498 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
499 &errmsg, &err);
500 if (!sobj)
502 close (fd);
503 continue;
505 if (!simple_object_find_section (sobj, LTO_SECTION_NAME_PREFIX "." "opts",
506 &offset, &length, &errmsg, &err))
508 simple_object_release_read (sobj);
509 close (fd);
510 continue;
512 lseek (fd, file_offset + offset, SEEK_SET);
513 data = (char *)xmalloc (length);
514 read (fd, data, length);
515 fopts = data;
518 get_options_from_collect_gcc_options (collect_gcc,
519 fopts, CL_LANG_ALL,
520 &f2decoded_options,
521 &f2decoded_options_count);
522 if (!fdecoded_options)
524 fdecoded_options = f2decoded_options;
525 fdecoded_options_count = f2decoded_options_count;
527 else
528 merge_and_complain (&fdecoded_options,
529 &fdecoded_options_count,
530 f2decoded_options, f2decoded_options_count);
532 fopts += strlen (fopts) + 1;
534 while (fopts - data < length);
536 free (data);
537 simple_object_release_read (sobj);
538 close (fd);
541 /* Initalize the common arguments for the driver. */
542 obstack_init (&argv_obstack);
543 obstack_ptr_grow (&argv_obstack, collect_gcc);
544 obstack_ptr_grow (&argv_obstack, "-xlto");
545 obstack_ptr_grow (&argv_obstack, "-c");
547 /* Append compiler driver arguments as far as they were merged. */
548 for (j = 1; j < fdecoded_options_count; ++j)
550 struct cl_decoded_option *option = &fdecoded_options[j];
552 /* File options have been properly filtered by lto-opts.c. */
553 switch (option->opt_index)
555 /* Drop arguments that we want to take from the link line. */
556 case OPT_flto_:
557 case OPT_flto:
558 case OPT_flto_partition_none:
559 case OPT_flto_partition_1to1:
560 case OPT_flto_partition_balanced:
561 continue;
563 default:
564 break;
567 /* For now do what the original LTO option code was doing - pass
568 on any CL_TARGET flag and a few selected others. */
569 switch (option->opt_index)
571 case OPT_fPIC:
572 case OPT_fpic:
573 case OPT_fpie:
574 case OPT_fcommon:
575 case OPT_fexceptions:
576 case OPT_fgnu_tm:
577 case OPT_freg_struct_return:
578 case OPT_fpcc_struct_return:
579 break;
581 default:
582 if (!(cl_options[option->opt_index].flags & CL_TARGET))
583 continue;
586 /* Pass the option on. */
587 for (i = 0; i < option->canonical_option_num_elements; ++i)
588 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
591 /* Append linker driver arguments. Compiler options from the linker
592 driver arguments will override / merge with those from the compiler. */
593 for (j = 1; j < decoded_options_count; ++j)
595 struct cl_decoded_option *option = &decoded_options[j];
597 /* Do not pass on frontend specific flags not suitable for lto. */
598 if (!(cl_options[option->opt_index].flags
599 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
600 continue;
602 switch (option->opt_index)
604 case OPT_o:
605 linker_output = option->arg;
606 /* We generate new intermediate output, drop this arg. */
607 continue;
609 case OPT_save_temps:
610 debug = 1;
611 break;
613 case OPT_v:
614 verbose = 1;
615 break;
617 case OPT_flto_partition_none:
618 no_partition = true;
619 break;
621 case OPT_flto_:
622 if (strcmp (option->arg, "jobserver") == 0)
624 jobserver = 1;
625 parallel = 1;
627 else
629 parallel = atoi (option->arg);
630 if (parallel <= 1)
631 parallel = 0;
633 /* Fallthru. */
635 case OPT_flto:
636 lto_mode = LTO_MODE_WHOPR;
637 /* We've handled these LTO options, do not pass them on. */
638 continue;
640 case OPT_freg_struct_return:
641 case OPT_fpcc_struct_return:
642 /* Ignore these, they are determined by the input files.
643 ??? We fail to diagnose a possible mismatch here. */
644 continue;
646 default:
647 break;
650 /* Pass the option on. */
651 for (i = 0; i < option->canonical_option_num_elements; ++i)
652 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
655 if (no_partition)
657 lto_mode = LTO_MODE_LTO;
658 jobserver = 0;
659 parallel = 0;
662 if (linker_output)
664 char *output_dir, *base, *name;
665 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
667 output_dir = xstrdup (linker_output);
668 base = output_dir;
669 for (name = base; *name; name++)
670 if (IS_DIR_SEPARATOR (*name))
671 base = name + 1;
672 *base = '\0';
674 linker_output = &linker_output[base - output_dir];
675 if (*output_dir == '\0')
677 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
678 output_dir = current_dir;
680 if (!bit_bucket)
682 obstack_ptr_grow (&argv_obstack, "-dumpdir");
683 obstack_ptr_grow (&argv_obstack, output_dir);
686 obstack_ptr_grow (&argv_obstack, "-dumpbase");
689 /* Remember at which point we can scrub args to re-use the commons. */
690 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
692 if (lto_mode == LTO_MODE_LTO)
694 flto_out = make_temp_file (".lto.o");
695 if (linker_output)
696 obstack_ptr_grow (&argv_obstack, linker_output);
697 obstack_ptr_grow (&argv_obstack, "-o");
698 obstack_ptr_grow (&argv_obstack, flto_out);
700 else
702 const char *list_option = "-fltrans-output-list=";
703 size_t list_option_len = strlen (list_option);
704 char *tmp;
706 if (linker_output)
708 char *dumpbase = (char *) xmalloc (strlen (linker_output)
709 + sizeof (".wpa") + 1);
710 strcpy (dumpbase, linker_output);
711 strcat (dumpbase, ".wpa");
712 obstack_ptr_grow (&argv_obstack, dumpbase);
715 if (linker_output && debug)
717 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
718 + sizeof (".ltrans.out") + 1);
719 strcpy (ltrans_output_file, linker_output);
720 strcat (ltrans_output_file, ".ltrans.out");
722 else
723 ltrans_output_file = make_temp_file (".ltrans.out");
724 list_option_full = (char *) xmalloc (sizeof (char) *
725 (strlen (ltrans_output_file) + list_option_len + 1));
726 tmp = list_option_full;
728 obstack_ptr_grow (&argv_obstack, tmp);
729 strcpy (tmp, list_option);
730 tmp += list_option_len;
731 strcpy (tmp, ltrans_output_file);
733 obstack_ptr_grow (&argv_obstack, "-fwpa");
736 /* Append the input objects and possible preceding arguments. */
737 for (i = 1; i < argc; ++i)
738 obstack_ptr_grow (&argv_obstack, argv[i]);
739 obstack_ptr_grow (&argv_obstack, NULL);
741 new_argv = XOBFINISH (&argv_obstack, const char **);
742 argv_ptr = &new_argv[new_head_argc];
743 fork_execute (CONST_CAST (char **, new_argv));
745 if (lto_mode == LTO_MODE_LTO)
747 printf("%s\n", flto_out);
748 free (flto_out);
749 flto_out = NULL;
751 else
753 FILE *stream = fopen (ltrans_output_file, "r");
754 FILE *mstream = NULL;
755 struct obstack env_obstack;
757 if (!stream)
758 fatal_perror ("fopen: %s", ltrans_output_file);
760 /* Parse the list of LTRANS inputs from the WPA stage. */
761 obstack_init (&env_obstack);
762 nr = 0;
763 for (;;)
765 const unsigned piece = 32;
766 char *output_name = NULL;
767 char *buf, *input_name = (char *)xmalloc (piece);
768 size_t len;
770 buf = input_name;
771 cont:
772 if (!fgets (buf, piece, stream))
773 break;
774 len = strlen (input_name);
775 if (input_name[len - 1] != '\n')
777 input_name = (char *)xrealloc (input_name, len + piece);
778 buf = input_name + len;
779 goto cont;
781 input_name[len - 1] = '\0';
783 if (input_name[0] == '*')
784 output_name = &input_name[1];
786 nr++;
787 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
788 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
789 input_names[nr-1] = input_name;
790 output_names[nr-1] = output_name;
792 fclose (stream);
793 maybe_unlink_file (ltrans_output_file);
794 ltrans_output_file = NULL;
796 if (parallel)
798 makefile = make_temp_file (".mk");
799 mstream = fopen (makefile, "w");
802 /* Execute the LTRANS stage for each input file (or prepare a
803 makefile to invoke this in parallel). */
804 for (i = 0; i < nr; ++i)
806 char *output_name;
807 char *input_name = input_names[i];
808 /* If it's a pass-through file do nothing. */
809 if (output_names[i])
810 continue;
812 /* Replace the .o suffix with a .ltrans.o suffix and write
813 the resulting name to the LTRANS output list. */
814 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
815 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
816 output_name = XOBFINISH (&env_obstack, char *);
818 /* Adjust the dumpbase if the linker output file was seen. */
819 if (linker_output)
821 char *dumpbase
822 = (char *) xmalloc (strlen (linker_output)
823 + sizeof(DUMPBASE_SUFFIX) + 1);
824 snprintf (dumpbase,
825 strlen (linker_output) + sizeof(DUMPBASE_SUFFIX),
826 "%s.ltrans%u", linker_output, i);
827 argv_ptr[0] = dumpbase;
830 argv_ptr[1] = "-fltrans";
831 argv_ptr[2] = "-o";
832 argv_ptr[3] = output_name;
833 argv_ptr[4] = input_name;
834 argv_ptr[5] = NULL;
835 if (parallel)
837 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
838 for (j = 1; new_argv[j] != NULL; ++j)
839 fprintf (mstream, " '%s'", new_argv[j]);
840 fprintf (mstream, "\n");
841 /* If we are not preserving the ltrans input files then
842 truncate them as soon as we have processed it. This
843 reduces temporary disk-space usage. */
844 if (! debug)
845 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
846 "&& mv %s.tem %s\n",
847 input_name, input_name, input_name, input_name);
849 else
851 fork_execute (CONST_CAST (char **, new_argv));
852 maybe_unlink_file (input_name);
855 output_names[i] = output_name;
857 if (parallel)
859 struct pex_obj *pex;
860 char jobs[32];
862 fprintf (mstream, "all:");
863 for (i = 0; i < nr; ++i)
864 fprintf (mstream, " \\\n\t%s", output_names[i]);
865 fprintf (mstream, "\n");
866 fclose (mstream);
867 if (!jobserver)
869 /* Avoid passing --jobserver-fd= and similar flags
870 unless jobserver mode is explicitly enabled. */
871 putenv (xstrdup ("MAKEFLAGS="));
872 putenv (xstrdup ("MFLAGS="));
874 new_argv[0] = getenv ("MAKE");
875 if (!new_argv[0])
876 new_argv[0] = "make";
877 new_argv[1] = "-f";
878 new_argv[2] = makefile;
879 i = 3;
880 if (!jobserver)
882 snprintf (jobs, 31, "-j%d", parallel);
883 new_argv[i++] = jobs;
885 new_argv[i++] = "all";
886 new_argv[i++] = NULL;
887 pex = collect_execute (CONST_CAST (char **, new_argv));
888 collect_wait (new_argv[0], pex);
889 maybe_unlink_file (makefile);
890 makefile = NULL;
891 for (i = 0; i < nr; ++i)
892 maybe_unlink_file (input_names[i]);
894 for (i = 0; i < nr; ++i)
896 fputs (output_names[i], stdout);
897 putc ('\n', stdout);
898 free (input_names[i]);
900 nr = 0;
901 free (output_names);
902 free (input_names);
903 free (list_option_full);
904 obstack_free (&env_obstack, NULL);
907 obstack_free (&argv_obstack, NULL);
911 /* Entry point. */
914 main (int argc, char *argv[])
916 const char *p;
918 gcc_obstack_init (&opts_obstack);
920 p = argv[0] + strlen (argv[0]);
921 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
922 --p;
923 progname = p;
925 xmalloc_set_program_name (progname);
927 gcc_init_libintl ();
929 diagnostic_initialize (global_dc, 0);
931 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
932 signal (SIGINT, fatal_signal);
933 #ifdef SIGHUP
934 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
935 signal (SIGHUP, fatal_signal);
936 #endif
937 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
938 signal (SIGTERM, fatal_signal);
939 #ifdef SIGPIPE
940 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
941 signal (SIGPIPE, fatal_signal);
942 #endif
943 #ifdef SIGCHLD
944 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
945 receive the signal. A different setting is inheritable */
946 signal (SIGCHLD, SIG_DFL);
947 #endif
949 /* We may be called with all the arguments stored in some file and
950 passed with @file. Expand them into argv before processing. */
951 expandargv (&argc, &argv);
953 run_gcc (argc, argv);
955 return 0;