cond.md (stzx_16): Use register_operand for operand 0.
[gcc.git] / gcc / lto-wrapper.c
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2013 Free Software Foundation, Inc.
3
4 Factored out of collect2 by Rafael Espindola <espindola@google.com>
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>. */
21
22
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.
27
28 Example:
29
30 $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto
31
32 The above will print something like
33 /tmp/ccwbQ8B2.lto.o
34
35 If WHOPR is used instead, more than one file might be produced
36 ./ccXj2DTk.lto.ltrans.o
37 ./ccCJuXGv.lto.ltrans.o
38 */
39
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"
49
50 /* From lto-streamer.h which we cannot include with -fkeep-inline-functions.
51 ??? Split out a lto-streamer-core.h. */
52
53 #define LTO_SECTION_NAME_PREFIX ".gnu.lto_"
54
55 /* End of lto-streamer.h copy. */
56
57 int debug; /* true if -save-temps. */
58 int verbose; /* true if -v. */
59
60 enum lto_mode_d {
61 LTO_MODE_NONE, /* Not doing LTO. */
62 LTO_MODE_LTO, /* Normal LTO. */
63 LTO_MODE_WHOPR /* WHOPR. */
64 };
65
66 /* Current LTO mode. */
67 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
68
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;
76
77 static void maybe_unlink_file (const char *);
78
79 /* Delete tempfiles. */
80
81 static void
82 lto_wrapper_cleanup (void)
83 {
84 static bool cleanup_done = false;
85 unsigned int i;
86
87 if (cleanup_done)
88 return;
89
90 /* Setting cleanup_done prevents an infinite loop if one of the
91 calls to maybe_unlink_file fails. */
92 cleanup_done = true;
93
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)
103 {
104 maybe_unlink_file (input_names[i]);
105 if (output_names[i])
106 maybe_unlink_file (output_names[i]);
107 }
108 }
109
110 static void
111 fatal_signal (int signum)
112 {
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);
118 }
119
120 /* Just die. CMSGID is the error message. */
121
122 static void __attribute__ ((format (printf, 1, 2)))
123 fatal (const char * cmsgid, ...)
124 {
125 va_list ap;
126
127 va_start (ap, cmsgid);
128 fprintf (stderr, "lto-wrapper: ");
129 vfprintf (stderr, _(cmsgid), ap);
130 fprintf (stderr, "\n");
131 va_end (ap);
132
133 lto_wrapper_cleanup ();
134 exit (FATAL_EXIT_CODE);
135 }
136
137
138 /* Die when sys call fails. CMSGID is the error message. */
139
140 static void __attribute__ ((format (printf, 1, 2)))
141 fatal_perror (const char *cmsgid, ...)
142 {
143 int e = errno;
144 va_list ap;
145
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);
151
152 lto_wrapper_cleanup ();
153 exit (FATAL_EXIT_CODE);
154 }
155
156
157 /* Execute a program, and wait for the reply. ARGV are the arguments. The
158 last one must be NULL. */
159
160 static struct pex_obj *
161 collect_execute (char **argv)
162 {
163 struct pex_obj *pex;
164 const char *errmsg;
165 int err;
166
167 if (verbose)
168 {
169 char **p_argv;
170 const char *str;
171
172 for (p_argv = argv; (str = *p_argv) != (char *) 0; p_argv++)
173 fprintf (stderr, " %s", str);
174
175 fprintf (stderr, "\n");
176 }
177
178 fflush (stdout);
179 fflush (stderr);
180
181 pex = pex_init (0, "lto-wrapper", NULL);
182 if (pex == NULL)
183 fatal_perror ("pex_init failed");
184
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)
191 {
192 if (err != 0)
193 {
194 errno = err;
195 fatal_perror (errmsg);
196 }
197 else
198 fatal (errmsg);
199 }
200
201 return pex;
202 }
203
204
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. */
207
208 static int
209 collect_wait (const char *prog, struct pex_obj *pex)
210 {
211 int status;
212
213 if (!pex_get_status (pex, 1, &status))
214 fatal_perror ("can't get program status");
215 pex_free (pex);
216
217 if (status)
218 {
219 if (WIFSIGNALED (status))
220 {
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));
228 }
229
230 if (WIFEXITED (status))
231 fatal ("%s returned %d exit status", prog, WEXITSTATUS (status));
232 }
233
234 return 0;
235 }
236
237
238 /* Unlink a temporary LTRANS file unless requested otherwise. */
239
240 static void
241 maybe_unlink_file (const char *file)
242 {
243 if (! debug)
244 {
245 if (unlink_if_ordinary (file)
246 && errno != ENOENT)
247 fatal_perror ("deleting LTRANS file %s", file);
248 }
249 else
250 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
251 }
252
253
254 /* Execute program ARGV[0] with arguments ARGV. Wait for it to finish. */
255
256 static void
257 fork_execute (char **argv)
258 {
259 struct pex_obj *pex;
260 char *new_argv[3];
261 char *at_args;
262 FILE *args;
263 int status;
264
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);
270
271 status = writeargv (&argv[1], args);
272
273 if (status)
274 fatal ("could not write to temporary file %s", args_name);
275
276 fclose (args);
277
278 new_argv[0] = argv[0];
279 new_argv[1] = at_args;
280 new_argv[2] = NULL;
281
282 pex = collect_execute (new_argv);
283 collect_wait (new_argv[0], pex);
284
285 maybe_unlink_file (args_name);
286 args_name = NULL;
287 free (at_args);
288 }
289
290 /* Template of LTRANS dumpbase suffix. */
291 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
292
293 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
294 environment according to LANG_MASK. */
295
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)
302 {
303 struct obstack argv_obstack;
304 char *argv_storage;
305 const char **argv;
306 int j, k, argc;
307
308 argv_storage = xstrdup (collect_gcc_options);
309 obstack_init (&argv_obstack);
310 obstack_ptr_grow (&argv_obstack, collect_gcc);
311
312 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
313 {
314 if (argv_storage[j] == '\'')
315 {
316 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
317 ++j;
318 do
319 {
320 if (argv_storage[j] == '\0')
321 fatal ("malformed COLLECT_GCC_OPTIONS");
322 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
323 {
324 argv_storage[k++] = '\'';
325 j += 4;
326 }
327 else if (argv_storage[j] == '\'')
328 break;
329 else
330 argv_storage[k++] = argv_storage[j++];
331 }
332 while (1);
333 argv_storage[k++] = '\0';
334 }
335 }
336
337 obstack_ptr_grow (&argv_obstack, NULL);
338 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
339 argv = XOBFINISH (&argv_obstack, const char **);
340
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);
345 }
346
347 /* Append OPTION to the options array DECODED_OPTIONS with size
348 DECODED_OPTIONS_COUNT. */
349
350 static void
351 append_option (struct cl_decoded_option **decoded_options,
352 unsigned int *decoded_options_count,
353 struct cl_decoded_option *option)
354 {
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));
363 }
364
365 /* Try to merge and complain about options FDECODED_OPTIONS when applied
366 ontop of DECODED_OPTIONS. */
367
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)
373 {
374 unsigned int i, j;
375
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. */
388
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)
392 {
393 struct cl_decoded_option *foption = &fdecoded_options[i];
394 switch (foption->opt_index)
395 {
396 case OPT_SPECIAL_unknown:
397 case OPT_SPECIAL_ignore:
398 case OPT_SPECIAL_program_name:
399 case OPT_SPECIAL_input_file:
400 break;
401
402 default:
403 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
404 break;
405
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;
424
425 case OPT_ffp_contract_:
426 /* For selected options we can merge conservatively. */
427 for (j = 0; j < *decoded_options_count; ++j)
428 if ((*decoded_options)[j].opt_index == foption->opt_index)
429 break;
430 if (j == *decoded_options_count)
431 append_option (decoded_options, decoded_options_count, foption);
432 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST. */
433 else if (foption->value < (*decoded_options)[j].value)
434 (*decoded_options)[j] = *foption;
435 break;
436
437 case OPT_freg_struct_return:
438 case OPT_fpcc_struct_return:
439 for (j = 0; j < *decoded_options_count; ++j)
440 if ((*decoded_options)[j].opt_index == foption->opt_index)
441 break;
442 if (j == *decoded_options_count)
443 fatal ("Option %s not used consistently in all LTO input files",
444 foption->orig_option_with_args_text);
445 break;
446 }
447 }
448 }
449
450 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
451
452 static void
453 run_gcc (unsigned argc, char *argv[])
454 {
455 unsigned i, j;
456 const char **new_argv;
457 const char **argv_ptr;
458 char *list_option_full = NULL;
459 const char *linker_output = NULL;
460 const char *collect_gcc, *collect_gcc_options;
461 int parallel = 0;
462 int jobserver = 0;
463 bool no_partition = false;
464 struct cl_decoded_option *fdecoded_options = NULL;
465 unsigned int fdecoded_options_count = 0;
466 struct cl_decoded_option *decoded_options;
467 unsigned int decoded_options_count;
468 struct obstack argv_obstack;
469 int new_head_argc;
470
471 /* Get the driver and options. */
472 collect_gcc = getenv ("COLLECT_GCC");
473 if (!collect_gcc)
474 fatal ("environment variable COLLECT_GCC must be set");
475 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
476 if (!collect_gcc_options)
477 fatal ("environment variable COLLECT_GCC_OPTIONS must be set");
478 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
479 CL_LANG_ALL,
480 &decoded_options,
481 &decoded_options_count);
482
483 /* Look at saved options in the IL files. */
484 for (i = 1; i < argc; ++i)
485 {
486 char *data, *p;
487 char *fopts;
488 int fd;
489 const char *errmsg;
490 int err;
491 off_t file_offset = 0, offset, length;
492 long loffset;
493 simple_object_read *sobj;
494 int consumed;
495 struct cl_decoded_option *f2decoded_options;
496 unsigned int f2decoded_options_count;
497 char *filename = argv[i];
498 if ((p = strrchr (argv[i], '@'))
499 && p != argv[i]
500 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
501 && strlen (p) == (unsigned int) consumed)
502 {
503 filename = XNEWVEC (char, p - argv[i] + 1);
504 memcpy (filename, argv[i], p - argv[i]);
505 filename[p - argv[i]] = '\0';
506 file_offset = (off_t) loffset;
507 }
508 fd = open (argv[i], O_RDONLY);
509 if (fd == -1)
510 continue;
511 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
512 &errmsg, &err);
513 if (!sobj)
514 {
515 close (fd);
516 continue;
517 }
518 if (!simple_object_find_section (sobj, LTO_SECTION_NAME_PREFIX "." "opts",
519 &offset, &length, &errmsg, &err))
520 {
521 simple_object_release_read (sobj);
522 close (fd);
523 continue;
524 }
525 lseek (fd, file_offset + offset, SEEK_SET);
526 data = (char *)xmalloc (length);
527 read (fd, data, length);
528 fopts = data;
529 do
530 {
531 get_options_from_collect_gcc_options (collect_gcc,
532 fopts, CL_LANG_ALL,
533 &f2decoded_options,
534 &f2decoded_options_count);
535 if (!fdecoded_options)
536 {
537 fdecoded_options = f2decoded_options;
538 fdecoded_options_count = f2decoded_options_count;
539 }
540 else
541 merge_and_complain (&fdecoded_options,
542 &fdecoded_options_count,
543 f2decoded_options, f2decoded_options_count);
544
545 fopts += strlen (fopts) + 1;
546 }
547 while (fopts - data < length);
548
549 free (data);
550 simple_object_release_read (sobj);
551 close (fd);
552 }
553
554 /* Initalize the common arguments for the driver. */
555 obstack_init (&argv_obstack);
556 obstack_ptr_grow (&argv_obstack, collect_gcc);
557 obstack_ptr_grow (&argv_obstack, "-xlto");
558 obstack_ptr_grow (&argv_obstack, "-c");
559
560 /* Append compiler driver arguments as far as they were merged. */
561 for (j = 1; j < fdecoded_options_count; ++j)
562 {
563 struct cl_decoded_option *option = &fdecoded_options[j];
564
565 /* File options have been properly filtered by lto-opts.c. */
566 switch (option->opt_index)
567 {
568 /* Drop arguments that we want to take from the link line. */
569 case OPT_flto_:
570 case OPT_flto:
571 case OPT_flto_partition_none:
572 case OPT_flto_partition_1to1:
573 case OPT_flto_partition_balanced:
574 continue;
575
576 default:
577 break;
578 }
579
580 /* For now do what the original LTO option code was doing - pass
581 on any CL_TARGET flag and a few selected others. */
582 switch (option->opt_index)
583 {
584 case OPT_fPIC:
585 case OPT_fpic:
586 case OPT_fpie:
587 case OPT_fcommon:
588 case OPT_fexceptions:
589 case OPT_fnon_call_exceptions:
590 case OPT_fgnu_tm:
591 case OPT_freg_struct_return:
592 case OPT_fpcc_struct_return:
593 case OPT_ffp_contract_:
594 break;
595
596 default:
597 if (!(cl_options[option->opt_index].flags & CL_TARGET))
598 continue;
599 }
600
601 /* Pass the option on. */
602 for (i = 0; i < option->canonical_option_num_elements; ++i)
603 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
604 }
605
606 /* Append linker driver arguments. Compiler options from the linker
607 driver arguments will override / merge with those from the compiler. */
608 for (j = 1; j < decoded_options_count; ++j)
609 {
610 struct cl_decoded_option *option = &decoded_options[j];
611
612 /* Do not pass on frontend specific flags not suitable for lto. */
613 if (!(cl_options[option->opt_index].flags
614 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
615 continue;
616
617 switch (option->opt_index)
618 {
619 case OPT_o:
620 linker_output = option->arg;
621 /* We generate new intermediate output, drop this arg. */
622 continue;
623
624 case OPT_save_temps:
625 debug = 1;
626 break;
627
628 case OPT_v:
629 verbose = 1;
630 break;
631
632 case OPT_flto_partition_none:
633 no_partition = true;
634 break;
635
636 case OPT_flto_:
637 if (strcmp (option->arg, "jobserver") == 0)
638 {
639 jobserver = 1;
640 parallel = 1;
641 }
642 else
643 {
644 parallel = atoi (option->arg);
645 if (parallel <= 1)
646 parallel = 0;
647 }
648 /* Fallthru. */
649
650 case OPT_flto:
651 lto_mode = LTO_MODE_WHOPR;
652 /* We've handled these LTO options, do not pass them on. */
653 continue;
654
655 case OPT_freg_struct_return:
656 case OPT_fpcc_struct_return:
657 /* Ignore these, they are determined by the input files.
658 ??? We fail to diagnose a possible mismatch here. */
659 continue;
660
661 default:
662 break;
663 }
664
665 /* Pass the option on. */
666 for (i = 0; i < option->canonical_option_num_elements; ++i)
667 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
668 }
669
670 if (no_partition)
671 {
672 lto_mode = LTO_MODE_LTO;
673 jobserver = 0;
674 parallel = 0;
675 }
676
677 if (linker_output)
678 {
679 char *output_dir, *base, *name;
680 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
681
682 output_dir = xstrdup (linker_output);
683 base = output_dir;
684 for (name = base; *name; name++)
685 if (IS_DIR_SEPARATOR (*name))
686 base = name + 1;
687 *base = '\0';
688
689 linker_output = &linker_output[base - output_dir];
690 if (*output_dir == '\0')
691 {
692 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
693 output_dir = current_dir;
694 }
695 if (!bit_bucket)
696 {
697 obstack_ptr_grow (&argv_obstack, "-dumpdir");
698 obstack_ptr_grow (&argv_obstack, output_dir);
699 }
700
701 obstack_ptr_grow (&argv_obstack, "-dumpbase");
702 }
703
704 /* Remember at which point we can scrub args to re-use the commons. */
705 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
706
707 if (lto_mode == LTO_MODE_LTO)
708 {
709 flto_out = make_temp_file (".lto.o");
710 if (linker_output)
711 obstack_ptr_grow (&argv_obstack, linker_output);
712 obstack_ptr_grow (&argv_obstack, "-o");
713 obstack_ptr_grow (&argv_obstack, flto_out);
714 }
715 else
716 {
717 const char *list_option = "-fltrans-output-list=";
718 size_t list_option_len = strlen (list_option);
719 char *tmp;
720
721 if (linker_output)
722 {
723 char *dumpbase = (char *) xmalloc (strlen (linker_output)
724 + sizeof (".wpa") + 1);
725 strcpy (dumpbase, linker_output);
726 strcat (dumpbase, ".wpa");
727 obstack_ptr_grow (&argv_obstack, dumpbase);
728 }
729
730 if (linker_output && debug)
731 {
732 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
733 + sizeof (".ltrans.out") + 1);
734 strcpy (ltrans_output_file, linker_output);
735 strcat (ltrans_output_file, ".ltrans.out");
736 }
737 else
738 ltrans_output_file = make_temp_file (".ltrans.out");
739 list_option_full = (char *) xmalloc (sizeof (char) *
740 (strlen (ltrans_output_file) + list_option_len + 1));
741 tmp = list_option_full;
742
743 obstack_ptr_grow (&argv_obstack, tmp);
744 strcpy (tmp, list_option);
745 tmp += list_option_len;
746 strcpy (tmp, ltrans_output_file);
747
748 obstack_ptr_grow (&argv_obstack, "-fwpa");
749 }
750
751 /* Append the input objects and possible preceding arguments. */
752 for (i = 1; i < argc; ++i)
753 obstack_ptr_grow (&argv_obstack, argv[i]);
754 obstack_ptr_grow (&argv_obstack, NULL);
755
756 new_argv = XOBFINISH (&argv_obstack, const char **);
757 argv_ptr = &new_argv[new_head_argc];
758 fork_execute (CONST_CAST (char **, new_argv));
759
760 if (lto_mode == LTO_MODE_LTO)
761 {
762 printf ("%s\n", flto_out);
763 free (flto_out);
764 flto_out = NULL;
765 }
766 else
767 {
768 FILE *stream = fopen (ltrans_output_file, "r");
769 FILE *mstream = NULL;
770 struct obstack env_obstack;
771
772 if (!stream)
773 fatal_perror ("fopen: %s", ltrans_output_file);
774
775 /* Parse the list of LTRANS inputs from the WPA stage. */
776 obstack_init (&env_obstack);
777 nr = 0;
778 for (;;)
779 {
780 const unsigned piece = 32;
781 char *output_name = NULL;
782 char *buf, *input_name = (char *)xmalloc (piece);
783 size_t len;
784
785 buf = input_name;
786 cont:
787 if (!fgets (buf, piece, stream))
788 break;
789 len = strlen (input_name);
790 if (input_name[len - 1] != '\n')
791 {
792 input_name = (char *)xrealloc (input_name, len + piece);
793 buf = input_name + len;
794 goto cont;
795 }
796 input_name[len - 1] = '\0';
797
798 if (input_name[0] == '*')
799 output_name = &input_name[1];
800
801 nr++;
802 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
803 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
804 input_names[nr-1] = input_name;
805 output_names[nr-1] = output_name;
806 }
807 fclose (stream);
808 maybe_unlink_file (ltrans_output_file);
809 ltrans_output_file = NULL;
810
811 if (parallel)
812 {
813 makefile = make_temp_file (".mk");
814 mstream = fopen (makefile, "w");
815 }
816
817 /* Execute the LTRANS stage for each input file (or prepare a
818 makefile to invoke this in parallel). */
819 for (i = 0; i < nr; ++i)
820 {
821 char *output_name;
822 char *input_name = input_names[i];
823 /* If it's a pass-through file do nothing. */
824 if (output_names[i])
825 continue;
826
827 /* Replace the .o suffix with a .ltrans.o suffix and write
828 the resulting name to the LTRANS output list. */
829 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
830 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
831 output_name = XOBFINISH (&env_obstack, char *);
832
833 /* Adjust the dumpbase if the linker output file was seen. */
834 if (linker_output)
835 {
836 char *dumpbase
837 = (char *) xmalloc (strlen (linker_output)
838 + sizeof (DUMPBASE_SUFFIX) + 1);
839 snprintf (dumpbase,
840 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
841 "%s.ltrans%u", linker_output, i);
842 argv_ptr[0] = dumpbase;
843 }
844
845 argv_ptr[1] = "-fltrans";
846 argv_ptr[2] = "-o";
847 argv_ptr[3] = output_name;
848 argv_ptr[4] = input_name;
849 argv_ptr[5] = NULL;
850 if (parallel)
851 {
852 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
853 for (j = 1; new_argv[j] != NULL; ++j)
854 fprintf (mstream, " '%s'", new_argv[j]);
855 fprintf (mstream, "\n");
856 /* If we are not preserving the ltrans input files then
857 truncate them as soon as we have processed it. This
858 reduces temporary disk-space usage. */
859 if (! debug)
860 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
861 "&& mv %s.tem %s\n",
862 input_name, input_name, input_name, input_name);
863 }
864 else
865 {
866 fork_execute (CONST_CAST (char **, new_argv));
867 maybe_unlink_file (input_name);
868 }
869
870 output_names[i] = output_name;
871 }
872 if (parallel)
873 {
874 struct pex_obj *pex;
875 char jobs[32];
876
877 fprintf (mstream, "all:");
878 for (i = 0; i < nr; ++i)
879 fprintf (mstream, " \\\n\t%s", output_names[i]);
880 fprintf (mstream, "\n");
881 fclose (mstream);
882 if (!jobserver)
883 {
884 /* Avoid passing --jobserver-fd= and similar flags
885 unless jobserver mode is explicitly enabled. */
886 putenv (xstrdup ("MAKEFLAGS="));
887 putenv (xstrdup ("MFLAGS="));
888 }
889 new_argv[0] = getenv ("MAKE");
890 if (!new_argv[0])
891 new_argv[0] = "make";
892 new_argv[1] = "-f";
893 new_argv[2] = makefile;
894 i = 3;
895 if (!jobserver)
896 {
897 snprintf (jobs, 31, "-j%d", parallel);
898 new_argv[i++] = jobs;
899 }
900 new_argv[i++] = "all";
901 new_argv[i++] = NULL;
902 pex = collect_execute (CONST_CAST (char **, new_argv));
903 collect_wait (new_argv[0], pex);
904 maybe_unlink_file (makefile);
905 makefile = NULL;
906 for (i = 0; i < nr; ++i)
907 maybe_unlink_file (input_names[i]);
908 }
909 for (i = 0; i < nr; ++i)
910 {
911 fputs (output_names[i], stdout);
912 putc ('\n', stdout);
913 free (input_names[i]);
914 }
915 nr = 0;
916 free (output_names);
917 free (input_names);
918 free (list_option_full);
919 obstack_free (&env_obstack, NULL);
920 }
921
922 obstack_free (&argv_obstack, NULL);
923 }
924
925
926 /* Entry point. */
927
928 int
929 main (int argc, char *argv[])
930 {
931 const char *p;
932
933 gcc_obstack_init (&opts_obstack);
934
935 p = argv[0] + strlen (argv[0]);
936 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
937 --p;
938 progname = p;
939
940 xmalloc_set_program_name (progname);
941
942 gcc_init_libintl ();
943
944 diagnostic_initialize (global_dc, 0);
945
946 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
947 signal (SIGINT, fatal_signal);
948 #ifdef SIGHUP
949 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
950 signal (SIGHUP, fatal_signal);
951 #endif
952 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
953 signal (SIGTERM, fatal_signal);
954 #ifdef SIGPIPE
955 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
956 signal (SIGPIPE, fatal_signal);
957 #endif
958 #ifdef SIGCHLD
959 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
960 receive the signal. A different setting is inheritable */
961 signal (SIGCHLD, SIG_DFL);
962 #endif
963
964 /* We may be called with all the arguments stored in some file and
965 passed with @file. Expand them into argv before processing. */
966 expandargv (&argc, &argv);
967
968 run_gcc (argc, argv);
969
970 return 0;
971 }