Clean up some minor white space issues in trans-decl.c and trans-expr.c
[official-gcc.git] / gcc / lto-wrapper.c
blobecb9996b85bb32ebc6d4a081efe8a5c68a7c147e
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2016 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 const char *offloadbegin, *offloadend;
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 (makefile)
88 maybe_unlink (makefile);
89 for (i = 0; i < nr; ++i)
91 maybe_unlink (input_names[i]);
92 if (output_names[i])
93 maybe_unlink (output_names[i]);
97 static void
98 lto_wrapper_cleanup (void)
100 utils_cleanup (false);
103 /* Unlink a temporary LTRANS file unless requested otherwise. */
105 void
106 maybe_unlink (const char *file)
108 if (!save_temps)
110 if (unlink_if_ordinary (file)
111 && errno != ENOENT)
112 fatal_error (input_location, "deleting LTRANS file %s: %m", file);
114 else if (verbose)
115 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
118 /* Template of LTRANS dumpbase suffix. */
119 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
121 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
122 environment according to LANG_MASK. */
124 static void
125 get_options_from_collect_gcc_options (const char *collect_gcc,
126 const char *collect_gcc_options,
127 unsigned int lang_mask,
128 struct cl_decoded_option **decoded_options,
129 unsigned int *decoded_options_count)
131 struct obstack argv_obstack;
132 char *argv_storage;
133 const char **argv;
134 int j, k, argc;
136 argv_storage = xstrdup (collect_gcc_options);
137 obstack_init (&argv_obstack);
138 obstack_ptr_grow (&argv_obstack, collect_gcc);
140 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
142 if (argv_storage[j] == '\'')
144 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
145 ++j;
148 if (argv_storage[j] == '\0')
149 fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS");
150 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
152 argv_storage[k++] = '\'';
153 j += 4;
155 else if (argv_storage[j] == '\'')
156 break;
157 else
158 argv_storage[k++] = argv_storage[j++];
160 while (1);
161 argv_storage[k++] = '\0';
165 obstack_ptr_grow (&argv_obstack, NULL);
166 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
167 argv = XOBFINISH (&argv_obstack, const char **);
169 decode_cmdline_options_to_array (argc, (const char **)argv,
170 lang_mask,
171 decoded_options, decoded_options_count);
172 obstack_free (&argv_obstack, NULL);
175 /* Append OPTION to the options array DECODED_OPTIONS with size
176 DECODED_OPTIONS_COUNT. */
178 static void
179 append_option (struct cl_decoded_option **decoded_options,
180 unsigned int *decoded_options_count,
181 struct cl_decoded_option *option)
183 ++*decoded_options_count;
184 *decoded_options
185 = (struct cl_decoded_option *)
186 xrealloc (*decoded_options,
187 (*decoded_options_count
188 * sizeof (struct cl_decoded_option)));
189 memcpy (&(*decoded_options)[*decoded_options_count - 1], option,
190 sizeof (struct cl_decoded_option));
193 /* Try to merge and complain about options FDECODED_OPTIONS when applied
194 ontop of DECODED_OPTIONS. */
196 static void
197 merge_and_complain (struct cl_decoded_option **decoded_options,
198 unsigned int *decoded_options_count,
199 struct cl_decoded_option *fdecoded_options,
200 unsigned int fdecoded_options_count)
202 unsigned int i, j;
204 /* ??? Merge options from files. Most cases can be
205 handled by either unioning or intersecting
206 (for example -fwrapv is a case for unioning,
207 -ffast-math is for intersection). Most complaints
208 about real conflicts between different options can
209 be deferred to the compiler proper. Options that
210 we can neither safely handle by intersection nor
211 unioning would need to be complained about here.
212 Ideally we'd have a flag in the opt files that
213 tells whether to union or intersect or reject.
214 In absence of that it's unclear what a good default is.
215 It's also difficult to get positional handling correct. */
217 /* The following does what the old LTO option code did,
218 union all target and a selected set of common options. */
219 for (i = 0; i < fdecoded_options_count; ++i)
221 struct cl_decoded_option *foption = &fdecoded_options[i];
222 switch (foption->opt_index)
224 case OPT_SPECIAL_unknown:
225 case OPT_SPECIAL_ignore:
226 case OPT_SPECIAL_program_name:
227 case OPT_SPECIAL_input_file:
228 break;
230 default:
231 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
232 break;
234 /* Fallthru. */
235 case OPT_fdiagnostics_show_caret:
236 case OPT_fdiagnostics_show_option:
237 case OPT_fdiagnostics_show_location_:
238 case OPT_fshow_column:
239 case OPT_fPIC:
240 case OPT_fpic:
241 case OPT_fPIE:
242 case OPT_fpie:
243 case OPT_fcommon:
244 case OPT_fexceptions:
245 case OPT_fnon_call_exceptions:
246 case OPT_fgnu_tm:
247 /* Do what the old LTO code did - collect exactly one option
248 setting per OPT code, we pick the first we encounter.
249 ??? This doesn't make too much sense, but when it doesn't
250 then we should complain. */
251 for (j = 0; j < *decoded_options_count; ++j)
252 if ((*decoded_options)[j].opt_index == foption->opt_index)
253 break;
254 if (j == *decoded_options_count)
255 append_option (decoded_options, decoded_options_count, foption);
256 break;
258 case OPT_ftrapv:
259 case OPT_fstrict_overflow:
260 case OPT_ffp_contract_:
261 /* For selected options we can merge conservatively. */
262 for (j = 0; j < *decoded_options_count; ++j)
263 if ((*decoded_options)[j].opt_index == foption->opt_index)
264 break;
265 if (j == *decoded_options_count)
266 append_option (decoded_options, decoded_options_count, foption);
267 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST,
268 -fno-trapv < -ftrapv,
269 -fno-strict-overflow < -fstrict-overflow */
270 else if (foption->value < (*decoded_options)[j].value)
271 (*decoded_options)[j] = *foption;
272 break;
274 case OPT_fmath_errno:
275 case OPT_fsigned_zeros:
276 case OPT_ftrapping_math:
277 case OPT_fwrapv:
278 case OPT_fopenmp:
279 case OPT_fopenacc:
280 case OPT_fcheck_pointer_bounds:
281 /* For selected options we can merge conservatively. */
282 for (j = 0; j < *decoded_options_count; ++j)
283 if ((*decoded_options)[j].opt_index == foption->opt_index)
284 break;
285 if (j == *decoded_options_count)
286 append_option (decoded_options, decoded_options_count, foption);
287 /* -fmath-errno > -fno-math-errno,
288 -fsigned-zeros > -fno-signed-zeros,
289 -ftrapping-math -> -fno-trapping-math,
290 -fwrapv > -fno-wrapv. */
291 else if (foption->value > (*decoded_options)[j].value)
292 (*decoded_options)[j] = *foption;
293 break;
295 case OPT_freg_struct_return:
296 case OPT_fpcc_struct_return:
297 case OPT_fshort_double:
298 for (j = 0; j < *decoded_options_count; ++j)
299 if ((*decoded_options)[j].opt_index == foption->opt_index)
300 break;
301 if (j == *decoded_options_count)
302 fatal_error (input_location,
303 "Option %s not used consistently in all LTO input"
304 " files", foption->orig_option_with_args_text);
305 break;
307 case OPT_foffload_abi_:
308 for (j = 0; j < *decoded_options_count; ++j)
309 if ((*decoded_options)[j].opt_index == foption->opt_index)
310 break;
311 if (j == *decoded_options_count)
312 append_option (decoded_options, decoded_options_count, foption);
313 else if (foption->value != (*decoded_options)[j].value)
314 fatal_error (input_location,
315 "Option %s not used consistently in all LTO input"
316 " files", foption->orig_option_with_args_text);
317 break;
319 case OPT_O:
320 case OPT_Ofast:
321 case OPT_Og:
322 case OPT_Os:
323 for (j = 0; j < *decoded_options_count; ++j)
324 if ((*decoded_options)[j].opt_index == OPT_O
325 || (*decoded_options)[j].opt_index == OPT_Ofast
326 || (*decoded_options)[j].opt_index == OPT_Og
327 || (*decoded_options)[j].opt_index == OPT_Os)
328 break;
329 if (j == *decoded_options_count)
330 append_option (decoded_options, decoded_options_count, foption);
331 else if ((*decoded_options)[j].opt_index == foption->opt_index
332 && foption->opt_index != OPT_O)
333 /* Exact same options get merged. */
335 else
337 /* For mismatched option kinds preserve the optimization
338 level only, thus merge it as -On. This also handles
339 merging of same optimization level -On. */
340 int level = 0;
341 switch (foption->opt_index)
343 case OPT_O:
344 if (foption->arg[0] == '\0')
345 level = MAX (level, 1);
346 else
347 level = MAX (level, atoi (foption->arg));
348 break;
349 case OPT_Ofast:
350 level = MAX (level, 3);
351 break;
352 case OPT_Og:
353 level = MAX (level, 1);
354 break;
355 case OPT_Os:
356 level = MAX (level, 2);
357 break;
358 default:
359 gcc_unreachable ();
361 switch ((*decoded_options)[j].opt_index)
363 case OPT_O:
364 if ((*decoded_options)[j].arg[0] == '\0')
365 level = MAX (level, 1);
366 else
367 level = MAX (level, atoi ((*decoded_options)[j].arg));
368 break;
369 case OPT_Ofast:
370 level = MAX (level, 3);
371 break;
372 case OPT_Og:
373 level = MAX (level, 1);
374 break;
375 case OPT_Os:
376 level = MAX (level, 2);
377 break;
378 default:
379 gcc_unreachable ();
381 (*decoded_options)[j].opt_index = OPT_O;
382 char *tem;
383 tem = xasprintf ("-O%d", level);
384 (*decoded_options)[j].arg = &tem[2];
385 (*decoded_options)[j].canonical_option[0] = tem;
386 (*decoded_options)[j].value = 1;
388 break;
390 case OPT_foffload_:
391 append_option (decoded_options, decoded_options_count, foption);
392 break;
397 /* Auxiliary function that frees elements of PTR and PTR itself.
398 N is number of elements to be freed. If PTR is NULL, nothing is freed.
399 If an element is NULL, subsequent elements are not freed. */
401 static void **
402 free_array_of_ptrs (void **ptr, unsigned n)
404 if (!ptr)
405 return NULL;
406 for (unsigned i = 0; i < n; i++)
408 if (!ptr[i])
409 break;
410 free (ptr[i]);
412 free (ptr);
413 return NULL;
416 /* Parse STR, saving found tokens into PVALUES and return their number.
417 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
418 append it to every token we find. */
420 static unsigned
421 parse_env_var (const char *str, char ***pvalues, const char *append)
423 const char *curval, *nextval;
424 char **values;
425 unsigned num = 1, i;
427 curval = strchr (str, ':');
428 while (curval)
430 num++;
431 curval = strchr (curval + 1, ':');
434 values = (char**) xmalloc (num * sizeof (char*));
435 curval = str;
436 nextval = strchr (curval, ':');
437 if (nextval == NULL)
438 nextval = strchr (curval, '\0');
440 int append_len = append ? strlen (append) : 0;
441 for (i = 0; i < num; i++)
443 int l = nextval - curval;
444 values[i] = (char*) xmalloc (l + 1 + append_len);
445 memcpy (values[i], curval, l);
446 values[i][l] = 0;
447 if (append)
448 strcat (values[i], append);
449 curval = nextval + 1;
450 nextval = strchr (curval, ':');
451 if (nextval == NULL)
452 nextval = strchr (curval, '\0');
454 *pvalues = values;
455 return num;
458 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
460 static void
461 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
462 unsigned int count)
464 /* Append compiler driver arguments as far as they were merged. */
465 for (unsigned int j = 1; j < count; ++j)
467 struct cl_decoded_option *option = &opts[j];
469 /* File options have been properly filtered by lto-opts.c. */
470 switch (option->opt_index)
472 /* Drop arguments that we want to take from the link line. */
473 case OPT_flto_:
474 case OPT_flto:
475 case OPT_flto_partition_:
476 continue;
478 default:
479 break;
482 /* For now do what the original LTO option code was doing - pass
483 on any CL_TARGET flag and a few selected others. */
484 switch (option->opt_index)
486 case OPT_fdiagnostics_show_caret:
487 case OPT_fdiagnostics_show_option:
488 case OPT_fdiagnostics_show_location_:
489 case OPT_fshow_column:
490 case OPT_fPIC:
491 case OPT_fpic:
492 case OPT_fPIE:
493 case OPT_fpie:
494 case OPT_fcommon:
495 case OPT_fexceptions:
496 case OPT_fnon_call_exceptions:
497 case OPT_fgnu_tm:
498 case OPT_freg_struct_return:
499 case OPT_fpcc_struct_return:
500 case OPT_fshort_double:
501 case OPT_ffp_contract_:
502 case OPT_fmath_errno:
503 case OPT_fsigned_zeros:
504 case OPT_ftrapping_math:
505 case OPT_fwrapv:
506 case OPT_fopenmp:
507 case OPT_fopenacc:
508 case OPT_ftrapv:
509 case OPT_fstrict_overflow:
510 case OPT_foffload_abi_:
511 case OPT_O:
512 case OPT_Ofast:
513 case OPT_Og:
514 case OPT_Os:
515 case OPT_fcheck_pointer_bounds:
516 break;
518 default:
519 if (!(cl_options[option->opt_index].flags & CL_TARGET))
520 continue;
523 /* Pass the option on. */
524 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
525 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
529 /* Append linker options OPTS to ARGV_OBSTACK. */
531 static void
532 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
533 unsigned int count)
535 /* Append linker driver arguments. Compiler options from the linker
536 driver arguments will override / merge with those from the compiler. */
537 for (unsigned int j = 1; j < count; ++j)
539 struct cl_decoded_option *option = &opts[j];
541 /* Do not pass on frontend specific flags not suitable for lto. */
542 if (!(cl_options[option->opt_index].flags
543 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
544 continue;
546 switch (option->opt_index)
548 case OPT_o:
549 case OPT_flto_:
550 case OPT_flto:
551 /* We've handled these LTO options, do not pass them on. */
552 continue;
554 case OPT_freg_struct_return:
555 case OPT_fpcc_struct_return:
556 case OPT_fshort_double:
557 /* Ignore these, they are determined by the input files.
558 ??? We fail to diagnose a possible mismatch here. */
559 continue;
561 default:
562 break;
565 /* Pass the option on. */
566 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
567 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
571 /* Extract options for TARGET offload compiler from OPTIONS and append
572 them to ARGV_OBSTACK. */
574 static void
575 append_offload_options (obstack *argv_obstack, const char *target,
576 struct cl_decoded_option *options,
577 unsigned int options_count)
579 for (unsigned i = 0; i < options_count; i++)
581 const char *cur, *next, *opts;
582 char **argv;
583 unsigned argc;
584 struct cl_decoded_option *option = &options[i];
586 if (option->opt_index != OPT_foffload_)
587 continue;
589 /* If option argument starts with '-' then no target is specified. That
590 means offload options are specified for all targets, so we need to
591 append them. */
592 if (option->arg[0] == '-')
593 opts = option->arg;
594 else
596 opts = strchr (option->arg, '=');
597 /* If there are offload targets specified, but no actual options,
598 there is nothing to do here. */
599 if (!opts)
600 continue;
602 cur = option->arg;
604 while (cur < opts)
606 next = strchr (cur, ',');
607 if (next == NULL)
608 next = opts;
609 next = (next > opts) ? opts : next;
611 /* Are we looking for this offload target? */
612 if (strlen (target) == (size_t) (next - cur)
613 && strncmp (target, cur, next - cur) == 0)
614 break;
616 /* Skip the comma or equal sign. */
617 cur = next + 1;
620 if (cur >= opts)
621 continue;
623 opts++;
626 argv = buildargv (opts);
627 for (argc = 0; argv[argc]; argc++)
628 obstack_ptr_grow (argv_obstack, argv[argc]);
632 /* Check whether NAME can be accessed in MODE. This is like access,
633 except that it never considers directories to be executable. */
635 static int
636 access_check (const char *name, int mode)
638 if (mode == X_OK)
640 struct stat st;
642 if (stat (name, &st) < 0
643 || S_ISDIR (st.st_mode))
644 return -1;
647 return access (name, mode);
650 /* Prepare a target image for offload TARGET, using mkoffload tool from
651 COMPILER_PATH. Return the name of the resultant object file. */
653 static char *
654 compile_offload_image (const char *target, const char *compiler_path,
655 unsigned in_argc, char *in_argv[],
656 struct cl_decoded_option *compiler_opts,
657 unsigned int compiler_opt_count,
658 struct cl_decoded_option *linker_opts,
659 unsigned int linker_opt_count)
661 char *filename = NULL;
662 char **argv;
663 char *suffix
664 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
665 strcpy (suffix, "/accel/");
666 strcat (suffix, target);
667 strcat (suffix, "/mkoffload");
669 char **paths = NULL;
670 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
672 const char *compiler = NULL;
673 for (unsigned i = 0; i < n_paths; i++)
674 if (access_check (paths[i], X_OK) == 0)
676 compiler = paths[i];
677 break;
680 if (compiler)
682 /* Generate temporary output file name. */
683 filename = make_temp_file (".target.o");
685 struct obstack argv_obstack;
686 obstack_init (&argv_obstack);
687 obstack_ptr_grow (&argv_obstack, compiler);
688 if (save_temps)
689 obstack_ptr_grow (&argv_obstack, "-save-temps");
690 if (verbose)
691 obstack_ptr_grow (&argv_obstack, "-v");
692 obstack_ptr_grow (&argv_obstack, "-o");
693 obstack_ptr_grow (&argv_obstack, filename);
695 /* Append names of input object files. */
696 for (unsigned i = 0; i < in_argc; i++)
697 obstack_ptr_grow (&argv_obstack, in_argv[i]);
699 /* Append options from offload_lto sections. */
700 append_compiler_options (&argv_obstack, compiler_opts,
701 compiler_opt_count);
703 /* Append options specified by -foffload last. In case of conflicting
704 options we expect offload compiler to choose the latest. */
705 append_offload_options (&argv_obstack, target, compiler_opts,
706 compiler_opt_count);
707 append_offload_options (&argv_obstack, target, linker_opts,
708 linker_opt_count);
710 obstack_ptr_grow (&argv_obstack, NULL);
711 argv = XOBFINISH (&argv_obstack, char **);
712 fork_execute (argv[0], argv, true);
713 obstack_free (&argv_obstack, NULL);
716 free_array_of_ptrs ((void **) paths, n_paths);
717 return filename;
721 /* The main routine dealing with offloading.
722 The routine builds a target image for each offload target. IN_ARGC and
723 IN_ARGV specify options and input object files. As all of them could contain
724 target sections, we pass them all to target compilers. */
726 static void
727 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
728 struct cl_decoded_option *compiler_opts,
729 unsigned int compiler_opt_count,
730 struct cl_decoded_option *linker_opts,
731 unsigned int linker_opt_count)
733 char **names = NULL;
734 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
735 if (!target_names)
736 return;
737 unsigned num_targets = parse_env_var (target_names, &names, NULL);
739 const char *compiler_path = getenv ("COMPILER_PATH");
740 if (!compiler_path)
741 goto out;
743 /* Prepare an image for each target and save the name of the resultant object
744 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
745 offload_names = XCNEWVEC (char *, num_targets + 1);
746 for (unsigned i = 0; i < num_targets; i++)
748 offload_names[i]
749 = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
750 compiler_opts, compiler_opt_count,
751 linker_opts, linker_opt_count);
752 if (!offload_names[i])
753 fatal_error (input_location,
754 "problem with building target image for %s\n", names[i]);
757 out:
758 free_array_of_ptrs ((void **) names, num_targets);
761 /* Copy a file from SRC to DEST. */
763 static void
764 copy_file (const char *dest, const char *src)
766 FILE *d = fopen (dest, "wb");
767 FILE *s = fopen (src, "rb");
768 char buffer[512];
769 while (!feof (s))
771 size_t len = fread (buffer, 1, 512, s);
772 if (ferror (s) != 0)
773 fatal_error (input_location, "reading input file");
774 if (len > 0)
776 fwrite (buffer, 1, len, d);
777 if (ferror (d) != 0)
778 fatal_error (input_location, "writing output file");
783 /* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make
784 copies and store the names of the copies in offloadbegin and offloadend. */
786 static void
787 find_offloadbeginend (void)
789 char **paths = NULL;
790 const char *library_path = getenv ("LIBRARY_PATH");
791 if (!library_path)
792 return;
793 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadbegin.o");
795 unsigned i;
796 for (i = 0; i < n_paths; i++)
797 if (access_check (paths[i], R_OK) == 0)
799 size_t len = strlen (paths[i]);
800 char *tmp = xstrdup (paths[i]);
801 strcpy (paths[i] + len - strlen ("begin.o"), "end.o");
802 if (access_check (paths[i], R_OK) != 0)
803 fatal_error (input_location,
804 "installation error, can't find crtoffloadend.o");
805 /* The linker will delete the filenames we give it, so make
806 copies. */
807 offloadbegin = make_temp_file (".o");
808 offloadend = make_temp_file (".o");
809 copy_file (offloadbegin, tmp);
810 copy_file (offloadend, paths[i]);
811 free (tmp);
812 break;
814 if (i == n_paths)
815 fatal_error (input_location,
816 "installation error, can't find crtoffloadbegin.o");
818 free_array_of_ptrs ((void **) paths, n_paths);
821 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
822 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
823 and OPT_COUNT. Return true if we found a matchingn section, false
824 otherwise. COLLECT_GCC holds the value of the environment variable with
825 the same name. */
827 static bool
828 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
829 struct cl_decoded_option **opts,
830 unsigned int *opt_count, const char *collect_gcc)
832 off_t offset, length;
833 char *data;
834 char *fopts;
835 const char *errmsg;
836 int err;
837 struct cl_decoded_option *fdecoded_options = *opts;
838 unsigned int fdecoded_options_count = *opt_count;
840 simple_object_read *sobj;
841 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
842 &errmsg, &err);
843 if (!sobj)
844 return false;
846 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
847 strcpy (secname, prefix);
848 strcat (secname, ".opts");
849 if (!simple_object_find_section (sobj, secname, &offset, &length,
850 &errmsg, &err))
852 simple_object_release_read (sobj);
853 return false;
856 lseek (fd, file_offset + offset, SEEK_SET);
857 data = (char *)xmalloc (length);
858 read (fd, data, length);
859 fopts = data;
862 struct cl_decoded_option *f2decoded_options;
863 unsigned int f2decoded_options_count;
864 get_options_from_collect_gcc_options (collect_gcc,
865 fopts, CL_LANG_ALL,
866 &f2decoded_options,
867 &f2decoded_options_count);
868 if (!fdecoded_options)
870 fdecoded_options = f2decoded_options;
871 fdecoded_options_count = f2decoded_options_count;
873 else
874 merge_and_complain (&fdecoded_options,
875 &fdecoded_options_count,
876 f2decoded_options, f2decoded_options_count);
878 fopts += strlen (fopts) + 1;
880 while (fopts - data < length);
882 free (data);
883 simple_object_release_read (sobj);
884 *opts = fdecoded_options;
885 *opt_count = fdecoded_options_count;
886 return true;
889 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
891 static void
892 run_gcc (unsigned argc, char *argv[])
894 unsigned i, j;
895 const char **new_argv;
896 const char **argv_ptr;
897 char *list_option_full = NULL;
898 const char *linker_output = NULL;
899 const char *collect_gcc, *collect_gcc_options;
900 int parallel = 0;
901 int jobserver = 0;
902 bool no_partition = false;
903 struct cl_decoded_option *fdecoded_options = NULL;
904 struct cl_decoded_option *offload_fdecoded_options = NULL;
905 unsigned int fdecoded_options_count = 0;
906 unsigned int offload_fdecoded_options_count = 0;
907 struct cl_decoded_option *decoded_options;
908 unsigned int decoded_options_count;
909 struct obstack argv_obstack;
910 int new_head_argc;
911 bool have_lto = false;
912 bool have_offload = false;
913 unsigned lto_argc = 0, offload_argc = 0;
914 char **lto_argv, **offload_argv;
916 /* Get the driver and options. */
917 collect_gcc = getenv ("COLLECT_GCC");
918 if (!collect_gcc)
919 fatal_error (input_location,
920 "environment variable COLLECT_GCC must be set");
921 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
922 if (!collect_gcc_options)
923 fatal_error (input_location,
924 "environment variable COLLECT_GCC_OPTIONS must be set");
925 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
926 CL_LANG_ALL,
927 &decoded_options,
928 &decoded_options_count);
930 /* Allocate arrays for input object files with LTO or offload IL,
931 and for possible preceding arguments. */
932 lto_argv = XNEWVEC (char *, argc);
933 offload_argv = XNEWVEC (char *, argc);
935 /* Look at saved options in the IL files. */
936 for (i = 1; i < argc; ++i)
938 char *p;
939 int fd;
940 off_t file_offset = 0;
941 long loffset;
942 int consumed;
943 char *filename = argv[i];
945 if ((p = strrchr (argv[i], '@'))
946 && p != argv[i]
947 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
948 && strlen (p) == (unsigned int) consumed)
950 filename = XNEWVEC (char, p - argv[i] + 1);
951 memcpy (filename, argv[i], p - argv[i]);
952 filename[p - argv[i]] = '\0';
953 file_offset = (off_t) loffset;
955 fd = open (filename, O_RDONLY | O_BINARY);
956 if (fd == -1)
958 lto_argv[lto_argc++] = argv[i];
959 continue;
962 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
963 &fdecoded_options, &fdecoded_options_count,
964 collect_gcc))
966 have_lto = true;
967 lto_argv[lto_argc++] = argv[i];
970 if (find_and_merge_options (fd, file_offset, OFFLOAD_SECTION_NAME_PREFIX,
971 &offload_fdecoded_options,
972 &offload_fdecoded_options_count, collect_gcc))
974 have_offload = true;
975 offload_argv[offload_argc++] = argv[i];
978 close (fd);
981 /* Initalize the common arguments for the driver. */
982 obstack_init (&argv_obstack);
983 obstack_ptr_grow (&argv_obstack, collect_gcc);
984 obstack_ptr_grow (&argv_obstack, "-xlto");
985 obstack_ptr_grow (&argv_obstack, "-c");
987 append_compiler_options (&argv_obstack, fdecoded_options,
988 fdecoded_options_count);
989 append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
991 /* Scan linker driver arguments for things that are of relevance to us. */
992 for (j = 1; j < decoded_options_count; ++j)
994 struct cl_decoded_option *option = &decoded_options[j];
995 switch (option->opt_index)
997 case OPT_o:
998 linker_output = option->arg;
999 break;
1001 case OPT_save_temps:
1002 save_temps = 1;
1003 break;
1005 case OPT_v:
1006 verbose = 1;
1007 break;
1009 case OPT_flto_partition_:
1010 if (strcmp (option->arg, "none") == 0)
1011 no_partition = true;
1012 break;
1014 case OPT_flto_:
1015 if (strcmp (option->arg, "jobserver") == 0)
1017 jobserver = 1;
1018 parallel = 1;
1020 else
1022 parallel = atoi (option->arg);
1023 if (parallel <= 1)
1024 parallel = 0;
1026 /* Fallthru. */
1028 case OPT_flto:
1029 lto_mode = LTO_MODE_WHOPR;
1030 break;
1032 default:
1033 break;
1037 if (no_partition)
1039 lto_mode = LTO_MODE_LTO;
1040 jobserver = 0;
1041 parallel = 0;
1044 if (linker_output)
1046 char *output_dir, *base, *name;
1047 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1049 output_dir = xstrdup (linker_output);
1050 base = output_dir;
1051 for (name = base; *name; name++)
1052 if (IS_DIR_SEPARATOR (*name))
1053 base = name + 1;
1054 *base = '\0';
1056 linker_output = &linker_output[base - output_dir];
1057 if (*output_dir == '\0')
1059 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1060 output_dir = current_dir;
1062 if (!bit_bucket)
1064 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1065 obstack_ptr_grow (&argv_obstack, output_dir);
1068 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1071 /* Remember at which point we can scrub args to re-use the commons. */
1072 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1074 if (have_offload)
1076 compile_images_for_offload_targets (offload_argc, offload_argv,
1077 offload_fdecoded_options,
1078 offload_fdecoded_options_count,
1079 decoded_options,
1080 decoded_options_count);
1081 if (offload_names)
1083 find_offloadbeginend ();
1084 for (i = 0; offload_names[i]; i++)
1085 printf ("%s\n", offload_names[i]);
1086 free_array_of_ptrs ((void **) offload_names, i);
1090 if (offloadbegin)
1091 printf ("%s\n", offloadbegin);
1093 /* If object files contain offload sections, but do not contain LTO sections,
1094 then there is no need to perform a link-time recompilation, i.e.
1095 lto-wrapper is used only for a compilation of offload images. */
1096 if (have_offload && !have_lto)
1098 for (i = 1; i < argc; ++i)
1099 if (strncmp (argv[i], "-fresolution=",
1100 sizeof ("-fresolution=") - 1) != 0
1101 && strncmp (argv[i], "-flinker-output=",
1102 sizeof ("-flinker-output=") - 1) != 0)
1104 char *out_file;
1105 /* Can be ".o" or ".so". */
1106 char *ext = strrchr (argv[i], '.');
1107 if (ext == NULL)
1108 out_file = make_temp_file ("");
1109 else
1110 out_file = make_temp_file (ext);
1111 /* The linker will delete the files we give it, so make copies. */
1112 copy_file (out_file, argv[i]);
1113 printf ("%s\n", out_file);
1115 goto finish;
1118 if (lto_mode == LTO_MODE_LTO)
1120 flto_out = make_temp_file (".lto.o");
1121 if (linker_output)
1122 obstack_ptr_grow (&argv_obstack, linker_output);
1123 obstack_ptr_grow (&argv_obstack, "-o");
1124 obstack_ptr_grow (&argv_obstack, flto_out);
1126 else
1128 const char *list_option = "-fltrans-output-list=";
1129 size_t list_option_len = strlen (list_option);
1130 char *tmp;
1132 if (linker_output)
1134 char *dumpbase = (char *) xmalloc (strlen (linker_output)
1135 + sizeof (".wpa") + 1);
1136 strcpy (dumpbase, linker_output);
1137 strcat (dumpbase, ".wpa");
1138 obstack_ptr_grow (&argv_obstack, dumpbase);
1141 if (linker_output && save_temps)
1143 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1144 + sizeof (".ltrans.out") + 1);
1145 strcpy (ltrans_output_file, linker_output);
1146 strcat (ltrans_output_file, ".ltrans.out");
1148 else
1149 ltrans_output_file = make_temp_file (".ltrans.out");
1150 list_option_full = (char *) xmalloc (sizeof (char) *
1151 (strlen (ltrans_output_file) + list_option_len + 1));
1152 tmp = list_option_full;
1154 obstack_ptr_grow (&argv_obstack, tmp);
1155 strcpy (tmp, list_option);
1156 tmp += list_option_len;
1157 strcpy (tmp, ltrans_output_file);
1159 if (jobserver)
1160 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1161 else if (parallel > 1)
1163 char buf[256];
1164 sprintf (buf, "-fwpa=%i", parallel);
1165 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1167 else
1168 obstack_ptr_grow (&argv_obstack, "-fwpa");
1171 /* Append the input objects and possible preceding arguments. */
1172 for (i = 0; i < lto_argc; ++i)
1173 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1174 obstack_ptr_grow (&argv_obstack, NULL);
1176 new_argv = XOBFINISH (&argv_obstack, const char **);
1177 argv_ptr = &new_argv[new_head_argc];
1178 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1180 if (lto_mode == LTO_MODE_LTO)
1182 printf ("%s\n", flto_out);
1183 free (flto_out);
1184 flto_out = NULL;
1186 else
1188 FILE *stream = fopen (ltrans_output_file, "r");
1189 FILE *mstream = NULL;
1190 struct obstack env_obstack;
1192 if (!stream)
1193 fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
1195 /* Parse the list of LTRANS inputs from the WPA stage. */
1196 obstack_init (&env_obstack);
1197 nr = 0;
1198 for (;;)
1200 const unsigned piece = 32;
1201 char *output_name = NULL;
1202 char *buf, *input_name = (char *)xmalloc (piece);
1203 size_t len;
1205 buf = input_name;
1206 cont:
1207 if (!fgets (buf, piece, stream))
1208 break;
1209 len = strlen (input_name);
1210 if (input_name[len - 1] != '\n')
1212 input_name = (char *)xrealloc (input_name, len + piece);
1213 buf = input_name + len;
1214 goto cont;
1216 input_name[len - 1] = '\0';
1218 if (input_name[0] == '*')
1219 output_name = &input_name[1];
1221 nr++;
1222 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1223 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1224 input_names[nr-1] = input_name;
1225 output_names[nr-1] = output_name;
1227 fclose (stream);
1228 maybe_unlink (ltrans_output_file);
1229 ltrans_output_file = NULL;
1231 if (parallel)
1233 makefile = make_temp_file (".mk");
1234 mstream = fopen (makefile, "w");
1237 /* Execute the LTRANS stage for each input file (or prepare a
1238 makefile to invoke this in parallel). */
1239 for (i = 0; i < nr; ++i)
1241 char *output_name;
1242 char *input_name = input_names[i];
1243 /* If it's a pass-through file do nothing. */
1244 if (output_names[i])
1245 continue;
1247 /* Replace the .o suffix with a .ltrans.o suffix and write
1248 the resulting name to the LTRANS output list. */
1249 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1250 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1251 output_name = XOBFINISH (&env_obstack, char *);
1253 /* Adjust the dumpbase if the linker output file was seen. */
1254 if (linker_output)
1256 char *dumpbase
1257 = (char *) xmalloc (strlen (linker_output)
1258 + sizeof (DUMPBASE_SUFFIX) + 1);
1259 snprintf (dumpbase,
1260 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1261 "%s.ltrans%u", linker_output, i);
1262 argv_ptr[0] = dumpbase;
1265 argv_ptr[1] = "-fltrans";
1266 argv_ptr[2] = "-o";
1267 argv_ptr[3] = output_name;
1268 argv_ptr[4] = input_name;
1269 argv_ptr[5] = NULL;
1270 if (parallel)
1272 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1273 for (j = 1; new_argv[j] != NULL; ++j)
1274 fprintf (mstream, " '%s'", new_argv[j]);
1275 fprintf (mstream, "\n");
1276 /* If we are not preserving the ltrans input files then
1277 truncate them as soon as we have processed it. This
1278 reduces temporary disk-space usage. */
1279 if (! save_temps)
1280 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1281 "&& mv %s.tem %s\n",
1282 input_name, input_name, input_name, input_name);
1284 else
1286 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1287 true);
1288 maybe_unlink (input_name);
1291 output_names[i] = output_name;
1293 if (parallel)
1295 struct pex_obj *pex;
1296 char jobs[32];
1298 fprintf (mstream, "all:");
1299 for (i = 0; i < nr; ++i)
1300 fprintf (mstream, " \\\n\t%s", output_names[i]);
1301 fprintf (mstream, "\n");
1302 fclose (mstream);
1303 if (!jobserver)
1305 /* Avoid passing --jobserver-fd= and similar flags
1306 unless jobserver mode is explicitly enabled. */
1307 putenv (xstrdup ("MAKEFLAGS="));
1308 putenv (xstrdup ("MFLAGS="));
1310 new_argv[0] = getenv ("MAKE");
1311 if (!new_argv[0])
1312 new_argv[0] = "make";
1313 new_argv[1] = "-f";
1314 new_argv[2] = makefile;
1315 i = 3;
1316 if (!jobserver)
1318 snprintf (jobs, 31, "-j%d", parallel);
1319 new_argv[i++] = jobs;
1321 new_argv[i++] = "all";
1322 new_argv[i++] = NULL;
1323 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1324 NULL, NULL, PEX_SEARCH, false);
1325 do_wait (new_argv[0], pex);
1326 maybe_unlink (makefile);
1327 makefile = NULL;
1328 for (i = 0; i < nr; ++i)
1329 maybe_unlink (input_names[i]);
1331 for (i = 0; i < nr; ++i)
1333 fputs (output_names[i], stdout);
1334 putc ('\n', stdout);
1335 free (input_names[i]);
1337 nr = 0;
1338 free (output_names);
1339 free (input_names);
1340 free (list_option_full);
1341 obstack_free (&env_obstack, NULL);
1344 finish:
1345 if (offloadend)
1346 printf ("%s\n", offloadend);
1348 XDELETE (lto_argv);
1349 XDELETE (offload_argv);
1350 obstack_free (&argv_obstack, NULL);
1354 /* Entry point. */
1357 main (int argc, char *argv[])
1359 const char *p;
1361 init_opts_obstack ();
1363 p = argv[0] + strlen (argv[0]);
1364 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1365 --p;
1366 progname = p;
1368 xmalloc_set_program_name (progname);
1370 gcc_init_libintl ();
1372 diagnostic_initialize (global_dc, 0);
1374 if (atexit (lto_wrapper_cleanup) != 0)
1375 fatal_error (input_location, "atexit failed");
1377 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1378 signal (SIGINT, fatal_signal);
1379 #ifdef SIGHUP
1380 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1381 signal (SIGHUP, fatal_signal);
1382 #endif
1383 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1384 signal (SIGTERM, fatal_signal);
1385 #ifdef SIGPIPE
1386 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1387 signal (SIGPIPE, fatal_signal);
1388 #endif
1389 #ifdef SIGCHLD
1390 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1391 receive the signal. A different setting is inheritable */
1392 signal (SIGCHLD, SIG_DFL);
1393 #endif
1395 /* We may be called with all the arguments stored in some file and
1396 passed with @file. Expand them into argv before processing. */
1397 expandargv (&argc, &argv);
1399 run_gcc (argc, argv);
1401 return 0;