tree-optimization/114485 - neg induction with partial vectors
[official-gcc.git] / gcc / lto-wrapper.cc
blob610594cdc2baff5b4df3cf7e7c1b5dbffa12d3ba
1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2024 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 #define INCLUDE_STRING
41 #include "config.h"
42 #include "system.h"
43 #include "coretypes.h"
44 #include "intl.h"
45 #include "diagnostic.h"
46 #include "obstack.h"
47 #include "opts.h"
48 #include "options.h"
49 #include "simple-object.h"
50 #include "lto-section-names.h"
51 #include "collect-utils.h"
52 #include "opts-diagnostic.h"
53 #include "opt-suggestions.h"
54 #include "opts-jobserver.h"
56 /* Environment variable, used for passing the names of offload targets from GCC
57 driver to lto-wrapper. */
58 #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
59 #define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
61 /* By default there is no special suffix for target executables. */
62 #ifdef TARGET_EXECUTABLE_SUFFIX
63 #define HAVE_TARGET_EXECUTABLE_SUFFIX
64 #else
65 #define TARGET_EXECUTABLE_SUFFIX ""
66 #endif
68 enum lto_mode_d {
69 LTO_MODE_NONE, /* Not doing LTO. */
70 LTO_MODE_LTO, /* Normal LTO. */
71 LTO_MODE_WHOPR /* WHOPR. */
74 /* Current LTO mode. */
75 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
77 static char *ltrans_output_file;
78 static char *flto_out;
79 static unsigned int nr;
80 static int *ltrans_priorities;
81 static char **input_names;
82 static char **output_names;
83 static char **offload_names;
84 static char *offload_objects_file_name;
85 static char *makefile;
86 static unsigned int num_deb_objs;
87 static const char **early_debug_object_names;
88 static bool xassembler_options_error = false;
90 const char tool_name[] = "lto-wrapper";
92 /* Auxiliary function that frees elements of PTR and PTR itself.
93 N is number of elements to be freed. If PTR is NULL, nothing is freed.
94 If an element is NULL, subsequent elements are not freed. */
96 static void **
97 free_array_of_ptrs (void **ptr, unsigned n)
99 if (!ptr)
100 return NULL;
101 for (unsigned i = 0; i < n; i++)
103 if (!ptr[i])
104 break;
105 free (ptr[i]);
107 free (ptr);
108 return NULL;
111 /* Delete tempfiles. Called from utils_cleanup. */
113 void
114 tool_cleanup (bool)
116 unsigned int i;
118 if (ltrans_output_file)
119 maybe_unlink (ltrans_output_file);
120 if (flto_out)
121 maybe_unlink (flto_out);
122 if (offload_objects_file_name)
123 maybe_unlink (offload_objects_file_name);
124 if (makefile)
125 maybe_unlink (makefile);
126 if (early_debug_object_names)
127 for (i = 0; i < num_deb_objs; ++i)
128 if (early_debug_object_names[i])
129 maybe_unlink (early_debug_object_names[i]);
130 for (i = 0; i < nr; ++i)
132 maybe_unlink (input_names[i]);
133 if (output_names[i])
134 maybe_unlink (output_names[i]);
136 if (offload_names)
138 for (i = 0; offload_names[i]; i++)
139 maybe_unlink (offload_names[i]);
140 free_array_of_ptrs ((void **) offload_names, i);
144 static void
145 lto_wrapper_cleanup (void)
147 utils_cleanup (false);
150 /* Unlink a temporary LTRANS file unless requested otherwise. */
152 void
153 maybe_unlink (const char *file)
155 if (!save_temps)
157 if (unlink_if_ordinary (file)
158 && errno != ENOENT)
159 fatal_error (input_location, "deleting LTRANS file %s: %m", file);
161 else if (verbose)
162 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
165 /* Template of LTRANS dumpbase suffix. */
166 #define DUMPBASE_SUFFIX "ltrans18446744073709551615"
168 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
169 environment. */
171 static vec<cl_decoded_option>
172 get_options_from_collect_gcc_options (const char *collect_gcc,
173 const char *collect_gcc_options)
175 cl_decoded_option *decoded_options;
176 unsigned int decoded_options_count;
177 struct obstack argv_obstack;
178 const char **argv;
179 int argc;
181 obstack_init (&argv_obstack);
182 obstack_ptr_grow (&argv_obstack, collect_gcc);
184 parse_options_from_collect_gcc_options (collect_gcc_options,
185 &argv_obstack, &argc);
186 argv = XOBFINISH (&argv_obstack, const char **);
188 decode_cmdline_options_to_array (argc, (const char **)argv, CL_DRIVER,
189 &decoded_options, &decoded_options_count);
190 vec<cl_decoded_option> decoded;
191 decoded.create (decoded_options_count);
192 for (unsigned i = 0; i < decoded_options_count; ++i)
193 decoded.quick_push (decoded_options[i]);
194 free (decoded_options);
196 obstack_free (&argv_obstack, NULL);
198 return decoded;
201 /* Find option in OPTIONS based on OPT_INDEX, starting at START. -1
202 value is returned if the option is not present. */
204 static int
205 find_option (vec<cl_decoded_option> &options, size_t opt_index,
206 unsigned start = 0)
208 for (unsigned i = start; i < options.length (); ++i)
209 if (options[i].opt_index == opt_index)
210 return i;
212 return -1;
215 static int
216 find_option (vec<cl_decoded_option> &options, cl_decoded_option *option)
218 return find_option (options, option->opt_index);
221 /* Merge -flto FOPTION into vector of DECODED_OPTIONS. */
223 static void
224 merge_flto_options (vec<cl_decoded_option> &decoded_options,
225 cl_decoded_option *foption)
227 int existing_opt = find_option (decoded_options, foption);
228 if (existing_opt == -1)
229 decoded_options.safe_push (*foption);
230 else
232 if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
234 /* -flto=auto is preferred. */
235 if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
237 else if (strcmp (foption->arg, "auto") == 0
238 || strcmp (foption->arg, "jobserver") == 0)
239 decoded_options[existing_opt].arg = foption->arg;
240 else if (strcmp (decoded_options[existing_opt].arg,
241 "jobserver") != 0)
243 int n = atoi (foption->arg);
244 int original_n = atoi (decoded_options[existing_opt].arg);
245 if (n > original_n)
246 decoded_options[existing_opt].arg = foption->arg;
252 /* Try to merge and complain about options FDECODED_OPTIONS when applied
253 ontop of DECODED_OPTIONS. */
255 static void
256 merge_and_complain (vec<cl_decoded_option> &decoded_options,
257 vec<cl_decoded_option> fdecoded_options,
258 vec<cl_decoded_option> decoded_cl_options)
260 unsigned int i, j;
261 cl_decoded_option *pic_option = NULL;
262 cl_decoded_option *pie_option = NULL;
263 cl_decoded_option *cf_protection_option = NULL;
265 /* ??? Merge options from files. Most cases can be
266 handled by either unioning or intersecting
267 (for example -fwrapv is a case for unioning,
268 -ffast-math is for intersection). Most complaints
269 about real conflicts between different options can
270 be deferred to the compiler proper. Options that
271 we can neither safely handle by intersection nor
272 unioning would need to be complained about here.
273 Ideally we'd have a flag in the opt files that
274 tells whether to union or intersect or reject.
275 In absence of that it's unclear what a good default is.
276 It's also difficult to get positional handling correct. */
278 /* Look for a -fcf-protection option in the link-time options
279 which overrides any -fcf-protection from the lto sections. */
280 for (i = 0; i < decoded_cl_options.length (); ++i)
282 cl_decoded_option *foption = &decoded_cl_options[i];
283 if (foption->opt_index == OPT_fcf_protection_)
285 cf_protection_option = foption;
289 /* The following does what the old LTO option code did,
290 union all target and a selected set of common options. */
291 for (i = 0; i < fdecoded_options.length (); ++i)
293 cl_decoded_option *foption = &fdecoded_options[i];
294 int existing_opt = find_option (decoded_options, foption);
295 switch (foption->opt_index)
297 case OPT_SPECIAL_unknown:
298 case OPT_SPECIAL_ignore:
299 case OPT_SPECIAL_warn_removed:
300 case OPT_SPECIAL_program_name:
301 case OPT_SPECIAL_input_file:
302 break;
304 default:
305 if (!(cl_options[foption->opt_index].flags & CL_TARGET))
306 break;
308 /* Fallthru. */
309 case OPT_fdiagnostics_show_caret:
310 case OPT_fdiagnostics_show_labels:
311 case OPT_fdiagnostics_show_line_numbers:
312 case OPT_fdiagnostics_show_option:
313 case OPT_fdiagnostics_show_location_:
314 case OPT_fshow_column:
315 case OPT_fcommon:
316 case OPT_fgnu_tm:
317 case OPT_g:
318 /* Do what the old LTO code did - collect exactly one option
319 setting per OPT code, we pick the first we encounter.
320 ??? This doesn't make too much sense, but when it doesn't
321 then we should complain. */
322 if (existing_opt == -1)
323 decoded_options.safe_push (*foption);
324 break;
326 /* Figure out what PIC/PIE level wins and merge the results. */
327 case OPT_fPIC:
328 case OPT_fpic:
329 pic_option = foption;
330 break;
331 case OPT_fPIE:
332 case OPT_fpie:
333 pie_option = foption;
334 break;
336 case OPT_fopenmp:
337 case OPT_fopenacc:
338 case OPT_fasynchronous_unwind_tables:
339 case OPT_funwind_tables:
340 /* For selected options we can merge conservatively. */
341 if (existing_opt == -1)
342 decoded_options.safe_push (*foption);
343 /* -fopenmp > -fno-openmp,
344 -fopenacc > -fno-openacc */
345 else if (foption->value > decoded_options[existing_opt].value)
346 decoded_options[existing_opt] = *foption;
347 break;
349 case OPT_fopenacc_dim_:
350 /* Append or check identical. */
351 if (existing_opt == -1)
352 decoded_options.safe_push (*foption);
353 else if (strcmp (decoded_options[existing_opt].arg, foption->arg))
354 fatal_error (input_location,
355 "option %s with different values",
356 foption->orig_option_with_args_text);
357 break;
359 case OPT_fcf_protection_:
360 /* Default to link-time option, else append or check identical. */
361 if (!cf_protection_option
362 || cf_protection_option->value == CF_CHECK)
364 if (existing_opt == -1)
365 decoded_options.safe_push (*foption);
366 else if (decoded_options[existing_opt].value != foption->value)
368 if (cf_protection_option
369 && cf_protection_option->value == CF_CHECK)
370 fatal_error (input_location,
371 "option %qs with mismatching values"
372 " (%s, %s)",
373 "-fcf-protection",
374 decoded_options[existing_opt].arg,
375 foption->arg);
376 else
378 /* Merge and update the -fcf-protection option. */
379 decoded_options[existing_opt].value
380 &= (foption->value & CF_FULL);
381 switch (decoded_options[existing_opt].value)
383 case CF_NONE:
384 decoded_options[existing_opt].arg = "none";
385 break;
386 case CF_BRANCH:
387 decoded_options[existing_opt].arg = "branch";
388 break;
389 case CF_RETURN:
390 decoded_options[existing_opt].arg = "return";
391 break;
392 default:
393 gcc_unreachable ();
398 break;
400 case OPT_O:
401 case OPT_Ofast:
402 case OPT_Og:
403 case OPT_Os:
404 case OPT_Oz:
405 existing_opt = -1;
406 for (j = 0; j < decoded_options.length (); ++j)
407 if (decoded_options[j].opt_index == OPT_O
408 || decoded_options[j].opt_index == OPT_Ofast
409 || decoded_options[j].opt_index == OPT_Og
410 || decoded_options[j].opt_index == OPT_Os
411 || decoded_options[j].opt_index == OPT_Oz)
413 existing_opt = j;
414 break;
416 if (existing_opt == -1)
417 decoded_options.safe_push (*foption);
418 else if (decoded_options[existing_opt].opt_index == foption->opt_index
419 && foption->opt_index != OPT_O)
420 /* Exact same options get merged. */
422 else
424 /* For mismatched option kinds preserve the optimization
425 level only, thus merge it as -On. This also handles
426 merging of same optimization level -On. */
427 int level = 0;
428 switch (foption->opt_index)
430 case OPT_O:
431 if (foption->arg[0] == '\0')
432 level = MAX (level, 1);
433 else
434 level = MAX (level, atoi (foption->arg));
435 break;
436 case OPT_Ofast:
437 level = MAX (level, 3);
438 break;
439 case OPT_Og:
440 level = MAX (level, 1);
441 break;
442 case OPT_Os:
443 case OPT_Oz:
444 level = MAX (level, 2);
445 break;
446 default:
447 gcc_unreachable ();
449 switch (decoded_options[existing_opt].opt_index)
451 case OPT_O:
452 if (decoded_options[existing_opt].arg[0] == '\0')
453 level = MAX (level, 1);
454 else
455 level = MAX (level,
456 atoi (decoded_options[existing_opt].arg));
457 break;
458 case OPT_Ofast:
459 level = MAX (level, 3);
460 break;
461 case OPT_Og:
462 level = MAX (level, 1);
463 break;
464 case OPT_Os:
465 case OPT_Oz:
466 level = MAX (level, 2);
467 break;
468 default:
469 gcc_unreachable ();
471 decoded_options[existing_opt].opt_index = OPT_O;
472 char *tem;
473 tem = xasprintf ("-O%d", level);
474 decoded_options[existing_opt].arg = &tem[2];
475 decoded_options[existing_opt].canonical_option[0] = tem;
476 decoded_options[existing_opt].value = 1;
478 break;
481 case OPT_foffload_abi_:
482 if (existing_opt == -1)
483 decoded_options.safe_push (*foption);
484 else if (foption->value != decoded_options[existing_opt].value)
485 fatal_error (input_location,
486 "option %s not used consistently in all LTO input"
487 " files", foption->orig_option_with_args_text);
488 break;
491 case OPT_foffload_options_:
492 decoded_options.safe_push (*foption);
493 break;
495 case OPT_flto_:
496 merge_flto_options (decoded_options, foption);
497 break;
501 /* Merge PIC options:
502 -fPIC + -fpic = -fpic
503 -fPIC + -fno-pic = -fno-pic
504 -fpic/-fPIC + nothing = nothing.
505 It is a common mistake to mix few -fPIC compiled objects into otherwise
506 non-PIC code. We do not want to build everything with PIC then.
508 Similarly we merge PIE options, however in addition we keep
509 -fPIC + -fPIE = -fPIE
510 -fpic + -fPIE = -fpie
511 -fPIC/-fpic + -fpie = -fpie
513 It would be good to warn on mismatches, but it is bit hard to do as
514 we do not know what nothing translates to. */
516 for (unsigned int j = 0; j < decoded_options.length ();)
517 if (decoded_options[j].opt_index == OPT_fPIC
518 || decoded_options[j].opt_index == OPT_fpic)
520 /* -fno-pic in one unit implies -fno-pic everywhere. */
521 if (decoded_options[j].value == 0)
522 j++;
523 /* If we have no pic option or merge in -fno-pic, we still may turn
524 existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */
525 else if ((pic_option && pic_option->value == 0)
526 || !pic_option)
528 if (pie_option)
530 bool big = decoded_options[j].opt_index == OPT_fPIC
531 && pie_option->opt_index == OPT_fPIE;
532 decoded_options[j].opt_index = big ? OPT_fPIE : OPT_fpie;
533 if (pie_option->value)
534 decoded_options[j].canonical_option[0]
535 = big ? "-fPIE" : "-fpie";
536 else
537 decoded_options[j].canonical_option[0] = "-fno-pie";
538 decoded_options[j].value = pie_option->value;
539 j++;
541 else if (pic_option)
543 decoded_options[j] = *pic_option;
544 j++;
546 /* We do not know if target defaults to pic or not, so just remove
547 option if it is missing in one unit but enabled in other. */
548 else
549 decoded_options.ordered_remove (j);
551 else if (pic_option->opt_index == OPT_fpic
552 && decoded_options[j].opt_index == OPT_fPIC)
554 decoded_options[j] = *pic_option;
555 j++;
557 else
558 j++;
560 else if (decoded_options[j].opt_index == OPT_fPIE
561 || decoded_options[j].opt_index == OPT_fpie)
563 /* -fno-pie in one unit implies -fno-pie everywhere. */
564 if (decoded_options[j].value == 0)
565 j++;
566 /* If we have no pie option or merge in -fno-pie, we still preserve
567 PIE/pie if pic/PIC is present. */
568 else if ((pie_option && pie_option->value == 0)
569 || !pie_option)
571 /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */
572 if (pic_option)
574 if (pic_option->opt_index == OPT_fpic
575 && decoded_options[j].opt_index == OPT_fPIE)
577 decoded_options[j].opt_index = OPT_fpie;
578 decoded_options[j].canonical_option[0]
579 = pic_option->value ? "-fpie" : "-fno-pie";
581 else if (!pic_option->value)
582 decoded_options[j].canonical_option[0] = "-fno-pie";
583 decoded_options[j].value = pic_option->value;
584 j++;
586 else if (pie_option)
588 decoded_options[j] = *pie_option;
589 j++;
591 /* Because we always append pic/PIE options this code path should
592 not happen unless the LTO object was built by old lto1 which
593 did not contain that logic yet. */
594 else
595 decoded_options.ordered_remove (j);
597 else if (pie_option->opt_index == OPT_fpie
598 && decoded_options[j].opt_index == OPT_fPIE)
600 decoded_options[j] = *pie_option;
601 j++;
603 else
604 j++;
606 else
607 j++;
609 int existing_opt_index, existing_opt2_index;
610 if (!xassembler_options_error)
611 for (existing_opt_index = existing_opt2_index = 0; ;
612 existing_opt_index++, existing_opt2_index++)
614 existing_opt_index
615 = find_option (decoded_options, OPT_Xassembler, existing_opt_index);
616 existing_opt2_index
617 = find_option (fdecoded_options, OPT_Xassembler,
618 existing_opt2_index);
620 cl_decoded_option *existing_opt = NULL;
621 cl_decoded_option *existing_opt2 = NULL;
622 if (existing_opt_index != -1)
623 existing_opt = &decoded_options[existing_opt_index];
624 if (existing_opt2_index != -1)
625 existing_opt2 = &fdecoded_options[existing_opt2_index];
627 if (existing_opt == NULL && existing_opt2 == NULL)
628 break;
629 else if (existing_opt != NULL && existing_opt2 == NULL)
631 warning (0, "Extra option to %<-Xassembler%>: %s,"
632 " dropping all %<-Xassembler%> and %<-Wa%> options.",
633 existing_opt->arg);
634 xassembler_options_error = true;
635 break;
637 else if (existing_opt == NULL && existing_opt2 != NULL)
639 warning (0, "Extra option to %<-Xassembler%>: %s,"
640 " dropping all %<-Xassembler%> and %<-Wa%> options.",
641 existing_opt2->arg);
642 xassembler_options_error = true;
643 break;
645 else if (strcmp (existing_opt->arg, existing_opt2->arg) != 0)
647 warning (0, "Options to %<-Xassembler%> do not match: %s, %s,"
648 " dropping all %<-Xassembler%> and %<-Wa%> options.",
649 existing_opt->arg, existing_opt2->arg);
650 xassembler_options_error = true;
651 break;
656 /* Parse STR, saving found tokens into PVALUES and return their number.
657 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
658 append it to every token we find. */
660 static unsigned
661 parse_env_var (const char *str, char ***pvalues, const char *append)
663 const char *curval, *nextval;
664 char **values;
665 unsigned num = 1, i;
667 curval = strchr (str, ':');
668 while (curval)
670 num++;
671 curval = strchr (curval + 1, ':');
674 values = (char**) xmalloc (num * sizeof (char*));
675 curval = str;
676 nextval = strchr (curval, ':');
677 if (nextval == NULL)
678 nextval = strchr (curval, '\0');
680 int append_len = append ? strlen (append) : 0;
681 for (i = 0; i < num; i++)
683 int l = nextval - curval;
684 values[i] = (char*) xmalloc (l + 1 + append_len);
685 memcpy (values[i], curval, l);
686 values[i][l] = 0;
687 if (append)
688 strcat (values[i], append);
689 curval = nextval + 1;
690 nextval = strchr (curval, ':');
691 if (nextval == NULL)
692 nextval = strchr (curval, '\0');
694 *pvalues = values;
695 return num;
698 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
700 static void
701 append_compiler_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
703 /* Append compiler driver arguments as far as they were merged. */
704 for (unsigned int j = 1; j < opts.length (); ++j)
706 cl_decoded_option *option = &opts[j];
708 /* File options have been properly filtered by lto-opts.cc. */
709 switch (option->opt_index)
711 /* Drop arguments that we want to take from the link line. */
712 case OPT_flto_:
713 case OPT_flto:
714 case OPT_flto_partition_:
715 continue;
717 default:
718 break;
721 /* For now do what the original LTO option code was doing - pass
722 on any CL_TARGET flag and a few selected others. */
723 switch (option->opt_index)
725 case OPT_fdiagnostics_show_caret:
726 case OPT_fdiagnostics_show_labels:
727 case OPT_fdiagnostics_show_line_numbers:
728 case OPT_fdiagnostics_show_option:
729 case OPT_fdiagnostics_show_location_:
730 case OPT_fshow_column:
731 case OPT_fPIC:
732 case OPT_fpic:
733 case OPT_fPIE:
734 case OPT_fpie:
735 case OPT_fcommon:
736 case OPT_fgnu_tm:
737 case OPT_fopenmp:
738 case OPT_fopenacc:
739 case OPT_fopenacc_dim_:
740 case OPT_foffload_abi_:
741 case OPT_fcf_protection_:
742 case OPT_fasynchronous_unwind_tables:
743 case OPT_funwind_tables:
744 case OPT_g:
745 case OPT_O:
746 case OPT_Ofast:
747 case OPT_Og:
748 case OPT_Os:
749 case OPT_Oz:
750 break;
752 case OPT_Xassembler:
753 /* When we detected a mismatch in assembler options between
754 the input TU's fall back to previous behavior of ignoring them. */
755 if (xassembler_options_error)
756 continue;
757 break;
759 default:
760 if (!(cl_options[option->opt_index].flags & CL_TARGET))
761 continue;
764 /* Pass the option on. */
765 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
766 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
770 /* Append diag options in OPTS to ARGV_OBSTACK. */
772 static void
773 append_diag_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
775 /* Append compiler driver arguments as far as they were merged. */
776 for (unsigned int j = 1; j < opts.length (); ++j)
778 cl_decoded_option *option = &opts[j];
780 switch (option->opt_index)
782 case OPT_fdiagnostics_color_:
783 case OPT_fdiagnostics_format_:
784 case OPT_fdiagnostics_show_caret:
785 case OPT_fdiagnostics_show_labels:
786 case OPT_fdiagnostics_show_line_numbers:
787 case OPT_fdiagnostics_show_option:
788 case OPT_fdiagnostics_show_location_:
789 case OPT_fshow_column:
790 break;
791 default:
792 continue;
795 /* Pass the option on. */
796 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
797 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
802 /* Append linker options OPTS to ARGV_OBSTACK. */
804 static void
805 append_linker_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
807 /* Append linker driver arguments. Compiler options from the linker
808 driver arguments will override / merge with those from the compiler. */
809 for (unsigned int j = 1; j < opts.length (); ++j)
811 cl_decoded_option *option = &opts[j];
813 /* Do not pass on frontend specific flags not suitable for lto. */
814 if (!(cl_options[option->opt_index].flags
815 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
816 continue;
818 switch (option->opt_index)
820 case OPT_o:
821 case OPT_flto_:
822 case OPT_flto:
823 /* We've handled these LTO options, do not pass them on. */
824 continue;
826 case OPT_fopenmp:
827 case OPT_fopenacc:
828 /* Ignore -fno-XXX form of these options, as otherwise
829 corresponding builtins will not be enabled. */
830 if (option->value == 0)
831 continue;
832 break;
834 default:
835 break;
838 /* Pass the option on. */
839 for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
840 obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
844 /* Extract options for TARGET offload compiler from OPTIONS and append
845 them to ARGV_OBSTACK. */
847 static void
848 append_offload_options (obstack *argv_obstack, const char *target,
849 vec<cl_decoded_option> options)
851 for (unsigned i = 0; i < options.length (); i++)
853 const char *cur, *next, *opts;
854 char **argv;
855 unsigned argc;
856 cl_decoded_option *option = &options[i];
858 if (option->opt_index != OPT_foffload_options_)
859 continue;
861 /* If option argument starts with '-' then no target is specified. That
862 means offload options are specified for all targets, so we need to
863 append them. */
864 if (option->arg[0] == '-')
865 opts = option->arg;
866 else
868 opts = strchr (option->arg, '=');
869 gcc_assert (opts);
870 cur = option->arg;
872 while (cur < opts)
874 next = strchr (cur, ',');
875 if (next == NULL)
876 next = opts;
877 next = (next > opts) ? opts : next;
879 /* Are we looking for this offload target? */
880 if (strlen (target) == (size_t) (next - cur)
881 && strncmp (target, cur, next - cur) == 0)
882 break;
884 /* Skip the comma or equal sign. */
885 cur = next + 1;
888 if (cur >= opts)
889 continue;
891 opts++;
894 argv = buildargv (opts);
895 for (argc = 0; argv[argc]; argc++)
896 obstack_ptr_grow (argv_obstack, argv[argc]);
900 /* Check whether NAME can be accessed in MODE. This is like access,
901 except that it never considers directories to be executable. */
903 static int
904 access_check (const char *name, int mode)
906 if (mode == X_OK)
908 struct stat st;
910 if (stat (name, &st) < 0
911 || S_ISDIR (st.st_mode))
912 return -1;
915 return access (name, mode);
918 /* Prepare a target image for offload TARGET, using mkoffload tool from
919 COMPILER_PATH. Return the name of the resultant object file. */
921 static const char *
922 compile_offload_image (const char *target, const char *compiler_path,
923 unsigned in_argc, char *in_argv[],
924 vec<cl_decoded_option> compiler_opts,
925 vec<cl_decoded_option> linker_opts,
926 char **filename)
928 char *dumpbase;
929 char **argv;
930 char *suffix
931 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
932 strcpy (suffix, "/accel/");
933 strcat (suffix, target);
934 strcat (suffix, "/mkoffload");
935 *filename = NULL;
937 char **paths = NULL;
938 unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
940 const char *compiler = NULL;
941 for (unsigned i = 0; i < n_paths; i++)
942 if (access_check (paths[i], X_OK) == 0)
944 compiler = paths[i];
945 break;
947 #if OFFLOAD_DEFAULTED
948 if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV))
950 free_array_of_ptrs ((void **) paths, n_paths);
951 return NULL;
953 #endif
955 if (!compiler)
956 fatal_error (input_location,
957 "could not find %s in %s (consider using %<-B%>)",
958 suffix + 1, compiler_path);
960 dumpbase = concat (dumppfx, "x", target, NULL);
962 /* Generate temporary output file name. */
963 if (save_temps)
964 *filename = concat (dumpbase, ".o", NULL);
965 else
966 *filename = make_temp_file (".target.o");
968 struct obstack argv_obstack;
969 obstack_init (&argv_obstack);
970 obstack_ptr_grow (&argv_obstack, compiler);
971 if (save_temps)
972 obstack_ptr_grow (&argv_obstack, "-save-temps");
973 if (verbose)
974 obstack_ptr_grow (&argv_obstack, "-v");
975 obstack_ptr_grow (&argv_obstack, "-o");
976 obstack_ptr_grow (&argv_obstack, *filename);
978 /* Append names of input object files. */
979 for (unsigned i = 0; i < in_argc; i++)
980 obstack_ptr_grow (&argv_obstack, in_argv[i]);
982 /* Append options from offload_lto sections. */
983 append_compiler_options (&argv_obstack, compiler_opts);
984 append_diag_options (&argv_obstack, linker_opts);
986 obstack_ptr_grow (&argv_obstack, "-dumpbase");
987 obstack_ptr_grow (&argv_obstack, dumpbase);
989 /* Append options specified by -foffload last. In case of conflicting
990 options we expect offload compiler to choose the latest. */
991 append_offload_options (&argv_obstack, target, compiler_opts);
992 append_offload_options (&argv_obstack, target, linker_opts);
994 obstack_ptr_grow (&argv_obstack, NULL);
995 argv = XOBFINISH (&argv_obstack, char **);
996 suffix = concat (target, ".offload_args", NULL);
997 fork_execute (argv[0], argv, true, suffix);
998 obstack_free (&argv_obstack, NULL);
1000 free_array_of_ptrs ((void **) paths, n_paths);
1001 return *filename;
1005 /* The main routine dealing with offloading.
1006 The routine builds a target image for each offload target. IN_ARGC and
1007 IN_ARGV specify options and input object files. As all of them could contain
1008 target sections, we pass them all to target compilers. */
1010 static void
1011 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
1012 vec<cl_decoded_option> compiler_opts,
1013 vec<cl_decoded_option> linker_opts)
1015 char **names = NULL;
1016 const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
1017 if (!target_names)
1018 return;
1019 unsigned num_targets = parse_env_var (target_names, &names, NULL);
1020 int next_name_entry = 0;
1022 const char *compiler_path = getenv ("COMPILER_PATH");
1023 if (!compiler_path)
1024 goto out;
1026 /* Prepare an image for each target and save the name of the resultant object
1027 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
1028 offload_names = XCNEWVEC (char *, num_targets + 1);
1029 for (unsigned i = 0; i < num_targets; i++)
1031 if (!compile_offload_image (names[i], compiler_path, in_argc, in_argv,
1032 compiler_opts, linker_opts,
1033 &offload_names[next_name_entry]))
1034 #if OFFLOAD_DEFAULTED
1035 continue;
1036 #else
1037 fatal_error (input_location,
1038 "problem with building target image for %s", names[i]);
1039 #endif
1040 next_name_entry++;
1043 #if OFFLOAD_DEFAULTED
1044 if (next_name_entry == 0)
1046 free (offload_names);
1047 offload_names = NULL;
1049 #endif
1051 out:
1052 free_array_of_ptrs ((void **) names, num_targets);
1055 /* Copy a file from SRC to DEST. */
1057 static void
1058 copy_file (const char *dest, const char *src)
1060 FILE *d = fopen (dest, "wb");
1061 FILE *s = fopen (src, "rb");
1062 char buffer[512];
1063 while (!feof (s))
1065 size_t len = fread (buffer, 1, 512, s);
1066 if (ferror (s) != 0)
1067 fatal_error (input_location, "reading input file");
1068 if (len > 0)
1070 fwrite (buffer, 1, len, d);
1071 if (ferror (d) != 0)
1072 fatal_error (input_location, "writing output file");
1075 fclose (d);
1076 fclose (s);
1079 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
1080 the copy to the linker. */
1082 static void
1083 find_crtoffloadtable (int save_temps, const char *dumppfx)
1085 char **paths = NULL;
1086 const char *library_path = getenv ("LIBRARY_PATH");
1087 if (!library_path)
1088 return;
1089 unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
1091 unsigned i;
1092 for (i = 0; i < n_paths; i++)
1093 if (access_check (paths[i], R_OK) == 0)
1095 /* The linker will delete the filename we give it, so make a copy. */
1096 char *crtoffloadtable;
1097 if (!save_temps)
1098 crtoffloadtable = make_temp_file (".crtoffloadtable.o");
1099 else
1100 crtoffloadtable = concat (dumppfx, "crtoffloadtable.o", NULL);
1101 copy_file (crtoffloadtable, paths[i]);
1102 printf ("%s\n", crtoffloadtable);
1103 XDELETEVEC (crtoffloadtable);
1104 break;
1106 if (i == n_paths)
1107 fatal_error (input_location,
1108 "installation error, cannot find %<crtoffloadtable.o%>");
1110 free_array_of_ptrs ((void **) paths, n_paths);
1113 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
1114 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS.
1115 Return true if we found a matching section, false
1116 otherwise. COLLECT_GCC holds the value of the environment variable with
1117 the same name. */
1119 static bool
1120 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
1121 vec<cl_decoded_option> decoded_cl_options, bool first,
1122 vec<cl_decoded_option> *opts, const char *collect_gcc)
1124 off_t offset, length;
1125 char *data;
1126 char *fopts;
1127 const char *errmsg;
1128 int err;
1129 vec<cl_decoded_option> fdecoded_options;
1131 if (!first)
1132 fdecoded_options = *opts;
1134 simple_object_read *sobj;
1135 sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
1136 &errmsg, &err);
1137 if (!sobj)
1138 return false;
1140 char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
1141 strcpy (secname, prefix);
1142 strcat (secname, ".opts");
1143 if (!simple_object_find_section (sobj, secname, &offset, &length,
1144 &errmsg, &err))
1146 simple_object_release_read (sobj);
1147 return false;
1150 lseek (fd, file_offset + offset, SEEK_SET);
1151 data = (char *)xmalloc (length);
1152 read (fd, data, length);
1153 fopts = data;
1156 vec<cl_decoded_option> f2decoded_options
1157 = get_options_from_collect_gcc_options (collect_gcc, fopts);
1158 if (first)
1160 fdecoded_options = f2decoded_options;
1161 first = false;
1163 else
1164 merge_and_complain (fdecoded_options, f2decoded_options,
1165 decoded_cl_options);
1167 fopts += strlen (fopts) + 1;
1169 while (fopts - data < length);
1171 free (data);
1172 simple_object_release_read (sobj);
1173 *opts = fdecoded_options;
1174 return true;
1177 /* Copy early debug info sections from INFILE to a new file whose name
1178 is returned. Return NULL on error. */
1180 const char *
1181 debug_objcopy (const char *infile, bool rename)
1183 char *outfile;
1184 const char *errmsg;
1185 int err;
1187 const char *p;
1188 const char *orig_infile = infile;
1189 off_t inoff = 0;
1190 long loffset;
1191 int consumed;
1192 if ((p = strrchr (infile, '@'))
1193 && p != infile
1194 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1195 && strlen (p) == (unsigned int) consumed)
1197 char *fname = xstrdup (infile);
1198 fname[p - infile] = '\0';
1199 infile = fname;
1200 inoff = (off_t) loffset;
1202 int infd = open (infile, O_RDONLY | O_BINARY);
1203 if (infd == -1)
1204 return NULL;
1205 simple_object_read *inobj = simple_object_start_read (infd, inoff,
1206 "__GNU_LTO",
1207 &errmsg, &err);
1208 if (!inobj)
1209 return NULL;
1211 off_t off, len;
1212 if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info",
1213 &off, &len, &errmsg, &err) != 1)
1215 if (errmsg)
1216 fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1218 simple_object_release_read (inobj);
1219 close (infd);
1220 return NULL;
1223 if (save_temps)
1224 outfile = concat (orig_infile, ".debug.temp.o", NULL);
1225 else
1226 outfile = make_temp_file (".debug.temp.o");
1227 errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
1228 if (errmsg)
1230 unlink_if_ordinary (outfile);
1231 fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1234 simple_object_release_read (inobj);
1235 close (infd);
1237 return outfile;
1240 /* Helper for qsort: compare priorities for parallel compilation. */
1243 cmp_priority (const void *a, const void *b)
1245 return *((const int *)b)-*((const int *)a);
1248 /* Number of CPUs that can be used for parallel LTRANS phase. */
1250 static unsigned long nthreads_var = 0;
1252 #ifdef HAVE_PTHREAD_AFFINITY_NP
1253 unsigned long cpuset_size;
1254 static unsigned long get_cpuset_size;
1255 cpu_set_t *cpusetp;
1257 unsigned long
1258 static cpuset_popcount (unsigned long cpusetsize, cpu_set_t *cpusetp)
1260 #ifdef CPU_COUNT_S
1261 /* glibc 2.7 and above provide a macro for this. */
1262 return CPU_COUNT_S (cpusetsize, cpusetp);
1263 #else
1264 #ifdef CPU_COUNT
1265 if (cpusetsize == sizeof (cpu_set_t))
1266 /* glibc 2.6 and above provide a macro for this. */
1267 return CPU_COUNT (cpusetp);
1268 #endif
1269 size_t i;
1270 unsigned long ret = 0;
1271 STATIC_ASSERT (sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int));
1272 for (i = 0; i < cpusetsize / sizeof (cpusetp->__bits[0]); i++)
1274 unsigned long int mask = cpusetp->__bits[i];
1275 if (mask == 0)
1276 continue;
1277 ret += __builtin_popcountl (mask);
1279 return ret;
1280 #endif
1282 #endif
1284 /* At startup, determine the default number of threads. It would seem
1285 this should be related to the number of cpus online. */
1287 static void
1288 init_num_threads (void)
1290 #ifdef HAVE_PTHREAD_AFFINITY_NP
1291 #if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE)
1292 cpuset_size = sysconf (_SC_NPROCESSORS_CONF);
1293 cpuset_size = CPU_ALLOC_SIZE (cpuset_size);
1294 #else
1295 cpuset_size = sizeof (cpu_set_t);
1296 #endif
1298 cpusetp = (cpu_set_t *) xmalloc (gomp_cpuset_size);
1301 int ret = pthread_getaffinity_np (pthread_self (), gomp_cpuset_size,
1302 cpusetp);
1303 if (ret == 0)
1305 /* Count only the CPUs this process can use. */
1306 nthreads_var = cpuset_popcount (cpuset_size, cpusetp);
1307 if (nthreads_var == 0)
1308 break;
1309 get_cpuset_size = cpuset_size;
1310 #ifdef CPU_ALLOC_SIZE
1311 unsigned long i;
1312 for (i = cpuset_size * 8; i; i--)
1313 if (CPU_ISSET_S (i - 1, cpuset_size, cpusetp))
1314 break;
1315 cpuset_size = CPU_ALLOC_SIZE (i);
1316 #endif
1317 return;
1319 if (ret != EINVAL)
1320 break;
1321 #ifdef CPU_ALLOC_SIZE
1322 if (cpuset_size < sizeof (cpu_set_t))
1323 cpuset_size = sizeof (cpu_set_t);
1324 else
1325 cpuset_size = cpuset_size * 2;
1326 if (cpuset_size < 8 * sizeof (cpu_set_t))
1327 cpusetp
1328 = (cpu_set_t *) realloc (cpusetp, cpuset_size);
1329 else
1331 /* Avoid fatal if too large memory allocation would be
1332 requested, e.g. kernel returning EINVAL all the time. */
1333 void *p = realloc (cpusetp, cpuset_size);
1334 if (p == NULL)
1335 break;
1336 cpusetp = (cpu_set_t *) p;
1338 #else
1339 break;
1340 #endif
1342 while (1);
1343 cpuset_size = 0;
1344 nthreads_var = 1;
1345 free (cpusetp);
1346 cpusetp = NULL;
1347 #endif
1348 #ifdef _SC_NPROCESSORS_ONLN
1349 nthreads_var = sysconf (_SC_NPROCESSORS_ONLN);
1350 #endif
1353 /* Print link to -flto documentation with a hint message. */
1355 void
1356 print_lto_docs_link ()
1358 bool print_url = global_dc->printer->url_format != URL_FORMAT_NONE;
1359 const char *url = global_dc->make_option_url (OPT_flto);
1361 pretty_printer pp;
1362 pp.url_format = URL_FORMAT_DEFAULT;
1363 pp_string (&pp, "see the ");
1364 if (print_url)
1365 pp_begin_url (&pp, url);
1366 pp_string (&pp, "%<-flto%> option documentation");
1367 if (print_url)
1368 pp_end_url (&pp);
1369 pp_string (&pp, " for more information");
1370 inform (UNKNOWN_LOCATION, pp_formatted_text (&pp));
1373 /* Test that a make command is present and working, return true if so. */
1375 static bool
1376 make_exists (void)
1378 const char *make = "make";
1379 char **make_argv = buildargv (getenv ("MAKE"));
1380 if (make_argv)
1381 make = make_argv[0];
1382 const char *make_args[] = {make, "--version", NULL};
1384 int exit_status = 0;
1385 int err = 0;
1386 const char *errmsg
1387 = pex_one (PEX_SEARCH, make_args[0], CONST_CAST (char **, make_args),
1388 "make", NULL, NULL, &exit_status, &err);
1389 freeargv (make_argv);
1390 return errmsg == NULL && exit_status == 0 && err == 0;
1393 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1395 static void
1396 run_gcc (unsigned argc, char *argv[])
1398 unsigned i, j;
1399 const char **new_argv;
1400 const char **argv_ptr;
1401 char *list_option_full = NULL;
1402 const char *linker_output = NULL;
1403 const char *collect_gcc;
1404 char *collect_gcc_options;
1405 int parallel = 0;
1406 int jobserver = 0;
1407 bool jobserver_requested = false;
1408 int auto_parallel = 0;
1409 bool no_partition = false;
1410 bool fdecoded_options_first = true;
1411 vec<cl_decoded_option> fdecoded_options;
1412 fdecoded_options.create (16);
1413 bool offload_fdecoded_options_first = true;
1414 vec<cl_decoded_option> offload_fdecoded_options = vNULL;
1415 struct obstack argv_obstack;
1416 int new_head_argc;
1417 bool have_lto = false;
1418 bool have_offload = false;
1419 unsigned lto_argc = 0, ltoobj_argc = 0;
1420 char **lto_argv, **ltoobj_argv;
1421 bool linker_output_rel = false;
1422 bool skip_debug = false;
1423 const char *incoming_dumppfx = dumppfx = NULL;
1424 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1426 /* Get the driver and options. */
1427 collect_gcc = getenv ("COLLECT_GCC");
1428 if (!collect_gcc)
1429 fatal_error (input_location,
1430 "environment variable %<COLLECT_GCC%> must be set");
1431 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1432 if (!collect_gcc_options)
1433 fatal_error (input_location,
1434 "environment variable %<COLLECT_GCC_OPTIONS%> must be set");
1436 char *collect_as_options = getenv ("COLLECT_AS_OPTIONS");
1438 /* Prepend -Xassembler to each option, and append the string
1439 to collect_gcc_options. */
1440 if (collect_as_options)
1442 obstack temporary_obstack;
1443 obstack_init (&temporary_obstack);
1445 prepend_xassembler_to_collect_as_options (collect_as_options,
1446 &temporary_obstack);
1447 obstack_1grow (&temporary_obstack, '\0');
1449 char *xassembler_opts_string
1450 = XOBFINISH (&temporary_obstack, char *);
1451 collect_gcc_options = concat (collect_gcc_options, xassembler_opts_string,
1452 NULL);
1455 vec<cl_decoded_option> decoded_options
1456 = get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options);
1458 /* Allocate array for input object files with LTO IL,
1459 and for possible preceding arguments. */
1460 lto_argv = XNEWVEC (char *, argc);
1461 ltoobj_argv = XNEWVEC (char *, argc);
1463 /* Look at saved options in the IL files. */
1464 for (i = 1; i < argc; ++i)
1466 char *p;
1467 int fd;
1468 off_t file_offset = 0;
1469 long loffset;
1470 int consumed;
1471 char *filename = argv[i];
1473 if (startswith (argv[i], "-foffload-objects="))
1475 have_offload = true;
1476 offload_objects_file_name
1477 = argv[i] + sizeof ("-foffload-objects=") - 1;
1478 continue;
1481 if ((p = strrchr (argv[i], '@'))
1482 && p != argv[i]
1483 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1484 && strlen (p) == (unsigned int) consumed)
1486 filename = XNEWVEC (char, p - argv[i] + 1);
1487 memcpy (filename, argv[i], p - argv[i]);
1488 filename[p - argv[i]] = '\0';
1489 file_offset = (off_t) loffset;
1491 fd = open (filename, O_RDONLY | O_BINARY);
1492 /* Linker plugin passes -fresolution and -flinker-output options.
1493 -flinker-output is passed only when user did not specify one and thus
1494 we do not need to worry about duplicities with the option handling
1495 below. */
1496 if (fd == -1)
1498 lto_argv[lto_argc++] = argv[i];
1499 if (strcmp (argv[i], "-flinker-output=rel") == 0)
1500 linker_output_rel = true;
1501 continue;
1504 if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1505 decoded_options, fdecoded_options_first,
1506 &fdecoded_options,
1507 collect_gcc))
1509 have_lto = true;
1510 ltoobj_argv[ltoobj_argc++] = argv[i];
1511 fdecoded_options_first = false;
1513 close (fd);
1516 /* Initalize the common arguments for the driver. */
1517 obstack_init (&argv_obstack);
1518 obstack_ptr_grow (&argv_obstack, collect_gcc);
1519 obstack_ptr_grow (&argv_obstack, "-xlto");
1520 obstack_ptr_grow (&argv_obstack, "-c");
1522 append_compiler_options (&argv_obstack, fdecoded_options);
1523 append_linker_options (&argv_obstack, decoded_options);
1525 /* Scan linker driver arguments for things that are of relevance to us. */
1526 for (j = 1; j < decoded_options.length (); ++j)
1528 cl_decoded_option *option = &decoded_options[j];
1529 switch (option->opt_index)
1531 case OPT_o:
1532 linker_output = option->arg;
1533 break;
1535 /* We don't have to distinguish between -save-temps=* and
1536 -save-temps, -dumpdir already carries that
1537 information. */
1538 case OPT_save_temps_:
1539 case OPT_save_temps:
1540 save_temps = 1;
1541 break;
1543 case OPT_v:
1544 verbose = 1;
1545 break;
1547 case OPT_flto_partition_:
1548 if (strcmp (option->arg, "none") == 0)
1549 no_partition = true;
1550 break;
1552 case OPT_flto_:
1553 /* Merge linker -flto= option with what we have in IL files. */
1554 merge_flto_options (fdecoded_options, option);
1555 if (strcmp (option->arg, "jobserver") == 0)
1556 jobserver_requested = true;
1557 break;
1559 case OPT_flinker_output_:
1560 linker_output_rel = !strcmp (option->arg, "rel");
1561 break;
1563 case OPT_g:
1564 /* Recognize -g0. */
1565 skip_debug = option->arg && !strcmp (option->arg, "0");
1566 break;
1568 case OPT_gbtf:
1569 case OPT_gctf:
1570 case OPT_gdwarf:
1571 case OPT_gdwarf_:
1572 case OPT_ggdb:
1573 case OPT_gvms:
1574 /* Negative forms, if allowed, enable debug info as well. */
1575 skip_debug = false;
1576 break;
1578 case OPT_dumpdir:
1579 incoming_dumppfx = dumppfx = option->arg;
1580 break;
1582 case OPT_fdiagnostics_urls_:
1583 diagnostic_urls_init (global_dc, option->value);
1584 break;
1586 case OPT_fdiagnostics_color_:
1587 diagnostic_color_init (global_dc, option->value);
1588 break;
1590 default:
1591 break;
1595 /* Process LTO-related options on merged options. */
1596 for (j = 1; j < fdecoded_options.length (); ++j)
1598 cl_decoded_option *option = &fdecoded_options[j];
1599 switch (option->opt_index)
1601 case OPT_flto_:
1602 if (strcmp (option->arg, "jobserver") == 0)
1604 parallel = 1;
1605 jobserver = 1;
1607 else if (strcmp (option->arg, "auto") == 0)
1609 parallel = 1;
1610 auto_parallel = 1;
1612 else
1614 parallel = atoi (option->arg);
1615 if (parallel <= 1)
1616 parallel = 0;
1618 /* Fallthru. */
1620 case OPT_flto:
1621 lto_mode = LTO_MODE_WHOPR;
1622 break;
1626 /* Output lto-wrapper invocation command. */
1627 if (verbose)
1629 for (i = 0; i < argc; ++i)
1631 fputs (argv[i], stderr);
1632 fputc (' ', stderr);
1634 fputc ('\n', stderr);
1637 if (linker_output_rel)
1638 no_partition = true;
1640 if (no_partition)
1642 lto_mode = LTO_MODE_LTO;
1643 jobserver = 0;
1644 jobserver_requested = false;
1645 auto_parallel = 0;
1646 parallel = 0;
1648 else
1650 jobserver_info jinfo;
1651 if (jobserver && !jinfo.is_active)
1653 /* Fall back to auto parallelism. */
1654 jobserver = 0;
1655 auto_parallel = 1;
1657 else if (!jobserver && jinfo.is_active)
1659 parallel = 1;
1660 jobserver = 1;
1664 /* We need make working for a parallel execution. */
1665 if (parallel && !make_exists ())
1666 parallel = 0;
1668 if (!dumppfx)
1670 if (!linker_output
1671 || strcmp (linker_output, HOST_BIT_BUCKET) == 0)
1672 dumppfx = "a.";
1673 else
1675 const char *obase = lbasename (linker_output), *temp;
1677 /* Strip the executable extension. */
1678 size_t blen = strlen (obase), xlen;
1679 if ((temp = strrchr (obase + 1, '.'))
1680 && (xlen = strlen (temp))
1681 && (strcmp (temp, ".exe") == 0
1682 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
1683 || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
1684 #endif
1685 || strcmp (obase, "a.out") == 0))
1686 dumppfx = xstrndup (linker_output,
1687 obase - linker_output + blen - xlen + 1);
1688 else
1689 dumppfx = concat (linker_output, ".", NULL);
1693 /* If there's no directory component in the dumppfx, add one, so
1694 that, when it is used as -dumpbase, it overrides any occurrence
1695 of -dumpdir that might have been passed in. */
1696 if (!dumppfx || lbasename (dumppfx) == dumppfx)
1697 dumppfx = concat (current_dir, dumppfx, NULL);
1699 /* Make sure some -dumpdir is passed, so as to get predictable
1700 -dumpbase overriding semantics. If we got an incoming -dumpdir
1701 argument, we'll pass it on, so don't bother with another one
1702 then. */
1703 if (!incoming_dumppfx)
1705 obstack_ptr_grow (&argv_obstack, "-dumpdir");
1706 obstack_ptr_grow (&argv_obstack, "");
1708 obstack_ptr_grow (&argv_obstack, "-dumpbase");
1710 /* Remember at which point we can scrub args to re-use the commons. */
1711 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1713 if (have_offload)
1715 unsigned i, num_offload_files;
1716 char **offload_argv;
1717 FILE *f;
1719 f = fopen (offload_objects_file_name, "r");
1720 if (f == NULL)
1721 fatal_error (input_location, "cannot open %s: %m",
1722 offload_objects_file_name);
1723 if (fscanf (f, "%u ", &num_offload_files) != 1)
1724 fatal_error (input_location, "cannot read %s: %m",
1725 offload_objects_file_name);
1726 offload_argv = XCNEWVEC (char *, num_offload_files);
1728 /* Read names of object files with offload. */
1729 for (i = 0; i < num_offload_files; i++)
1731 const unsigned piece = 32;
1732 char *buf, *filename = XNEWVEC (char, piece);
1733 size_t len;
1735 buf = filename;
1736 cont1:
1737 if (!fgets (buf, piece, f))
1738 break;
1739 len = strlen (filename);
1740 if (filename[len - 1] != '\n')
1742 filename = XRESIZEVEC (char, filename, len + piece);
1743 buf = filename + len;
1744 goto cont1;
1746 filename[len - 1] = '\0';
1747 offload_argv[i] = filename;
1749 fclose (f);
1750 if (offload_argv[num_offload_files - 1] == NULL)
1751 fatal_error (input_location, "invalid format of %s",
1752 offload_objects_file_name);
1753 maybe_unlink (offload_objects_file_name);
1754 offload_objects_file_name = NULL;
1756 /* Look at saved offload options in files. */
1757 for (i = 0; i < num_offload_files; i++)
1759 char *p;
1760 long loffset;
1761 int fd, consumed;
1762 off_t file_offset = 0;
1763 char *filename = offload_argv[i];
1765 if ((p = strrchr (offload_argv[i], '@'))
1766 && p != offload_argv[i]
1767 && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1768 && strlen (p) == (unsigned int) consumed)
1770 filename = XNEWVEC (char, p - offload_argv[i] + 1);
1771 memcpy (filename, offload_argv[i], p - offload_argv[i]);
1772 filename[p - offload_argv[i]] = '\0';
1773 file_offset = (off_t) loffset;
1775 fd = open (filename, O_RDONLY | O_BINARY);
1776 if (fd == -1)
1777 fatal_error (input_location, "cannot open %s: %m", filename);
1778 if (!find_and_merge_options (fd, file_offset,
1779 OFFLOAD_SECTION_NAME_PREFIX,
1780 decoded_options,
1781 offload_fdecoded_options_first,
1782 &offload_fdecoded_options,
1783 collect_gcc))
1784 fatal_error (input_location, "cannot read %s: %m", filename);
1785 offload_fdecoded_options_first = false;
1786 close (fd);
1787 if (filename != offload_argv[i])
1788 XDELETEVEC (filename);
1791 compile_images_for_offload_targets (num_offload_files, offload_argv,
1792 offload_fdecoded_options, decoded_options);
1794 free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1796 if (offload_names)
1798 find_crtoffloadtable (save_temps, dumppfx);
1799 for (i = 0; offload_names[i]; i++)
1800 printf ("%s\n", offload_names[i]);
1801 free_array_of_ptrs ((void **) offload_names, i);
1802 offload_names = NULL;
1806 /* If object files contain offload sections, but do not contain LTO sections,
1807 then there is no need to perform a link-time recompilation, i.e.
1808 lto-wrapper is used only for a compilation of offload images. */
1809 if (have_offload && !have_lto)
1810 goto finish;
1812 if (lto_mode == LTO_MODE_LTO)
1814 /* -dumpbase argument for LTO. */
1815 flto_out = concat (dumppfx, "lto.o", NULL);
1816 obstack_ptr_grow (&argv_obstack, flto_out);
1818 if (!save_temps)
1819 flto_out = make_temp_file (".lto.o");
1820 obstack_ptr_grow (&argv_obstack, "-o");
1821 obstack_ptr_grow (&argv_obstack, flto_out);
1823 else
1825 const char *list_option = "-fltrans-output-list=";
1827 /* -dumpbase argument for WPA. */
1828 char *dumpbase = concat (dumppfx, "wpa", NULL);
1829 obstack_ptr_grow (&argv_obstack, dumpbase);
1831 if (save_temps)
1832 ltrans_output_file = concat (dumppfx, "ltrans.out", NULL);
1833 else
1834 ltrans_output_file = make_temp_file (".ltrans.out");
1835 list_option_full = concat (list_option, ltrans_output_file, NULL);
1836 obstack_ptr_grow (&argv_obstack, list_option_full);
1838 if (jobserver)
1840 if (verbose)
1841 fprintf (stderr, "Using make jobserver\n");
1842 obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1844 else if (auto_parallel)
1846 char buf[256];
1847 init_num_threads ();
1848 if (nthreads_var == 0)
1849 nthreads_var = 1;
1850 if (verbose)
1851 fprintf (stderr, "LTO parallelism level set to %ld\n",
1852 nthreads_var);
1853 sprintf (buf, "-fwpa=%ld", nthreads_var);
1854 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1856 else if (parallel > 1)
1858 char buf[256];
1859 sprintf (buf, "-fwpa=%i", parallel);
1860 obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1862 else
1863 obstack_ptr_grow (&argv_obstack, "-fwpa");
1866 /* Append input arguments. */
1867 for (i = 0; i < lto_argc; ++i)
1868 obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1869 /* Append the input objects. */
1870 for (i = 0; i < ltoobj_argc; ++i)
1871 obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]);
1872 obstack_ptr_grow (&argv_obstack, NULL);
1874 new_argv = XOBFINISH (&argv_obstack, const char **);
1875 argv_ptr = &new_argv[new_head_argc];
1876 fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true,
1877 "ltrans_args");
1879 /* Copy the early generated debug info from the objects to temporary
1880 files and append those to the partial link commandline. */
1881 early_debug_object_names = NULL;
1882 if (! skip_debug)
1884 early_debug_object_names = XCNEWVEC (const char *, ltoobj_argc+ 1);
1885 num_deb_objs = ltoobj_argc;
1886 for (i = 0; i < ltoobj_argc; ++i)
1888 const char *tem;
1889 if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
1890 early_debug_object_names[i] = tem;
1894 if (lto_mode == LTO_MODE_LTO)
1896 printf ("%s\n", flto_out);
1897 if (!skip_debug)
1899 for (i = 0; i < ltoobj_argc; ++i)
1900 if (early_debug_object_names[i] != NULL)
1901 printf ("%s\n", early_debug_object_names[i]);
1903 /* These now belong to collect2. */
1904 free (flto_out);
1905 flto_out = NULL;
1906 free (early_debug_object_names);
1907 early_debug_object_names = NULL;
1909 else
1911 FILE *stream = fopen (ltrans_output_file, "r");
1912 FILE *mstream = NULL;
1913 struct obstack env_obstack;
1914 int priority;
1916 if (!stream)
1917 fatal_error (input_location, "%<fopen%>: %s: %m", ltrans_output_file);
1919 /* Parse the list of LTRANS inputs from the WPA stage. */
1920 obstack_init (&env_obstack);
1921 nr = 0;
1922 for (;;)
1924 const unsigned piece = 32;
1925 char *output_name = NULL;
1926 char *buf, *input_name = (char *)xmalloc (piece);
1927 size_t len;
1929 buf = input_name;
1930 if (fscanf (stream, "%i\n", &priority) != 1)
1932 if (!feof (stream))
1933 fatal_error (input_location,
1934 "corrupted ltrans output file %s",
1935 ltrans_output_file);
1936 break;
1938 cont:
1939 if (!fgets (buf, piece, stream))
1940 break;
1941 len = strlen (input_name);
1942 if (input_name[len - 1] != '\n')
1944 input_name = (char *)xrealloc (input_name, len + piece);
1945 buf = input_name + len;
1946 goto cont;
1948 input_name[len - 1] = '\0';
1950 if (input_name[0] == '*')
1951 output_name = &input_name[1];
1953 nr++;
1954 ltrans_priorities
1955 = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
1956 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1957 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1958 ltrans_priorities[(nr-1)*2] = priority;
1959 ltrans_priorities[(nr-1)*2+1] = nr-1;
1960 input_names[nr-1] = input_name;
1961 output_names[nr-1] = output_name;
1963 fclose (stream);
1964 maybe_unlink (ltrans_output_file);
1965 ltrans_output_file = NULL;
1967 if (nr > 1)
1969 jobserver_info jinfo;
1970 if (jobserver_requested && !jinfo.is_active)
1972 warning (0, jinfo.error_msg.c_str ());
1973 print_lto_docs_link ();
1975 else if (parallel == 0)
1977 warning (0, "using serial compilation of %d LTRANS jobs", nr);
1978 print_lto_docs_link ();
1982 if (parallel)
1984 makefile = make_temp_file (".mk");
1985 mstream = fopen (makefile, "w");
1986 qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
1989 /* Execute the LTRANS stage for each input file (or prepare a
1990 makefile to invoke this in parallel). */
1991 for (i = 0; i < nr; ++i)
1993 char *output_name;
1994 char *input_name = input_names[i];
1995 /* If it's a pass-through file do nothing. */
1996 if (output_names[i])
1997 continue;
1999 /* Replace the .o suffix with a .ltrans.o suffix and write
2000 the resulting name to the LTRANS output list. */
2001 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
2002 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
2003 output_name = XOBFINISH (&env_obstack, char *);
2005 /* Adjust the dumpbase if the linker output file was seen. */
2006 int dumpbase_len = (strlen (dumppfx)
2007 + sizeof (DUMPBASE_SUFFIX)
2008 + sizeof (".ltrans"));
2009 char *dumpbase = (char *) xmalloc (dumpbase_len + 1);
2010 snprintf (dumpbase, dumpbase_len, "%sltrans%u.ltrans", dumppfx, i);
2011 argv_ptr[0] = dumpbase;
2013 argv_ptr[1] = "-fltrans";
2014 argv_ptr[2] = "-o";
2015 argv_ptr[3] = output_name;
2016 argv_ptr[4] = input_name;
2017 argv_ptr[5] = NULL;
2018 if (parallel)
2020 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
2021 for (j = 1; new_argv[j] != NULL; ++j)
2022 fprintf (mstream, " '%s'", new_argv[j]);
2023 fprintf (mstream, "\n");
2024 /* If we are not preserving the ltrans input files then
2025 truncate them as soon as we have processed it. This
2026 reduces temporary disk-space usage. */
2027 if (! save_temps)
2028 fprintf (mstream, "\t@-touch -r \"%s\" \"%s.tem\" > /dev/null "
2029 "2>&1 && mv \"%s.tem\" \"%s\"\n",
2030 input_name, input_name, input_name, input_name);
2032 else
2034 char argsuffix[sizeof (DUMPBASE_SUFFIX)
2035 + sizeof (".ltrans_args") + 1];
2036 if (save_temps)
2037 snprintf (argsuffix,
2038 sizeof (DUMPBASE_SUFFIX) + sizeof (".ltrans_args"),
2039 "ltrans%u.ltrans_args", i);
2040 fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
2041 true, save_temps ? argsuffix : NULL);
2042 maybe_unlink (input_name);
2045 output_names[i] = output_name;
2047 if (parallel)
2049 struct pex_obj *pex;
2050 char jobs[32];
2052 fprintf (mstream,
2053 ".PHONY: all\n"
2054 "all:");
2055 for (i = 0; i < nr; ++i)
2057 int j = ltrans_priorities[i*2 + 1];
2058 fprintf (mstream, " \\\n\t%s", output_names[j]);
2060 fprintf (mstream, "\n");
2061 fclose (mstream);
2062 if (!jobserver)
2064 /* Avoid passing --jobserver-fd= and similar flags
2065 unless jobserver mode is explicitly enabled. */
2066 putenv (xstrdup ("MAKEFLAGS="));
2067 putenv (xstrdup ("MFLAGS="));
2070 char **make_argv = buildargv (getenv ("MAKE"));
2071 if (make_argv)
2073 for (unsigned argc = 0; make_argv[argc]; argc++)
2074 obstack_ptr_grow (&argv_obstack, make_argv[argc]);
2076 else
2077 obstack_ptr_grow (&argv_obstack, "make");
2079 obstack_ptr_grow (&argv_obstack, "-f");
2080 obstack_ptr_grow (&argv_obstack, makefile);
2081 if (!jobserver)
2083 snprintf (jobs, 31, "-j%ld",
2084 auto_parallel ? nthreads_var : parallel);
2085 obstack_ptr_grow (&argv_obstack, jobs);
2087 obstack_ptr_grow (&argv_obstack, "all");
2088 obstack_ptr_grow (&argv_obstack, NULL);
2089 new_argv = XOBFINISH (&argv_obstack, const char **);
2091 pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
2092 NULL, NULL, PEX_SEARCH, false, NULL);
2093 do_wait (new_argv[0], pex);
2094 freeargv (make_argv);
2095 maybe_unlink (makefile);
2096 makefile = NULL;
2097 for (i = 0; i < nr; ++i)
2098 maybe_unlink (input_names[i]);
2100 for (i = 0; i < nr; ++i)
2102 fputs (output_names[i], stdout);
2103 putc ('\n', stdout);
2104 free (input_names[i]);
2106 if (!skip_debug)
2108 for (i = 0; i < ltoobj_argc; ++i)
2109 if (early_debug_object_names[i] != NULL)
2110 printf ("%s\n", early_debug_object_names[i]);
2112 nr = 0;
2113 free (ltrans_priorities);
2114 free (output_names);
2115 output_names = NULL;
2116 free (early_debug_object_names);
2117 early_debug_object_names = NULL;
2118 free (input_names);
2119 free (list_option_full);
2120 obstack_free (&env_obstack, NULL);
2123 finish:
2124 XDELETE (lto_argv);
2125 obstack_free (&argv_obstack, NULL);
2129 /* Entry point. */
2132 main (int argc, char *argv[])
2134 const char *p;
2136 init_opts_obstack ();
2138 p = argv[0] + strlen (argv[0]);
2139 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
2140 --p;
2141 progname = p;
2143 xmalloc_set_program_name (progname);
2145 gcc_init_libintl ();
2147 diagnostic_initialize (global_dc, 0);
2148 diagnostic_color_init (global_dc);
2149 diagnostic_urls_init (global_dc);
2150 global_dc->set_option_hooks (nullptr,
2151 nullptr,
2152 nullptr,
2153 get_option_url,
2156 if (atexit (lto_wrapper_cleanup) != 0)
2157 fatal_error (input_location, "%<atexit%> failed");
2159 setup_signals ();
2161 /* We may be called with all the arguments stored in some file and
2162 passed with @file. Expand them into argv before processing. */
2163 expandargv (&argc, &argv);
2165 run_gcc (argc, argv);
2167 return 0;