* tree-loop-distribution.c (struct partition): New field recording
[official-gcc.git] / gcc / lto-wrapper.c
blob832ffde3e404c3f160638d5579fb14af61533987
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2017 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 char **input_names;
69 static char **output_names;
70 static char **offload_names;
71 static char *offload_objects_file_name;
72 static char *makefile;
74 const char tool_name[] = "lto-wrapper";
76 /* Delete tempfiles. Called from utils_cleanup. */
78 void
79 tool_cleanup (bool)
81 unsigned int i;
83 if (ltrans_output_file)
84 maybe_unlink (ltrans_output_file);
85 if (flto_out)
86 maybe_unlink (flto_out);
87 if (offload_objects_file_name)
88 maybe_unlink (offload_objects_file_name);
89 if (makefile)
90 maybe_unlink (makefile);
91 for (i = 0; i < nr; ++i)
93 maybe_unlink (input_names[i]);
94 if (output_names[i])
95 maybe_unlink (output_names[i]);
99 static void
100 lto_wrapper_cleanup (void)
102 utils_cleanup (false);
105 /* Unlink a temporary LTRANS file unless requested otherwise. */
107 void
108 maybe_unlink (const char *file)
110 if (!save_temps)
112 if (unlink_if_ordinary (file)
113 && errno != ENOENT)
114 fatal_error (input_location, "deleting LTRANS file %s: %m", file);
116 else if (verbose)
117 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
120 /* Template of LTRANS dumpbase suffix. */
121 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
123 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
124 environment according to LANG_MASK. */
126 static void
127 get_options_from_collect_gcc_options (const char *collect_gcc,
128 const char *collect_gcc_options,
129 unsigned int lang_mask,
130 struct cl_decoded_option **decoded_options,
131 unsigned int *decoded_options_count)
133 struct obstack argv_obstack;
134 char *argv_storage;
135 const char **argv;
136 int j, k, argc;
138 argv_storage = xstrdup (collect_gcc_options);
139 obstack_init (&argv_obstack);
140 obstack_ptr_grow (&argv_obstack, collect_gcc);
142 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
144 if (argv_storage[j] == '\'')
146 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
147 ++j;
150 if (argv_storage[j] == '\0')
151 fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS");
152 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
154 argv_storage[k++] = '\'';
155 j += 4;
157 else if (argv_storage[j] == '\'')
158 break;
159 else
160 argv_storage[k++] = argv_storage[j++];
162 while (1);
163 argv_storage[k++] = '\0';
167 obstack_ptr_grow (&argv_obstack, NULL);
168 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
169 argv = XOBFINISH (&argv_obstack, const char **);
171 decode_cmdline_options_to_array (argc, (const char **)argv,
172 lang_mask,
173 decoded_options, decoded_options_count);
174 obstack_free (&argv_obstack, NULL);
177 /* Append OPTION to the options array DECODED_OPTIONS with size
178 DECODED_OPTIONS_COUNT. */
180 static void
181 append_option (struct cl_decoded_option **decoded_options,
182 unsigned int *decoded_options_count,
183 struct cl_decoded_option *option)
185 ++*decoded_options_count;
186 *decoded_options
187 = (struct cl_decoded_option *)
188 xrealloc (*decoded_options,
189 (*decoded_options_count
190 * sizeof (struct cl_decoded_option)));
191 memcpy (&(*decoded_options)[*decoded_options_count - 1], option,
192 sizeof (struct cl_decoded_option));
195 /* Try to merge and complain about options FDECODED_OPTIONS when applied
196 ontop of DECODED_OPTIONS. */
198 static void
199 merge_and_complain (struct cl_decoded_option **decoded_options,
200 unsigned int *decoded_options_count,
201 struct cl_decoded_option *fdecoded_options,
202 unsigned int fdecoded_options_count)
204 unsigned int i, j;
206 /* ??? Merge options from files. Most cases can be
207 handled by either unioning or intersecting
208 (for example -fwrapv is a case for unioning,
209 -ffast-math is for intersection). Most complaints
210 about real conflicts between different options can
211 be deferred to the compiler proper. Options that
212 we can neither safely handle by intersection nor
213 unioning would need to be complained about here.
214 Ideally we'd have a flag in the opt files that
215 tells whether to union or intersect or reject.
216 In absence of that it's unclear what a good default is.
217 It's also difficult to get positional handling correct. */
219 /* The following does what the old LTO option code did,
220 union all target and a selected set of common options. */
221 for (i = 0; i < fdecoded_options_count; ++i)
223 struct cl_decoded_option *foption = &fdecoded_options[i];
224 switch (foption->opt_index)
226 case OPT_SPECIAL_unknown:
227 case OPT_SPECIAL_ignore:
228 case OPT_SPECIAL_program_name:
229 case OPT_SPECIAL_input_file:
230 break;
232 default:
233 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
234 break;
236 /* Fallthru. */
237 case OPT_fdiagnostics_show_caret:
238 case OPT_fdiagnostics_show_option:
239 case OPT_fdiagnostics_show_location_:
240 case OPT_fshow_column:
241 case OPT_fPIC:
242 case OPT_fpic:
243 case OPT_fPIE:
244 case OPT_fpie:
245 case OPT_fcommon:
246 case OPT_fexceptions:
247 case OPT_fnon_call_exceptions:
248 case OPT_fgnu_tm:
249 /* Do what the old LTO code did - collect exactly one option
250 setting per OPT code, we pick the first we encounter.
251 ??? This doesn't make too much sense, but when it doesn't
252 then we should complain. */
253 for (j = 0; j < *decoded_options_count; ++j)
254 if ((*decoded_options)[j].opt_index == foption->opt_index)
255 break;
256 if (j == *decoded_options_count)
257 append_option (decoded_options, decoded_options_count, foption);
258 break;
260 case OPT_ftrapv:
261 case OPT_ffp_contract_:
262 /* For selected options we can merge conservatively. */
263 for (j = 0; j < *decoded_options_count; ++j)
264 if ((*decoded_options)[j].opt_index == foption->opt_index)
265 break;
266 if (j == *decoded_options_count)
267 append_option (decoded_options, decoded_options_count, foption);
268 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST,
269 -fno-trapv < -ftrapv,
270 -fno-strict-overflow < -fstrict-overflow */
271 else if (foption->value < (*decoded_options)[j].value)
272 (*decoded_options)[j] = *foption;
273 break;
275 case OPT_fmath_errno:
276 case OPT_fsigned_zeros:
277 case OPT_ftrapping_math:
278 case OPT_fwrapv:
279 case OPT_fopenmp:
280 case OPT_fopenacc:
281 case OPT_fcilkplus:
282 case OPT_fcheck_pointer_bounds:
283 /* For selected options we can merge conservatively. */
284 for (j = 0; j < *decoded_options_count; ++j)
285 if ((*decoded_options)[j].opt_index == foption->opt_index)
286 break;
287 if (j == *decoded_options_count)
288 append_option (decoded_options, decoded_options_count, foption);
289 /* -fmath-errno > -fno-math-errno,
290 -fsigned-zeros > -fno-signed-zeros,
291 -ftrapping-math > -fno-trapping-math,
292 -fwrapv > -fno-wrapv. */
293 else if (foption->value > (*decoded_options)[j].value)
294 (*decoded_options)[j] = *foption;
295 break;
297 case OPT_fopenacc_dim_:
298 /* Append or check identical. */
299 for (j = 0; j < *decoded_options_count; ++j)
300 if ((*decoded_options)[j].opt_index == foption->opt_index)
301 break;
302 if (j == *decoded_options_count)
303 append_option (decoded_options, decoded_options_count, foption);
304 else if (strcmp ((*decoded_options)[j].arg, foption->arg))
305 fatal_error (input_location,
306 "Option %s with different values",
307 foption->orig_option_with_args_text);
308 break;
310 case OPT_freg_struct_return:
311 case OPT_fpcc_struct_return:
312 for (j = 0; j < *decoded_options_count; ++j)
313 if ((*decoded_options)[j].opt_index == foption->opt_index)
314 break;
315 if (j == *decoded_options_count)
316 fatal_error (input_location,
317 "Option %s not used consistently in all LTO input"
318 " files", foption->orig_option_with_args_text);
319 break;
321 case OPT_foffload_abi_:
322 for (j = 0; j < *decoded_options_count; ++j)
323 if ((*decoded_options)[j].opt_index == foption->opt_index)
324 break;
325 if (j == *decoded_options_count)
326 append_option (decoded_options, decoded_options_count, foption);
327 else if (foption->value != (*decoded_options)[j].value)
328 fatal_error (input_location,
329 "Option %s not used consistently in all LTO input"
330 " files", foption->orig_option_with_args_text);
331 break;
333 case OPT_O:
334 case OPT_Ofast:
335 case OPT_Og:
336 case OPT_Os:
337 for (j = 0; j < *decoded_options_count; ++j)
338 if ((*decoded_options)[j].opt_index == OPT_O
339 || (*decoded_options)[j].opt_index == OPT_Ofast
340 || (*decoded_options)[j].opt_index == OPT_Og
341 || (*decoded_options)[j].opt_index == OPT_Os)
342 break;
343 if (j == *decoded_options_count)
344 append_option (decoded_options, decoded_options_count, foption);
345 else if ((*decoded_options)[j].opt_index == foption->opt_index
346 && foption->opt_index != OPT_O)
347 /* Exact same options get merged. */
349 else
351 /* For mismatched option kinds preserve the optimization
352 level only, thus merge it as -On. This also handles
353 merging of same optimization level -On. */
354 int level = 0;
355 switch (foption->opt_index)
357 case OPT_O:
358 if (foption->arg[0] == '\0')
359 level = MAX (level, 1);
360 else
361 level = MAX (level, atoi (foption->arg));
362 break;
363 case OPT_Ofast:
364 level = MAX (level, 3);
365 break;
366 case OPT_Og:
367 level = MAX (level, 1);
368 break;
369 case OPT_Os:
370 level = MAX (level, 2);
371 break;
372 default:
373 gcc_unreachable ();
375 switch ((*decoded_options)[j].opt_index)
377 case OPT_O:
378 if ((*decoded_options)[j].arg[0] == '\0')
379 level = MAX (level, 1);
380 else
381 level = MAX (level, atoi ((*decoded_options)[j].arg));
382 break;
383 case OPT_Ofast:
384 level = MAX (level, 3);
385 break;
386 case OPT_Og:
387 level = MAX (level, 1);
388 break;
389 case OPT_Os:
390 level = MAX (level, 2);
391 break;
392 default:
393 gcc_unreachable ();
395 (*decoded_options)[j].opt_index = OPT_O;
396 char *tem;
397 tem = xasprintf ("-O%d", level);
398 (*decoded_options)[j].arg = &tem[2];
399 (*decoded_options)[j].canonical_option[0] = tem;
400 (*decoded_options)[j].value = 1;
402 break;
404 case OPT_foffload_:
405 append_option (decoded_options, decoded_options_count, foption);
406 break;
411 /* Auxiliary function that frees elements of PTR and PTR itself.
412 N is number of elements to be freed. If PTR is NULL, nothing is freed.
413 If an element is NULL, subsequent elements are not freed. */
415 static void **
416 free_array_of_ptrs (void **ptr, unsigned n)
418 if (!ptr)
419 return NULL;
420 for (unsigned i = 0; i < n; i++)
422 if (!ptr[i])
423 break;
424 free (ptr[i]);
426 free (ptr);
427 return NULL;
430 /* Parse STR, saving found tokens into PVALUES and return their number.
431 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
432 append it to every token we find. */
434 static unsigned
435 parse_env_var (const char *str, char ***pvalues, const char *append)
437 const char *curval, *nextval;
438 char **values;
439 unsigned num = 1, i;
441 curval = strchr (str, ':');
442 while (curval)
444 num++;
445 curval = strchr (curval + 1, ':');
448 values = (char**) xmalloc (num * sizeof (char*));
449 curval = str;
450 nextval = strchr (curval, ':');
451 if (nextval == NULL)
452 nextval = strchr (curval, '\0');
454 int append_len = append ? strlen (append) : 0;
455 for (i = 0; i < num; i++)
457 int l = nextval - curval;
458 values[i] = (char*) xmalloc (l + 1 + append_len);
459 memcpy (values[i], curval, l);
460 values[i][l] = 0;
461 if (append)
462 strcat (values[i], append);
463 curval = nextval + 1;
464 nextval = strchr (curval, ':');
465 if (nextval == NULL)
466 nextval = strchr (curval, '\0');
468 *pvalues = values;
469 return num;
472 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
474 static void
475 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
476 unsigned int count)
478 /* Append compiler driver arguments as far as they were merged. */
479 for (unsigned int j = 1; j < count; ++j)
481 struct cl_decoded_option *option = &opts[j];
483 /* File options have been properly filtered by lto-opts.c. */
484 switch (option->opt_index)
486 /* Drop arguments that we want to take from the link line. */
487 case OPT_flto_:
488 case OPT_flto:
489 case OPT_flto_partition_:
490 continue;
492 default:
493 break;
496 /* For now do what the original LTO option code was doing - pass
497 on any CL_TARGET flag and a few selected others. */
498 switch (option->opt_index)
500 case OPT_fdiagnostics_show_caret:
501 case OPT_fdiagnostics_show_option:
502 case OPT_fdiagnostics_show_location_:
503 case OPT_fshow_column:
504 case OPT_fPIC:
505 case OPT_fpic:
506 case OPT_fPIE:
507 case OPT_fpie:
508 case OPT_fcommon:
509 case OPT_fexceptions:
510 case OPT_fnon_call_exceptions:
511 case OPT_fgnu_tm:
512 case OPT_freg_struct_return:
513 case OPT_fpcc_struct_return:
514 case OPT_ffp_contract_:
515 case OPT_fmath_errno:
516 case OPT_fsigned_zeros:
517 case OPT_ftrapping_math:
518 case OPT_fwrapv:
519 case OPT_fopenmp:
520 case OPT_fopenacc:
521 case OPT_fopenacc_dim_:
522 case OPT_fcilkplus:
523 case OPT_ftrapv:
524 case OPT_foffload_abi_:
525 case OPT_O:
526 case OPT_Ofast:
527 case OPT_Og:
528 case OPT_Os:
529 case OPT_fcheck_pointer_bounds:
530 break;
532 default:
533 if (!(cl_options[option->opt_index].flags & CL_TARGET))
534 continue;
537 /* Pass the option on. */
538 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
539 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
543 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
545 static void
546 append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts,
547 unsigned int count)
549 /* Append compiler driver arguments as far as they were merged. */
550 for (unsigned int j = 1; j < count; ++j)
552 struct cl_decoded_option *option = &opts[j];
554 switch (option->opt_index)
556 case OPT_fdiagnostics_color_:
557 case OPT_fdiagnostics_show_caret:
558 case OPT_fdiagnostics_show_option:
559 case OPT_fdiagnostics_show_location_:
560 case OPT_fshow_column:
561 break;
562 default:
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]);
573 /* Append linker options OPTS to ARGV_OBSTACK. */
575 static void
576 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
577 unsigned int count)
579 /* Append linker driver arguments. Compiler options from the linker
580 driver arguments will override / merge with those from the compiler. */
581 for (unsigned int j = 1; j < count; ++j)
583 struct cl_decoded_option *option = &opts[j];
585 /* Do not pass on frontend specific flags not suitable for lto. */
586 if (!(cl_options[option->opt_index].flags
587 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
588 continue;
590 switch (option->opt_index)
592 case OPT_o:
593 case OPT_flto_:
594 case OPT_flto:
595 /* We've handled these LTO options, do not pass them on. */
596 continue;
598 case OPT_freg_struct_return:
599 case OPT_fpcc_struct_return:
600 /* Ignore these, they are determined by the input files.
601 ??? We fail to diagnose a possible mismatch here. */
602 continue;
604 case OPT_fopenmp:
605 case OPT_fopenacc:
606 case OPT_fcilkplus:
607 /* Ignore -fno-XXX form of these options, as otherwise
608 corresponding builtins will not be enabled. */
609 if (option->value == 0)
610 continue;
611 break;
613 default:
614 break;
617 /* Pass the option on. */
618 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
619 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
623 /* Extract options for TARGET offload compiler from OPTIONS and append
624 them to ARGV_OBSTACK. */
626 static void
627 append_offload_options (obstack *argv_obstack, const char *target,
628 struct cl_decoded_option *options,
629 unsigned int options_count)
631 for (unsigned i = 0; i < options_count; i++)
633 const char *cur, *next, *opts;
634 char **argv;
635 unsigned argc;
636 struct cl_decoded_option *option = &options[i];
638 if (option->opt_index != OPT_foffload_)
639 continue;
641 /* If option argument starts with '-' then no target is specified. That
642 means offload options are specified for all targets, so we need to
643 append them. */
644 if (option->arg[0] == '-')
645 opts = option->arg;
646 else
648 opts = strchr (option->arg, '=');
649 /* If there are offload targets specified, but no actual options,
650 there is nothing to do here. */
651 if (!opts)
652 continue;
654 cur = option->arg;
656 while (cur < opts)
658 next = strchr (cur, ',');
659 if (next == NULL)
660 next = opts;
661 next = (next > opts) ? opts : next;
663 /* Are we looking for this offload target? */
664 if (strlen (target) == (size_t) (next - cur)
665 && strncmp (target, cur, next - cur) == 0)
666 break;
668 /* Skip the comma or equal sign. */
669 cur = next + 1;
672 if (cur >= opts)
673 continue;
675 opts++;
678 argv = buildargv (opts);
679 for (argc = 0; argv[argc]; argc++)
680 obstack_ptr_grow (argv_obstack, argv[argc]);
684 /* Check whether NAME can be accessed in MODE. This is like access,
685 except that it never considers directories to be executable. */
687 static int
688 access_check (const char *name, int mode)
690 if (mode == X_OK)
692 struct stat st;
694 if (stat (name, &st) < 0
695 || S_ISDIR (st.st_mode))
696 return -1;
699 return access (name, mode);
702 /* Prepare a target image for offload TARGET, using mkoffload tool from
703 COMPILER_PATH. Return the name of the resultant object file. */
705 static char *
706 compile_offload_image (const char *target, const char *compiler_path,
707 unsigned in_argc, char *in_argv[],
708 struct cl_decoded_option *compiler_opts,
709 unsigned int compiler_opt_count,
710 struct cl_decoded_option *linker_opts,
711 unsigned int linker_opt_count)
713 char *filename = NULL;
714 char **argv;
715 char *suffix
716 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
717 strcpy (suffix, "/accel/");
718 strcat (suffix, target);
719 strcat (suffix, "/mkoffload");
721 char **paths = NULL;
722 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
724 const char *compiler = NULL;
725 for (unsigned i = 0; i < n_paths; i++)
726 if (access_check (paths[i], X_OK) == 0)
728 compiler = paths[i];
729 break;
732 if (compiler)
734 /* Generate temporary output file name. */
735 filename = make_temp_file (".target.o");
737 struct obstack argv_obstack;
738 obstack_init (&argv_obstack);
739 obstack_ptr_grow (&argv_obstack, compiler);
740 if (save_temps)
741 obstack_ptr_grow (&argv_obstack, "-save-temps");
742 if (verbose)
743 obstack_ptr_grow (&argv_obstack, "-v");
744 obstack_ptr_grow (&argv_obstack, "-o");
745 obstack_ptr_grow (&argv_obstack, filename);
747 /* Append names of input object files. */
748 for (unsigned i = 0; i < in_argc; i++)
749 obstack_ptr_grow (&argv_obstack, in_argv[i]);
751 /* Append options from offload_lto sections. */
752 append_compiler_options (&argv_obstack, compiler_opts,
753 compiler_opt_count);
754 append_diag_options (&argv_obstack, linker_opts, linker_opt_count);
756 /* Append options specified by -foffload last. In case of conflicting
757 options we expect offload compiler to choose the latest. */
758 append_offload_options (&argv_obstack, target, compiler_opts,
759 compiler_opt_count);
760 append_offload_options (&argv_obstack, target, linker_opts,
761 linker_opt_count);
763 obstack_ptr_grow (&argv_obstack, NULL);
764 argv = XOBFINISH (&argv_obstack, char **);
765 fork_execute (argv[0], argv, true);
766 obstack_free (&argv_obstack, NULL);
769 free_array_of_ptrs ((void **) paths, n_paths);
770 return filename;
774 /* The main routine dealing with offloading.
775 The routine builds a target image for each offload target. IN_ARGC and
776 IN_ARGV specify options and input object files. As all of them could contain
777 target sections, we pass them all to target compilers. */
779 static void
780 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
781 struct cl_decoded_option *compiler_opts,
782 unsigned int compiler_opt_count,
783 struct cl_decoded_option *linker_opts,
784 unsigned int linker_opt_count)
786 char **names = NULL;
787 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
788 if (!target_names)
789 return;
790 unsigned num_targets = parse_env_var (target_names, &names, NULL);
792 int next_name_entry = 0;
793 const char *compiler_path = getenv ("COMPILER_PATH");
794 if (!compiler_path)
795 goto out;
797 /* Prepare an image for each target and save the name of the resultant object
798 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
799 offload_names = XCNEWVEC (char *, num_targets + 1);
800 for (unsigned i = 0; i < num_targets; i++)
802 /* HSA does not use LTO-like streaming and a different compiler, skip
803 it. */
804 if (strcmp (names[i], "hsa") == 0)
805 continue;
807 offload_names[next_name_entry]
808 = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
809 compiler_opts, compiler_opt_count,
810 linker_opts, linker_opt_count);
811 if (!offload_names[next_name_entry])
812 fatal_error (input_location,
813 "problem with building target image for %s\n", names[i]);
814 next_name_entry++;
817 out:
818 free_array_of_ptrs ((void **) names, num_targets);
821 /* Copy a file from SRC to DEST. */
823 static void
824 copy_file (const char *dest, const char *src)
826 FILE *d = fopen (dest, "wb");
827 FILE *s = fopen (src, "rb");
828 char buffer[512];
829 while (!feof (s))
831 size_t len = fread (buffer, 1, 512, s);
832 if (ferror (s) != 0)
833 fatal_error (input_location, "reading input file");
834 if (len > 0)
836 fwrite (buffer, 1, len, d);
837 if (ferror (d) != 0)
838 fatal_error (input_location, "writing output file");
841 fclose (d);
842 fclose (s);
845 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
846 the copy to the linker. */
848 static void
849 find_crtoffloadtable (void)
851 char **paths = NULL;
852 const char *library_path = getenv ("LIBRARY_PATH");
853 if (!library_path)
854 return;
855 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
857 unsigned i;
858 for (i = 0; i < n_paths; i++)
859 if (access_check (paths[i], R_OK) == 0)
861 /* The linker will delete the filename we give it, so make a copy. */
862 char *crtoffloadtable = make_temp_file (".crtoffloadtable.o");
863 copy_file (crtoffloadtable, paths[i]);
864 printf ("%s\n", crtoffloadtable);
865 XDELETEVEC (crtoffloadtable);
866 break;
868 if (i == n_paths)
869 fatal_error (input_location,
870 "installation error, can't find crtoffloadtable.o");
872 free_array_of_ptrs ((void **) paths, n_paths);
875 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
876 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
877 and OPT_COUNT. Return true if we found a matchingn section, false
878 otherwise. COLLECT_GCC holds the value of the environment variable with
879 the same name. */
881 static bool
882 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
883 struct cl_decoded_option **opts,
884 unsigned int *opt_count, const char *collect_gcc)
886 off_t offset, length;
887 char *data;
888 char *fopts;
889 const char *errmsg;
890 int err;
891 struct cl_decoded_option *fdecoded_options = *opts;
892 unsigned int fdecoded_options_count = *opt_count;
894 simple_object_read *sobj;
895 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
896 &errmsg, &err);
897 if (!sobj)
898 return false;
900 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
901 strcpy (secname, prefix);
902 strcat (secname, ".opts");
903 if (!simple_object_find_section (sobj, secname, &offset, &length,
904 &errmsg, &err))
906 simple_object_release_read (sobj);
907 return false;
910 lseek (fd, file_offset + offset, SEEK_SET);
911 data = (char *)xmalloc (length);
912 read (fd, data, length);
913 fopts = data;
916 struct cl_decoded_option *f2decoded_options;
917 unsigned int f2decoded_options_count;
918 get_options_from_collect_gcc_options (collect_gcc,
919 fopts, CL_LANG_ALL,
920 &f2decoded_options,
921 &f2decoded_options_count);
922 if (!fdecoded_options)
924 fdecoded_options = f2decoded_options;
925 fdecoded_options_count = f2decoded_options_count;
927 else
928 merge_and_complain (&fdecoded_options,
929 &fdecoded_options_count,
930 f2decoded_options, f2decoded_options_count);
932 fopts += strlen (fopts) + 1;
934 while (fopts - data < length);
936 free (data);
937 simple_object_release_read (sobj);
938 *opts = fdecoded_options;
939 *opt_count = fdecoded_options_count;
940 return true;
943 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
945 static void
946 run_gcc (unsigned argc, char *argv[])
948 unsigned i, j;
949 const char **new_argv;
950 const char **argv_ptr;
951 char *list_option_full = NULL;
952 const char *linker_output = NULL;
953 const char *collect_gcc, *collect_gcc_options;
954 int parallel = 0;
955 int jobserver = 0;
956 bool no_partition = false;
957 struct cl_decoded_option *fdecoded_options = NULL;
958 struct cl_decoded_option *offload_fdecoded_options = NULL;
959 unsigned int fdecoded_options_count = 0;
960 unsigned int offload_fdecoded_options_count = 0;
961 struct cl_decoded_option *decoded_options;
962 unsigned int decoded_options_count;
963 struct obstack argv_obstack;
964 int new_head_argc;
965 bool have_lto = false;
966 bool have_offload = false;
967 unsigned lto_argc = 0;
968 char **lto_argv;
970 /* Get the driver and options. */
971 collect_gcc = getenv ("COLLECT_GCC");
972 if (!collect_gcc)
973 fatal_error (input_location,
974 "environment variable COLLECT_GCC must be set");
975 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
976 if (!collect_gcc_options)
977 fatal_error (input_location,
978 "environment variable COLLECT_GCC_OPTIONS must be set");
979 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
980 CL_LANG_ALL,
981 &decoded_options,
982 &decoded_options_count);
984 /* Allocate array for input object files with LTO IL,
985 and for possible preceding arguments. */
986 lto_argv = XNEWVEC (char *, argc);
988 /* Look at saved options in the IL files. */
989 for (i = 1; i < argc; ++i)
991 char *p;
992 int fd;
993 off_t file_offset = 0;
994 long loffset;
995 int consumed;
996 char *filename = argv[i];
998 if (strncmp (argv[i], "-foffload-objects=",
999 sizeof ("-foffload-objects=") - 1) == 0)
1001 have_offload = true;
1002 offload_objects_file_name
1003 = argv[i] + sizeof ("-foffload-objects=") - 1;
1004 continue;
1007 if ((p = strrchr (argv[i], '@'))
1008 && p != argv[i]
1009 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1010 && strlen (p) == (unsigned int) consumed)
1012 filename = XNEWVEC (char, p - argv[i] + 1);
1013 memcpy (filename, argv[i], p - argv[i]);
1014 filename[p - argv[i]] = '\0';
1015 file_offset = (off_t) loffset;
1017 fd = open (filename, O_RDONLY | O_BINARY);
1018 if (fd == -1)
1020 lto_argv[lto_argc++] = argv[i];
1021 continue;
1024 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1025 &fdecoded_options, &fdecoded_options_count,
1026 collect_gcc))
1028 have_lto = true;
1029 lto_argv[lto_argc++] = argv[i];
1031 close (fd);
1034 /* Initalize the common arguments for the driver. */
1035 obstack_init (&argv_obstack);
1036 obstack_ptr_grow (&argv_obstack, collect_gcc);
1037 obstack_ptr_grow (&argv_obstack, "-xlto");
1038 obstack_ptr_grow (&argv_obstack, "-c");
1040 append_compiler_options (&argv_obstack, fdecoded_options,
1041 fdecoded_options_count);
1042 append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
1044 /* Scan linker driver arguments for things that are of relevance to us. */
1045 for (j = 1; j < decoded_options_count; ++j)
1047 struct cl_decoded_option *option = &decoded_options[j];
1048 switch (option->opt_index)
1050 case OPT_o:
1051 linker_output = option->arg;
1052 break;
1054 case OPT_save_temps:
1055 save_temps = 1;
1056 break;
1058 case OPT_v:
1059 verbose = 1;
1060 break;
1062 case OPT_flto_partition_:
1063 if (strcmp (option->arg, "none") == 0)
1064 no_partition = true;
1065 break;
1067 case OPT_flto_:
1068 if (strcmp (option->arg, "jobserver") == 0)
1070 jobserver = 1;
1071 parallel = 1;
1073 else
1075 parallel = atoi (option->arg);
1076 if (parallel <= 1)
1077 parallel = 0;
1079 /* Fallthru. */
1081 case OPT_flto:
1082 lto_mode = LTO_MODE_WHOPR;
1083 break;
1085 default:
1086 break;
1090 if (no_partition)
1092 lto_mode = LTO_MODE_LTO;
1093 jobserver = 0;
1094 parallel = 0;
1097 if (linker_output)
1099 char *output_dir, *base, *name;
1100 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1102 output_dir = xstrdup (linker_output);
1103 base = output_dir;
1104 for (name = base; *name; name++)
1105 if (IS_DIR_SEPARATOR (*name))
1106 base = name + 1;
1107 *base = '\0';
1109 linker_output = &linker_output[base - output_dir];
1110 if (*output_dir == '\0')
1112 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1113 output_dir = current_dir;
1115 if (!bit_bucket)
1117 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1118 obstack_ptr_grow (&argv_obstack, output_dir);
1121 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1124 /* Remember at which point we can scrub args to re-use the commons. */
1125 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1127 if (have_offload)
1129 unsigned i, num_offload_files;
1130 char **offload_argv;
1131 FILE *f;
1133 f = fopen (offload_objects_file_name, "r");
1134 if (f == NULL)
1135 fatal_error (input_location, "cannot open %s: %m",
1136 offload_objects_file_name);
1137 if (fscanf (f, "%u ", &num_offload_files) != 1)
1138 fatal_error (input_location, "cannot read %s: %m",
1139 offload_objects_file_name);
1140 offload_argv = XCNEWVEC (char *, num_offload_files);
1142 /* Read names of object files with offload. */
1143 for (i = 0; i < num_offload_files; i++)
1145 const unsigned piece = 32;
1146 char *buf, *filename = XNEWVEC (char, piece);
1147 size_t len;
1149 buf = filename;
1150 cont1:
1151 if (!fgets (buf, piece, f))
1152 break;
1153 len = strlen (filename);
1154 if (filename[len - 1] != '\n')
1156 filename = XRESIZEVEC (char, filename, len + piece);
1157 buf = filename + len;
1158 goto cont1;
1160 filename[len - 1] = '\0';
1161 offload_argv[i] = filename;
1163 fclose (f);
1164 if (offload_argv[num_offload_files - 1] == NULL)
1165 fatal_error (input_location, "invalid format of %s",
1166 offload_objects_file_name);
1167 maybe_unlink (offload_objects_file_name);
1168 offload_objects_file_name = NULL;
1170 /* Look at saved offload options in files. */
1171 for (i = 0; i < num_offload_files; i++)
1173 char *p;
1174 long loffset;
1175 int fd, consumed;
1176 off_t file_offset = 0;
1177 char *filename = offload_argv[i];
1179 if ((p = strrchr (offload_argv[i], '@'))
1180 && p != offload_argv[i]
1181 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1182 && strlen (p) == (unsigned int) consumed)
1184 filename = XNEWVEC (char, p - offload_argv[i] + 1);
1185 memcpy (filename, offload_argv[i], p - offload_argv[i]);
1186 filename[p - offload_argv[i]] = '\0';
1187 file_offset = (off_t) loffset;
1189 fd = open (filename, O_RDONLY | O_BINARY);
1190 if (fd == -1)
1191 fatal_error (input_location, "cannot open %s: %m", filename);
1192 if (!find_and_merge_options (fd, file_offset,
1193 OFFLOAD_SECTION_NAME_PREFIX,
1194 &offload_fdecoded_options,
1195 &offload_fdecoded_options_count,
1196 collect_gcc))
1197 fatal_error (input_location, "cannot read %s: %m", filename);
1198 close (fd);
1199 if (filename != offload_argv[i])
1200 XDELETEVEC (filename);
1203 compile_images_for_offload_targets (num_offload_files, offload_argv,
1204 offload_fdecoded_options,
1205 offload_fdecoded_options_count,
1206 decoded_options,
1207 decoded_options_count);
1209 free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1211 if (offload_names)
1213 find_crtoffloadtable ();
1214 for (i = 0; offload_names[i]; i++)
1215 printf ("%s\n", offload_names[i]);
1216 free_array_of_ptrs ((void **) offload_names, i);
1220 /* If object files contain offload sections, but do not contain LTO sections,
1221 then there is no need to perform a link-time recompilation, i.e.
1222 lto-wrapper is used only for a compilation of offload images. */
1223 if (have_offload && !have_lto)
1224 goto finish;
1226 if (lto_mode == LTO_MODE_LTO)
1228 flto_out = make_temp_file (".lto.o");
1229 if (linker_output)
1230 obstack_ptr_grow (&argv_obstack, linker_output);
1231 obstack_ptr_grow (&argv_obstack, "-o");
1232 obstack_ptr_grow (&argv_obstack, flto_out);
1234 else
1236 const char *list_option = "-fltrans-output-list=";
1237 size_t list_option_len = strlen (list_option);
1238 char *tmp;
1240 if (linker_output)
1242 char *dumpbase = (char *) xmalloc (strlen (linker_output)
1243 + sizeof (".wpa") + 1);
1244 strcpy (dumpbase, linker_output);
1245 strcat (dumpbase, ".wpa");
1246 obstack_ptr_grow (&argv_obstack, dumpbase);
1249 if (linker_output && save_temps)
1251 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1252 + sizeof (".ltrans.out") + 1);
1253 strcpy (ltrans_output_file, linker_output);
1254 strcat (ltrans_output_file, ".ltrans.out");
1256 else
1257 ltrans_output_file = make_temp_file (".ltrans.out");
1258 list_option_full = (char *) xmalloc (sizeof (char) *
1259 (strlen (ltrans_output_file) + list_option_len + 1));
1260 tmp = list_option_full;
1262 obstack_ptr_grow (&argv_obstack, tmp);
1263 strcpy (tmp, list_option);
1264 tmp += list_option_len;
1265 strcpy (tmp, ltrans_output_file);
1267 if (jobserver)
1268 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1269 else if (parallel > 1)
1271 char buf[256];
1272 sprintf (buf, "-fwpa=%i", parallel);
1273 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1275 else
1276 obstack_ptr_grow (&argv_obstack, "-fwpa");
1279 /* Append the input objects and possible preceding arguments. */
1280 for (i = 0; i < lto_argc; ++i)
1281 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1282 obstack_ptr_grow (&argv_obstack, NULL);
1284 new_argv = XOBFINISH (&argv_obstack, const char **);
1285 argv_ptr = &new_argv[new_head_argc];
1286 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1288 if (lto_mode == LTO_MODE_LTO)
1290 printf ("%s\n", flto_out);
1291 free (flto_out);
1292 flto_out = NULL;
1294 else
1296 FILE *stream = fopen (ltrans_output_file, "r");
1297 FILE *mstream = NULL;
1298 struct obstack env_obstack;
1300 if (!stream)
1301 fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
1303 /* Parse the list of LTRANS inputs from the WPA stage. */
1304 obstack_init (&env_obstack);
1305 nr = 0;
1306 for (;;)
1308 const unsigned piece = 32;
1309 char *output_name = NULL;
1310 char *buf, *input_name = (char *)xmalloc (piece);
1311 size_t len;
1313 buf = input_name;
1314 cont:
1315 if (!fgets (buf, piece, stream))
1316 break;
1317 len = strlen (input_name);
1318 if (input_name[len - 1] != '\n')
1320 input_name = (char *)xrealloc (input_name, len + piece);
1321 buf = input_name + len;
1322 goto cont;
1324 input_name[len - 1] = '\0';
1326 if (input_name[0] == '*')
1327 output_name = &input_name[1];
1329 nr++;
1330 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1331 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1332 input_names[nr-1] = input_name;
1333 output_names[nr-1] = output_name;
1335 fclose (stream);
1336 maybe_unlink (ltrans_output_file);
1337 ltrans_output_file = NULL;
1339 if (parallel)
1341 makefile = make_temp_file (".mk");
1342 mstream = fopen (makefile, "w");
1345 /* Execute the LTRANS stage for each input file (or prepare a
1346 makefile to invoke this in parallel). */
1347 for (i = 0; i < nr; ++i)
1349 char *output_name;
1350 char *input_name = input_names[i];
1351 /* If it's a pass-through file do nothing. */
1352 if (output_names[i])
1353 continue;
1355 /* Replace the .o suffix with a .ltrans.o suffix and write
1356 the resulting name to the LTRANS output list. */
1357 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1358 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1359 output_name = XOBFINISH (&env_obstack, char *);
1361 /* Adjust the dumpbase if the linker output file was seen. */
1362 if (linker_output)
1364 char *dumpbase
1365 = (char *) xmalloc (strlen (linker_output)
1366 + sizeof (DUMPBASE_SUFFIX) + 1);
1367 snprintf (dumpbase,
1368 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1369 "%s.ltrans%u", linker_output, i);
1370 argv_ptr[0] = dumpbase;
1373 argv_ptr[1] = "-fltrans";
1374 argv_ptr[2] = "-o";
1375 argv_ptr[3] = output_name;
1376 argv_ptr[4] = input_name;
1377 argv_ptr[5] = NULL;
1378 if (parallel)
1380 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1381 for (j = 1; new_argv[j] != NULL; ++j)
1382 fprintf (mstream, " '%s'", new_argv[j]);
1383 fprintf (mstream, "\n");
1384 /* If we are not preserving the ltrans input files then
1385 truncate them as soon as we have processed it. This
1386 reduces temporary disk-space usage. */
1387 if (! save_temps)
1388 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1389 "&& mv %s.tem %s\n",
1390 input_name, input_name, input_name, input_name);
1392 else
1394 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1395 true);
1396 maybe_unlink (input_name);
1399 output_names[i] = output_name;
1401 if (parallel)
1403 struct pex_obj *pex;
1404 char jobs[32];
1406 fprintf (mstream, "all:");
1407 for (i = 0; i < nr; ++i)
1408 fprintf (mstream, " \\\n\t%s", output_names[i]);
1409 fprintf (mstream, "\n");
1410 fclose (mstream);
1411 if (!jobserver)
1413 /* Avoid passing --jobserver-fd= and similar flags
1414 unless jobserver mode is explicitly enabled. */
1415 putenv (xstrdup ("MAKEFLAGS="));
1416 putenv (xstrdup ("MFLAGS="));
1418 new_argv[0] = getenv ("MAKE");
1419 if (!new_argv[0])
1420 new_argv[0] = "make";
1421 new_argv[1] = "-f";
1422 new_argv[2] = makefile;
1423 i = 3;
1424 if (!jobserver)
1426 snprintf (jobs, 31, "-j%d", parallel);
1427 new_argv[i++] = jobs;
1429 new_argv[i++] = "all";
1430 new_argv[i++] = NULL;
1431 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1432 NULL, NULL, PEX_SEARCH, false);
1433 do_wait (new_argv[0], pex);
1434 maybe_unlink (makefile);
1435 makefile = NULL;
1436 for (i = 0; i < nr; ++i)
1437 maybe_unlink (input_names[i]);
1439 for (i = 0; i < nr; ++i)
1441 fputs (output_names[i], stdout);
1442 putc ('\n', stdout);
1443 free (input_names[i]);
1445 nr = 0;
1446 free (output_names);
1447 free (input_names);
1448 free (list_option_full);
1449 obstack_free (&env_obstack, NULL);
1452 finish:
1453 XDELETE (lto_argv);
1454 obstack_free (&argv_obstack, NULL);
1458 /* Entry point. */
1461 main (int argc, char *argv[])
1463 const char *p;
1465 init_opts_obstack ();
1467 p = argv[0] + strlen (argv[0]);
1468 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1469 --p;
1470 progname = p;
1472 xmalloc_set_program_name (progname);
1474 gcc_init_libintl ();
1476 diagnostic_initialize (global_dc, 0);
1478 if (atexit (lto_wrapper_cleanup) != 0)
1479 fatal_error (input_location, "atexit failed");
1481 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1482 signal (SIGINT, fatal_signal);
1483 #ifdef SIGHUP
1484 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1485 signal (SIGHUP, fatal_signal);
1486 #endif
1487 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1488 signal (SIGTERM, fatal_signal);
1489 #ifdef SIGPIPE
1490 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1491 signal (SIGPIPE, fatal_signal);
1492 #endif
1493 #ifdef SIGCHLD
1494 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1495 receive the signal. A different setting is inheritable */
1496 signal (SIGCHLD, SIG_DFL);
1497 #endif
1499 /* We may be called with all the arguments stored in some file and
1500 passed with @file. Expand them into argv before processing. */
1501 expandargv (&argc, &argv);
1503 run_gcc (argc, argv);
1505 return 0;