compiler, runtime: call gcWriteBarrier instead of writebarrierptr
[official-gcc.git] / gcc / lto-wrapper.c
blob2b9d47e514333cb2472592ddfc21418242dd1dbd
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_deprecated:
249 case OPT_SPECIAL_program_name:
250 case OPT_SPECIAL_input_file:
251 break;
253 default:
254 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
255 break;
257 /* Fallthru. */
258 case OPT_fdiagnostics_show_caret:
259 case OPT_fdiagnostics_show_labels:
260 case OPT_fdiagnostics_show_line_numbers:
261 case OPT_fdiagnostics_show_option:
262 case OPT_fdiagnostics_show_location_:
263 case OPT_fshow_column:
264 case OPT_fcommon:
265 case OPT_fgnu_tm:
266 /* Do what the old LTO code did - collect exactly one option
267 setting per OPT code, we pick the first we encounter.
268 ??? This doesn't make too much sense, but when it doesn't
269 then we should complain. */
270 for (j = 0; j < *decoded_options_count; ++j)
271 if ((*decoded_options)[j].opt_index == foption->opt_index)
272 break;
273 if (j == *decoded_options_count)
274 append_option (decoded_options, decoded_options_count, foption);
275 break;
277 /* Figure out what PIC/PIE level wins and merge the results. */
278 case OPT_fPIC:
279 case OPT_fpic:
280 pic_option = foption;
281 break;
282 case OPT_fPIE:
283 case OPT_fpie:
284 pie_option = foption;
285 break;
287 case OPT_fopenmp:
288 case OPT_fopenacc:
289 /* For selected options we can merge conservatively. */
290 for (j = 0; j < *decoded_options_count; ++j)
291 if ((*decoded_options)[j].opt_index == foption->opt_index)
292 break;
293 if (j == *decoded_options_count)
294 append_option (decoded_options, decoded_options_count, foption);
295 /* -fopenmp > -fno-openmp,
296 -fopenacc > -fno-openacc */
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 Similarly we merge PIE options, however in addition we keep
413 -fPIC + -fPIE = -fPIE
414 -fpic + -fPIE = -fpie
415 -fPIC/-fpic + -fpie = -fpie
417 It would be good to warn on mismatches, but it is bit hard to do as
418 we do not know what nothing translates to. */
420 for (unsigned int j = 0; j < *decoded_options_count;)
421 if ((*decoded_options)[j].opt_index == OPT_fPIC
422 || (*decoded_options)[j].opt_index == OPT_fpic)
424 /* -fno-pic in one unit implies -fno-pic everywhere. */
425 if ((*decoded_options)[j].value == 0)
426 j++;
427 /* If we have no pic option or merge in -fno-pic, we still may turn
428 existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */
429 else if ((pic_option && pic_option->value == 0)
430 || !pic_option)
432 if (pie_option)
434 bool big = (*decoded_options)[j].opt_index == OPT_fPIC
435 && pie_option->opt_index == OPT_fPIE;
436 (*decoded_options)[j].opt_index = big ? OPT_fPIE : OPT_fpie;
437 if (pie_option->value)
438 (*decoded_options)[j].canonical_option[0] = big ? "-fPIE" : "-fpie";
439 else
440 (*decoded_options)[j].canonical_option[0] = big ? "-fno-pie" : "-fno-pie";
441 (*decoded_options)[j].value = pie_option->value;
442 j++;
444 else if (pic_option)
446 (*decoded_options)[j] = *pic_option;
447 j++;
449 /* We do not know if target defaults to pic or not, so just remove
450 option if it is missing in one unit but enabled in other. */
451 else
452 remove_option (decoded_options, j, decoded_options_count);
454 else if (pic_option->opt_index == OPT_fpic
455 && (*decoded_options)[j].opt_index == OPT_fPIC)
457 (*decoded_options)[j] = *pic_option;
458 j++;
460 else
461 j++;
463 else if ((*decoded_options)[j].opt_index == OPT_fPIE
464 || (*decoded_options)[j].opt_index == OPT_fpie)
466 /* -fno-pie in one unit implies -fno-pie everywhere. */
467 if ((*decoded_options)[j].value == 0)
468 j++;
469 /* If we have no pie option or merge in -fno-pie, we still preserve
470 PIE/pie if pic/PIC is present. */
471 else if ((pie_option && pie_option->value == 0)
472 || !pie_option)
474 /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */
475 if (pic_option)
477 if (pic_option->opt_index == OPT_fpic
478 && (*decoded_options)[j].opt_index == OPT_fPIE)
480 (*decoded_options)[j].opt_index = OPT_fpie;
481 (*decoded_options)[j].canonical_option[0]
482 = pic_option->value ? "-fpie" : "-fno-pie";
484 else if (!pic_option->value)
485 (*decoded_options)[j].canonical_option[0] = "-fno-pie";
486 (*decoded_options)[j].value = pic_option->value;
487 j++;
489 else if (pie_option)
491 (*decoded_options)[j] = *pie_option;
492 j++;
494 /* Because we always append pic/PIE options this code path should
495 not happen unless the LTO object was built by old lto1 which
496 did not contain that logic yet. */
497 else
498 remove_option (decoded_options, j, decoded_options_count);
500 else if (pie_option->opt_index == OPT_fpie
501 && (*decoded_options)[j].opt_index == OPT_fPIE)
503 (*decoded_options)[j] = *pie_option;
504 j++;
506 else
507 j++;
509 else
510 j++;
513 /* Auxiliary function that frees elements of PTR and PTR itself.
514 N is number of elements to be freed. If PTR is NULL, nothing is freed.
515 If an element is NULL, subsequent elements are not freed. */
517 static void **
518 free_array_of_ptrs (void **ptr, unsigned n)
520 if (!ptr)
521 return NULL;
522 for (unsigned i = 0; i < n; i++)
524 if (!ptr[i])
525 break;
526 free (ptr[i]);
528 free (ptr);
529 return NULL;
532 /* Parse STR, saving found tokens into PVALUES and return their number.
533 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
534 append it to every token we find. */
536 static unsigned
537 parse_env_var (const char *str, char ***pvalues, const char *append)
539 const char *curval, *nextval;
540 char **values;
541 unsigned num = 1, i;
543 curval = strchr (str, ':');
544 while (curval)
546 num++;
547 curval = strchr (curval + 1, ':');
550 values = (char**) xmalloc (num * sizeof (char*));
551 curval = str;
552 nextval = strchr (curval, ':');
553 if (nextval == NULL)
554 nextval = strchr (curval, '\0');
556 int append_len = append ? strlen (append) : 0;
557 for (i = 0; i < num; i++)
559 int l = nextval - curval;
560 values[i] = (char*) xmalloc (l + 1 + append_len);
561 memcpy (values[i], curval, l);
562 values[i][l] = 0;
563 if (append)
564 strcat (values[i], append);
565 curval = nextval + 1;
566 nextval = strchr (curval, ':');
567 if (nextval == NULL)
568 nextval = strchr (curval, '\0');
570 *pvalues = values;
571 return num;
574 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
576 static void
577 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
578 unsigned int count)
580 /* Append compiler driver arguments as far as they were merged. */
581 for (unsigned int j = 1; j < count; ++j)
583 struct cl_decoded_option *option = &opts[j];
585 /* File options have been properly filtered by lto-opts.c. */
586 switch (option->opt_index)
588 /* Drop arguments that we want to take from the link line. */
589 case OPT_flto_:
590 case OPT_flto:
591 case OPT_flto_partition_:
592 continue;
594 default:
595 break;
598 /* For now do what the original LTO option code was doing - pass
599 on any CL_TARGET flag and a few selected others. */
600 switch (option->opt_index)
602 case OPT_fdiagnostics_show_caret:
603 case OPT_fdiagnostics_show_labels:
604 case OPT_fdiagnostics_show_line_numbers:
605 case OPT_fdiagnostics_show_option:
606 case OPT_fdiagnostics_show_location_:
607 case OPT_fshow_column:
608 case OPT_fPIC:
609 case OPT_fpic:
610 case OPT_fPIE:
611 case OPT_fpie:
612 case OPT_fcommon:
613 case OPT_fgnu_tm:
614 case OPT_fopenmp:
615 case OPT_fopenacc:
616 case OPT_fopenacc_dim_:
617 case OPT_foffload_abi_:
618 case OPT_O:
619 case OPT_Ofast:
620 case OPT_Og:
621 case OPT_Os:
622 break;
624 default:
625 if (!(cl_options[option->opt_index].flags & CL_TARGET))
626 continue;
629 /* Pass the option on. */
630 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
631 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
635 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
637 static void
638 append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts,
639 unsigned int count)
641 /* Append compiler driver arguments as far as they were merged. */
642 for (unsigned int j = 1; j < count; ++j)
644 struct cl_decoded_option *option = &opts[j];
646 switch (option->opt_index)
648 case OPT_fdiagnostics_color_:
649 case OPT_fdiagnostics_show_caret:
650 case OPT_fdiagnostics_show_labels:
651 case OPT_fdiagnostics_show_line_numbers:
652 case OPT_fdiagnostics_show_option:
653 case OPT_fdiagnostics_show_location_:
654 case OPT_fshow_column:
655 break;
656 default:
657 continue;
660 /* Pass the option on. */
661 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
662 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
667 /* Append linker options OPTS to ARGV_OBSTACK. */
669 static void
670 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
671 unsigned int count)
673 /* Append linker driver arguments. Compiler options from the linker
674 driver arguments will override / merge with those from the compiler. */
675 for (unsigned int j = 1; j < count; ++j)
677 struct cl_decoded_option *option = &opts[j];
679 /* Do not pass on frontend specific flags not suitable for lto. */
680 if (!(cl_options[option->opt_index].flags
681 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
682 continue;
684 switch (option->opt_index)
686 case OPT_o:
687 case OPT_flto_:
688 case OPT_flto:
689 /* We've handled these LTO options, do not pass them on. */
690 continue;
692 case OPT_fopenmp:
693 case OPT_fopenacc:
694 /* Ignore -fno-XXX form of these options, as otherwise
695 corresponding builtins will not be enabled. */
696 if (option->value == 0)
697 continue;
698 break;
700 default:
701 break;
704 /* Pass the option on. */
705 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
706 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
710 /* Extract options for TARGET offload compiler from OPTIONS and append
711 them to ARGV_OBSTACK. */
713 static void
714 append_offload_options (obstack *argv_obstack, const char *target,
715 struct cl_decoded_option *options,
716 unsigned int options_count)
718 for (unsigned i = 0; i < options_count; i++)
720 const char *cur, *next, *opts;
721 char **argv;
722 unsigned argc;
723 struct cl_decoded_option *option = &options[i];
725 if (option->opt_index != OPT_foffload_)
726 continue;
728 /* If option argument starts with '-' then no target is specified. That
729 means offload options are specified for all targets, so we need to
730 append them. */
731 if (option->arg[0] == '-')
732 opts = option->arg;
733 else
735 opts = strchr (option->arg, '=');
736 /* If there are offload targets specified, but no actual options,
737 there is nothing to do here. */
738 if (!opts)
739 continue;
741 cur = option->arg;
743 while (cur < opts)
745 next = strchr (cur, ',');
746 if (next == NULL)
747 next = opts;
748 next = (next > opts) ? opts : next;
750 /* Are we looking for this offload target? */
751 if (strlen (target) == (size_t) (next - cur)
752 && strncmp (target, cur, next - cur) == 0)
753 break;
755 /* Skip the comma or equal sign. */
756 cur = next + 1;
759 if (cur >= opts)
760 continue;
762 opts++;
765 argv = buildargv (opts);
766 for (argc = 0; argv[argc]; argc++)
767 obstack_ptr_grow (argv_obstack, argv[argc]);
771 /* Check whether NAME can be accessed in MODE. This is like access,
772 except that it never considers directories to be executable. */
774 static int
775 access_check (const char *name, int mode)
777 if (mode == X_OK)
779 struct stat st;
781 if (stat (name, &st) < 0
782 || S_ISDIR (st.st_mode))
783 return -1;
786 return access (name, mode);
789 /* Prepare a target image for offload TARGET, using mkoffload tool from
790 COMPILER_PATH. Return the name of the resultant object file. */
792 static char *
793 compile_offload_image (const char *target, const char *compiler_path,
794 unsigned in_argc, char *in_argv[],
795 struct cl_decoded_option *compiler_opts,
796 unsigned int compiler_opt_count,
797 struct cl_decoded_option *linker_opts,
798 unsigned int linker_opt_count)
800 char *filename = NULL;
801 char **argv;
802 char *suffix
803 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
804 strcpy (suffix, "/accel/");
805 strcat (suffix, target);
806 strcat (suffix, "/mkoffload");
808 char **paths = NULL;
809 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
811 const char *compiler = NULL;
812 for (unsigned i = 0; i < n_paths; i++)
813 if (access_check (paths[i], X_OK) == 0)
815 compiler = paths[i];
816 break;
819 if (!compiler)
820 fatal_error (input_location,
821 "could not find %s in %s (consider using '-B')\n", suffix + 1,
822 compiler_path);
824 /* Generate temporary output file name. */
825 filename = make_temp_file (".target.o");
827 struct obstack argv_obstack;
828 obstack_init (&argv_obstack);
829 obstack_ptr_grow (&argv_obstack, compiler);
830 if (save_temps)
831 obstack_ptr_grow (&argv_obstack, "-save-temps");
832 if (verbose)
833 obstack_ptr_grow (&argv_obstack, "-v");
834 obstack_ptr_grow (&argv_obstack, "-o");
835 obstack_ptr_grow (&argv_obstack, filename);
837 /* Append names of input object files. */
838 for (unsigned i = 0; i < in_argc; i++)
839 obstack_ptr_grow (&argv_obstack, in_argv[i]);
841 /* Append options from offload_lto sections. */
842 append_compiler_options (&argv_obstack, compiler_opts,
843 compiler_opt_count);
844 append_diag_options (&argv_obstack, linker_opts, linker_opt_count);
846 /* Append options specified by -foffload last. In case of conflicting
847 options we expect offload compiler to choose the latest. */
848 append_offload_options (&argv_obstack, target, compiler_opts,
849 compiler_opt_count);
850 append_offload_options (&argv_obstack, target, linker_opts,
851 linker_opt_count);
853 obstack_ptr_grow (&argv_obstack, NULL);
854 argv = XOBFINISH (&argv_obstack, char **);
855 fork_execute (argv[0], argv, true);
856 obstack_free (&argv_obstack, NULL);
858 free_array_of_ptrs ((void **) paths, n_paths);
859 return filename;
863 /* The main routine dealing with offloading.
864 The routine builds a target image for each offload target. IN_ARGC and
865 IN_ARGV specify options and input object files. As all of them could contain
866 target sections, we pass them all to target compilers. */
868 static void
869 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
870 struct cl_decoded_option *compiler_opts,
871 unsigned int compiler_opt_count,
872 struct cl_decoded_option *linker_opts,
873 unsigned int linker_opt_count)
875 char **names = NULL;
876 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
877 if (!target_names)
878 return;
879 unsigned num_targets = parse_env_var (target_names, &names, NULL);
881 int next_name_entry = 0;
882 const char *compiler_path = getenv ("COMPILER_PATH");
883 if (!compiler_path)
884 goto out;
886 /* Prepare an image for each target and save the name of the resultant object
887 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
888 offload_names = XCNEWVEC (char *, num_targets + 1);
889 for (unsigned i = 0; i < num_targets; i++)
891 /* HSA does not use LTO-like streaming and a different compiler, skip
892 it. */
893 if (strcmp (names[i], "hsa") == 0)
894 continue;
896 offload_names[next_name_entry]
897 = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
898 compiler_opts, compiler_opt_count,
899 linker_opts, linker_opt_count);
900 if (!offload_names[next_name_entry])
901 fatal_error (input_location,
902 "problem with building target image for %s\n", names[i]);
903 next_name_entry++;
906 out:
907 free_array_of_ptrs ((void **) names, num_targets);
910 /* Copy a file from SRC to DEST. */
912 static void
913 copy_file (const char *dest, const char *src)
915 FILE *d = fopen (dest, "wb");
916 FILE *s = fopen (src, "rb");
917 char buffer[512];
918 while (!feof (s))
920 size_t len = fread (buffer, 1, 512, s);
921 if (ferror (s) != 0)
922 fatal_error (input_location, "reading input file");
923 if (len > 0)
925 fwrite (buffer, 1, len, d);
926 if (ferror (d) != 0)
927 fatal_error (input_location, "writing output file");
930 fclose (d);
931 fclose (s);
934 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
935 the copy to the linker. */
937 static void
938 find_crtoffloadtable (void)
940 char **paths = NULL;
941 const char *library_path = getenv ("LIBRARY_PATH");
942 if (!library_path)
943 return;
944 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
946 unsigned i;
947 for (i = 0; i < n_paths; i++)
948 if (access_check (paths[i], R_OK) == 0)
950 /* The linker will delete the filename we give it, so make a copy. */
951 char *crtoffloadtable = make_temp_file (".crtoffloadtable.o");
952 copy_file (crtoffloadtable, paths[i]);
953 printf ("%s\n", crtoffloadtable);
954 XDELETEVEC (crtoffloadtable);
955 break;
957 if (i == n_paths)
958 fatal_error (input_location,
959 "installation error, can't find crtoffloadtable.o");
961 free_array_of_ptrs ((void **) paths, n_paths);
964 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
965 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
966 and OPT_COUNT. Return true if we found a matchingn section, false
967 otherwise. COLLECT_GCC holds the value of the environment variable with
968 the same name. */
970 static bool
971 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
972 struct cl_decoded_option **opts,
973 unsigned int *opt_count, const char *collect_gcc)
975 off_t offset, length;
976 char *data;
977 char *fopts;
978 const char *errmsg;
979 int err;
980 struct cl_decoded_option *fdecoded_options = *opts;
981 unsigned int fdecoded_options_count = *opt_count;
983 simple_object_read *sobj;
984 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
985 &errmsg, &err);
986 if (!sobj)
987 return false;
989 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
990 strcpy (secname, prefix);
991 strcat (secname, ".opts");
992 if (!simple_object_find_section (sobj, secname, &offset, &length,
993 &errmsg, &err))
995 simple_object_release_read (sobj);
996 return false;
999 lseek (fd, file_offset + offset, SEEK_SET);
1000 data = (char *)xmalloc (length);
1001 read (fd, data, length);
1002 fopts = data;
1005 struct cl_decoded_option *f2decoded_options;
1006 unsigned int f2decoded_options_count;
1007 get_options_from_collect_gcc_options (collect_gcc,
1008 fopts, CL_LANG_ALL,
1009 &f2decoded_options,
1010 &f2decoded_options_count);
1011 if (!fdecoded_options)
1013 fdecoded_options = f2decoded_options;
1014 fdecoded_options_count = f2decoded_options_count;
1016 else
1017 merge_and_complain (&fdecoded_options,
1018 &fdecoded_options_count,
1019 f2decoded_options, f2decoded_options_count);
1021 fopts += strlen (fopts) + 1;
1023 while (fopts - data < length);
1025 free (data);
1026 simple_object_release_read (sobj);
1027 *opts = fdecoded_options;
1028 *opt_count = fdecoded_options_count;
1029 return true;
1032 /* Copy early debug info sections from INFILE to a new file whose name
1033 is returned. Return NULL on error. */
1035 const char *
1036 debug_objcopy (const char *infile, bool rename)
1038 const char *outfile;
1039 const char *errmsg;
1040 int err;
1042 const char *p;
1043 off_t inoff = 0;
1044 long loffset;
1045 int consumed;
1046 if ((p = strrchr (infile, '@'))
1047 && p != infile
1048 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1049 && strlen (p) == (unsigned int) consumed)
1051 char *fname = xstrdup (infile);
1052 fname[p - infile] = '\0';
1053 infile = fname;
1054 inoff = (off_t) loffset;
1056 int infd = open (infile, O_RDONLY | O_BINARY);
1057 if (infd == -1)
1058 return NULL;
1059 simple_object_read *inobj = simple_object_start_read (infd, inoff,
1060 "__GNU_LTO",
1061 &errmsg, &err);
1062 if (!inobj)
1063 return NULL;
1065 off_t off, len;
1066 if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info",
1067 &off, &len, &errmsg, &err) != 1)
1069 if (errmsg)
1070 fatal_error (0, "%s: %s\n", errmsg, xstrerror (err));
1072 simple_object_release_read (inobj);
1073 close (infd);
1074 return NULL;
1077 outfile = make_temp_file ("debugobjtem");
1078 errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
1079 if (errmsg)
1081 unlink_if_ordinary (outfile);
1082 fatal_error (0, "%s: %s\n", errmsg, xstrerror (err));
1085 simple_object_release_read (inobj);
1086 close (infd);
1088 return outfile;
1091 /* Helper for qsort: compare priorities for parallel compilation. */
1094 cmp_priority (const void *a, const void *b)
1096 return *((const int *)b)-*((const int *)a);
1100 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1102 static void
1103 run_gcc (unsigned argc, char *argv[])
1105 unsigned i, j;
1106 const char **new_argv;
1107 const char **argv_ptr;
1108 char *list_option_full = NULL;
1109 const char *linker_output = NULL;
1110 const char *collect_gcc, *collect_gcc_options;
1111 int parallel = 0;
1112 int jobserver = 0;
1113 bool no_partition = false;
1114 struct cl_decoded_option *fdecoded_options = NULL;
1115 struct cl_decoded_option *offload_fdecoded_options = NULL;
1116 unsigned int fdecoded_options_count = 0;
1117 unsigned int offload_fdecoded_options_count = 0;
1118 struct cl_decoded_option *decoded_options;
1119 unsigned int decoded_options_count;
1120 struct obstack argv_obstack;
1121 int new_head_argc;
1122 bool have_lto = false;
1123 bool have_offload = false;
1124 unsigned lto_argc = 0, ltoobj_argc = 0;
1125 char **lto_argv, **ltoobj_argv;
1126 bool linker_output_rel = false;
1127 bool skip_debug = false;
1128 unsigned n_debugobj;
1130 /* Get the driver and options. */
1131 collect_gcc = getenv ("COLLECT_GCC");
1132 if (!collect_gcc)
1133 fatal_error (input_location,
1134 "environment variable COLLECT_GCC must be set");
1135 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1136 if (!collect_gcc_options)
1137 fatal_error (input_location,
1138 "environment variable COLLECT_GCC_OPTIONS must be set");
1139 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
1140 CL_LANG_ALL,
1141 &decoded_options,
1142 &decoded_options_count);
1144 /* Allocate array for input object files with LTO IL,
1145 and for possible preceding arguments. */
1146 lto_argv = XNEWVEC (char *, argc);
1147 ltoobj_argv = XNEWVEC (char *, argc);
1149 /* Look at saved options in the IL files. */
1150 for (i = 1; i < argc; ++i)
1152 char *p;
1153 int fd;
1154 off_t file_offset = 0;
1155 long loffset;
1156 int consumed;
1157 char *filename = argv[i];
1159 if (strncmp (argv[i], "-foffload-objects=",
1160 sizeof ("-foffload-objects=") - 1) == 0)
1162 have_offload = true;
1163 offload_objects_file_name
1164 = argv[i] + sizeof ("-foffload-objects=") - 1;
1165 continue;
1168 if ((p = strrchr (argv[i], '@'))
1169 && p != argv[i]
1170 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1171 && strlen (p) == (unsigned int) consumed)
1173 filename = XNEWVEC (char, p - argv[i] + 1);
1174 memcpy (filename, argv[i], p - argv[i]);
1175 filename[p - argv[i]] = '\0';
1176 file_offset = (off_t) loffset;
1178 fd = open (filename, O_RDONLY | O_BINARY);
1179 /* Linker plugin passes -fresolution and -flinker-output options.
1180 -flinker-output is passed only when user did not specify one and thus
1181 we do not need to worry about duplicities with the option handling
1182 below. */
1183 if (fd == -1)
1185 lto_argv[lto_argc++] = argv[i];
1186 if (strcmp (argv[i], "-flinker-output=rel") == 0)
1187 linker_output_rel = true;
1188 continue;
1191 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1192 &fdecoded_options, &fdecoded_options_count,
1193 collect_gcc))
1195 have_lto = true;
1196 ltoobj_argv[ltoobj_argc++] = argv[i];
1198 close (fd);
1201 /* Initalize the common arguments for the driver. */
1202 obstack_init (&argv_obstack);
1203 obstack_ptr_grow (&argv_obstack, collect_gcc);
1204 obstack_ptr_grow (&argv_obstack, "-xlto");
1205 obstack_ptr_grow (&argv_obstack, "-c");
1207 append_compiler_options (&argv_obstack, fdecoded_options,
1208 fdecoded_options_count);
1209 append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
1211 /* Scan linker driver arguments for things that are of relevance to us. */
1212 for (j = 1; j < decoded_options_count; ++j)
1214 struct cl_decoded_option *option = &decoded_options[j];
1215 switch (option->opt_index)
1217 case OPT_o:
1218 linker_output = option->arg;
1219 break;
1221 case OPT_save_temps:
1222 save_temps = 1;
1223 break;
1225 case OPT_v:
1226 verbose = 1;
1227 break;
1229 case OPT_flto_partition_:
1230 if (strcmp (option->arg, "none") == 0)
1231 no_partition = true;
1232 break;
1234 case OPT_flto_:
1235 if (strcmp (option->arg, "jobserver") == 0)
1237 jobserver = 1;
1238 parallel = 1;
1240 else
1242 parallel = atoi (option->arg);
1243 if (parallel <= 1)
1244 parallel = 0;
1246 /* Fallthru. */
1248 case OPT_flto:
1249 lto_mode = LTO_MODE_WHOPR;
1250 break;
1252 case OPT_flinker_output_:
1253 linker_output_rel = !strcmp (option->arg, "rel");
1254 break;
1257 default:
1258 break;
1262 /* Output lto-wrapper invocation command. */
1263 if (verbose)
1265 for (i = 0; i < argc; ++i)
1267 fputs (argv[i], stderr);
1268 fputc (' ', stderr);
1270 fputc ('\n', stderr);
1273 if (linker_output_rel)
1274 no_partition = true;
1276 if (no_partition)
1278 lto_mode = LTO_MODE_LTO;
1279 jobserver = 0;
1280 parallel = 0;
1283 if (linker_output)
1285 char *output_dir, *base, *name;
1286 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1288 output_dir = xstrdup (linker_output);
1289 base = output_dir;
1290 for (name = base; *name; name++)
1291 if (IS_DIR_SEPARATOR (*name))
1292 base = name + 1;
1293 *base = '\0';
1295 linker_output = &linker_output[base - output_dir];
1296 if (*output_dir == '\0')
1298 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1299 output_dir = current_dir;
1301 if (!bit_bucket)
1303 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1304 obstack_ptr_grow (&argv_obstack, output_dir);
1307 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1310 /* Remember at which point we can scrub args to re-use the commons. */
1311 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1313 if (have_offload)
1315 unsigned i, num_offload_files;
1316 char **offload_argv;
1317 FILE *f;
1319 f = fopen (offload_objects_file_name, "r");
1320 if (f == NULL)
1321 fatal_error (input_location, "cannot open %s: %m",
1322 offload_objects_file_name);
1323 if (fscanf (f, "%u ", &num_offload_files) != 1)
1324 fatal_error (input_location, "cannot read %s: %m",
1325 offload_objects_file_name);
1326 offload_argv = XCNEWVEC (char *, num_offload_files);
1328 /* Read names of object files with offload. */
1329 for (i = 0; i < num_offload_files; i++)
1331 const unsigned piece = 32;
1332 char *buf, *filename = XNEWVEC (char, piece);
1333 size_t len;
1335 buf = filename;
1336 cont1:
1337 if (!fgets (buf, piece, f))
1338 break;
1339 len = strlen (filename);
1340 if (filename[len - 1] != '\n')
1342 filename = XRESIZEVEC (char, filename, len + piece);
1343 buf = filename + len;
1344 goto cont1;
1346 filename[len - 1] = '\0';
1347 offload_argv[i] = filename;
1349 fclose (f);
1350 if (offload_argv[num_offload_files - 1] == NULL)
1351 fatal_error (input_location, "invalid format of %s",
1352 offload_objects_file_name);
1353 maybe_unlink (offload_objects_file_name);
1354 offload_objects_file_name = NULL;
1356 /* Look at saved offload options in files. */
1357 for (i = 0; i < num_offload_files; i++)
1359 char *p;
1360 long loffset;
1361 int fd, consumed;
1362 off_t file_offset = 0;
1363 char *filename = offload_argv[i];
1365 if ((p = strrchr (offload_argv[i], '@'))
1366 && p != offload_argv[i]
1367 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1368 && strlen (p) == (unsigned int) consumed)
1370 filename = XNEWVEC (char, p - offload_argv[i] + 1);
1371 memcpy (filename, offload_argv[i], p - offload_argv[i]);
1372 filename[p - offload_argv[i]] = '\0';
1373 file_offset = (off_t) loffset;
1375 fd = open (filename, O_RDONLY | O_BINARY);
1376 if (fd == -1)
1377 fatal_error (input_location, "cannot open %s: %m", filename);
1378 if (!find_and_merge_options (fd, file_offset,
1379 OFFLOAD_SECTION_NAME_PREFIX,
1380 &offload_fdecoded_options,
1381 &offload_fdecoded_options_count,
1382 collect_gcc))
1383 fatal_error (input_location, "cannot read %s: %m", filename);
1384 close (fd);
1385 if (filename != offload_argv[i])
1386 XDELETEVEC (filename);
1389 compile_images_for_offload_targets (num_offload_files, offload_argv,
1390 offload_fdecoded_options,
1391 offload_fdecoded_options_count,
1392 decoded_options,
1393 decoded_options_count);
1395 free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1397 if (offload_names)
1399 find_crtoffloadtable ();
1400 for (i = 0; offload_names[i]; i++)
1401 printf ("%s\n", offload_names[i]);
1402 free_array_of_ptrs ((void **) offload_names, i);
1406 /* If object files contain offload sections, but do not contain LTO sections,
1407 then there is no need to perform a link-time recompilation, i.e.
1408 lto-wrapper is used only for a compilation of offload images. */
1409 if (have_offload && !have_lto)
1410 goto finish;
1412 if (lto_mode == LTO_MODE_LTO)
1414 flto_out = make_temp_file (".lto.o");
1415 if (linker_output)
1416 obstack_ptr_grow (&argv_obstack, linker_output);
1417 obstack_ptr_grow (&argv_obstack, "-o");
1418 obstack_ptr_grow (&argv_obstack, flto_out);
1420 else
1422 const char *list_option = "-fltrans-output-list=";
1423 size_t list_option_len = strlen (list_option);
1424 char *tmp;
1426 if (linker_output)
1428 char *dumpbase = (char *) xmalloc (strlen (linker_output)
1429 + sizeof (".wpa") + 1);
1430 strcpy (dumpbase, linker_output);
1431 strcat (dumpbase, ".wpa");
1432 obstack_ptr_grow (&argv_obstack, dumpbase);
1435 if (linker_output && save_temps)
1437 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1438 + sizeof (".ltrans.out") + 1);
1439 strcpy (ltrans_output_file, linker_output);
1440 strcat (ltrans_output_file, ".ltrans.out");
1442 else
1444 char *prefix = NULL;
1445 if (linker_output)
1447 prefix = (char *) xmalloc (strlen (linker_output) + 2);
1448 strcpy (prefix, linker_output);
1449 strcat (prefix, ".");
1452 ltrans_output_file = make_temp_file_with_prefix (prefix,
1453 ".ltrans.out");
1454 free (prefix);
1456 list_option_full = (char *) xmalloc (sizeof (char) *
1457 (strlen (ltrans_output_file) + list_option_len + 1));
1458 tmp = list_option_full;
1460 obstack_ptr_grow (&argv_obstack, tmp);
1461 strcpy (tmp, list_option);
1462 tmp += list_option_len;
1463 strcpy (tmp, ltrans_output_file);
1465 if (jobserver)
1466 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1467 else if (parallel > 1)
1469 char buf[256];
1470 sprintf (buf, "-fwpa=%i", parallel);
1471 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1473 else
1474 obstack_ptr_grow (&argv_obstack, "-fwpa");
1477 /* Append input arguments. */
1478 for (i = 0; i < lto_argc; ++i)
1479 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1480 /* Append the input objects. */
1481 for (i = 0; i < ltoobj_argc; ++i)
1482 obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]);
1483 obstack_ptr_grow (&argv_obstack, NULL);
1485 new_argv = XOBFINISH (&argv_obstack, const char **);
1486 argv_ptr = &new_argv[new_head_argc];
1487 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1489 /* Handle early generated debug information. At compile-time
1490 we output early DWARF debug info into .gnu.debuglto_ prefixed
1491 sections. LTRANS object DWARF debug info refers to that.
1492 So we need to transfer the .gnu.debuglto_ sections to the final
1493 link. Ideally the linker plugin interface would allow us to
1494 not claim those sections and instruct the linker to keep
1495 them, renaming them in the process. For now we extract and
1496 rename those sections via a simple-object interface to produce
1497 regular objects containing only the early debug info. We
1498 then partially link those to a single early debug info object
1499 and pass that as additional output back to the linker plugin. */
1501 /* Prepare the partial link to gather the compile-time generated
1502 debug-info into a single input for the final link. */
1503 debug_obj = make_temp_file ("debugobj");
1504 obstack_ptr_grow (&argv_obstack, collect_gcc);
1505 for (i = 1; i < decoded_options_count; ++i)
1507 /* Retain linker choice and -B. */
1508 if (decoded_options[i].opt_index == OPT_B
1509 || decoded_options[i].opt_index == OPT_fuse_ld_bfd
1510 || decoded_options[i].opt_index == OPT_fuse_ld_gold)
1511 append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
1512 /* Retain all target options, this preserves -m32 for example. */
1513 if (cl_options[decoded_options[i].opt_index].flags & CL_TARGET)
1514 append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
1515 /* Recognize -g0. */
1516 if (decoded_options[i].opt_index == OPT_g
1517 && strcmp (decoded_options[i].arg, "0") == 0)
1518 skip_debug = true;
1520 obstack_ptr_grow (&argv_obstack, "-r");
1521 obstack_ptr_grow (&argv_obstack, "-nostdlib");
1522 obstack_ptr_grow (&argv_obstack, "-o");
1523 obstack_ptr_grow (&argv_obstack, debug_obj);
1525 /* Copy the early generated debug info from the objects to temporary
1526 files and append those to the partial link commandline. */
1527 n_debugobj = 0;
1528 if (! skip_debug)
1529 for (i = 0; i < ltoobj_argc; ++i)
1531 const char *tem;
1532 if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
1534 obstack_ptr_grow (&argv_obstack, tem);
1535 n_debugobj++;
1539 /* Link them all into a single object. Ideally this would reduce
1540 disk space usage mainly due to .debug_str merging but unfortunately
1541 GNU ld doesn't perform this with -r. */
1542 if (n_debugobj)
1544 obstack_ptr_grow (&argv_obstack, NULL);
1545 const char **debug_link_argv = XOBFINISH (&argv_obstack, const char **);
1546 fork_execute (debug_link_argv[0],
1547 CONST_CAST (char **, debug_link_argv), false);
1549 /* And dispose the temporaries. */
1550 for (i = 0; debug_link_argv[i]; ++i)
1552 for (--i; i > 0; --i)
1554 if (strcmp (debug_link_argv[i], debug_obj) == 0)
1555 break;
1556 maybe_unlink (debug_link_argv[i]);
1559 else
1561 unlink_if_ordinary (debug_obj);
1562 free (debug_obj);
1563 debug_obj = NULL;
1564 skip_debug = true;
1567 if (lto_mode == LTO_MODE_LTO)
1569 printf ("%s\n", flto_out);
1570 if (!skip_debug)
1572 printf ("%s\n", debug_obj);
1573 free (debug_obj);
1574 debug_obj = NULL;
1576 free (flto_out);
1577 flto_out = NULL;
1579 else
1581 FILE *stream = fopen (ltrans_output_file, "r");
1582 FILE *mstream = NULL;
1583 struct obstack env_obstack;
1584 int priority;
1586 if (!stream)
1587 fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
1589 /* Parse the list of LTRANS inputs from the WPA stage. */
1590 obstack_init (&env_obstack);
1591 nr = 0;
1592 for (;;)
1594 const unsigned piece = 32;
1595 char *output_name = NULL;
1596 char *buf, *input_name = (char *)xmalloc (piece);
1597 size_t len;
1599 buf = input_name;
1600 if (fscanf (stream, "%i\n", &priority) != 1)
1602 if (!feof (stream))
1603 fatal_error (input_location,
1604 "Corrupted ltrans output file %s",
1605 ltrans_output_file);
1606 break;
1608 cont:
1609 if (!fgets (buf, piece, stream))
1610 break;
1611 len = strlen (input_name);
1612 if (input_name[len - 1] != '\n')
1614 input_name = (char *)xrealloc (input_name, len + piece);
1615 buf = input_name + len;
1616 goto cont;
1618 input_name[len - 1] = '\0';
1620 if (input_name[0] == '*')
1621 output_name = &input_name[1];
1623 nr++;
1624 ltrans_priorities
1625 = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
1626 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1627 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1628 ltrans_priorities[(nr-1)*2] = priority;
1629 ltrans_priorities[(nr-1)*2+1] = nr-1;
1630 input_names[nr-1] = input_name;
1631 output_names[nr-1] = output_name;
1633 fclose (stream);
1634 maybe_unlink (ltrans_output_file);
1635 ltrans_output_file = NULL;
1637 if (parallel)
1639 makefile = make_temp_file (".mk");
1640 mstream = fopen (makefile, "w");
1641 qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
1644 /* Execute the LTRANS stage for each input file (or prepare a
1645 makefile to invoke this in parallel). */
1646 for (i = 0; i < nr; ++i)
1648 char *output_name;
1649 char *input_name = input_names[i];
1650 /* If it's a pass-through file do nothing. */
1651 if (output_names[i])
1652 continue;
1654 /* Replace the .o suffix with a .ltrans.o suffix and write
1655 the resulting name to the LTRANS output list. */
1656 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1657 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1658 output_name = XOBFINISH (&env_obstack, char *);
1660 /* Adjust the dumpbase if the linker output file was seen. */
1661 if (linker_output)
1663 char *dumpbase
1664 = (char *) xmalloc (strlen (linker_output)
1665 + sizeof (DUMPBASE_SUFFIX) + 1);
1666 snprintf (dumpbase,
1667 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1668 "%s.ltrans%u", linker_output, i);
1669 argv_ptr[0] = dumpbase;
1672 argv_ptr[1] = "-fltrans";
1673 argv_ptr[2] = "-o";
1674 argv_ptr[3] = output_name;
1675 argv_ptr[4] = input_name;
1676 argv_ptr[5] = NULL;
1677 if (parallel)
1679 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1680 for (j = 1; new_argv[j] != NULL; ++j)
1681 fprintf (mstream, " '%s'", new_argv[j]);
1682 fprintf (mstream, "\n");
1683 /* If we are not preserving the ltrans input files then
1684 truncate them as soon as we have processed it. This
1685 reduces temporary disk-space usage. */
1686 if (! save_temps)
1687 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1688 "&& mv %s.tem %s\n",
1689 input_name, input_name, input_name, input_name);
1691 else
1693 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1694 true);
1695 maybe_unlink (input_name);
1698 output_names[i] = output_name;
1700 if (parallel)
1702 struct pex_obj *pex;
1703 char jobs[32];
1705 fprintf (mstream, "all:");
1706 for (i = 0; i < nr; ++i)
1708 int j = ltrans_priorities[i*2 + 1];
1709 fprintf (mstream, " \\\n\t%s", output_names[j]);
1711 fprintf (mstream, "\n");
1712 fclose (mstream);
1713 if (!jobserver)
1715 /* Avoid passing --jobserver-fd= and similar flags
1716 unless jobserver mode is explicitly enabled. */
1717 putenv (xstrdup ("MAKEFLAGS="));
1718 putenv (xstrdup ("MFLAGS="));
1720 new_argv[0] = getenv ("MAKE");
1721 if (!new_argv[0])
1722 new_argv[0] = "make";
1723 new_argv[1] = "-f";
1724 new_argv[2] = makefile;
1725 i = 3;
1726 if (!jobserver)
1728 snprintf (jobs, 31, "-j%d", parallel);
1729 new_argv[i++] = jobs;
1731 new_argv[i++] = "all";
1732 new_argv[i++] = NULL;
1733 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1734 NULL, NULL, PEX_SEARCH, false);
1735 do_wait (new_argv[0], pex);
1736 maybe_unlink (makefile);
1737 makefile = NULL;
1738 for (i = 0; i < nr; ++i)
1739 maybe_unlink (input_names[i]);
1741 if (!skip_debug)
1743 printf ("%s\n", debug_obj);
1744 free (debug_obj);
1745 debug_obj = NULL;
1747 for (i = 0; i < nr; ++i)
1749 fputs (output_names[i], stdout);
1750 putc ('\n', stdout);
1751 free (input_names[i]);
1753 nr = 0;
1754 free (ltrans_priorities);
1755 free (output_names);
1756 free (input_names);
1757 free (list_option_full);
1758 obstack_free (&env_obstack, NULL);
1761 finish:
1762 XDELETE (lto_argv);
1763 obstack_free (&argv_obstack, NULL);
1767 /* Entry point. */
1770 main (int argc, char *argv[])
1772 const char *p;
1774 init_opts_obstack ();
1776 p = argv[0] + strlen (argv[0]);
1777 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1778 --p;
1779 progname = p;
1781 xmalloc_set_program_name (progname);
1783 gcc_init_libintl ();
1785 diagnostic_initialize (global_dc, 0);
1787 if (atexit (lto_wrapper_cleanup) != 0)
1788 fatal_error (input_location, "atexit failed");
1790 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1791 signal (SIGINT, fatal_signal);
1792 #ifdef SIGHUP
1793 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1794 signal (SIGHUP, fatal_signal);
1795 #endif
1796 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1797 signal (SIGTERM, fatal_signal);
1798 #ifdef SIGPIPE
1799 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1800 signal (SIGPIPE, fatal_signal);
1801 #endif
1802 #ifdef SIGCHLD
1803 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1804 receive the signal. A different setting is inheritable */
1805 signal (SIGCHLD, SIG_DFL);
1806 #endif
1808 /* We may be called with all the arguments stored in some file and
1809 passed with @file. Expand them into argv before processing. */
1810 expandargv (&argc, &argv);
1812 run_gcc (argc, argv);
1814 return 0;