Assorted ChangeLog cleanups.
[official-gcc.git] / gcc / lto-wrapper.c
blob84f59cf1a1f1d62aecc46b2bf2f29a8091c21235
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2019 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 unsigned int num_deb_objs;
75 static const char **early_debug_object_names;
77 const char tool_name[] = "lto-wrapper";
79 /* Delete tempfiles. Called from utils_cleanup. */
81 void
82 tool_cleanup (bool)
84 unsigned int i;
86 if (ltrans_output_file)
87 maybe_unlink (ltrans_output_file);
88 if (flto_out)
89 maybe_unlink (flto_out);
90 if (offload_objects_file_name)
91 maybe_unlink (offload_objects_file_name);
92 if (makefile)
93 maybe_unlink (makefile);
94 if (early_debug_object_names)
95 for (i = 0; i < num_deb_objs; ++i)
96 if (early_debug_object_names[i])
97 maybe_unlink (early_debug_object_names[i]);
98 for (i = 0; i < nr; ++i)
100 maybe_unlink (input_names[i]);
101 if (output_names[i])
102 maybe_unlink (output_names[i]);
106 static void
107 lto_wrapper_cleanup (void)
109 utils_cleanup (false);
112 /* Unlink a temporary LTRANS file unless requested otherwise. */
114 void
115 maybe_unlink (const char *file)
117 if (!save_temps)
119 if (unlink_if_ordinary (file)
120 && errno != ENOENT)
121 fatal_error (input_location, "deleting LTRANS file %s: %m", file);
123 else if (verbose)
124 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
127 /* Template of LTRANS dumpbase suffix. */
128 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
130 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
131 environment according to LANG_MASK. */
133 static void
134 get_options_from_collect_gcc_options (const char *collect_gcc,
135 const char *collect_gcc_options,
136 unsigned int lang_mask,
137 struct cl_decoded_option **decoded_options,
138 unsigned int *decoded_options_count)
140 struct obstack argv_obstack;
141 char *argv_storage;
142 const char **argv;
143 int j, k, argc;
145 argv_storage = xstrdup (collect_gcc_options);
146 obstack_init (&argv_obstack);
147 obstack_ptr_grow (&argv_obstack, collect_gcc);
149 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
151 if (argv_storage[j] == '\'')
153 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
154 ++j;
157 if (argv_storage[j] == '\0')
158 fatal_error (input_location,
159 "malformed %<COLLECT_GCC_OPTIONS%>");
160 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
162 argv_storage[k++] = '\'';
163 j += 4;
165 else if (argv_storage[j] == '\'')
166 break;
167 else
168 argv_storage[k++] = argv_storage[j++];
170 while (1);
171 argv_storage[k++] = '\0';
175 obstack_ptr_grow (&argv_obstack, NULL);
176 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
177 argv = XOBFINISH (&argv_obstack, const char **);
179 decode_cmdline_options_to_array (argc, (const char **)argv,
180 lang_mask,
181 decoded_options, decoded_options_count);
182 obstack_free (&argv_obstack, NULL);
185 /* Append OPTION to the options array DECODED_OPTIONS with size
186 DECODED_OPTIONS_COUNT. */
188 static void
189 append_option (struct cl_decoded_option **decoded_options,
190 unsigned int *decoded_options_count,
191 struct cl_decoded_option *option)
193 ++*decoded_options_count;
194 *decoded_options
195 = (struct cl_decoded_option *)
196 xrealloc (*decoded_options,
197 (*decoded_options_count
198 * sizeof (struct cl_decoded_option)));
199 memcpy (&(*decoded_options)[*decoded_options_count - 1], option,
200 sizeof (struct cl_decoded_option));
203 /* Remove option number INDEX from DECODED_OPTIONS, update
204 DECODED_OPTIONS_COUNT. */
206 static void
207 remove_option (struct cl_decoded_option **decoded_options,
208 int index, unsigned int *decoded_options_count)
210 --*decoded_options_count;
211 memmove (&(*decoded_options)[index + 1],
212 &(*decoded_options)[index],
213 sizeof (struct cl_decoded_option)
214 * (*decoded_options_count - index));
217 /* Try to merge and complain about options FDECODED_OPTIONS when applied
218 ontop of DECODED_OPTIONS. */
220 static void
221 merge_and_complain (struct cl_decoded_option **decoded_options,
222 unsigned int *decoded_options_count,
223 struct cl_decoded_option *fdecoded_options,
224 unsigned int fdecoded_options_count)
226 unsigned int i, j;
227 struct cl_decoded_option *pic_option = NULL;
228 struct cl_decoded_option *pie_option = NULL;
230 /* ??? Merge options from files. Most cases can be
231 handled by either unioning or intersecting
232 (for example -fwrapv is a case for unioning,
233 -ffast-math is for intersection). Most complaints
234 about real conflicts between different options can
235 be deferred to the compiler proper. Options that
236 we can neither safely handle by intersection nor
237 unioning would need to be complained about here.
238 Ideally we'd have a flag in the opt files that
239 tells whether to union or intersect or reject.
240 In absence of that it's unclear what a good default is.
241 It's also difficult to get positional handling correct. */
243 /* The following does what the old LTO option code did,
244 union all target and a selected set of common options. */
245 for (i = 0; i < fdecoded_options_count; ++i)
247 struct cl_decoded_option *foption = &fdecoded_options[i];
248 switch (foption->opt_index)
250 case OPT_SPECIAL_unknown:
251 case OPT_SPECIAL_ignore:
252 case OPT_SPECIAL_deprecated:
253 case OPT_SPECIAL_program_name:
254 case OPT_SPECIAL_input_file:
255 break;
257 default:
258 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
259 break;
261 /* Fallthru. */
262 case OPT_fdiagnostics_show_caret:
263 case OPT_fdiagnostics_show_labels:
264 case OPT_fdiagnostics_show_line_numbers:
265 case OPT_fdiagnostics_show_option:
266 case OPT_fdiagnostics_show_location_:
267 case OPT_fshow_column:
268 case OPT_fcommon:
269 case OPT_fgnu_tm:
270 /* Do what the old LTO code did - collect exactly one option
271 setting per OPT code, we pick the first we encounter.
272 ??? This doesn't make too much sense, but when it doesn't
273 then we should complain. */
274 for (j = 0; j < *decoded_options_count; ++j)
275 if ((*decoded_options)[j].opt_index == foption->opt_index)
276 break;
277 if (j == *decoded_options_count)
278 append_option (decoded_options, decoded_options_count, foption);
279 break;
281 /* Figure out what PIC/PIE level wins and merge the results. */
282 case OPT_fPIC:
283 case OPT_fpic:
284 pic_option = foption;
285 break;
286 case OPT_fPIE:
287 case OPT_fpie:
288 pie_option = foption;
289 break;
291 case OPT_fopenmp:
292 case OPT_fopenacc:
293 /* For selected options we can merge conservatively. */
294 for (j = 0; j < *decoded_options_count; ++j)
295 if ((*decoded_options)[j].opt_index == foption->opt_index)
296 break;
297 if (j == *decoded_options_count)
298 append_option (decoded_options, decoded_options_count, foption);
299 /* -fopenmp > -fno-openmp,
300 -fopenacc > -fno-openacc */
301 else if (foption->value > (*decoded_options)[j].value)
302 (*decoded_options)[j] = *foption;
303 break;
305 case OPT_fopenacc_dim_:
306 /* Append or check identical. */
307 for (j = 0; j < *decoded_options_count; ++j)
308 if ((*decoded_options)[j].opt_index == foption->opt_index)
309 break;
310 if (j == *decoded_options_count)
311 append_option (decoded_options, decoded_options_count, foption);
312 else if (strcmp ((*decoded_options)[j].arg, foption->arg))
313 fatal_error (input_location,
314 "option %s with different values",
315 foption->orig_option_with_args_text);
316 break;
318 case OPT_O:
319 case OPT_Ofast:
320 case OPT_Og:
321 case OPT_Os:
322 for (j = 0; j < *decoded_options_count; ++j)
323 if ((*decoded_options)[j].opt_index == OPT_O
324 || (*decoded_options)[j].opt_index == OPT_Ofast
325 || (*decoded_options)[j].opt_index == OPT_Og
326 || (*decoded_options)[j].opt_index == OPT_Os)
327 break;
328 if (j == *decoded_options_count)
329 append_option (decoded_options, decoded_options_count, foption);
330 else if ((*decoded_options)[j].opt_index == foption->opt_index
331 && foption->opt_index != OPT_O)
332 /* Exact same options get merged. */
334 else
336 /* For mismatched option kinds preserve the optimization
337 level only, thus merge it as -On. This also handles
338 merging of same optimization level -On. */
339 int level = 0;
340 switch (foption->opt_index)
342 case OPT_O:
343 if (foption->arg[0] == '\0')
344 level = MAX (level, 1);
345 else
346 level = MAX (level, atoi (foption->arg));
347 break;
348 case OPT_Ofast:
349 level = MAX (level, 3);
350 break;
351 case OPT_Og:
352 level = MAX (level, 1);
353 break;
354 case OPT_Os:
355 level = MAX (level, 2);
356 break;
357 default:
358 gcc_unreachable ();
360 switch ((*decoded_options)[j].opt_index)
362 case OPT_O:
363 if ((*decoded_options)[j].arg[0] == '\0')
364 level = MAX (level, 1);
365 else
366 level = MAX (level, atoi ((*decoded_options)[j].arg));
367 break;
368 case OPT_Ofast:
369 level = MAX (level, 3);
370 break;
371 case OPT_Og:
372 level = MAX (level, 1);
373 break;
374 case OPT_Os:
375 level = MAX (level, 2);
376 break;
377 default:
378 gcc_unreachable ();
380 (*decoded_options)[j].opt_index = OPT_O;
381 char *tem;
382 tem = xasprintf ("-O%d", level);
383 (*decoded_options)[j].arg = &tem[2];
384 (*decoded_options)[j].canonical_option[0] = tem;
385 (*decoded_options)[j].value = 1;
387 break;
390 case OPT_foffload_abi_:
391 for (j = 0; j < *decoded_options_count; ++j)
392 if ((*decoded_options)[j].opt_index == foption->opt_index)
393 break;
394 if (j == *decoded_options_count)
395 append_option (decoded_options, decoded_options_count, foption);
396 else if (foption->value != (*decoded_options)[j].value)
397 fatal_error (input_location,
398 "option %s not used consistently in all LTO input"
399 " files", foption->orig_option_with_args_text);
400 break;
403 case OPT_foffload_:
404 append_option (decoded_options, decoded_options_count, foption);
405 break;
409 /* Merge PIC options:
410 -fPIC + -fpic = -fpic
411 -fPIC + -fno-pic = -fno-pic
412 -fpic/-fPIC + nothin = nothing.
413 It is a common mistake to mix few -fPIC compiled objects into otherwise
414 non-PIC code. We do not want to build everything with PIC then.
416 Similarly we merge PIE options, however in addition we keep
417 -fPIC + -fPIE = -fPIE
418 -fpic + -fPIE = -fpie
419 -fPIC/-fpic + -fpie = -fpie
421 It would be good to warn on mismatches, but it is bit hard to do as
422 we do not know what nothing translates to. */
424 for (unsigned int j = 0; j < *decoded_options_count;)
425 if ((*decoded_options)[j].opt_index == OPT_fPIC
426 || (*decoded_options)[j].opt_index == OPT_fpic)
428 /* -fno-pic in one unit implies -fno-pic everywhere. */
429 if ((*decoded_options)[j].value == 0)
430 j++;
431 /* If we have no pic option or merge in -fno-pic, we still may turn
432 existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */
433 else if ((pic_option && pic_option->value == 0)
434 || !pic_option)
436 if (pie_option)
438 bool big = (*decoded_options)[j].opt_index == OPT_fPIC
439 && pie_option->opt_index == OPT_fPIE;
440 (*decoded_options)[j].opt_index = big ? OPT_fPIE : OPT_fpie;
441 if (pie_option->value)
442 (*decoded_options)[j].canonical_option[0] = big ? "-fPIE" : "-fpie";
443 else
444 (*decoded_options)[j].canonical_option[0] = big ? "-fno-pie" : "-fno-pie";
445 (*decoded_options)[j].value = pie_option->value;
446 j++;
448 else if (pic_option)
450 (*decoded_options)[j] = *pic_option;
451 j++;
453 /* We do not know if target defaults to pic or not, so just remove
454 option if it is missing in one unit but enabled in other. */
455 else
456 remove_option (decoded_options, j, decoded_options_count);
458 else if (pic_option->opt_index == OPT_fpic
459 && (*decoded_options)[j].opt_index == OPT_fPIC)
461 (*decoded_options)[j] = *pic_option;
462 j++;
464 else
465 j++;
467 else if ((*decoded_options)[j].opt_index == OPT_fPIE
468 || (*decoded_options)[j].opt_index == OPT_fpie)
470 /* -fno-pie in one unit implies -fno-pie everywhere. */
471 if ((*decoded_options)[j].value == 0)
472 j++;
473 /* If we have no pie option or merge in -fno-pie, we still preserve
474 PIE/pie if pic/PIC is present. */
475 else if ((pie_option && pie_option->value == 0)
476 || !pie_option)
478 /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */
479 if (pic_option)
481 if (pic_option->opt_index == OPT_fpic
482 && (*decoded_options)[j].opt_index == OPT_fPIE)
484 (*decoded_options)[j].opt_index = OPT_fpie;
485 (*decoded_options)[j].canonical_option[0]
486 = pic_option->value ? "-fpie" : "-fno-pie";
488 else if (!pic_option->value)
489 (*decoded_options)[j].canonical_option[0] = "-fno-pie";
490 (*decoded_options)[j].value = pic_option->value;
491 j++;
493 else if (pie_option)
495 (*decoded_options)[j] = *pie_option;
496 j++;
498 /* Because we always append pic/PIE options this code path should
499 not happen unless the LTO object was built by old lto1 which
500 did not contain that logic yet. */
501 else
502 remove_option (decoded_options, j, decoded_options_count);
504 else if (pie_option->opt_index == OPT_fpie
505 && (*decoded_options)[j].opt_index == OPT_fPIE)
507 (*decoded_options)[j] = *pie_option;
508 j++;
510 else
511 j++;
513 else
514 j++;
517 /* Auxiliary function that frees elements of PTR and PTR itself.
518 N is number of elements to be freed. If PTR is NULL, nothing is freed.
519 If an element is NULL, subsequent elements are not freed. */
521 static void **
522 free_array_of_ptrs (void **ptr, unsigned n)
524 if (!ptr)
525 return NULL;
526 for (unsigned i = 0; i < n; i++)
528 if (!ptr[i])
529 break;
530 free (ptr[i]);
532 free (ptr);
533 return NULL;
536 /* Parse STR, saving found tokens into PVALUES and return their number.
537 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
538 append it to every token we find. */
540 static unsigned
541 parse_env_var (const char *str, char ***pvalues, const char *append)
543 const char *curval, *nextval;
544 char **values;
545 unsigned num = 1, i;
547 curval = strchr (str, ':');
548 while (curval)
550 num++;
551 curval = strchr (curval + 1, ':');
554 values = (char**) xmalloc (num * sizeof (char*));
555 curval = str;
556 nextval = strchr (curval, ':');
557 if (nextval == NULL)
558 nextval = strchr (curval, '\0');
560 int append_len = append ? strlen (append) : 0;
561 for (i = 0; i < num; i++)
563 int l = nextval - curval;
564 values[i] = (char*) xmalloc (l + 1 + append_len);
565 memcpy (values[i], curval, l);
566 values[i][l] = 0;
567 if (append)
568 strcat (values[i], append);
569 curval = nextval + 1;
570 nextval = strchr (curval, ':');
571 if (nextval == NULL)
572 nextval = strchr (curval, '\0');
574 *pvalues = values;
575 return num;
578 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
580 static void
581 append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
582 unsigned int count)
584 /* Append compiler driver arguments as far as they were merged. */
585 for (unsigned int j = 1; j < count; ++j)
587 struct cl_decoded_option *option = &opts[j];
589 /* File options have been properly filtered by lto-opts.c. */
590 switch (option->opt_index)
592 /* Drop arguments that we want to take from the link line. */
593 case OPT_flto_:
594 case OPT_flto:
595 case OPT_flto_partition_:
596 continue;
598 default:
599 break;
602 /* For now do what the original LTO option code was doing - pass
603 on any CL_TARGET flag and a few selected others. */
604 switch (option->opt_index)
606 case OPT_fdiagnostics_show_caret:
607 case OPT_fdiagnostics_show_labels:
608 case OPT_fdiagnostics_show_line_numbers:
609 case OPT_fdiagnostics_show_option:
610 case OPT_fdiagnostics_show_location_:
611 case OPT_fshow_column:
612 case OPT_fPIC:
613 case OPT_fpic:
614 case OPT_fPIE:
615 case OPT_fpie:
616 case OPT_fcommon:
617 case OPT_fgnu_tm:
618 case OPT_fopenmp:
619 case OPT_fopenacc:
620 case OPT_fopenacc_dim_:
621 case OPT_foffload_abi_:
622 case OPT_O:
623 case OPT_Ofast:
624 case OPT_Og:
625 case OPT_Os:
626 break;
628 default:
629 if (!(cl_options[option->opt_index].flags & CL_TARGET))
630 continue;
633 /* Pass the option on. */
634 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
635 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
639 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
641 static void
642 append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts,
643 unsigned int count)
645 /* Append compiler driver arguments as far as they were merged. */
646 for (unsigned int j = 1; j < count; ++j)
648 struct cl_decoded_option *option = &opts[j];
650 switch (option->opt_index)
652 case OPT_fdiagnostics_color_:
653 case OPT_fdiagnostics_format_:
654 case OPT_fdiagnostics_show_caret:
655 case OPT_fdiagnostics_show_labels:
656 case OPT_fdiagnostics_show_line_numbers:
657 case OPT_fdiagnostics_show_option:
658 case OPT_fdiagnostics_show_location_:
659 case OPT_fshow_column:
660 break;
661 default:
662 continue;
665 /* Pass the option on. */
666 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
667 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
672 /* Append linker options OPTS to ARGV_OBSTACK. */
674 static void
675 append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
676 unsigned int count)
678 /* Append linker driver arguments. Compiler options from the linker
679 driver arguments will override / merge with those from the compiler. */
680 for (unsigned int j = 1; j < count; ++j)
682 struct cl_decoded_option *option = &opts[j];
684 /* Do not pass on frontend specific flags not suitable for lto. */
685 if (!(cl_options[option->opt_index].flags
686 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
687 continue;
689 switch (option->opt_index)
691 case OPT_o:
692 case OPT_flto_:
693 case OPT_flto:
694 /* We've handled these LTO options, do not pass them on. */
695 continue;
697 case OPT_fopenmp:
698 case OPT_fopenacc:
699 /* Ignore -fno-XXX form of these options, as otherwise
700 corresponding builtins will not be enabled. */
701 if (option->value == 0)
702 continue;
703 break;
705 default:
706 break;
709 /* Pass the option on. */
710 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
711 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
715 /* Extract options for TARGET offload compiler from OPTIONS and append
716 them to ARGV_OBSTACK. */
718 static void
719 append_offload_options (obstack *argv_obstack, const char *target,
720 struct cl_decoded_option *options,
721 unsigned int options_count)
723 for (unsigned i = 0; i < options_count; i++)
725 const char *cur, *next, *opts;
726 char **argv;
727 unsigned argc;
728 struct cl_decoded_option *option = &options[i];
730 if (option->opt_index != OPT_foffload_)
731 continue;
733 /* If option argument starts with '-' then no target is specified. That
734 means offload options are specified for all targets, so we need to
735 append them. */
736 if (option->arg[0] == '-')
737 opts = option->arg;
738 else
740 opts = strchr (option->arg, '=');
741 /* If there are offload targets specified, but no actual options,
742 there is nothing to do here. */
743 if (!opts)
744 continue;
746 cur = option->arg;
748 while (cur < opts)
750 next = strchr (cur, ',');
751 if (next == NULL)
752 next = opts;
753 next = (next > opts) ? opts : next;
755 /* Are we looking for this offload target? */
756 if (strlen (target) == (size_t) (next - cur)
757 && strncmp (target, cur, next - cur) == 0)
758 break;
760 /* Skip the comma or equal sign. */
761 cur = next + 1;
764 if (cur >= opts)
765 continue;
767 opts++;
770 argv = buildargv (opts);
771 for (argc = 0; argv[argc]; argc++)
772 obstack_ptr_grow (argv_obstack, argv[argc]);
776 /* Check whether NAME can be accessed in MODE. This is like access,
777 except that it never considers directories to be executable. */
779 static int
780 access_check (const char *name, int mode)
782 if (mode == X_OK)
784 struct stat st;
786 if (stat (name, &st) < 0
787 || S_ISDIR (st.st_mode))
788 return -1;
791 return access (name, mode);
794 /* Prepare a target image for offload TARGET, using mkoffload tool from
795 COMPILER_PATH. Return the name of the resultant object file. */
797 static char *
798 compile_offload_image (const char *target, const char *compiler_path,
799 unsigned in_argc, char *in_argv[],
800 struct cl_decoded_option *compiler_opts,
801 unsigned int compiler_opt_count,
802 struct cl_decoded_option *linker_opts,
803 unsigned int linker_opt_count)
805 char *filename = NULL;
806 char **argv;
807 char *suffix
808 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
809 strcpy (suffix, "/accel/");
810 strcat (suffix, target);
811 strcat (suffix, "/mkoffload");
813 char **paths = NULL;
814 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
816 const char *compiler = NULL;
817 for (unsigned i = 0; i < n_paths; i++)
818 if (access_check (paths[i], X_OK) == 0)
820 compiler = paths[i];
821 break;
824 if (!compiler)
825 fatal_error (input_location,
826 "could not find %s in %s (consider using %<-B%>)",
827 suffix + 1, compiler_path);
829 /* Generate temporary output file name. */
830 filename = make_temp_file (".target.o");
832 struct obstack argv_obstack;
833 obstack_init (&argv_obstack);
834 obstack_ptr_grow (&argv_obstack, compiler);
835 if (save_temps)
836 obstack_ptr_grow (&argv_obstack, "-save-temps");
837 if (verbose)
838 obstack_ptr_grow (&argv_obstack, "-v");
839 obstack_ptr_grow (&argv_obstack, "-o");
840 obstack_ptr_grow (&argv_obstack, filename);
842 /* Append names of input object files. */
843 for (unsigned i = 0; i < in_argc; i++)
844 obstack_ptr_grow (&argv_obstack, in_argv[i]);
846 /* Append options from offload_lto sections. */
847 append_compiler_options (&argv_obstack, compiler_opts,
848 compiler_opt_count);
849 append_diag_options (&argv_obstack, linker_opts, linker_opt_count);
851 /* Append options specified by -foffload last. In case of conflicting
852 options we expect offload compiler to choose the latest. */
853 append_offload_options (&argv_obstack, target, compiler_opts,
854 compiler_opt_count);
855 append_offload_options (&argv_obstack, target, linker_opts,
856 linker_opt_count);
858 obstack_ptr_grow (&argv_obstack, NULL);
859 argv = XOBFINISH (&argv_obstack, char **);
860 fork_execute (argv[0], argv, true);
861 obstack_free (&argv_obstack, NULL);
863 free_array_of_ptrs ((void **) paths, n_paths);
864 return filename;
868 /* The main routine dealing with offloading.
869 The routine builds a target image for each offload target. IN_ARGC and
870 IN_ARGV specify options and input object files. As all of them could contain
871 target sections, we pass them all to target compilers. */
873 static void
874 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
875 struct cl_decoded_option *compiler_opts,
876 unsigned int compiler_opt_count,
877 struct cl_decoded_option *linker_opts,
878 unsigned int linker_opt_count)
880 char **names = NULL;
881 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
882 if (!target_names)
883 return;
884 unsigned num_targets = parse_env_var (target_names, &names, NULL);
886 int next_name_entry = 0;
887 const char *compiler_path = getenv ("COMPILER_PATH");
888 if (!compiler_path)
889 goto out;
891 /* Prepare an image for each target and save the name of the resultant object
892 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
893 offload_names = XCNEWVEC (char *, num_targets + 1);
894 for (unsigned i = 0; i < num_targets; i++)
896 /* HSA does not use LTO-like streaming and a different compiler, skip
897 it. */
898 if (strcmp (names[i], "hsa") == 0)
899 continue;
901 offload_names[next_name_entry]
902 = compile_offload_image (names[i], compiler_path, in_argc, in_argv,
903 compiler_opts, compiler_opt_count,
904 linker_opts, linker_opt_count);
905 if (!offload_names[next_name_entry])
906 fatal_error (input_location,
907 "problem with building target image for %s", names[i]);
908 next_name_entry++;
911 out:
912 free_array_of_ptrs ((void **) names, num_targets);
915 /* Copy a file from SRC to DEST. */
917 static void
918 copy_file (const char *dest, const char *src)
920 FILE *d = fopen (dest, "wb");
921 FILE *s = fopen (src, "rb");
922 char buffer[512];
923 while (!feof (s))
925 size_t len = fread (buffer, 1, 512, s);
926 if (ferror (s) != 0)
927 fatal_error (input_location, "reading input file");
928 if (len > 0)
930 fwrite (buffer, 1, len, d);
931 if (ferror (d) != 0)
932 fatal_error (input_location, "writing output file");
935 fclose (d);
936 fclose (s);
939 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
940 the copy to the linker. */
942 static void
943 find_crtoffloadtable (void)
945 char **paths = NULL;
946 const char *library_path = getenv ("LIBRARY_PATH");
947 if (!library_path)
948 return;
949 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
951 unsigned i;
952 for (i = 0; i < n_paths; i++)
953 if (access_check (paths[i], R_OK) == 0)
955 /* The linker will delete the filename we give it, so make a copy. */
956 char *crtoffloadtable = make_temp_file (".crtoffloadtable.o");
957 copy_file (crtoffloadtable, paths[i]);
958 printf ("%s\n", crtoffloadtable);
959 XDELETEVEC (crtoffloadtable);
960 break;
962 if (i == n_paths)
963 fatal_error (input_location,
964 "installation error, cannot find %<crtoffloadtable.o%>");
966 free_array_of_ptrs ((void **) paths, n_paths);
969 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
970 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
971 and OPT_COUNT. Return true if we found a matchingn section, false
972 otherwise. COLLECT_GCC holds the value of the environment variable with
973 the same name. */
975 static bool
976 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
977 struct cl_decoded_option **opts,
978 unsigned int *opt_count, const char *collect_gcc)
980 off_t offset, length;
981 char *data;
982 char *fopts;
983 const char *errmsg;
984 int err;
985 struct cl_decoded_option *fdecoded_options = *opts;
986 unsigned int fdecoded_options_count = *opt_count;
988 simple_object_read *sobj;
989 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
990 &errmsg, &err);
991 if (!sobj)
992 return false;
994 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
995 strcpy (secname, prefix);
996 strcat (secname, ".opts");
997 if (!simple_object_find_section (sobj, secname, &offset, &length,
998 &errmsg, &err))
1000 simple_object_release_read (sobj);
1001 return false;
1004 lseek (fd, file_offset + offset, SEEK_SET);
1005 data = (char *)xmalloc (length);
1006 read (fd, data, length);
1007 fopts = data;
1010 struct cl_decoded_option *f2decoded_options;
1011 unsigned int f2decoded_options_count;
1012 get_options_from_collect_gcc_options (collect_gcc,
1013 fopts, CL_DRIVER,
1014 &f2decoded_options,
1015 &f2decoded_options_count);
1016 if (!fdecoded_options)
1018 fdecoded_options = f2decoded_options;
1019 fdecoded_options_count = f2decoded_options_count;
1021 else
1022 merge_and_complain (&fdecoded_options,
1023 &fdecoded_options_count,
1024 f2decoded_options, f2decoded_options_count);
1026 fopts += strlen (fopts) + 1;
1028 while (fopts - data < length);
1030 free (data);
1031 simple_object_release_read (sobj);
1032 *opts = fdecoded_options;
1033 *opt_count = fdecoded_options_count;
1034 return true;
1037 /* Copy early debug info sections from INFILE to a new file whose name
1038 is returned. Return NULL on error. */
1040 const char *
1041 debug_objcopy (const char *infile, bool rename)
1043 char *outfile;
1044 const char *errmsg;
1045 int err;
1047 const char *p;
1048 const char *orig_infile = infile;
1049 off_t inoff = 0;
1050 long loffset;
1051 int consumed;
1052 if ((p = strrchr (infile, '@'))
1053 && p != infile
1054 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1055 && strlen (p) == (unsigned int) consumed)
1057 char *fname = xstrdup (infile);
1058 fname[p - infile] = '\0';
1059 infile = fname;
1060 inoff = (off_t) loffset;
1062 int infd = open (infile, O_RDONLY | O_BINARY);
1063 if (infd == -1)
1064 return NULL;
1065 simple_object_read *inobj = simple_object_start_read (infd, inoff,
1066 "__GNU_LTO",
1067 &errmsg, &err);
1068 if (!inobj)
1069 return NULL;
1071 off_t off, len;
1072 if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info",
1073 &off, &len, &errmsg, &err) != 1)
1075 if (errmsg)
1076 fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1078 simple_object_release_read (inobj);
1079 close (infd);
1080 return NULL;
1083 if (save_temps)
1085 outfile = (char *) xmalloc (strlen (orig_infile)
1086 + sizeof (".debug.temp.o") + 1);
1087 strcpy (outfile, orig_infile);
1088 strcat (outfile, ".debug.temp.o");
1090 else
1091 outfile = make_temp_file (".debug.temp.o");
1092 errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
1093 if (errmsg)
1095 unlink_if_ordinary (outfile);
1096 fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1099 simple_object_release_read (inobj);
1100 close (infd);
1102 return outfile;
1105 /* Helper for qsort: compare priorities for parallel compilation. */
1108 cmp_priority (const void *a, const void *b)
1110 return *((const int *)b)-*((const int *)a);
1113 /* Number of CPUs that can be used for parallel LTRANS phase. */
1115 static unsigned long nthreads_var = 0;
1117 #ifdef HAVE_PTHREAD_AFFINITY_NP
1118 unsigned long cpuset_size;
1119 static unsigned long get_cpuset_size;
1120 cpu_set_t *cpusetp;
1122 unsigned long
1123 static cpuset_popcount (unsigned long cpusetsize, cpu_set_t *cpusetp)
1125 #ifdef CPU_COUNT_S
1126 /* glibc 2.7 and above provide a macro for this. */
1127 return CPU_COUNT_S (cpusetsize, cpusetp);
1128 #else
1129 #ifdef CPU_COUNT
1130 if (cpusetsize == sizeof (cpu_set_t))
1131 /* glibc 2.6 and above provide a macro for this. */
1132 return CPU_COUNT (cpusetp);
1133 #endif
1134 size_t i;
1135 unsigned long ret = 0;
1136 STATIC_ASSERT (sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int));
1137 for (i = 0; i < cpusetsize / sizeof (cpusetp->__bits[0]); i++)
1139 unsigned long int mask = cpusetp->__bits[i];
1140 if (mask == 0)
1141 continue;
1142 ret += __builtin_popcountl (mask);
1144 return ret;
1145 #endif
1147 #endif
1149 /* At startup, determine the default number of threads. It would seem
1150 this should be related to the number of cpus online. */
1152 static void
1153 init_num_threads (void)
1155 #ifdef HAVE_PTHREAD_AFFINITY_NP
1156 #if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE)
1157 cpuset_size = sysconf (_SC_NPROCESSORS_CONF);
1158 cpuset_size = CPU_ALLOC_SIZE (cpuset_size);
1159 #else
1160 cpuset_size = sizeof (cpu_set_t);
1161 #endif
1163 cpusetp = (cpu_set_t *) xmalloc (gomp_cpuset_size);
1166 int ret = pthread_getaffinity_np (pthread_self (), gomp_cpuset_size,
1167 cpusetp);
1168 if (ret == 0)
1170 /* Count only the CPUs this process can use. */
1171 nthreads_var = cpuset_popcount (cpuset_size, cpusetp);
1172 if (nthreads_var == 0)
1173 break;
1174 get_cpuset_size = cpuset_size;
1175 #ifdef CPU_ALLOC_SIZE
1176 unsigned long i;
1177 for (i = cpuset_size * 8; i; i--)
1178 if (CPU_ISSET_S (i - 1, cpuset_size, cpusetp))
1179 break;
1180 cpuset_size = CPU_ALLOC_SIZE (i);
1181 #endif
1182 return;
1184 if (ret != EINVAL)
1185 break;
1186 #ifdef CPU_ALLOC_SIZE
1187 if (cpuset_size < sizeof (cpu_set_t))
1188 cpuset_size = sizeof (cpu_set_t);
1189 else
1190 cpuset_size = cpuset_size * 2;
1191 if (cpuset_size < 8 * sizeof (cpu_set_t))
1192 cpusetp
1193 = (cpu_set_t *) realloc (cpusetp, cpuset_size);
1194 else
1196 /* Avoid fatal if too large memory allocation would be
1197 requested, e.g. kernel returning EINVAL all the time. */
1198 void *p = realloc (cpusetp, cpuset_size);
1199 if (p == NULL)
1200 break;
1201 cpusetp = (cpu_set_t *) p;
1203 #else
1204 break;
1205 #endif
1207 while (1);
1208 cpuset_size = 0;
1209 nthreads_var = 1;
1210 free (cpusetp);
1211 cpusetp = NULL;
1212 #endif
1213 #ifdef _SC_NPROCESSORS_ONLN
1214 nthreads_var = sysconf (_SC_NPROCESSORS_ONLN);
1215 #endif
1218 /* FIXME: once using -std=c11, we can use std::thread::hardware_concurrency. */
1220 /* Return true when a jobserver is running and can accept a job. */
1222 static bool
1223 jobserver_active_p (void)
1225 const char *makeflags = getenv ("MAKEFLAGS");
1226 if (makeflags == NULL)
1227 return false;
1229 const char *needle = "--jobserver-auth=";
1230 const char *n = strstr (makeflags, needle);
1231 if (n == NULL)
1232 return false;
1234 int rfd = -1;
1235 int wfd = -1;
1237 return (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
1238 && rfd > 0
1239 && wfd > 0
1240 && is_valid_fd (rfd)
1241 && is_valid_fd (wfd));
1244 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1246 static void
1247 run_gcc (unsigned argc, char *argv[])
1249 unsigned i, j;
1250 const char **new_argv;
1251 const char **argv_ptr;
1252 char *list_option_full = NULL;
1253 const char *linker_output = NULL;
1254 const char *collect_gcc, *collect_gcc_options;
1255 int parallel = 0;
1256 int jobserver = 0;
1257 int auto_parallel = 0;
1258 bool no_partition = false;
1259 struct cl_decoded_option *fdecoded_options = NULL;
1260 struct cl_decoded_option *offload_fdecoded_options = NULL;
1261 unsigned int fdecoded_options_count = 0;
1262 unsigned int offload_fdecoded_options_count = 0;
1263 struct cl_decoded_option *decoded_options;
1264 unsigned int decoded_options_count;
1265 struct obstack argv_obstack;
1266 int new_head_argc;
1267 bool have_lto = false;
1268 bool have_offload = false;
1269 unsigned lto_argc = 0, ltoobj_argc = 0;
1270 char **lto_argv, **ltoobj_argv;
1271 bool linker_output_rel = false;
1272 bool skip_debug = false;
1273 unsigned n_debugobj;
1275 /* Get the driver and options. */
1276 collect_gcc = getenv ("COLLECT_GCC");
1277 if (!collect_gcc)
1278 fatal_error (input_location,
1279 "environment variable %<COLLECT_GCC%> must be set");
1280 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1281 if (!collect_gcc_options)
1282 fatal_error (input_location,
1283 "environment variable %<COLLECT_GCC_OPTIONS%> must be set");
1284 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
1285 CL_DRIVER,
1286 &decoded_options,
1287 &decoded_options_count);
1289 /* Allocate array for input object files with LTO IL,
1290 and for possible preceding arguments. */
1291 lto_argv = XNEWVEC (char *, argc);
1292 ltoobj_argv = XNEWVEC (char *, argc);
1294 /* Look at saved options in the IL files. */
1295 for (i = 1; i < argc; ++i)
1297 char *p;
1298 int fd;
1299 off_t file_offset = 0;
1300 long loffset;
1301 int consumed;
1302 char *filename = argv[i];
1304 if (strncmp (argv[i], "-foffload-objects=",
1305 sizeof ("-foffload-objects=") - 1) == 0)
1307 have_offload = true;
1308 offload_objects_file_name
1309 = argv[i] + sizeof ("-foffload-objects=") - 1;
1310 continue;
1313 if ((p = strrchr (argv[i], '@'))
1314 && p != argv[i]
1315 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1316 && strlen (p) == (unsigned int) consumed)
1318 filename = XNEWVEC (char, p - argv[i] + 1);
1319 memcpy (filename, argv[i], p - argv[i]);
1320 filename[p - argv[i]] = '\0';
1321 file_offset = (off_t) loffset;
1323 fd = open (filename, O_RDONLY | O_BINARY);
1324 /* Linker plugin passes -fresolution and -flinker-output options.
1325 -flinker-output is passed only when user did not specify one and thus
1326 we do not need to worry about duplicities with the option handling
1327 below. */
1328 if (fd == -1)
1330 lto_argv[lto_argc++] = argv[i];
1331 if (strcmp (argv[i], "-flinker-output=rel") == 0)
1332 linker_output_rel = true;
1333 continue;
1336 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1337 &fdecoded_options, &fdecoded_options_count,
1338 collect_gcc))
1340 have_lto = true;
1341 ltoobj_argv[ltoobj_argc++] = argv[i];
1343 close (fd);
1346 /* Initalize the common arguments for the driver. */
1347 obstack_init (&argv_obstack);
1348 obstack_ptr_grow (&argv_obstack, collect_gcc);
1349 obstack_ptr_grow (&argv_obstack, "-xlto");
1350 obstack_ptr_grow (&argv_obstack, "-c");
1352 append_compiler_options (&argv_obstack, fdecoded_options,
1353 fdecoded_options_count);
1354 append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
1356 /* Scan linker driver arguments for things that are of relevance to us. */
1357 for (j = 1; j < decoded_options_count; ++j)
1359 struct cl_decoded_option *option = &decoded_options[j];
1360 switch (option->opt_index)
1362 case OPT_o:
1363 linker_output = option->arg;
1364 break;
1366 case OPT_save_temps:
1367 save_temps = 1;
1368 break;
1370 case OPT_v:
1371 verbose = 1;
1372 break;
1374 case OPT_flto_partition_:
1375 if (strcmp (option->arg, "none") == 0)
1376 no_partition = true;
1377 break;
1379 case OPT_flto_:
1380 if (strcmp (option->arg, "jobserver") == 0)
1381 jobserver = 1;
1382 else if (strcmp (option->arg, "auto") == 0)
1384 parallel = 1;
1385 auto_parallel = 1;
1387 else
1389 parallel = atoi (option->arg);
1390 if (parallel <= 1)
1391 parallel = 0;
1393 /* Fallthru. */
1395 case OPT_flto:
1396 lto_mode = LTO_MODE_WHOPR;
1397 break;
1399 case OPT_flinker_output_:
1400 linker_output_rel = !strcmp (option->arg, "rel");
1401 break;
1404 default:
1405 break;
1409 /* Output lto-wrapper invocation command. */
1410 if (verbose)
1412 for (i = 0; i < argc; ++i)
1414 fputs (argv[i], stderr);
1415 fputc (' ', stderr);
1417 fputc ('\n', stderr);
1420 if (linker_output_rel)
1421 no_partition = true;
1423 if (no_partition)
1425 lto_mode = LTO_MODE_LTO;
1426 jobserver = 0;
1427 auto_parallel = 0;
1428 parallel = 0;
1430 else if (!jobserver && auto_parallel)
1431 jobserver = jobserver_active_p ();
1433 if (linker_output)
1435 char *output_dir, *base, *name;
1436 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1438 output_dir = xstrdup (linker_output);
1439 base = output_dir;
1440 for (name = base; *name; name++)
1441 if (IS_DIR_SEPARATOR (*name))
1442 base = name + 1;
1443 *base = '\0';
1445 linker_output = &linker_output[base - output_dir];
1446 if (*output_dir == '\0')
1448 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1449 output_dir = current_dir;
1451 if (!bit_bucket)
1453 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1454 obstack_ptr_grow (&argv_obstack, output_dir);
1457 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1460 /* Remember at which point we can scrub args to re-use the commons. */
1461 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1463 if (have_offload)
1465 unsigned i, num_offload_files;
1466 char **offload_argv;
1467 FILE *f;
1469 f = fopen (offload_objects_file_name, "r");
1470 if (f == NULL)
1471 fatal_error (input_location, "cannot open %s: %m",
1472 offload_objects_file_name);
1473 if (fscanf (f, "%u ", &num_offload_files) != 1)
1474 fatal_error (input_location, "cannot read %s: %m",
1475 offload_objects_file_name);
1476 offload_argv = XCNEWVEC (char *, num_offload_files);
1478 /* Read names of object files with offload. */
1479 for (i = 0; i < num_offload_files; i++)
1481 const unsigned piece = 32;
1482 char *buf, *filename = XNEWVEC (char, piece);
1483 size_t len;
1485 buf = filename;
1486 cont1:
1487 if (!fgets (buf, piece, f))
1488 break;
1489 len = strlen (filename);
1490 if (filename[len - 1] != '\n')
1492 filename = XRESIZEVEC (char, filename, len + piece);
1493 buf = filename + len;
1494 goto cont1;
1496 filename[len - 1] = '\0';
1497 offload_argv[i] = filename;
1499 fclose (f);
1500 if (offload_argv[num_offload_files - 1] == NULL)
1501 fatal_error (input_location, "invalid format of %s",
1502 offload_objects_file_name);
1503 maybe_unlink (offload_objects_file_name);
1504 offload_objects_file_name = NULL;
1506 /* Look at saved offload options in files. */
1507 for (i = 0; i < num_offload_files; i++)
1509 char *p;
1510 long loffset;
1511 int fd, consumed;
1512 off_t file_offset = 0;
1513 char *filename = offload_argv[i];
1515 if ((p = strrchr (offload_argv[i], '@'))
1516 && p != offload_argv[i]
1517 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1518 && strlen (p) == (unsigned int) consumed)
1520 filename = XNEWVEC (char, p - offload_argv[i] + 1);
1521 memcpy (filename, offload_argv[i], p - offload_argv[i]);
1522 filename[p - offload_argv[i]] = '\0';
1523 file_offset = (off_t) loffset;
1525 fd = open (filename, O_RDONLY | O_BINARY);
1526 if (fd == -1)
1527 fatal_error (input_location, "cannot open %s: %m", filename);
1528 if (!find_and_merge_options (fd, file_offset,
1529 OFFLOAD_SECTION_NAME_PREFIX,
1530 &offload_fdecoded_options,
1531 &offload_fdecoded_options_count,
1532 collect_gcc))
1533 fatal_error (input_location, "cannot read %s: %m", filename);
1534 close (fd);
1535 if (filename != offload_argv[i])
1536 XDELETEVEC (filename);
1539 compile_images_for_offload_targets (num_offload_files, offload_argv,
1540 offload_fdecoded_options,
1541 offload_fdecoded_options_count,
1542 decoded_options,
1543 decoded_options_count);
1545 free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1547 if (offload_names)
1549 find_crtoffloadtable ();
1550 for (i = 0; offload_names[i]; i++)
1551 printf ("%s\n", offload_names[i]);
1552 free_array_of_ptrs ((void **) offload_names, i);
1556 /* If object files contain offload sections, but do not contain LTO sections,
1557 then there is no need to perform a link-time recompilation, i.e.
1558 lto-wrapper is used only for a compilation of offload images. */
1559 if (have_offload && !have_lto)
1560 goto finish;
1562 if (lto_mode == LTO_MODE_LTO)
1564 if (linker_output)
1566 obstack_ptr_grow (&argv_obstack, linker_output);
1567 flto_out = (char *) xmalloc (strlen (linker_output)
1568 + sizeof (".lto.o") + 1);
1569 strcpy (flto_out, linker_output);
1570 strcat (flto_out, ".lto.o");
1572 else
1573 flto_out = make_temp_file (".lto.o");
1574 obstack_ptr_grow (&argv_obstack, "-o");
1575 obstack_ptr_grow (&argv_obstack, flto_out);
1577 else
1579 const char *list_option = "-fltrans-output-list=";
1580 size_t list_option_len = strlen (list_option);
1581 char *tmp;
1583 if (linker_output)
1585 char *dumpbase = (char *) xmalloc (strlen (linker_output)
1586 + sizeof (".wpa") + 1);
1587 strcpy (dumpbase, linker_output);
1588 strcat (dumpbase, ".wpa");
1589 obstack_ptr_grow (&argv_obstack, dumpbase);
1592 if (linker_output && save_temps)
1594 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1595 + sizeof (".ltrans.out") + 1);
1596 strcpy (ltrans_output_file, linker_output);
1597 strcat (ltrans_output_file, ".ltrans.out");
1599 else
1601 char *prefix = NULL;
1602 if (linker_output)
1604 prefix = (char *) xmalloc (strlen (linker_output) + 2);
1605 strcpy (prefix, linker_output);
1606 strcat (prefix, ".");
1609 ltrans_output_file = make_temp_file_with_prefix (prefix,
1610 ".ltrans.out");
1611 free (prefix);
1613 list_option_full = (char *) xmalloc (sizeof (char) *
1614 (strlen (ltrans_output_file) + list_option_len + 1));
1615 tmp = list_option_full;
1617 obstack_ptr_grow (&argv_obstack, tmp);
1618 strcpy (tmp, list_option);
1619 tmp += list_option_len;
1620 strcpy (tmp, ltrans_output_file);
1622 if (jobserver)
1624 if (verbose)
1625 fprintf (stderr, "Using make jobserver\n");
1626 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1628 else if (auto_parallel)
1630 char buf[256];
1631 init_num_threads ();
1632 if (verbose)
1633 fprintf (stderr, "LTO parallelism level set to %ld\n",
1634 nthreads_var);
1635 sprintf (buf, "-fwpa=%ld", nthreads_var);
1636 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1638 else if (parallel > 1)
1640 char buf[256];
1641 sprintf (buf, "-fwpa=%i", parallel);
1642 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1644 else
1645 obstack_ptr_grow (&argv_obstack, "-fwpa");
1648 /* Append input arguments. */
1649 for (i = 0; i < lto_argc; ++i)
1650 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1651 /* Append the input objects. */
1652 for (i = 0; i < ltoobj_argc; ++i)
1653 obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]);
1654 obstack_ptr_grow (&argv_obstack, NULL);
1656 new_argv = XOBFINISH (&argv_obstack, const char **);
1657 argv_ptr = &new_argv[new_head_argc];
1658 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1660 /* Copy the early generated debug info from the objects to temporary
1661 files and append those to the partial link commandline. */
1662 n_debugobj = 0;
1663 early_debug_object_names = NULL;
1664 if (! skip_debug)
1666 early_debug_object_names = XCNEWVEC (const char *, ltoobj_argc+ 1);
1667 num_deb_objs = ltoobj_argc;
1668 for (i = 0; i < ltoobj_argc; ++i)
1670 const char *tem;
1671 if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
1673 early_debug_object_names[i] = tem;
1674 n_debugobj++;
1679 if (lto_mode == LTO_MODE_LTO)
1681 printf ("%s\n", flto_out);
1682 if (!skip_debug)
1684 for (i = 0; i < ltoobj_argc; ++i)
1685 if (early_debug_object_names[i] != NULL)
1686 printf ("%s\n", early_debug_object_names[i]);
1688 /* These now belong to collect2. */
1689 free (flto_out);
1690 flto_out = NULL;
1691 free (early_debug_object_names);
1692 early_debug_object_names = NULL;
1694 else
1696 FILE *stream = fopen (ltrans_output_file, "r");
1697 FILE *mstream = NULL;
1698 struct obstack env_obstack;
1699 int priority;
1701 if (!stream)
1702 fatal_error (input_location, "%<fopen%>: %s: %m", ltrans_output_file);
1704 /* Parse the list of LTRANS inputs from the WPA stage. */
1705 obstack_init (&env_obstack);
1706 nr = 0;
1707 for (;;)
1709 const unsigned piece = 32;
1710 char *output_name = NULL;
1711 char *buf, *input_name = (char *)xmalloc (piece);
1712 size_t len;
1714 buf = input_name;
1715 if (fscanf (stream, "%i\n", &priority) != 1)
1717 if (!feof (stream))
1718 fatal_error (input_location,
1719 "corrupted ltrans output file %s",
1720 ltrans_output_file);
1721 break;
1723 cont:
1724 if (!fgets (buf, piece, stream))
1725 break;
1726 len = strlen (input_name);
1727 if (input_name[len - 1] != '\n')
1729 input_name = (char *)xrealloc (input_name, len + piece);
1730 buf = input_name + len;
1731 goto cont;
1733 input_name[len - 1] = '\0';
1735 if (input_name[0] == '*')
1736 output_name = &input_name[1];
1738 nr++;
1739 ltrans_priorities
1740 = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
1741 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1742 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1743 ltrans_priorities[(nr-1)*2] = priority;
1744 ltrans_priorities[(nr-1)*2+1] = nr-1;
1745 input_names[nr-1] = input_name;
1746 output_names[nr-1] = output_name;
1748 fclose (stream);
1749 maybe_unlink (ltrans_output_file);
1750 ltrans_output_file = NULL;
1752 if (parallel)
1754 makefile = make_temp_file (".mk");
1755 mstream = fopen (makefile, "w");
1756 qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
1759 /* Execute the LTRANS stage for each input file (or prepare a
1760 makefile to invoke this in parallel). */
1761 for (i = 0; i < nr; ++i)
1763 char *output_name;
1764 char *input_name = input_names[i];
1765 /* If it's a pass-through file do nothing. */
1766 if (output_names[i])
1767 continue;
1769 /* Replace the .o suffix with a .ltrans.o suffix and write
1770 the resulting name to the LTRANS output list. */
1771 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1772 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1773 output_name = XOBFINISH (&env_obstack, char *);
1775 /* Adjust the dumpbase if the linker output file was seen. */
1776 if (linker_output)
1778 char *dumpbase
1779 = (char *) xmalloc (strlen (linker_output)
1780 + sizeof (DUMPBASE_SUFFIX) + 1);
1781 snprintf (dumpbase,
1782 strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1783 "%s.ltrans%u", linker_output, i);
1784 argv_ptr[0] = dumpbase;
1787 argv_ptr[1] = "-fltrans";
1788 argv_ptr[2] = "-o";
1789 argv_ptr[3] = output_name;
1790 argv_ptr[4] = input_name;
1791 argv_ptr[5] = NULL;
1792 if (parallel)
1794 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1795 for (j = 1; new_argv[j] != NULL; ++j)
1796 fprintf (mstream, " '%s'", new_argv[j]);
1797 fprintf (mstream, "\n");
1798 /* If we are not preserving the ltrans input files then
1799 truncate them as soon as we have processed it. This
1800 reduces temporary disk-space usage. */
1801 if (! save_temps)
1802 fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1803 "&& mv %s.tem %s\n",
1804 input_name, input_name, input_name, input_name);
1806 else
1808 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1809 true);
1810 maybe_unlink (input_name);
1813 output_names[i] = output_name;
1815 if (parallel)
1817 struct pex_obj *pex;
1818 char jobs[32];
1820 fprintf (mstream,
1821 ".PHONY: all\n"
1822 "all:");
1823 for (i = 0; i < nr; ++i)
1825 int j = ltrans_priorities[i*2 + 1];
1826 fprintf (mstream, " \\\n\t%s", output_names[j]);
1828 fprintf (mstream, "\n");
1829 fclose (mstream);
1830 if (!jobserver)
1832 /* Avoid passing --jobserver-fd= and similar flags
1833 unless jobserver mode is explicitly enabled. */
1834 putenv (xstrdup ("MAKEFLAGS="));
1835 putenv (xstrdup ("MFLAGS="));
1837 new_argv[0] = getenv ("MAKE");
1838 if (!new_argv[0])
1839 new_argv[0] = "make";
1840 new_argv[1] = "-f";
1841 new_argv[2] = makefile;
1842 i = 3;
1843 if (!jobserver)
1845 snprintf (jobs, 31, "-j%ld",
1846 auto_parallel ? nthreads_var : parallel);
1847 new_argv[i++] = jobs;
1849 new_argv[i++] = "all";
1850 new_argv[i++] = NULL;
1851 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1852 NULL, NULL, PEX_SEARCH, false);
1853 do_wait (new_argv[0], pex);
1854 maybe_unlink (makefile);
1855 makefile = NULL;
1856 for (i = 0; i < nr; ++i)
1857 maybe_unlink (input_names[i]);
1859 for (i = 0; i < nr; ++i)
1861 fputs (output_names[i], stdout);
1862 putc ('\n', stdout);
1863 free (input_names[i]);
1865 if (!skip_debug)
1867 for (i = 0; i < ltoobj_argc; ++i)
1868 if (early_debug_object_names[i] != NULL)
1869 printf ("%s\n", early_debug_object_names[i]);
1871 nr = 0;
1872 free (ltrans_priorities);
1873 free (output_names);
1874 output_names = NULL;
1875 free (early_debug_object_names);
1876 early_debug_object_names = NULL;
1877 free (input_names);
1878 free (list_option_full);
1879 obstack_free (&env_obstack, NULL);
1882 finish:
1883 XDELETE (lto_argv);
1884 obstack_free (&argv_obstack, NULL);
1888 /* Entry point. */
1891 main (int argc, char *argv[])
1893 const char *p;
1895 init_opts_obstack ();
1897 p = argv[0] + strlen (argv[0]);
1898 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1899 --p;
1900 progname = p;
1902 xmalloc_set_program_name (progname);
1904 gcc_init_libintl ();
1906 diagnostic_initialize (global_dc, 0);
1908 if (atexit (lto_wrapper_cleanup) != 0)
1909 fatal_error (input_location, "%<atexit%> failed");
1911 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1912 signal (SIGINT, fatal_signal);
1913 #ifdef SIGHUP
1914 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1915 signal (SIGHUP, fatal_signal);
1916 #endif
1917 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1918 signal (SIGTERM, fatal_signal);
1919 #ifdef SIGPIPE
1920 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1921 signal (SIGPIPE, fatal_signal);
1922 #endif
1923 #ifdef SIGCHLD
1924 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1925 receive the signal. A different setting is inheritable */
1926 signal (SIGCHLD, SIG_DFL);
1927 #endif
1929 /* We may be called with all the arguments stored in some file and
1930 passed with @file. Expand them into argv before processing. */
1931 expandargv (&argc, &argv);
1933 run_gcc (argc, argv);
1935 return 0;