PR target/86547
[official-gcc.git] / gcc / lto-wrapper.c
blob39d9f088bc6d3a06e5a543eae41ee355f2ef3869
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2018 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"
49 #include "lto-section-names.h"
50 #include "collect-utils.h"
52 /* Environment variable, used for passing the names of offload targets from GCC
53 driver to lto-wrapper. */
54 #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
56 enum lto_mode_d {
57 LTO_MODE_NONE, /* Not doing LTO. */
58 LTO_MODE_LTO, /* Normal LTO. */
59 LTO_MODE_WHOPR /* WHOPR. */
62 /* Current LTO mode. */
63 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
65 static char *ltrans_output_file;
66 static char *flto_out;
67 static unsigned int nr;
68 static int *ltrans_priorities;
69 static char **input_names;
70 static char **output_names;
71 static char **offload_names;
72 static char *offload_objects_file_name;
73 static char *makefile;
74 static char *debug_obj;
76 const char tool_name[] = "lto-wrapper";
78 /* Delete tempfiles. Called from utils_cleanup. */
80 void
81 tool_cleanup (bool)
83 unsigned int i;
85 if (ltrans_output_file)
86 maybe_unlink (ltrans_output_file);
87 if (flto_out)
88 maybe_unlink (flto_out);
89 if (offload_objects_file_name)
90 maybe_unlink (offload_objects_file_name);
91 if (makefile)
92 maybe_unlink (makefile);
93 if (debug_obj)
94 maybe_unlink (debug_obj);
95 for (i = 0; i < nr; ++i)
97 maybe_unlink (input_names[i]);
98 if (output_names[i])
99 maybe_unlink (output_names[i]);
103 static void
104 lto_wrapper_cleanup (void)
106 utils_cleanup (false);
109 /* Unlink a temporary LTRANS file unless requested otherwise. */
111 void
112 maybe_unlink (const char *file)
114 if (!save_temps)
116 if (unlink_if_ordinary (file)
117 && errno != ENOENT)
118 fatal_error (input_location, "deleting LTRANS file %s: %m", file);
120 else if (verbose)
121 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
124 /* Template of LTRANS dumpbase suffix. */
125 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
127 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
128 environment according to LANG_MASK. */
130 static void
131 get_options_from_collect_gcc_options (const char *collect_gcc,
132 const char *collect_gcc_options,
133 unsigned int lang_mask,
134 struct cl_decoded_option **decoded_options,
135 unsigned int *decoded_options_count)
137 struct obstack argv_obstack;
138 char *argv_storage;
139 const char **argv;
140 int j, k, argc;
142 argv_storage = xstrdup (collect_gcc_options);
143 obstack_init (&argv_obstack);
144 obstack_ptr_grow (&argv_obstack, collect_gcc);
146 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
148 if (argv_storage[j] == '\'')
150 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
151 ++j;
154 if (argv_storage[j] == '\0')
155 fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS");
156 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
158 argv_storage[k++] = '\'';
159 j += 4;
161 else if (argv_storage[j] == '\'')
162 break;
163 else
164 argv_storage[k++] = argv_storage[j++];
166 while (1);
167 argv_storage[k++] = '\0';
171 obstack_ptr_grow (&argv_obstack, NULL);
172 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
173 argv = XOBFINISH (&argv_obstack, const char **);
175 decode_cmdline_options_to_array (argc, (const char **)argv,
176 lang_mask,
177 decoded_options, decoded_options_count);
178 obstack_free (&argv_obstack, NULL);
181 /* Append OPTION to the options array DECODED_OPTIONS with size
182 DECODED_OPTIONS_COUNT. */
184 static void
185 append_option (struct cl_decoded_option **decoded_options,
186 unsigned int *decoded_options_count,
187 struct cl_decoded_option *option)
189 ++*decoded_options_count;
190 *decoded_options
191 = (struct cl_decoded_option *)
192 xrealloc (*decoded_options,
193 (*decoded_options_count
194 * sizeof (struct cl_decoded_option)));
195 memcpy (&(*decoded_options)[*decoded_options_count - 1], option,
196 sizeof (struct cl_decoded_option));
199 /* Remove option number INDEX from DECODED_OPTIONS, update
200 DECODED_OPTIONS_COUNT. */
202 static void
203 remove_option (struct cl_decoded_option **decoded_options,
204 int index, unsigned int *decoded_options_count)
206 --*decoded_options_count;
207 memmove (&(*decoded_options)[index + 1],
208 &(*decoded_options)[index],
209 sizeof (struct cl_decoded_option)
210 * (*decoded_options_count - index));
213 /* Try to merge and complain about options FDECODED_OPTIONS when applied
214 ontop of DECODED_OPTIONS. */
216 static void
217 merge_and_complain (struct cl_decoded_option **decoded_options,
218 unsigned int *decoded_options_count,
219 struct cl_decoded_option *fdecoded_options,
220 unsigned int fdecoded_options_count)
222 unsigned int i, j;
223 struct cl_decoded_option *pic_option = NULL;
224 struct cl_decoded_option *pie_option = NULL;
226 /* ??? Merge options from files. Most cases can be
227 handled by either unioning or intersecting
228 (for example -fwrapv is a case for unioning,
229 -ffast-math is for intersection). Most complaints
230 about real conflicts between different options can
231 be deferred to the compiler proper. Options that
232 we can neither safely handle by intersection nor
233 unioning would need to be complained about here.
234 Ideally we'd have a flag in the opt files that
235 tells whether to union or intersect or reject.
236 In absence of that it's unclear what a good default is.
237 It's also difficult to get positional handling correct. */
239 /* The following does what the old LTO option code did,
240 union all target and a selected set of common options. */
241 for (i = 0; i < fdecoded_options_count; ++i)
243 struct cl_decoded_option *foption = &fdecoded_options[i];
244 switch (foption->opt_index)
246 case OPT_SPECIAL_unknown:
247 case OPT_SPECIAL_ignore:
248 case OPT_SPECIAL_program_name:
249 case OPT_SPECIAL_input_file:
250 break;
252 default:
253 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
254 break;
256 /* Fallthru. */
257 case OPT_fdiagnostics_show_caret:
258 case OPT_fdiagnostics_show_line_numbers:
259 case OPT_fdiagnostics_show_option:
260 case OPT_fdiagnostics_show_location_:
261 case OPT_fshow_column:
262 case OPT_fcommon:
263 case OPT_fgnu_tm:
264 /* Do what the old LTO code did - collect exactly one option
265 setting per OPT code, we pick the first we encounter.
266 ??? This doesn't make too much sense, but when it doesn't
267 then we should complain. */
268 for (j = 0; j < *decoded_options_count; ++j)
269 if ((*decoded_options)[j].opt_index == foption->opt_index)
270 break;
271 if (j == *decoded_options_count)
272 append_option (decoded_options, decoded_options_count, foption);
273 break;
275 /* Figure out what PIC/PIE level wins and merge the results. */
276 case OPT_fPIC:
277 case OPT_fpic:
278 pic_option = foption;
279 break;
280 case OPT_fPIE:
281 case OPT_fpie:
282 pie_option = foption;
283 break;
285 case OPT_fopenmp:
286 case OPT_fopenacc:
287 case OPT_fcheck_pointer_bounds:
288 /* For selected options we can merge conservatively. */
289 for (j = 0; j < *decoded_options_count; ++j)
290 if ((*decoded_options)[j].opt_index == foption->opt_index)
291 break;
292 if (j == *decoded_options_count)
293 append_option (decoded_options, decoded_options_count, foption);
294 /* -fopenmp > -fno-openmp,
295 -fopenacc > -fno-openacc,
296 -fcheck_pointer_bounds > -fcheck_pointer_bounds */
297 else if (foption->value > (*decoded_options)[j].value)
298 (*decoded_options)[j] = *foption;
299 break;
301 case OPT_fopenacc_dim_:
302 /* Append or check identical. */
303 for (j = 0; j < *decoded_options_count; ++j)
304 if ((*decoded_options)[j].opt_index == foption->opt_index)
305 break;
306 if (j == *decoded_options_count)
307 append_option (decoded_options, decoded_options_count, foption);
308 else if (strcmp ((*decoded_options)[j].arg, foption->arg))
309 fatal_error (input_location,
310 "Option %s with different values",
311 foption->orig_option_with_args_text);
312 break;
314 case OPT_O:
315 case OPT_Ofast:
316 case OPT_Og:
317 case OPT_Os:
318 for (j = 0; j < *decoded_options_count; ++j)
319 if ((*decoded_options)[j].opt_index == OPT_O
320 || (*decoded_options)[j].opt_index == OPT_Ofast
321 || (*decoded_options)[j].opt_index == OPT_Og
322 || (*decoded_options)[j].opt_index == OPT_Os)
323 break;
324 if (j == *decoded_options_count)
325 append_option (decoded_options, decoded_options_count, foption);
326 else if ((*decoded_options)[j].opt_index == foption->opt_index
327 && foption->opt_index != OPT_O)
328 /* Exact same options get merged. */
330 else
332 /* For mismatched option kinds preserve the optimization
333 level only, thus merge it as -On. This also handles
334 merging of same optimization level -On. */
335 int level = 0;
336 switch (foption->opt_index)
338 case OPT_O:
339 if (foption->arg[0] == '\0')
340 level = MAX (level, 1);
341 else
342 level = MAX (level, atoi (foption->arg));
343 break;
344 case OPT_Ofast:
345 level = MAX (level, 3);
346 break;
347 case OPT_Og:
348 level = MAX (level, 1);
349 break;
350 case OPT_Os:
351 level = MAX (level, 2);
352 break;
353 default:
354 gcc_unreachable ();
356 switch ((*decoded_options)[j].opt_index)
358 case OPT_O:
359 if ((*decoded_options)[j].arg[0] == '\0')
360 level = MAX (level, 1);
361 else
362 level = MAX (level, atoi ((*decoded_options)[j].arg));
363 break;
364 case OPT_Ofast:
365 level = MAX (level, 3);
366 break;
367 case OPT_Og:
368 level = MAX (level, 1);
369 break;
370 case OPT_Os:
371 level = MAX (level, 2);
372 break;
373 default:
374 gcc_unreachable ();
376 (*decoded_options)[j].opt_index = OPT_O;
377 char *tem;
378 tem = xasprintf ("-O%d", level);
379 (*decoded_options)[j].arg = &tem[2];
380 (*decoded_options)[j].canonical_option[0] = tem;
381 (*decoded_options)[j].value = 1;
383 break;
386 case OPT_foffload_abi_:
387 for (j = 0; j < *decoded_options_count; ++j)
388 if ((*decoded_options)[j].opt_index == foption->opt_index)
389 break;
390 if (j == *decoded_options_count)
391 append_option (decoded_options, decoded_options_count, foption);
392 else if (foption->value != (*decoded_options)[j].value)
393 fatal_error (input_location,
394 "Option %s not used consistently in all LTO input"
395 " files", foption->orig_option_with_args_text);
396 break;
399 case OPT_foffload_:
400 append_option (decoded_options, decoded_options_count, foption);
401 break;
405 /* Merge PIC options:
406 -fPIC + -fpic = -fpic
407 -fPIC + -fno-pic = -fno-pic
408 -fpic/-fPIC + nothin = nothing.
409 It is a common mistake to mix few -fPIC compiled objects into otherwise
410 non-PIC code. We do not want to build everything with PIC then.
412 It would be good to warn on mismatches, but it is bit hard to do as
413 we do not know what nothing translates to. */
415 for (unsigned int j = 0; j < *decoded_options_count;)
416 if ((*decoded_options)[j].opt_index == OPT_fPIC
417 || (*decoded_options)[j].opt_index == OPT_fpic)
419 if (!pic_option
420 || (pic_option->value > 0) != ((*decoded_options)[j].value > 0))
421 remove_option (decoded_options, j, decoded_options_count);
422 else if (pic_option->opt_index == OPT_fPIC
423 && (*decoded_options)[j].opt_index == OPT_fpic)
425 (*decoded_options)[j] = *pic_option;
426 j++;
428 else
429 j++;
431 else if ((*decoded_options)[j].opt_index == OPT_fPIE
432 || (*decoded_options)[j].opt_index == OPT_fpie)
434 if (!pie_option
435 || pie_option->value != (*decoded_options)[j].value)
436 remove_option (decoded_options, j, decoded_options_count);
437 else if (pie_option->opt_index == OPT_fPIE
438 && (*decoded_options)[j].opt_index == OPT_fpie)
440 (*decoded_options)[j] = *pie_option;
441 j++;
443 else
444 j++;
446 else
447 j++;
450 /* Auxiliary function that frees elements of PTR and PTR itself.
451 N is number of elements to be freed. If PTR is NULL, nothing is freed.
452 If an element is NULL, subsequent elements are not freed. */
454 static void **
455 free_array_of_ptrs (void **ptr, unsigned n)
457 if (!ptr)
458 return NULL;
459 for (unsigned i = 0; i < n; i++)
461 if (!ptr[i])
462 break;
463 free (ptr[i]);
465 free (ptr);
466 return NULL;
469 /* Parse STR, saving found tokens into PVALUES and return their number.
470 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
471 append it to every token we find. */
473 static unsigned
474 parse_env_var (const char *str, char ***pvalues, const char *append)
476 const char *curval, *nextval;
477 char **values;
478 unsigned num = 1, i;
480 curval = strchr (str, ':');
481 while (curval)
483 num++;
484 curval = strchr (curval + 1, ':');
487 values = (char**) xmalloc (num * sizeof (char*));
488 curval = str;
489 nextval = strchr (curval, ':');
490 if (nextval == NULL)
491 nextval = strchr (curval, '\0');
493 int append_len = append ? strlen (append) : 0;
494 for (i = 0; i < num; i++)
496 int l = nextval - curval;
497 values[i] = (char*) xmalloc (l + 1 + append_len);
498 memcpy (values[i], curval, l);
499 values[i][l] = 0;
500 if (append)
501 strcat (values[i], append);
502 curval = nextval + 1;
503 nextval = strchr (curval, ':');
504 if (nextval == NULL)
505 nextval = strchr (curval, '\0');
507 *pvalues = values;
508 return num;
511 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
513 static void
514 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
515 unsigned int count)
517 /* Append compiler driver arguments as far as they were merged. */
518 for (unsigned int j = 1; j < count; ++j)
520 struct cl_decoded_option *option = &opts[j];
522 /* File options have been properly filtered by lto-opts.c. */
523 switch (option->opt_index)
525 /* Drop arguments that we want to take from the link line. */
526 case OPT_flto_:
527 case OPT_flto:
528 case OPT_flto_partition_:
529 continue;
531 default:
532 break;
535 /* For now do what the original LTO option code was doing - pass
536 on any CL_TARGET flag and a few selected others. */
537 switch (option->opt_index)
539 case OPT_fdiagnostics_show_caret:
540 case OPT_fdiagnostics_show_line_numbers:
541 case OPT_fdiagnostics_show_option:
542 case OPT_fdiagnostics_show_location_:
543 case OPT_fshow_column:
544 case OPT_fPIC:
545 case OPT_fpic:
546 case OPT_fPIE:
547 case OPT_fpie:
548 case OPT_fcommon:
549 case OPT_fgnu_tm:
550 case OPT_fopenmp:
551 case OPT_fopenacc:
552 case OPT_fopenacc_dim_:
553 case OPT_foffload_abi_:
554 case OPT_O:
555 case OPT_Ofast:
556 case OPT_Og:
557 case OPT_Os:
558 case OPT_fcheck_pointer_bounds:
559 break;
561 default:
562 if (!(cl_options[option->opt_index].flags & CL_TARGET))
563 continue;
566 /* Pass the option on. */
567 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
568 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
572 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
574 static void
575 append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts,
576 unsigned int count)
578 /* Append compiler driver arguments as far as they were merged. */
579 for (unsigned int j = 1; j < count; ++j)
581 struct cl_decoded_option *option = &opts[j];
583 switch (option->opt_index)
585 case OPT_fdiagnostics_color_:
586 case OPT_fdiagnostics_show_caret:
587 case OPT_fdiagnostics_show_line_numbers:
588 case OPT_fdiagnostics_show_option:
589 case OPT_fdiagnostics_show_location_:
590 case OPT_fshow_column:
591 break;
592 default:
593 continue;
596 /* Pass the option on. */
597 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
598 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
603 /* Append linker options OPTS to ARGV_OBSTACK. */
605 static void
606 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
607 unsigned int count)
609 /* Append linker driver arguments. Compiler options from the linker
610 driver arguments will override / merge with those from the compiler. */
611 for (unsigned int j = 1; j < count; ++j)
613 struct cl_decoded_option *option = &opts[j];
615 /* Do not pass on frontend specific flags not suitable for lto. */
616 if (!(cl_options[option->opt_index].flags
617 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
618 continue;
620 switch (option->opt_index)
622 case OPT_o:
623 case OPT_flto_:
624 case OPT_flto:
625 /* We've handled these LTO options, do not pass them on. */
626 continue;
628 case OPT_fopenmp:
629 case OPT_fopenacc:
630 /* Ignore -fno-XXX form of these options, as otherwise
631 corresponding builtins will not be enabled. */
632 if (option->value == 0)
633 continue;
634 break;
636 default:
637 break;
640 /* Pass the option on. */
641 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
642 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
646 /* Extract options for TARGET offload compiler from OPTIONS and append
647 them to ARGV_OBSTACK. */
649 static void
650 append_offload_options (obstack *argv_obstack, const char *target,
651 struct cl_decoded_option *options,
652 unsigned int options_count)
654 for (unsigned i = 0; i < options_count; i++)
656 const char *cur, *next, *opts;
657 char **argv;
658 unsigned argc;
659 struct cl_decoded_option *option = &options[i];
661 if (option->opt_index != OPT_foffload_)
662 continue;
664 /* If option argument starts with '-' then no target is specified. That
665 means offload options are specified for all targets, so we need to
666 append them. */
667 if (option->arg[0] == '-')
668 opts = option->arg;
669 else
671 opts = strchr (option->arg, '=');
672 /* If there are offload targets specified, but no actual options,
673 there is nothing to do here. */
674 if (!opts)
675 continue;
677 cur = option->arg;
679 while (cur < opts)
681 next = strchr (cur, ',');
682 if (next == NULL)
683 next = opts;
684 next = (next > opts) ? opts : next;
686 /* Are we looking for this offload target? */
687 if (strlen (target) == (size_t) (next - cur)
688 && strncmp (target, cur, next - cur) == 0)
689 break;
691 /* Skip the comma or equal sign. */
692 cur = next + 1;
695 if (cur >= opts)
696 continue;
698 opts++;
701 argv = buildargv (opts);
702 for (argc = 0; argv[argc]; argc++)
703 obstack_ptr_grow (argv_obstack, argv[argc]);
707 /* Check whether NAME can be accessed in MODE. This is like access,
708 except that it never considers directories to be executable. */
710 static int
711 access_check (const char *name, int mode)
713 if (mode == X_OK)
715 struct stat st;
717 if (stat (name, &st) < 0
718 || S_ISDIR (st.st_mode))
719 return -1;
722 return access (name, mode);
725 /* Prepare a target image for offload TARGET, using mkoffload tool from
726 COMPILER_PATH. Return the name of the resultant object file. */
728 static char *
729 compile_offload_image (const char *target, const char *compiler_path,
730 unsigned in_argc, char *in_argv[],
731 struct cl_decoded_option *compiler_opts,
732 unsigned int compiler_opt_count,
733 struct cl_decoded_option *linker_opts,
734 unsigned int linker_opt_count)
736 char *filename = NULL;
737 char **argv;
738 char *suffix
739 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
740 strcpy (suffix, "/accel/");
741 strcat (suffix, target);
742 strcat (suffix, "/mkoffload");
744 char **paths = NULL;
745 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
747 const char *compiler = NULL;
748 for (unsigned i = 0; i < n_paths; i++)
749 if (access_check (paths[i], X_OK) == 0)
751 compiler = paths[i];
752 break;
755 if (!compiler)
756 fatal_error (input_location,
757 "could not find %s in %s (consider using '-B')\n", suffix + 1,
758 compiler_path);
760 /* Generate temporary output file name. */
761 filename = make_temp_file (".target.o");
763 struct obstack argv_obstack;
764 obstack_init (&argv_obstack);
765 obstack_ptr_grow (&argv_obstack, compiler);
766 if (save_temps)
767 obstack_ptr_grow (&argv_obstack, "-save-temps");
768 if (verbose)
769 obstack_ptr_grow (&argv_obstack, "-v");
770 obstack_ptr_grow (&argv_obstack, "-o");
771 obstack_ptr_grow (&argv_obstack, filename);
773 /* Append names of input object files. */
774 for (unsigned i = 0; i < in_argc; i++)
775 obstack_ptr_grow (&argv_obstack, in_argv[i]);
777 /* Append options from offload_lto sections. */
778 append_compiler_options (&argv_obstack, compiler_opts,
779 compiler_opt_count);
780 append_diag_options (&argv_obstack, linker_opts, linker_opt_count);
782 /* Append options specified by -foffload last. In case of conflicting
783 options we expect offload compiler to choose the latest. */
784 append_offload_options (&argv_obstack, target, compiler_opts,
785 compiler_opt_count);
786 append_offload_options (&argv_obstack, target, linker_opts,
787 linker_opt_count);
789 obstack_ptr_grow (&argv_obstack, NULL);
790 argv = XOBFINISH (&argv_obstack, char **);
791 fork_execute (argv[0], argv, true);
792 obstack_free (&argv_obstack, NULL);
794 free_array_of_ptrs ((void **) paths, n_paths);
795 return filename;
799 /* The main routine dealing with offloading.
800 The routine builds a target image for each offload target. IN_ARGC and
801 IN_ARGV specify options and input object files. As all of them could contain
802 target sections, we pass them all to target compilers. */
804 static void
805 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
806 struct cl_decoded_option *compiler_opts,
807 unsigned int compiler_opt_count,
808 struct cl_decoded_option *linker_opts,
809 unsigned int linker_opt_count)
811 char **names = NULL;
812 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
813 if (!target_names)
814 return;
815 unsigned num_targets = parse_env_var (target_names, &names, NULL);
817 int next_name_entry = 0;
818 const char *compiler_path = getenv ("COMPILER_PATH");
819 if (!compiler_path)
820 goto out;
822 /* Prepare an image for each target and save the name of the resultant object
823 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
824 offload_names = XCNEWVEC (char *, num_targets + 1);
825 for (unsigned i = 0; i < num_targets; i++)
827 /* HSA does not use LTO-like streaming and a different compiler, skip
828 it. */
829 if (strcmp (names[i], "hsa") == 0)
830 continue;
832 offload_names[next_name_entry]
833 = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
834 compiler_opts, compiler_opt_count,
835 linker_opts, linker_opt_count);
836 if (!offload_names[next_name_entry])
837 fatal_error (input_location,
838 "problem with building target image for %s\n", names[i]);
839 next_name_entry++;
842 out:
843 free_array_of_ptrs ((void **) names, num_targets);
846 /* Copy a file from SRC to DEST. */
848 static void
849 copy_file (const char *dest, const char *src)
851 FILE *d = fopen (dest, "wb");
852 FILE *s = fopen (src, "rb");
853 char buffer[512];
854 while (!feof (s))
856 size_t len = fread (buffer, 1, 512, s);
857 if (ferror (s) != 0)
858 fatal_error (input_location, "reading input file");
859 if (len > 0)
861 fwrite (buffer, 1, len, d);
862 if (ferror (d) != 0)
863 fatal_error (input_location, "writing output file");
866 fclose (d);
867 fclose (s);
870 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
871 the copy to the linker. */
873 static void
874 find_crtoffloadtable (void)
876 char **paths = NULL;
877 const char *library_path = getenv ("LIBRARY_PATH");
878 if (!library_path)
879 return;
880 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
882 unsigned i;
883 for (i = 0; i < n_paths; i++)
884 if (access_check (paths[i], R_OK) == 0)
886 /* The linker will delete the filename we give it, so make a copy. */
887 char *crtoffloadtable = make_temp_file (".crtoffloadtable.o");
888 copy_file (crtoffloadtable, paths[i]);
889 printf ("%s\n", crtoffloadtable);
890 XDELETEVEC (crtoffloadtable);
891 break;
893 if (i == n_paths)
894 fatal_error (input_location,
895 "installation error, can't find crtoffloadtable.o");
897 free_array_of_ptrs ((void **) paths, n_paths);
900 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
901 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
902 and OPT_COUNT. Return true if we found a matchingn section, false
903 otherwise. COLLECT_GCC holds the value of the environment variable with
904 the same name. */
906 static bool
907 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
908 struct cl_decoded_option **opts,
909 unsigned int *opt_count, const char *collect_gcc)
911 off_t offset, length;
912 char *data;
913 char *fopts;
914 const char *errmsg;
915 int err;
916 struct cl_decoded_option *fdecoded_options = *opts;
917 unsigned int fdecoded_options_count = *opt_count;
919 simple_object_read *sobj;
920 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
921 &errmsg, &err);
922 if (!sobj)
923 return false;
925 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
926 strcpy (secname, prefix);
927 strcat (secname, ".opts");
928 if (!simple_object_find_section (sobj, secname, &offset, &length,
929 &errmsg, &err))
931 simple_object_release_read (sobj);
932 return false;
935 lseek (fd, file_offset + offset, SEEK_SET);
936 data = (char *)xmalloc (length);
937 read (fd, data, length);
938 fopts = data;
941 struct cl_decoded_option *f2decoded_options;
942 unsigned int f2decoded_options_count;
943 get_options_from_collect_gcc_options (collect_gcc,
944 fopts, CL_LANG_ALL,
945 &f2decoded_options,
946 &f2decoded_options_count);
947 if (!fdecoded_options)
949 fdecoded_options = f2decoded_options;
950 fdecoded_options_count = f2decoded_options_count;
952 else
953 merge_and_complain (&fdecoded_options,
954 &fdecoded_options_count,
955 f2decoded_options, f2decoded_options_count);
957 fopts += strlen (fopts) + 1;
959 while (fopts - data < length);
961 free (data);
962 simple_object_release_read (sobj);
963 *opts = fdecoded_options;
964 *opt_count = fdecoded_options_count;
965 return true;
968 /* Copy early debug info sections from INFILE to a new file whose name
969 is returned. Return NULL on error. */
971 const char *
972 debug_objcopy (const char *infile, bool rename)
974 const char *outfile;
975 const char *errmsg;
976 int err;
978 const char *p;
979 off_t inoff = 0;
980 long loffset;
981 int consumed;
982 if ((p = strrchr (infile, '@'))
983 && p != infile
984 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
985 && strlen (p) == (unsigned int) consumed)
987 char *fname = xstrdup (infile);
988 fname[p - infile] = '\0';
989 infile = fname;
990 inoff = (off_t) loffset;
992 int infd = open (infile, O_RDONLY | O_BINARY);
993 if (infd == -1)
994 return NULL;
995 simple_object_read *inobj = simple_object_start_read (infd, inoff,
996 "__GNU_LTO",
997 &errmsg, &err);
998 if (!inobj)
999 return NULL;
1001 off_t off, len;
1002 if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info",
1003 &off, &len, &errmsg, &err) != 1)
1005 if (errmsg)
1006 fatal_error (0, "%s: %s\n", errmsg, xstrerror (err));
1008 simple_object_release_read (inobj);
1009 close (infd);
1010 return NULL;
1013 outfile = make_temp_file ("debugobjtem");
1014 errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
1015 if (errmsg)
1017 unlink_if_ordinary (outfile);
1018 fatal_error (0, "%s: %s\n", errmsg, xstrerror (err));
1021 simple_object_release_read (inobj);
1022 close (infd);
1024 return outfile;
1027 /* Helper for qsort: compare priorities for parallel compilation. */
1030 cmp_priority (const void *a, const void *b)
1032 return *((const int *)b)-*((const int *)a);
1036 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1038 static void
1039 run_gcc (unsigned argc, char *argv[])
1041 unsigned i, j;
1042 const char **new_argv;
1043 const char **argv_ptr;
1044 char *list_option_full = NULL;
1045 const char *linker_output = NULL;
1046 const char *collect_gcc, *collect_gcc_options;
1047 int parallel = 0;
1048 int jobserver = 0;
1049 bool no_partition = false;
1050 struct cl_decoded_option *fdecoded_options = NULL;
1051 struct cl_decoded_option *offload_fdecoded_options = NULL;
1052 unsigned int fdecoded_options_count = 0;
1053 unsigned int offload_fdecoded_options_count = 0;
1054 struct cl_decoded_option *decoded_options;
1055 unsigned int decoded_options_count;
1056 struct obstack argv_obstack;
1057 int new_head_argc;
1058 bool have_lto = false;
1059 bool have_offload = false;
1060 unsigned lto_argc = 0, ltoobj_argc = 0;
1061 char **lto_argv, **ltoobj_argv;
1062 bool linker_output_rel = false;
1063 bool skip_debug = false;
1064 unsigned n_debugobj;
1066 /* Get the driver and options. */
1067 collect_gcc = getenv ("COLLECT_GCC");
1068 if (!collect_gcc)
1069 fatal_error (input_location,
1070 "environment variable COLLECT_GCC must be set");
1071 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1072 if (!collect_gcc_options)
1073 fatal_error (input_location,
1074 "environment variable COLLECT_GCC_OPTIONS must be set");
1075 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
1076 CL_LANG_ALL,
1077 &decoded_options,
1078 &decoded_options_count);
1080 /* Allocate array for input object files with LTO IL,
1081 and for possible preceding arguments. */
1082 lto_argv = XNEWVEC (char *, argc);
1083 ltoobj_argv = XNEWVEC (char *, argc);
1085 /* Look at saved options in the IL files. */
1086 for (i = 1; i < argc; ++i)
1088 char *p;
1089 int fd;
1090 off_t file_offset = 0;
1091 long loffset;
1092 int consumed;
1093 char *filename = argv[i];
1095 if (strncmp (argv[i], "-foffload-objects=",
1096 sizeof ("-foffload-objects=") - 1) == 0)
1098 have_offload = true;
1099 offload_objects_file_name
1100 = argv[i] + sizeof ("-foffload-objects=") - 1;
1101 continue;
1104 if ((p = strrchr (argv[i], '@'))
1105 && p != argv[i]
1106 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1107 && strlen (p) == (unsigned int) consumed)
1109 filename = XNEWVEC (char, p - argv[i] + 1);
1110 memcpy (filename, argv[i], p - argv[i]);
1111 filename[p - argv[i]] = '\0';
1112 file_offset = (off_t) loffset;
1114 fd = open (filename, O_RDONLY | O_BINARY);
1115 /* Linker plugin passes -fresolution and -flinker-output options.
1116 -flinker-output is passed only when user did not specify one and thus
1117 we do not need to worry about duplicities with the option handling
1118 below. */
1119 if (fd == -1)
1121 lto_argv[lto_argc++] = argv[i];
1122 if (strcmp (argv[i], "-flinker-output=rel") == 0)
1123 linker_output_rel = true;
1124 continue;
1127 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1128 &fdecoded_options, &fdecoded_options_count,
1129 collect_gcc))
1131 have_lto = true;
1132 ltoobj_argv[ltoobj_argc++] = argv[i];
1134 close (fd);
1137 /* Initalize the common arguments for the driver. */
1138 obstack_init (&argv_obstack);
1139 obstack_ptr_grow (&argv_obstack, collect_gcc);
1140 obstack_ptr_grow (&argv_obstack, "-xlto");
1141 obstack_ptr_grow (&argv_obstack, "-c");
1143 append_compiler_options (&argv_obstack, fdecoded_options,
1144 fdecoded_options_count);
1145 append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
1147 /* Scan linker driver arguments for things that are of relevance to us. */
1148 for (j = 1; j < decoded_options_count; ++j)
1150 struct cl_decoded_option *option = &decoded_options[j];
1151 switch (option->opt_index)
1153 case OPT_o:
1154 linker_output = option->arg;
1155 break;
1157 case OPT_save_temps:
1158 save_temps = 1;
1159 break;
1161 case OPT_v:
1162 verbose = 1;
1163 break;
1165 case OPT_flto_partition_:
1166 if (strcmp (option->arg, "none") == 0)
1167 no_partition = true;
1168 break;
1170 case OPT_flto_:
1171 if (strcmp (option->arg, "jobserver") == 0)
1173 jobserver = 1;
1174 parallel = 1;
1176 else
1178 parallel = atoi (option->arg);
1179 if (parallel <= 1)
1180 parallel = 0;
1182 /* Fallthru. */
1184 case OPT_flto:
1185 lto_mode = LTO_MODE_WHOPR;
1186 break;
1188 case OPT_flinker_output_:
1189 linker_output_rel = !strcmp (option->arg, "rel");
1190 break;
1193 default:
1194 break;
1198 /* Output lto-wrapper invocation command. */
1199 if (verbose)
1201 for (i = 0; i < argc; ++i)
1203 fputs (argv[i], stderr);
1204 fputc (' ', stderr);
1206 fputc ('\n', stderr);
1209 if (linker_output_rel)
1210 no_partition = true;
1212 if (no_partition)
1214 lto_mode = LTO_MODE_LTO;
1215 jobserver = 0;
1216 parallel = 0;
1219 if (linker_output)
1221 char *output_dir, *base, *name;
1222 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1224 output_dir = xstrdup (linker_output);
1225 base = output_dir;
1226 for (name = base; *name; name++)
1227 if (IS_DIR_SEPARATOR (*name))
1228 base = name + 1;
1229 *base = '\0';
1231 linker_output = &linker_output[base - output_dir];
1232 if (*output_dir == '\0')
1234 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1235 output_dir = current_dir;
1237 if (!bit_bucket)
1239 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1240 obstack_ptr_grow (&argv_obstack, output_dir);
1243 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1246 /* Remember at which point we can scrub args to re-use the commons. */
1247 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1249 if (have_offload)
1251 unsigned i, num_offload_files;
1252 char **offload_argv;
1253 FILE *f;
1255 f = fopen (offload_objects_file_name, "r");
1256 if (f == NULL)
1257 fatal_error (input_location, "cannot open %s: %m",
1258 offload_objects_file_name);
1259 if (fscanf (f, "%u ", &num_offload_files) != 1)
1260 fatal_error (input_location, "cannot read %s: %m",
1261 offload_objects_file_name);
1262 offload_argv = XCNEWVEC (char *, num_offload_files);
1264 /* Read names of object files with offload. */
1265 for (i = 0; i < num_offload_files; i++)
1267 const unsigned piece = 32;
1268 char *buf, *filename = XNEWVEC (char, piece);
1269 size_t len;
1271 buf = filename;
1272 cont1:
1273 if (!fgets (buf, piece, f))
1274 break;
1275 len = strlen (filename);
1276 if (filename[len - 1] != '\n')
1278 filename = XRESIZEVEC (char, filename, len + piece);
1279 buf = filename + len;
1280 goto cont1;
1282 filename[len - 1] = '\0';
1283 offload_argv[i] = filename;
1285 fclose (f);
1286 if (offload_argv[num_offload_files - 1] == NULL)
1287 fatal_error (input_location, "invalid format of %s",
1288 offload_objects_file_name);
1289 maybe_unlink (offload_objects_file_name);
1290 offload_objects_file_name = NULL;
1292 /* Look at saved offload options in files. */
1293 for (i = 0; i < num_offload_files; i++)
1295 char *p;
1296 long loffset;
1297 int fd, consumed;
1298 off_t file_offset = 0;
1299 char *filename = offload_argv[i];
1301 if ((p = strrchr (offload_argv[i], '@'))
1302 && p != offload_argv[i]
1303 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1304 && strlen (p) == (unsigned int) consumed)
1306 filename = XNEWVEC (char, p - offload_argv[i] + 1);
1307 memcpy (filename, offload_argv[i], p - offload_argv[i]);
1308 filename[p - offload_argv[i]] = '\0';
1309 file_offset = (off_t) loffset;
1311 fd = open (filename, O_RDONLY | O_BINARY);
1312 if (fd == -1)
1313 fatal_error (input_location, "cannot open %s: %m", filename);
1314 if (!find_and_merge_options (fd, file_offset,
1315 OFFLOAD_SECTION_NAME_PREFIX,
1316 &offload_fdecoded_options,
1317 &offload_fdecoded_options_count,
1318 collect_gcc))
1319 fatal_error (input_location, "cannot read %s: %m", filename);
1320 close (fd);
1321 if (filename != offload_argv[i])
1322 XDELETEVEC (filename);
1325 compile_images_for_offload_targets (num_offload_files, offload_argv,
1326 offload_fdecoded_options,
1327 offload_fdecoded_options_count,
1328 decoded_options,
1329 decoded_options_count);
1331 free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1333 if (offload_names)
1335 find_crtoffloadtable ();
1336 for (i = 0; offload_names[i]; i++)
1337 printf ("%s\n", offload_names[i]);
1338 free_array_of_ptrs ((void **) offload_names, i);
1342 /* If object files contain offload sections, but do not contain LTO sections,
1343 then there is no need to perform a link-time recompilation, i.e.
1344 lto-wrapper is used only for a compilation of offload images. */
1345 if (have_offload && !have_lto)
1346 goto finish;
1348 if (lto_mode == LTO_MODE_LTO)
1350 flto_out = make_temp_file (".lto.o");
1351 if (linker_output)
1352 obstack_ptr_grow (&argv_obstack, linker_output);
1353 obstack_ptr_grow (&argv_obstack, "-o");
1354 obstack_ptr_grow (&argv_obstack, flto_out);
1356 else
1358 const char *list_option = "-fltrans-output-list=";
1359 size_t list_option_len = strlen (list_option);
1360 char *tmp;
1362 if (linker_output)
1364 char *dumpbase = (char *) xmalloc (strlen (linker_output)
1365 + sizeof (".wpa") + 1);
1366 strcpy (dumpbase, linker_output);
1367 strcat (dumpbase, ".wpa");
1368 obstack_ptr_grow (&argv_obstack, dumpbase);
1371 if (linker_output && save_temps)
1373 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1374 + sizeof (".ltrans.out") + 1);
1375 strcpy (ltrans_output_file, linker_output);
1376 strcat (ltrans_output_file, ".ltrans.out");
1378 else
1380 char *prefix = NULL;
1381 if (linker_output)
1383 prefix = (char *) xmalloc (strlen (linker_output) + 2);
1384 strcpy (prefix, linker_output);
1385 strcat (prefix, ".");
1388 ltrans_output_file = make_temp_file_with_prefix (prefix,
1389 ".ltrans.out");
1390 free (prefix);
1392 list_option_full = (char *) xmalloc (sizeof (char) *
1393 (strlen (ltrans_output_file) + list_option_len + 1));
1394 tmp = list_option_full;
1396 obstack_ptr_grow (&argv_obstack, tmp);
1397 strcpy (tmp, list_option);
1398 tmp += list_option_len;
1399 strcpy (tmp, ltrans_output_file);
1401 if (jobserver)
1402 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1403 else if (parallel > 1)
1405 char buf[256];
1406 sprintf (buf, "-fwpa=%i", parallel);
1407 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1409 else
1410 obstack_ptr_grow (&argv_obstack, "-fwpa");
1413 /* Append input arguments. */
1414 for (i = 0; i < lto_argc; ++i)
1415 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1416 /* Append the input objects. */
1417 for (i = 0; i < ltoobj_argc; ++i)
1418 obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]);
1419 obstack_ptr_grow (&argv_obstack, NULL);
1421 new_argv = XOBFINISH (&argv_obstack, const char **);
1422 argv_ptr = &new_argv[new_head_argc];
1423 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1425 /* Handle early generated debug information. At compile-time
1426 we output early DWARF debug info into .gnu.debuglto_ prefixed
1427 sections. LTRANS object DWARF debug info refers to that.
1428 So we need to transfer the .gnu.debuglto_ sections to the final
1429 link. Ideally the linker plugin interface would allow us to
1430 not claim those sections and instruct the linker to keep
1431 them, renaming them in the process. For now we extract and
1432 rename those sections via a simple-object interface to produce
1433 regular objects containing only the early debug info. We
1434 then partially link those to a single early debug info object
1435 and pass that as additional output back to the linker plugin. */
1437 /* Prepare the partial link to gather the compile-time generated
1438 debug-info into a single input for the final link. */
1439 debug_obj = make_temp_file ("debugobj");
1440 obstack_ptr_grow (&argv_obstack, collect_gcc);
1441 for (i = 1; i < decoded_options_count; ++i)
1443 /* Retain linker choice and -B. */
1444 if (decoded_options[i].opt_index == OPT_B
1445 || decoded_options[i].opt_index == OPT_fuse_ld_bfd
1446 || decoded_options[i].opt_index == OPT_fuse_ld_gold)
1447 append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
1448 /* Retain all target options, this preserves -m32 for example. */
1449 if (cl_options[decoded_options[i].opt_index].flags & CL_TARGET)
1450 append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
1451 /* Recognize -g0. */
1452 if (decoded_options[i].opt_index == OPT_g
1453 && strcmp (decoded_options[i].arg, "0") == 0)
1454 skip_debug = true;
1456 obstack_ptr_grow (&argv_obstack, "-r");
1457 obstack_ptr_grow (&argv_obstack, "-nostdlib");
1458 obstack_ptr_grow (&argv_obstack, "-o");
1459 obstack_ptr_grow (&argv_obstack, debug_obj);
1461 /* Copy the early generated debug info from the objects to temporary
1462 files and append those to the partial link commandline. */
1463 n_debugobj = 0;
1464 if (! skip_debug)
1465 for (i = 0; i < ltoobj_argc; ++i)
1467 const char *tem;
1468 if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
1470 obstack_ptr_grow (&argv_obstack, tem);
1471 n_debugobj++;
1475 /* Link them all into a single object. Ideally this would reduce
1476 disk space usage mainly due to .debug_str merging but unfortunately
1477 GNU ld doesn't perform this with -r. */
1478 if (n_debugobj)
1480 obstack_ptr_grow (&argv_obstack, NULL);
1481 const char **debug_link_argv = XOBFINISH (&argv_obstack, const char **);
1482 fork_execute (debug_link_argv[0],
1483 CONST_CAST (char **, debug_link_argv), false);
1485 /* And dispose the temporaries. */
1486 for (i = 0; debug_link_argv[i]; ++i)
1488 for (--i; i > 0; --i)
1490 if (strcmp (debug_link_argv[i], debug_obj) == 0)
1491 break;
1492 maybe_unlink (debug_link_argv[i]);
1495 else
1497 unlink_if_ordinary (debug_obj);
1498 free (debug_obj);
1499 debug_obj = NULL;
1500 skip_debug = true;
1503 if (lto_mode == LTO_MODE_LTO)
1505 printf ("%s\n", flto_out);
1506 if (!skip_debug)
1508 printf ("%s\n", debug_obj);
1509 free (debug_obj);
1510 debug_obj = NULL;
1512 free (flto_out);
1513 flto_out = NULL;
1515 else
1517 FILE *stream = fopen (ltrans_output_file, "r");
1518 FILE *mstream = NULL;
1519 struct obstack env_obstack;
1520 int priority;
1522 if (!stream)
1523 fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
1525 /* Parse the list of LTRANS inputs from the WPA stage. */
1526 obstack_init (&env_obstack);
1527 nr = 0;
1528 for (;;)
1530 const unsigned piece = 32;
1531 char *output_name = NULL;
1532 char *buf, *input_name = (char *)xmalloc (piece);
1533 size_t len;
1535 buf = input_name;
1536 if (fscanf (stream, "%i\n", &priority) != 1)
1538 if (!feof (stream))
1539 fatal_error (input_location,
1540 "Corrupted ltrans output file %s",
1541 ltrans_output_file);
1542 break;
1544 cont:
1545 if (!fgets (buf, piece, stream))
1546 break;
1547 len = strlen (input_name);
1548 if (input_name[len - 1] != '\n')
1550 input_name = (char *)xrealloc (input_name, len + piece);
1551 buf = input_name + len;
1552 goto cont;
1554 input_name[len - 1] = '\0';
1556 if (input_name[0] == '*')
1557 output_name = &input_name[1];
1559 nr++;
1560 ltrans_priorities
1561 = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
1562 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1563 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1564 ltrans_priorities[(nr-1)*2] = priority;
1565 ltrans_priorities[(nr-1)*2+1] = nr-1;
1566 input_names[nr-1] = input_name;
1567 output_names[nr-1] = output_name;
1569 fclose (stream);
1570 maybe_unlink (ltrans_output_file);
1571 ltrans_output_file = NULL;
1573 if (parallel)
1575 makefile = make_temp_file (".mk");
1576 mstream = fopen (makefile, "w");
1577 qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
1580 /* Execute the LTRANS stage for each input file (or prepare a
1581 makefile to invoke this in parallel). */
1582 for (i = 0; i < nr; ++i)
1584 char *output_name;
1585 char *input_name = input_names[i];
1586 /* If it's a pass-through file do nothing. */
1587 if (output_names[i])
1588 continue;
1590 /* Replace the .o suffix with a .ltrans.o suffix and write
1591 the resulting name to the LTRANS output list. */
1592 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1593 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1594 output_name = XOBFINISH (&env_obstack, char *);
1596 /* Adjust the dumpbase if the linker output file was seen. */
1597 if (linker_output)
1599 char *dumpbase
1600 = (char *) xmalloc (strlen (linker_output)
1601 + sizeof (DUMPBASE_SUFFIX) + 1);
1602 snprintf (dumpbase,
1603 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1604 "%s.ltrans%u", linker_output, i);
1605 argv_ptr[0] = dumpbase;
1608 argv_ptr[1] = "-fltrans";
1609 argv_ptr[2] = "-o";
1610 argv_ptr[3] = output_name;
1611 argv_ptr[4] = input_name;
1612 argv_ptr[5] = NULL;
1613 if (parallel)
1615 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1616 for (j = 1; new_argv[j] != NULL; ++j)
1617 fprintf (mstream, " '%s'", new_argv[j]);
1618 fprintf (mstream, "\n");
1619 /* If we are not preserving the ltrans input files then
1620 truncate them as soon as we have processed it. This
1621 reduces temporary disk-space usage. */
1622 if (! save_temps)
1623 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1624 "&& mv %s.tem %s\n",
1625 input_name, input_name, input_name, input_name);
1627 else
1629 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1630 true);
1631 maybe_unlink (input_name);
1634 output_names[i] = output_name;
1636 if (parallel)
1638 struct pex_obj *pex;
1639 char jobs[32];
1641 fprintf (mstream, "all:");
1642 for (i = 0; i < nr; ++i)
1644 int j = ltrans_priorities[i*2 + 1];
1645 fprintf (mstream, " \\\n\t%s", output_names[j]);
1647 fprintf (mstream, "\n");
1648 fclose (mstream);
1649 if (!jobserver)
1651 /* Avoid passing --jobserver-fd= and similar flags
1652 unless jobserver mode is explicitly enabled. */
1653 putenv (xstrdup ("MAKEFLAGS="));
1654 putenv (xstrdup ("MFLAGS="));
1656 new_argv[0] = getenv ("MAKE");
1657 if (!new_argv[0])
1658 new_argv[0] = "make";
1659 new_argv[1] = "-f";
1660 new_argv[2] = makefile;
1661 i = 3;
1662 if (!jobserver)
1664 snprintf (jobs, 31, "-j%d", parallel);
1665 new_argv[i++] = jobs;
1667 new_argv[i++] = "all";
1668 new_argv[i++] = NULL;
1669 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1670 NULL, NULL, PEX_SEARCH, false);
1671 do_wait (new_argv[0], pex);
1672 maybe_unlink (makefile);
1673 makefile = NULL;
1674 for (i = 0; i < nr; ++i)
1675 maybe_unlink (input_names[i]);
1677 if (!skip_debug)
1679 printf ("%s\n", debug_obj);
1680 free (debug_obj);
1681 debug_obj = NULL;
1683 for (i = 0; i < nr; ++i)
1685 fputs (output_names[i], stdout);
1686 putc ('\n', stdout);
1687 free (input_names[i]);
1689 nr = 0;
1690 free (ltrans_priorities);
1691 free (output_names);
1692 free (input_names);
1693 free (list_option_full);
1694 obstack_free (&env_obstack, NULL);
1697 finish:
1698 XDELETE (lto_argv);
1699 obstack_free (&argv_obstack, NULL);
1703 /* Entry point. */
1706 main (int argc, char *argv[])
1708 const char *p;
1710 init_opts_obstack ();
1712 p = argv[0] + strlen (argv[0]);
1713 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1714 --p;
1715 progname = p;
1717 xmalloc_set_program_name (progname);
1719 gcc_init_libintl ();
1721 diagnostic_initialize (global_dc, 0);
1723 if (atexit (lto_wrapper_cleanup) != 0)
1724 fatal_error (input_location, "atexit failed");
1726 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1727 signal (SIGINT, fatal_signal);
1728 #ifdef SIGHUP
1729 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1730 signal (SIGHUP, fatal_signal);
1731 #endif
1732 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1733 signal (SIGTERM, fatal_signal);
1734 #ifdef SIGPIPE
1735 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1736 signal (SIGPIPE, fatal_signal);
1737 #endif
1738 #ifdef SIGCHLD
1739 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1740 receive the signal. A different setting is inheritable */
1741 signal (SIGCHLD, SIG_DFL);
1742 #endif
1744 /* We may be called with all the arguments stored in some file and
1745 passed with @file. Expand them into argv before processing. */
1746 expandargv (&argc, &argv);
1748 run_gcc (argc, argv);
1750 return 0;