* ChangeLog: Fix whitespace.
[official-gcc.git] / gcc / lto-wrapper.c
blobb17945a2ffea8f7ddd7436a5bfc8fbac42afd1a2
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2014 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_fnon_call_exceptions:
413 case OPT_fgnu_tm:
414 /* Do what the old LTO code did - collect exactly one option
415 setting per OPT code, we pick the first we encounter.
416 ??? This doesn't make too much sense, but when it doesn't
417 then we should complain. */
418 for (j = 0; j < *decoded_options_count; ++j)
419 if ((*decoded_options)[j].opt_index == foption->opt_index)
420 break;
421 if (j == *decoded_options_count)
422 append_option (decoded_options, decoded_options_count, foption);
423 break;
425 case OPT_ftrapv:
426 case OPT_fstrict_overflow:
427 case OPT_ffp_contract_:
428 /* For selected options we can merge conservatively. */
429 for (j = 0; j < *decoded_options_count; ++j)
430 if ((*decoded_options)[j].opt_index == foption->opt_index)
431 break;
432 if (j == *decoded_options_count)
433 append_option (decoded_options, decoded_options_count, foption);
434 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST,
435 -fno-trapv < -ftrapv,
436 -fno-strict-overflow < -fstrict-overflow */
437 else if (foption->value < (*decoded_options)[j].value)
438 (*decoded_options)[j] = *foption;
439 break;
441 case OPT_fwrapv:
442 /* For selected options we can merge conservatively. */
443 for (j = 0; j < *decoded_options_count; ++j)
444 if ((*decoded_options)[j].opt_index == foption->opt_index)
445 break;
446 if (j == *decoded_options_count)
447 append_option (decoded_options, decoded_options_count, foption);
448 /* -fwrapv > -fno-wrapv. */
449 else if (foption->value > (*decoded_options)[j].value)
450 (*decoded_options)[j] = *foption;
451 break;
453 case OPT_freg_struct_return:
454 case OPT_fpcc_struct_return:
455 for (j = 0; j < *decoded_options_count; ++j)
456 if ((*decoded_options)[j].opt_index == foption->opt_index)
457 break;
458 if (j == *decoded_options_count)
459 fatal ("Option %s not used consistently in all LTO input files",
460 foption->orig_option_with_args_text);
461 break;
466 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
468 static void
469 run_gcc (unsigned argc, char *argv[])
471 unsigned i, j;
472 const char **new_argv;
473 const char **argv_ptr;
474 char *list_option_full = NULL;
475 const char *linker_output = NULL;
476 const char *collect_gcc, *collect_gcc_options;
477 int parallel = 0;
478 int jobserver = 0;
479 bool no_partition = false;
480 struct cl_decoded_option *fdecoded_options = NULL;
481 unsigned int fdecoded_options_count = 0;
482 struct cl_decoded_option *decoded_options;
483 unsigned int decoded_options_count;
484 struct obstack argv_obstack;
485 int new_head_argc;
487 /* Get the driver and options. */
488 collect_gcc = getenv ("COLLECT_GCC");
489 if (!collect_gcc)
490 fatal ("environment variable COLLECT_GCC must be set");
491 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
492 if (!collect_gcc_options)
493 fatal ("environment variable COLLECT_GCC_OPTIONS must be set");
494 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
495 CL_LANG_ALL,
496 &decoded_options,
497 &decoded_options_count);
499 /* Look at saved options in the IL files. */
500 for (i = 1; i < argc; ++i)
502 char *data, *p;
503 char *fopts;
504 int fd;
505 const char *errmsg;
506 int err;
507 off_t file_offset = 0, offset, length;
508 long loffset;
509 simple_object_read *sobj;
510 int consumed;
511 struct cl_decoded_option *f2decoded_options;
512 unsigned int f2decoded_options_count;
513 char *filename = argv[i];
514 if ((p = strrchr (argv[i], '@'))
515 && p != argv[i]
516 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
517 && strlen (p) == (unsigned int) consumed)
519 filename = XNEWVEC (char, p - argv[i] + 1);
520 memcpy (filename, argv[i], p - argv[i]);
521 filename[p - argv[i]] = '\0';
522 file_offset = (off_t) loffset;
524 fd = open (argv[i], O_RDONLY);
525 if (fd == -1)
526 continue;
527 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
528 &errmsg, &err);
529 if (!sobj)
531 close (fd);
532 continue;
534 if (!simple_object_find_section (sobj, LTO_SECTION_NAME_PREFIX "." "opts",
535 &offset, &length, &errmsg, &err))
537 simple_object_release_read (sobj);
538 close (fd);
539 continue;
541 lseek (fd, file_offset + offset, SEEK_SET);
542 data = (char *)xmalloc (length);
543 read (fd, data, length);
544 fopts = data;
547 get_options_from_collect_gcc_options (collect_gcc,
548 fopts, CL_LANG_ALL,
549 &f2decoded_options,
550 &f2decoded_options_count);
551 if (!fdecoded_options)
553 fdecoded_options = f2decoded_options;
554 fdecoded_options_count = f2decoded_options_count;
556 else
557 merge_and_complain (&fdecoded_options,
558 &fdecoded_options_count,
559 f2decoded_options, f2decoded_options_count);
561 fopts += strlen (fopts) + 1;
563 while (fopts - data < length);
565 free (data);
566 simple_object_release_read (sobj);
567 close (fd);
570 /* Initalize the common arguments for the driver. */
571 obstack_init (&argv_obstack);
572 obstack_ptr_grow (&argv_obstack, collect_gcc);
573 obstack_ptr_grow (&argv_obstack, "-xlto");
574 obstack_ptr_grow (&argv_obstack, "-c");
576 /* Append compiler driver arguments as far as they were merged. */
577 for (j = 1; j < fdecoded_options_count; ++j)
579 struct cl_decoded_option *option = &fdecoded_options[j];
581 /* File options have been properly filtered by lto-opts.c. */
582 switch (option->opt_index)
584 /* Drop arguments that we want to take from the link line. */
585 case OPT_flto_:
586 case OPT_flto:
587 case OPT_flto_partition_none:
588 case OPT_flto_partition_1to1:
589 case OPT_flto_partition_balanced:
590 continue;
592 default:
593 break;
596 /* For now do what the original LTO option code was doing - pass
597 on any CL_TARGET flag and a few selected others. */
598 switch (option->opt_index)
600 case OPT_fPIC:
601 case OPT_fpic:
602 case OPT_fpie:
603 case OPT_fcommon:
604 case OPT_fexceptions:
605 case OPT_fnon_call_exceptions:
606 case OPT_fgnu_tm:
607 case OPT_freg_struct_return:
608 case OPT_fpcc_struct_return:
609 case OPT_ffp_contract_:
610 case OPT_fwrapv:
611 case OPT_ftrapv:
612 case OPT_fstrict_overflow:
613 break;
615 default:
616 if (!(cl_options[option->opt_index].flags & CL_TARGET))
617 continue;
620 /* Pass the option on. */
621 for (i = 0; i < option->canonical_option_num_elements; ++i)
622 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
625 /* Append linker driver arguments. Compiler options from the linker
626 driver arguments will override / merge with those from the compiler. */
627 for (j = 1; j < decoded_options_count; ++j)
629 struct cl_decoded_option *option = &decoded_options[j];
631 /* Do not pass on frontend specific flags not suitable for lto. */
632 if (!(cl_options[option->opt_index].flags
633 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
634 continue;
636 switch (option->opt_index)
638 case OPT_o:
639 linker_output = option->arg;
640 /* We generate new intermediate output, drop this arg. */
641 continue;
643 case OPT_save_temps:
644 debug = 1;
645 break;
647 case OPT_v:
648 verbose = 1;
649 break;
651 case OPT_flto_partition_none:
652 no_partition = true;
653 break;
655 case OPT_flto_:
656 if (strcmp (option->arg, "jobserver") == 0)
658 jobserver = 1;
659 parallel = 1;
661 else
663 parallel = atoi (option->arg);
664 if (parallel <= 1)
665 parallel = 0;
667 /* Fallthru. */
669 case OPT_flto:
670 lto_mode = LTO_MODE_WHOPR;
671 /* We've handled these LTO options, do not pass them on. */
672 continue;
674 case OPT_freg_struct_return:
675 case OPT_fpcc_struct_return:
676 /* Ignore these, they are determined by the input files.
677 ??? We fail to diagnose a possible mismatch here. */
678 continue;
680 default:
681 break;
684 /* Pass the option on. */
685 for (i = 0; i < option->canonical_option_num_elements; ++i)
686 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
689 if (no_partition)
691 lto_mode = LTO_MODE_LTO;
692 jobserver = 0;
693 parallel = 0;
696 if (linker_output)
698 char *output_dir, *base, *name;
699 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
701 output_dir = xstrdup (linker_output);
702 base = output_dir;
703 for (name = base; *name; name++)
704 if (IS_DIR_SEPARATOR (*name))
705 base = name + 1;
706 *base = '\0';
708 linker_output = &linker_output[base - output_dir];
709 if (*output_dir == '\0')
711 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
712 output_dir = current_dir;
714 if (!bit_bucket)
716 obstack_ptr_grow (&argv_obstack, "-dumpdir");
717 obstack_ptr_grow (&argv_obstack, output_dir);
720 obstack_ptr_grow (&argv_obstack, "-dumpbase");
723 /* Remember at which point we can scrub args to re-use the commons. */
724 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
726 if (lto_mode == LTO_MODE_LTO)
728 flto_out = make_temp_file (".lto.o");
729 if (linker_output)
730 obstack_ptr_grow (&argv_obstack, linker_output);
731 obstack_ptr_grow (&argv_obstack, "-o");
732 obstack_ptr_grow (&argv_obstack, flto_out);
734 else
736 const char *list_option = "-fltrans-output-list=";
737 size_t list_option_len = strlen (list_option);
738 char *tmp;
740 if (linker_output)
742 char *dumpbase = (char *) xmalloc (strlen (linker_output)
743 + sizeof (".wpa") + 1);
744 strcpy (dumpbase, linker_output);
745 strcat (dumpbase, ".wpa");
746 obstack_ptr_grow (&argv_obstack, dumpbase);
749 if (linker_output && debug)
751 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
752 + sizeof (".ltrans.out") + 1);
753 strcpy (ltrans_output_file, linker_output);
754 strcat (ltrans_output_file, ".ltrans.out");
756 else
757 ltrans_output_file = make_temp_file (".ltrans.out");
758 list_option_full = (char *) xmalloc (sizeof (char) *
759 (strlen (ltrans_output_file) + list_option_len + 1));
760 tmp = list_option_full;
762 obstack_ptr_grow (&argv_obstack, tmp);
763 strcpy (tmp, list_option);
764 tmp += list_option_len;
765 strcpy (tmp, ltrans_output_file);
767 if (jobserver)
768 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
769 else if (parallel > 1)
771 char buf[256];
772 sprintf (buf, "-fwpa=%i", parallel);
773 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
775 else
776 obstack_ptr_grow (&argv_obstack, "-fwpa");
779 /* Append the input objects and possible preceding arguments. */
780 for (i = 1; i < argc; ++i)
781 obstack_ptr_grow (&argv_obstack, argv[i]);
782 obstack_ptr_grow (&argv_obstack, NULL);
784 new_argv = XOBFINISH (&argv_obstack, const char **);
785 argv_ptr = &new_argv[new_head_argc];
786 fork_execute (CONST_CAST (char **, new_argv));
788 if (lto_mode == LTO_MODE_LTO)
790 printf ("%s\n", flto_out);
791 free (flto_out);
792 flto_out = NULL;
794 else
796 FILE *stream = fopen (ltrans_output_file, "r");
797 FILE *mstream = NULL;
798 struct obstack env_obstack;
800 if (!stream)
801 fatal_perror ("fopen: %s", ltrans_output_file);
803 /* Parse the list of LTRANS inputs from the WPA stage. */
804 obstack_init (&env_obstack);
805 nr = 0;
806 for (;;)
808 const unsigned piece = 32;
809 char *output_name = NULL;
810 char *buf, *input_name = (char *)xmalloc (piece);
811 size_t len;
813 buf = input_name;
814 cont:
815 if (!fgets (buf, piece, stream))
816 break;
817 len = strlen (input_name);
818 if (input_name[len - 1] != '\n')
820 input_name = (char *)xrealloc (input_name, len + piece);
821 buf = input_name + len;
822 goto cont;
824 input_name[len - 1] = '\0';
826 if (input_name[0] == '*')
827 output_name = &input_name[1];
829 nr++;
830 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
831 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
832 input_names[nr-1] = input_name;
833 output_names[nr-1] = output_name;
835 fclose (stream);
836 maybe_unlink_file (ltrans_output_file);
837 ltrans_output_file = NULL;
839 if (parallel)
841 makefile = make_temp_file (".mk");
842 mstream = fopen (makefile, "w");
845 /* Execute the LTRANS stage for each input file (or prepare a
846 makefile to invoke this in parallel). */
847 for (i = 0; i < nr; ++i)
849 char *output_name;
850 char *input_name = input_names[i];
851 /* If it's a pass-through file do nothing. */
852 if (output_names[i])
853 continue;
855 /* Replace the .o suffix with a .ltrans.o suffix and write
856 the resulting name to the LTRANS output list. */
857 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
858 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
859 output_name = XOBFINISH (&env_obstack, char *);
861 /* Adjust the dumpbase if the linker output file was seen. */
862 if (linker_output)
864 char *dumpbase
865 = (char *) xmalloc (strlen (linker_output)
866 + sizeof (DUMPBASE_SUFFIX) + 1);
867 snprintf (dumpbase,
868 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
869 "%s.ltrans%u", linker_output, i);
870 argv_ptr[0] = dumpbase;
873 argv_ptr[1] = "-fltrans";
874 argv_ptr[2] = "-o";
875 argv_ptr[3] = output_name;
876 argv_ptr[4] = input_name;
877 argv_ptr[5] = NULL;
878 if (parallel)
880 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
881 for (j = 1; new_argv[j] != NULL; ++j)
882 fprintf (mstream, " '%s'", new_argv[j]);
883 fprintf (mstream, "\n");
884 /* If we are not preserving the ltrans input files then
885 truncate them as soon as we have processed it. This
886 reduces temporary disk-space usage. */
887 if (! debug)
888 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
889 "&& mv %s.tem %s\n",
890 input_name, input_name, input_name, input_name);
892 else
894 fork_execute (CONST_CAST (char **, new_argv));
895 maybe_unlink_file (input_name);
898 output_names[i] = output_name;
900 if (parallel)
902 struct pex_obj *pex;
903 char jobs[32];
905 fprintf (mstream, "all:");
906 for (i = 0; i < nr; ++i)
907 fprintf (mstream, " \\\n\t%s", output_names[i]);
908 fprintf (mstream, "\n");
909 fclose (mstream);
910 if (!jobserver)
912 /* Avoid passing --jobserver-fd= and similar flags
913 unless jobserver mode is explicitly enabled. */
914 putenv (xstrdup ("MAKEFLAGS="));
915 putenv (xstrdup ("MFLAGS="));
917 new_argv[0] = getenv ("MAKE");
918 if (!new_argv[0])
919 new_argv[0] = "make";
920 new_argv[1] = "-f";
921 new_argv[2] = makefile;
922 i = 3;
923 if (!jobserver)
925 snprintf (jobs, 31, "-j%d", parallel);
926 new_argv[i++] = jobs;
928 new_argv[i++] = "all";
929 new_argv[i++] = NULL;
930 pex = collect_execute (CONST_CAST (char **, new_argv));
931 collect_wait (new_argv[0], pex);
932 maybe_unlink_file (makefile);
933 makefile = NULL;
934 for (i = 0; i < nr; ++i)
935 maybe_unlink_file (input_names[i]);
937 for (i = 0; i < nr; ++i)
939 fputs (output_names[i], stdout);
940 putc ('\n', stdout);
941 free (input_names[i]);
943 nr = 0;
944 free (output_names);
945 free (input_names);
946 free (list_option_full);
947 obstack_free (&env_obstack, NULL);
950 obstack_free (&argv_obstack, NULL);
954 /* Entry point. */
957 main (int argc, char *argv[])
959 const char *p;
961 gcc_obstack_init (&opts_obstack);
963 p = argv[0] + strlen (argv[0]);
964 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
965 --p;
966 progname = p;
968 xmalloc_set_program_name (progname);
970 gcc_init_libintl ();
972 diagnostic_initialize (global_dc, 0);
974 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
975 signal (SIGINT, fatal_signal);
976 #ifdef SIGHUP
977 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
978 signal (SIGHUP, fatal_signal);
979 #endif
980 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
981 signal (SIGTERM, fatal_signal);
982 #ifdef SIGPIPE
983 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
984 signal (SIGPIPE, fatal_signal);
985 #endif
986 #ifdef SIGCHLD
987 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
988 receive the signal. A different setting is inheritable */
989 signal (SIGCHLD, SIG_DFL);
990 #endif
992 /* We may be called with all the arguments stored in some file and
993 passed with @file. Expand them into argv before processing. */
994 expandargv (&argc, &argv);
996 run_gcc (argc, argv);
998 return 0;