1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2021 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
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
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.
30 $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto
32 The above will print something like
35 If WHOPR is used instead, more than one file might be produced
36 ./ccXj2DTk.lto.ltrans.o
37 ./ccCJuXGv.lto.ltrans.o
42 #include "coretypes.h"
44 #include "diagnostic.h"
48 #include "simple-object.h"
49 #include "lto-section-names.h"
50 #include "collect-utils.h"
51 #include "opts-diagnostic.h"
53 /* Environment variable, used for passing the names of offload targets from GCC
54 driver to lto-wrapper. */
55 #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
56 #define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT"
58 /* By default there is no special suffix for target executables. */
59 #ifdef TARGET_EXECUTABLE_SUFFIX
60 #define HAVE_TARGET_EXECUTABLE_SUFFIX
62 #define TARGET_EXECUTABLE_SUFFIX ""
66 LTO_MODE_NONE
, /* Not doing LTO. */
67 LTO_MODE_LTO
, /* Normal LTO. */
68 LTO_MODE_WHOPR
/* WHOPR. */
71 /* Current LTO mode. */
72 static enum lto_mode_d lto_mode
= LTO_MODE_NONE
;
74 static char *ltrans_output_file
;
75 static char *flto_out
;
76 static unsigned int nr
;
77 static int *ltrans_priorities
;
78 static char **input_names
;
79 static char **output_names
;
80 static char **offload_names
;
81 static char *offload_objects_file_name
;
82 static char *makefile
;
83 static unsigned int num_deb_objs
;
84 static const char **early_debug_object_names
;
85 static bool xassembler_options_error
= false;
87 const char tool_name
[] = "lto-wrapper";
89 /* Delete tempfiles. Called from utils_cleanup. */
96 if (ltrans_output_file
)
97 maybe_unlink (ltrans_output_file
);
99 maybe_unlink (flto_out
);
100 if (offload_objects_file_name
)
101 maybe_unlink (offload_objects_file_name
);
103 maybe_unlink (makefile
);
104 if (early_debug_object_names
)
105 for (i
= 0; i
< num_deb_objs
; ++i
)
106 if (early_debug_object_names
[i
])
107 maybe_unlink (early_debug_object_names
[i
]);
108 for (i
= 0; i
< nr
; ++i
)
110 maybe_unlink (input_names
[i
]);
112 maybe_unlink (output_names
[i
]);
117 lto_wrapper_cleanup (void)
119 utils_cleanup (false);
122 /* Unlink a temporary LTRANS file unless requested otherwise. */
125 maybe_unlink (const char *file
)
129 if (unlink_if_ordinary (file
)
131 fatal_error (input_location
, "deleting LTRANS file %s: %m", file
);
134 fprintf (stderr
, "[Leaving LTRANS %s]\n", file
);
137 /* Template of LTRANS dumpbase suffix. */
138 #define DUMPBASE_SUFFIX "ltrans18446744073709551615"
140 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
143 static vec
<cl_decoded_option
>
144 get_options_from_collect_gcc_options (const char *collect_gcc
,
145 const char *collect_gcc_options
)
147 cl_decoded_option
*decoded_options
;
148 unsigned int decoded_options_count
;
149 struct obstack argv_obstack
;
153 obstack_init (&argv_obstack
);
154 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
156 parse_options_from_collect_gcc_options (collect_gcc_options
,
157 &argv_obstack
, &argc
);
158 argv
= XOBFINISH (&argv_obstack
, const char **);
160 decode_cmdline_options_to_array (argc
, (const char **)argv
, CL_DRIVER
,
161 &decoded_options
, &decoded_options_count
);
162 vec
<cl_decoded_option
> decoded
;
163 decoded
.create (decoded_options_count
);
164 for (unsigned i
= 0; i
< decoded_options_count
; ++i
)
165 decoded
.quick_push (decoded_options
[i
]);
166 free (decoded_options
);
168 obstack_free (&argv_obstack
, NULL
);
173 /* Find option in OPTIONS based on OPT_INDEX. -1 value is returned
174 if the option is not present. */
177 find_option (vec
<cl_decoded_option
> &options
, size_t opt_index
)
179 for (unsigned i
= 0; i
< options
.length (); ++i
)
180 if (options
[i
].opt_index
== opt_index
)
187 find_option (vec
<cl_decoded_option
> &options
, cl_decoded_option
*option
)
189 return find_option (options
, option
->opt_index
);
192 /* Merge -flto FOPTION into vector of DECODED_OPTIONS. */
195 merge_flto_options (vec
<cl_decoded_option
> &decoded_options
,
196 cl_decoded_option
*foption
)
198 int existing_opt
= find_option (decoded_options
, foption
);
199 if (existing_opt
== -1)
200 decoded_options
.safe_push (*foption
);
203 if (strcmp (foption
->arg
, decoded_options
[existing_opt
].arg
) != 0)
205 /* -flto=auto is preferred. */
206 if (strcmp (decoded_options
[existing_opt
].arg
, "auto") == 0)
208 else if (strcmp (foption
->arg
, "auto") == 0
209 || strcmp (foption
->arg
, "jobserver") == 0)
210 decoded_options
[existing_opt
].arg
= foption
->arg
;
211 else if (strcmp (decoded_options
[existing_opt
].arg
,
214 int n
= atoi (foption
->arg
);
215 int original_n
= atoi (decoded_options
[existing_opt
].arg
);
217 decoded_options
[existing_opt
].arg
= foption
->arg
;
223 /* Try to merge and complain about options FDECODED_OPTIONS when applied
224 ontop of DECODED_OPTIONS. */
227 merge_and_complain (vec
<cl_decoded_option
> &decoded_options
,
228 vec
<cl_decoded_option
> fdecoded_options
,
229 vec
<cl_decoded_option
> decoded_cl_options
)
232 cl_decoded_option
*pic_option
= NULL
;
233 cl_decoded_option
*pie_option
= NULL
;
234 cl_decoded_option
*cf_protection_option
= NULL
;
236 /* ??? Merge options from files. Most cases can be
237 handled by either unioning or intersecting
238 (for example -fwrapv is a case for unioning,
239 -ffast-math is for intersection). Most complaints
240 about real conflicts between different options can
241 be deferred to the compiler proper. Options that
242 we can neither safely handle by intersection nor
243 unioning would need to be complained about here.
244 Ideally we'd have a flag in the opt files that
245 tells whether to union or intersect or reject.
246 In absence of that it's unclear what a good default is.
247 It's also difficult to get positional handling correct. */
249 /* Look for a -fcf-protection option in the link-time options
250 which overrides any -fcf-protection from the lto sections. */
251 for (i
= 0; i
< decoded_cl_options
.length (); ++i
)
253 cl_decoded_option
*foption
= &decoded_cl_options
[i
];
254 if (foption
->opt_index
== OPT_fcf_protection_
)
256 cf_protection_option
= foption
;
260 /* The following does what the old LTO option code did,
261 union all target and a selected set of common options. */
262 for (i
= 0; i
< fdecoded_options
.length (); ++i
)
264 cl_decoded_option
*foption
= &fdecoded_options
[i
];
265 int existing_opt
= find_option (decoded_options
, foption
);
266 switch (foption
->opt_index
)
268 case OPT_SPECIAL_unknown
:
269 case OPT_SPECIAL_ignore
:
270 case OPT_SPECIAL_warn_removed
:
271 case OPT_SPECIAL_program_name
:
272 case OPT_SPECIAL_input_file
:
276 if (!(cl_options
[foption
->opt_index
].flags
& CL_TARGET
))
280 case OPT_fdiagnostics_show_caret
:
281 case OPT_fdiagnostics_show_labels
:
282 case OPT_fdiagnostics_show_line_numbers
:
283 case OPT_fdiagnostics_show_option
:
284 case OPT_fdiagnostics_show_location_
:
285 case OPT_fshow_column
:
289 /* Do what the old LTO code did - collect exactly one option
290 setting per OPT code, we pick the first we encounter.
291 ??? This doesn't make too much sense, but when it doesn't
292 then we should complain. */
293 if (existing_opt
== -1)
294 decoded_options
.safe_push (*foption
);
297 /* Figure out what PIC/PIE level wins and merge the results. */
300 pic_option
= foption
;
304 pie_option
= foption
;
309 /* For selected options we can merge conservatively. */
310 if (existing_opt
== -1)
311 decoded_options
.safe_push (*foption
);
312 /* -fopenmp > -fno-openmp,
313 -fopenacc > -fno-openacc */
314 else if (foption
->value
> decoded_options
[existing_opt
].value
)
315 decoded_options
[existing_opt
] = *foption
;
318 case OPT_fopenacc_dim_
:
319 /* Append or check identical. */
320 if (existing_opt
== -1)
321 decoded_options
.safe_push (*foption
);
322 else if (strcmp (decoded_options
[existing_opt
].arg
, foption
->arg
))
323 fatal_error (input_location
,
324 "option %s with different values",
325 foption
->orig_option_with_args_text
);
328 case OPT_fcf_protection_
:
329 /* Default to link-time option, else append or check identical. */
330 if (!cf_protection_option
331 || cf_protection_option
->value
== CF_CHECK
)
333 if (existing_opt
== -1)
334 decoded_options
.safe_push (*foption
);
335 else if (decoded_options
[existing_opt
].value
!= foption
->value
)
337 if (cf_protection_option
338 && cf_protection_option
->value
== CF_CHECK
)
339 fatal_error (input_location
,
340 "option %qs with mismatching values"
343 decoded_options
[existing_opt
].arg
,
347 /* Merge and update the -fcf-protection option. */
348 decoded_options
[existing_opt
].value
349 &= (foption
->value
& CF_FULL
);
350 switch (decoded_options
[existing_opt
].value
)
353 decoded_options
[existing_opt
].arg
= "none";
356 decoded_options
[existing_opt
].arg
= "branch";
359 decoded_options
[existing_opt
].arg
= "return";
375 for (j
= 0; j
< decoded_options
.length (); ++j
)
376 if (decoded_options
[j
].opt_index
== OPT_O
377 || decoded_options
[j
].opt_index
== OPT_Ofast
378 || decoded_options
[j
].opt_index
== OPT_Og
379 || decoded_options
[j
].opt_index
== OPT_Os
380 || decoded_options
[j
].opt_index
== OPT_Oz
)
385 if (existing_opt
== -1)
386 decoded_options
.safe_push (*foption
);
387 else if (decoded_options
[existing_opt
].opt_index
== foption
->opt_index
388 && foption
->opt_index
!= OPT_O
)
389 /* Exact same options get merged. */
393 /* For mismatched option kinds preserve the optimization
394 level only, thus merge it as -On. This also handles
395 merging of same optimization level -On. */
397 switch (foption
->opt_index
)
400 if (foption
->arg
[0] == '\0')
401 level
= MAX (level
, 1);
403 level
= MAX (level
, atoi (foption
->arg
));
406 level
= MAX (level
, 3);
409 level
= MAX (level
, 1);
413 level
= MAX (level
, 2);
418 switch (decoded_options
[existing_opt
].opt_index
)
421 if (decoded_options
[existing_opt
].arg
[0] == '\0')
422 level
= MAX (level
, 1);
425 atoi (decoded_options
[existing_opt
].arg
));
428 level
= MAX (level
, 3);
431 level
= MAX (level
, 1);
435 level
= MAX (level
, 2);
440 decoded_options
[existing_opt
].opt_index
= OPT_O
;
442 tem
= xasprintf ("-O%d", level
);
443 decoded_options
[existing_opt
].arg
= &tem
[2];
444 decoded_options
[existing_opt
].canonical_option
[0] = tem
;
445 decoded_options
[existing_opt
].value
= 1;
450 case OPT_foffload_abi_
:
451 if (existing_opt
== -1)
452 decoded_options
.safe_push (*foption
);
453 else if (foption
->value
!= decoded_options
[existing_opt
].value
)
454 fatal_error (input_location
,
455 "option %s not used consistently in all LTO input"
456 " files", foption
->orig_option_with_args_text
);
460 case OPT_foffload_options_
:
461 decoded_options
.safe_push (*foption
);
465 merge_flto_options (decoded_options
, foption
);
470 /* Merge PIC options:
471 -fPIC + -fpic = -fpic
472 -fPIC + -fno-pic = -fno-pic
473 -fpic/-fPIC + nothing = nothing.
474 It is a common mistake to mix few -fPIC compiled objects into otherwise
475 non-PIC code. We do not want to build everything with PIC then.
477 Similarly we merge PIE options, however in addition we keep
478 -fPIC + -fPIE = -fPIE
479 -fpic + -fPIE = -fpie
480 -fPIC/-fpic + -fpie = -fpie
482 It would be good to warn on mismatches, but it is bit hard to do as
483 we do not know what nothing translates to. */
485 for (unsigned int j
= 0; j
< decoded_options
.length ();)
486 if (decoded_options
[j
].opt_index
== OPT_fPIC
487 || decoded_options
[j
].opt_index
== OPT_fpic
)
489 /* -fno-pic in one unit implies -fno-pic everywhere. */
490 if (decoded_options
[j
].value
== 0)
492 /* If we have no pic option or merge in -fno-pic, we still may turn
493 existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */
494 else if ((pic_option
&& pic_option
->value
== 0)
499 bool big
= decoded_options
[j
].opt_index
== OPT_fPIC
500 && pie_option
->opt_index
== OPT_fPIE
;
501 decoded_options
[j
].opt_index
= big
? OPT_fPIE
: OPT_fpie
;
502 if (pie_option
->value
)
503 decoded_options
[j
].canonical_option
[0]
504 = big
? "-fPIE" : "-fpie";
506 decoded_options
[j
].canonical_option
[0] = "-fno-pie";
507 decoded_options
[j
].value
= pie_option
->value
;
512 decoded_options
[j
] = *pic_option
;
515 /* We do not know if target defaults to pic or not, so just remove
516 option if it is missing in one unit but enabled in other. */
518 decoded_options
.ordered_remove (j
);
520 else if (pic_option
->opt_index
== OPT_fpic
521 && decoded_options
[j
].opt_index
== OPT_fPIC
)
523 decoded_options
[j
] = *pic_option
;
529 else if (decoded_options
[j
].opt_index
== OPT_fPIE
530 || decoded_options
[j
].opt_index
== OPT_fpie
)
532 /* -fno-pie in one unit implies -fno-pie everywhere. */
533 if (decoded_options
[j
].value
== 0)
535 /* If we have no pie option or merge in -fno-pie, we still preserve
536 PIE/pie if pic/PIC is present. */
537 else if ((pie_option
&& pie_option
->value
== 0)
540 /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */
543 if (pic_option
->opt_index
== OPT_fpic
544 && decoded_options
[j
].opt_index
== OPT_fPIE
)
546 decoded_options
[j
].opt_index
= OPT_fpie
;
547 decoded_options
[j
].canonical_option
[0]
548 = pic_option
->value
? "-fpie" : "-fno-pie";
550 else if (!pic_option
->value
)
551 decoded_options
[j
].canonical_option
[0] = "-fno-pie";
552 decoded_options
[j
].value
= pic_option
->value
;
557 decoded_options
[j
] = *pie_option
;
560 /* Because we always append pic/PIE options this code path should
561 not happen unless the LTO object was built by old lto1 which
562 did not contain that logic yet. */
564 decoded_options
.ordered_remove (j
);
566 else if (pie_option
->opt_index
== OPT_fpie
567 && decoded_options
[j
].opt_index
== OPT_fPIE
)
569 decoded_options
[j
] = *pie_option
;
578 if (!xassembler_options_error
)
579 for (i
= j
= 0; ; i
++, j
++)
581 int existing_opt_index
582 = find_option (decoded_options
, OPT_Xassembler
);
583 int existing_opt2_index
584 = find_option (fdecoded_options
, OPT_Xassembler
);
586 cl_decoded_option
*existing_opt
= NULL
;
587 cl_decoded_option
*existing_opt2
= NULL
;
588 if (existing_opt_index
!= -1)
589 existing_opt
= &decoded_options
[existing_opt_index
];
590 if (existing_opt2_index
!= -1)
591 existing_opt2
= &fdecoded_options
[existing_opt2_index
];
593 if (existing_opt
== NULL
&& existing_opt2
== NULL
)
595 else if (existing_opt
!= NULL
&& existing_opt2
== NULL
)
597 warning (0, "Extra option to %<-Xassembler%>: %s,"
598 " dropping all %<-Xassembler%> and %<-Wa%> options.",
600 xassembler_options_error
= true;
603 else if (existing_opt
== NULL
&& existing_opt2
!= NULL
)
605 warning (0, "Extra option to %<-Xassembler%>: %s,"
606 " dropping all %<-Xassembler%> and %<-Wa%> options.",
608 xassembler_options_error
= true;
611 else if (strcmp (existing_opt
->arg
, existing_opt2
->arg
) != 0)
613 warning (0, "Options to %<-Xassembler%> do not match: %s, %s,"
614 " dropping all %<-Xassembler%> and %<-Wa%> options.",
615 existing_opt
->arg
, existing_opt2
->arg
);
616 xassembler_options_error
= true;
622 /* Auxiliary function that frees elements of PTR and PTR itself.
623 N is number of elements to be freed. If PTR is NULL, nothing is freed.
624 If an element is NULL, subsequent elements are not freed. */
627 free_array_of_ptrs (void **ptr
, unsigned n
)
631 for (unsigned i
= 0; i
< n
; i
++)
641 /* Parse STR, saving found tokens into PVALUES and return their number.
642 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
643 append it to every token we find. */
646 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
648 const char *curval
, *nextval
;
652 curval
= strchr (str
, ':');
656 curval
= strchr (curval
+ 1, ':');
659 values
= (char**) xmalloc (num
* sizeof (char*));
661 nextval
= strchr (curval
, ':');
663 nextval
= strchr (curval
, '\0');
665 int append_len
= append
? strlen (append
) : 0;
666 for (i
= 0; i
< num
; i
++)
668 int l
= nextval
- curval
;
669 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
670 memcpy (values
[i
], curval
, l
);
673 strcat (values
[i
], append
);
674 curval
= nextval
+ 1;
675 nextval
= strchr (curval
, ':');
677 nextval
= strchr (curval
, '\0');
683 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
686 append_compiler_options (obstack
*argv_obstack
, vec
<cl_decoded_option
> opts
)
688 /* Append compiler driver arguments as far as they were merged. */
689 for (unsigned int j
= 1; j
< opts
.length (); ++j
)
691 cl_decoded_option
*option
= &opts
[j
];
693 /* File options have been properly filtered by lto-opts.c. */
694 switch (option
->opt_index
)
696 /* Drop arguments that we want to take from the link line. */
699 case OPT_flto_partition_
:
706 /* For now do what the original LTO option code was doing - pass
707 on any CL_TARGET flag and a few selected others. */
708 switch (option
->opt_index
)
710 case OPT_fdiagnostics_show_caret
:
711 case OPT_fdiagnostics_show_labels
:
712 case OPT_fdiagnostics_show_line_numbers
:
713 case OPT_fdiagnostics_show_option
:
714 case OPT_fdiagnostics_show_location_
:
715 case OPT_fshow_column
:
724 case OPT_fopenacc_dim_
:
725 case OPT_foffload_abi_
:
726 case OPT_fcf_protection_
:
736 /* When we detected a mismatch in assembler options between
737 the input TU's fall back to previous behavior of ignoring them. */
738 if (xassembler_options_error
)
743 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
747 /* Pass the option on. */
748 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
749 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
753 /* Append diag options in OPTS to ARGV_OBSTACK. */
756 append_diag_options (obstack
*argv_obstack
, vec
<cl_decoded_option
> opts
)
758 /* Append compiler driver arguments as far as they were merged. */
759 for (unsigned int j
= 1; j
< opts
.length (); ++j
)
761 cl_decoded_option
*option
= &opts
[j
];
763 switch (option
->opt_index
)
765 case OPT_fdiagnostics_color_
:
766 case OPT_fdiagnostics_format_
:
767 case OPT_fdiagnostics_show_caret
:
768 case OPT_fdiagnostics_show_labels
:
769 case OPT_fdiagnostics_show_line_numbers
:
770 case OPT_fdiagnostics_show_option
:
771 case OPT_fdiagnostics_show_location_
:
772 case OPT_fshow_column
:
778 /* Pass the option on. */
779 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
780 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
785 /* Append linker options OPTS to ARGV_OBSTACK. */
788 append_linker_options (obstack
*argv_obstack
, vec
<cl_decoded_option
> opts
)
790 /* Append linker driver arguments. Compiler options from the linker
791 driver arguments will override / merge with those from the compiler. */
792 for (unsigned int j
= 1; j
< opts
.length (); ++j
)
794 cl_decoded_option
*option
= &opts
[j
];
796 /* Do not pass on frontend specific flags not suitable for lto. */
797 if (!(cl_options
[option
->opt_index
].flags
798 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
801 switch (option
->opt_index
)
806 /* We've handled these LTO options, do not pass them on. */
811 /* Ignore -fno-XXX form of these options, as otherwise
812 corresponding builtins will not be enabled. */
813 if (option
->value
== 0)
821 /* Pass the option on. */
822 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
823 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
827 /* Extract options for TARGET offload compiler from OPTIONS and append
828 them to ARGV_OBSTACK. */
831 append_offload_options (obstack
*argv_obstack
, const char *target
,
832 vec
<cl_decoded_option
> options
)
834 for (unsigned i
= 0; i
< options
.length (); i
++)
836 const char *cur
, *next
, *opts
;
839 cl_decoded_option
*option
= &options
[i
];
841 if (option
->opt_index
!= OPT_foffload_options_
)
844 /* If option argument starts with '-' then no target is specified. That
845 means offload options are specified for all targets, so we need to
847 if (option
->arg
[0] == '-')
851 opts
= strchr (option
->arg
, '=');
857 next
= strchr (cur
, ',');
860 next
= (next
> opts
) ? opts
: next
;
862 /* Are we looking for this offload target? */
863 if (strlen (target
) == (size_t) (next
- cur
)
864 && strncmp (target
, cur
, next
- cur
) == 0)
867 /* Skip the comma or equal sign. */
877 argv
= buildargv (opts
);
878 for (argc
= 0; argv
[argc
]; argc
++)
879 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
883 /* Check whether NAME can be accessed in MODE. This is like access,
884 except that it never considers directories to be executable. */
887 access_check (const char *name
, int mode
)
893 if (stat (name
, &st
) < 0
894 || S_ISDIR (st
.st_mode
))
898 return access (name
, mode
);
901 /* Prepare a target image for offload TARGET, using mkoffload tool from
902 COMPILER_PATH. Return the name of the resultant object file. */
905 compile_offload_image (const char *target
, const char *compiler_path
,
906 unsigned in_argc
, char *in_argv
[],
907 vec
<cl_decoded_option
> compiler_opts
,
908 vec
<cl_decoded_option
> linker_opts
)
910 char *filename
= NULL
;
914 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
915 strcpy (suffix
, "/accel/");
916 strcat (suffix
, target
);
917 strcat (suffix
, "/mkoffload");
920 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
922 const char *compiler
= NULL
;
923 for (unsigned i
= 0; i
< n_paths
; i
++)
924 if (access_check (paths
[i
], X_OK
) == 0)
929 #if OFFLOAD_DEFAULTED
930 if (!compiler
&& getenv (OFFLOAD_TARGET_DEFAULT_ENV
))
932 free_array_of_ptrs ((void **) paths
, n_paths
);
938 fatal_error (input_location
,
939 "could not find %s in %s (consider using %<-B%>)",
940 suffix
+ 1, compiler_path
);
942 dumpbase
= concat (dumppfx
, "x", target
, NULL
);
944 /* Generate temporary output file name. */
946 filename
= concat (dumpbase
, ".o", NULL
);
948 filename
= make_temp_file (".target.o");
950 struct obstack argv_obstack
;
951 obstack_init (&argv_obstack
);
952 obstack_ptr_grow (&argv_obstack
, compiler
);
954 obstack_ptr_grow (&argv_obstack
, "-save-temps");
956 obstack_ptr_grow (&argv_obstack
, "-v");
957 obstack_ptr_grow (&argv_obstack
, "-o");
958 obstack_ptr_grow (&argv_obstack
, filename
);
960 /* Append names of input object files. */
961 for (unsigned i
= 0; i
< in_argc
; i
++)
962 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
964 /* Append options from offload_lto sections. */
965 append_compiler_options (&argv_obstack
, compiler_opts
);
966 append_diag_options (&argv_obstack
, linker_opts
);
968 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
969 obstack_ptr_grow (&argv_obstack
, dumpbase
);
971 /* Append options specified by -foffload last. In case of conflicting
972 options we expect offload compiler to choose the latest. */
973 append_offload_options (&argv_obstack
, target
, compiler_opts
);
974 append_offload_options (&argv_obstack
, target
, linker_opts
);
976 obstack_ptr_grow (&argv_obstack
, NULL
);
977 argv
= XOBFINISH (&argv_obstack
, char **);
978 fork_execute (argv
[0], argv
, true, "offload_args");
979 obstack_free (&argv_obstack
, NULL
);
981 free_array_of_ptrs ((void **) paths
, n_paths
);
986 /* The main routine dealing with offloading.
987 The routine builds a target image for each offload target. IN_ARGC and
988 IN_ARGV specify options and input object files. As all of them could contain
989 target sections, we pass them all to target compilers. */
992 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
993 vec
<cl_decoded_option
> compiler_opts
,
994 vec
<cl_decoded_option
> linker_opts
)
997 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
1000 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
1001 int next_name_entry
= 0;
1003 const char *compiler_path
= getenv ("COMPILER_PATH");
1007 /* Prepare an image for each target and save the name of the resultant object
1008 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
1009 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
1010 for (unsigned i
= 0; i
< num_targets
; i
++)
1012 offload_names
[next_name_entry
]
1013 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
1014 compiler_opts
, linker_opts
);
1015 if (!offload_names
[next_name_entry
])
1016 #if OFFLOAD_DEFAULTED
1019 fatal_error (input_location
,
1020 "problem with building target image for %s", names
[i
]);
1025 #if OFFLOAD_DEFAULTED
1026 if (next_name_entry
== 0)
1028 free (offload_names
);
1029 offload_names
= NULL
;
1034 free_array_of_ptrs ((void **) names
, num_targets
);
1037 /* Copy a file from SRC to DEST. */
1040 copy_file (const char *dest
, const char *src
)
1042 FILE *d
= fopen (dest
, "wb");
1043 FILE *s
= fopen (src
, "rb");
1047 size_t len
= fread (buffer
, 1, 512, s
);
1048 if (ferror (s
) != 0)
1049 fatal_error (input_location
, "reading input file");
1052 fwrite (buffer
, 1, len
, d
);
1053 if (ferror (d
) != 0)
1054 fatal_error (input_location
, "writing output file");
1061 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
1062 the copy to the linker. */
1065 find_crtoffloadtable (int save_temps
, const char *dumppfx
)
1067 char **paths
= NULL
;
1068 const char *library_path
= getenv ("LIBRARY_PATH");
1071 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadtable.o");
1074 for (i
= 0; i
< n_paths
; i
++)
1075 if (access_check (paths
[i
], R_OK
) == 0)
1077 /* The linker will delete the filename we give it, so make a copy. */
1078 char *crtoffloadtable
;
1080 crtoffloadtable
= make_temp_file (".crtoffloadtable.o");
1082 crtoffloadtable
= concat (dumppfx
, "crtoffloadtable.o", NULL
);
1083 copy_file (crtoffloadtable
, paths
[i
]);
1084 printf ("%s\n", crtoffloadtable
);
1085 XDELETEVEC (crtoffloadtable
);
1089 fatal_error (input_location
,
1090 "installation error, cannot find %<crtoffloadtable.o%>");
1092 free_array_of_ptrs ((void **) paths
, n_paths
);
1095 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
1096 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS.
1097 Return true if we found a matching section, false
1098 otherwise. COLLECT_GCC holds the value of the environment variable with
1102 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
1103 vec
<cl_decoded_option
> decoded_cl_options
,
1104 vec
<cl_decoded_option
> *opts
, const char *collect_gcc
)
1106 off_t offset
, length
;
1111 vec
<cl_decoded_option
> fdecoded_options
;
1113 simple_object_read
*sobj
;
1114 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
1119 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
1120 strcpy (secname
, prefix
);
1121 strcat (secname
, ".opts");
1122 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
1125 simple_object_release_read (sobj
);
1129 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
1130 data
= (char *)xmalloc (length
);
1131 read (fd
, data
, length
);
1136 vec
<cl_decoded_option
> f2decoded_options
1137 = get_options_from_collect_gcc_options (collect_gcc
, fopts
);
1140 fdecoded_options
= f2decoded_options
;
1144 merge_and_complain (fdecoded_options
, f2decoded_options
,
1145 decoded_cl_options
);
1147 fopts
+= strlen (fopts
) + 1;
1149 while (fopts
- data
< length
);
1152 simple_object_release_read (sobj
);
1153 *opts
= fdecoded_options
;
1157 /* Copy early debug info sections from INFILE to a new file whose name
1158 is returned. Return NULL on error. */
1161 debug_objcopy (const char *infile
, bool rename
)
1168 const char *orig_infile
= infile
;
1172 if ((p
= strrchr (infile
, '@'))
1174 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1175 && strlen (p
) == (unsigned int) consumed
)
1177 char *fname
= xstrdup (infile
);
1178 fname
[p
- infile
] = '\0';
1180 inoff
= (off_t
) loffset
;
1182 int infd
= open (infile
, O_RDONLY
| O_BINARY
);
1185 simple_object_read
*inobj
= simple_object_start_read (infd
, inoff
,
1192 if (simple_object_find_section (inobj
, ".gnu.debuglto_.debug_info",
1193 &off
, &len
, &errmsg
, &err
) != 1)
1196 fatal_error (0, "%s: %s", errmsg
, xstrerror (err
));
1198 simple_object_release_read (inobj
);
1204 outfile
= concat (orig_infile
, ".debug.temp.o", NULL
);
1206 outfile
= make_temp_file (".debug.temp.o");
1207 errmsg
= simple_object_copy_lto_debug_sections (inobj
, outfile
, &err
, rename
);
1210 unlink_if_ordinary (outfile
);
1211 fatal_error (0, "%s: %s", errmsg
, xstrerror (err
));
1214 simple_object_release_read (inobj
);
1220 /* Helper for qsort: compare priorities for parallel compilation. */
1223 cmp_priority (const void *a
, const void *b
)
1225 return *((const int *)b
)-*((const int *)a
);
1228 /* Number of CPUs that can be used for parallel LTRANS phase. */
1230 static unsigned long nthreads_var
= 0;
1232 #ifdef HAVE_PTHREAD_AFFINITY_NP
1233 unsigned long cpuset_size
;
1234 static unsigned long get_cpuset_size
;
1238 static cpuset_popcount (unsigned long cpusetsize
, cpu_set_t
*cpusetp
)
1241 /* glibc 2.7 and above provide a macro for this. */
1242 return CPU_COUNT_S (cpusetsize
, cpusetp
);
1245 if (cpusetsize
== sizeof (cpu_set_t
))
1246 /* glibc 2.6 and above provide a macro for this. */
1247 return CPU_COUNT (cpusetp
);
1250 unsigned long ret
= 0;
1251 STATIC_ASSERT (sizeof (cpusetp
->__bits
[0]) == sizeof (unsigned long int));
1252 for (i
= 0; i
< cpusetsize
/ sizeof (cpusetp
->__bits
[0]); i
++)
1254 unsigned long int mask
= cpusetp
->__bits
[i
];
1257 ret
+= __builtin_popcountl (mask
);
1264 /* At startup, determine the default number of threads. It would seem
1265 this should be related to the number of cpus online. */
1268 init_num_threads (void)
1270 #ifdef HAVE_PTHREAD_AFFINITY_NP
1271 #if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE)
1272 cpuset_size
= sysconf (_SC_NPROCESSORS_CONF
);
1273 cpuset_size
= CPU_ALLOC_SIZE (cpuset_size
);
1275 cpuset_size
= sizeof (cpu_set_t
);
1278 cpusetp
= (cpu_set_t
*) xmalloc (gomp_cpuset_size
);
1281 int ret
= pthread_getaffinity_np (pthread_self (), gomp_cpuset_size
,
1285 /* Count only the CPUs this process can use. */
1286 nthreads_var
= cpuset_popcount (cpuset_size
, cpusetp
);
1287 if (nthreads_var
== 0)
1289 get_cpuset_size
= cpuset_size
;
1290 #ifdef CPU_ALLOC_SIZE
1292 for (i
= cpuset_size
* 8; i
; i
--)
1293 if (CPU_ISSET_S (i
- 1, cpuset_size
, cpusetp
))
1295 cpuset_size
= CPU_ALLOC_SIZE (i
);
1301 #ifdef CPU_ALLOC_SIZE
1302 if (cpuset_size
< sizeof (cpu_set_t
))
1303 cpuset_size
= sizeof (cpu_set_t
);
1305 cpuset_size
= cpuset_size
* 2;
1306 if (cpuset_size
< 8 * sizeof (cpu_set_t
))
1308 = (cpu_set_t
*) realloc (cpusetp
, cpuset_size
);
1311 /* Avoid fatal if too large memory allocation would be
1312 requested, e.g. kernel returning EINVAL all the time. */
1313 void *p
= realloc (cpusetp
, cpuset_size
);
1316 cpusetp
= (cpu_set_t
*) p
;
1328 #ifdef _SC_NPROCESSORS_ONLN
1329 nthreads_var
= sysconf (_SC_NPROCESSORS_ONLN
);
1333 /* Test and return reason why a jobserver cannot be detected. */
1336 jobserver_active_p (void)
1338 #define JS_PREFIX "jobserver is not available: "
1339 #define JS_NEEDLE "--jobserver-auth="
1341 const char *makeflags
= getenv ("MAKEFLAGS");
1342 if (makeflags
== NULL
)
1343 return JS_PREFIX
"%<MAKEFLAGS%> environment variable is unset";
1345 const char *n
= strstr (makeflags
, JS_NEEDLE
);
1347 return JS_PREFIX
"%<" JS_NEEDLE
"%> is not present in %<MAKEFLAGS%>";
1352 if (sscanf (n
+ strlen (JS_NEEDLE
), "%d,%d", &rfd
, &wfd
) == 2
1355 && is_valid_fd (rfd
)
1356 && is_valid_fd (wfd
))
1359 return JS_PREFIX
"cannot access %<" JS_NEEDLE
"%> file descriptors";
1362 /* Print link to -flto documentation with a hint message. */
1365 print_lto_docs_link ()
1367 const char *url
= get_option_url (NULL
, OPT_flto
);
1370 pp
.url_format
= URL_FORMAT_DEFAULT
;
1371 pp_string (&pp
, "see the ");
1372 pp_begin_url (&pp
, url
);
1373 pp_string (&pp
, "%<-flto%> option documentation");
1375 pp_string (&pp
, " for more information");
1376 inform (UNKNOWN_LOCATION
, pp_formatted_text (&pp
));
1379 /* Test that a make command is present and working, return true if so. */
1384 const char *make
= "make";
1385 char **make_argv
= buildargv (getenv ("MAKE"));
1387 make
= make_argv
[0];
1388 const char *make_args
[] = {make
, "--version", NULL
};
1390 int exit_status
= 0;
1393 = pex_one (PEX_SEARCH
, make_args
[0], CONST_CAST (char **, make_args
),
1394 "make", NULL
, NULL
, &exit_status
, &err
);
1395 freeargv (make_argv
);
1396 return errmsg
== NULL
&& exit_status
== 0 && err
== 0;
1399 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1402 run_gcc (unsigned argc
, char *argv
[])
1405 const char **new_argv
;
1406 const char **argv_ptr
;
1407 char *list_option_full
= NULL
;
1408 const char *linker_output
= NULL
;
1409 const char *collect_gcc
;
1410 char *collect_gcc_options
;
1413 bool jobserver_requested
= false;
1414 int auto_parallel
= 0;
1415 bool no_partition
= false;
1416 const char *jobserver_error
= NULL
;
1417 vec
<cl_decoded_option
> fdecoded_options
;
1418 fdecoded_options
.create (16);
1419 vec
<cl_decoded_option
> offload_fdecoded_options
= vNULL
;
1420 struct obstack argv_obstack
;
1422 bool have_lto
= false;
1423 bool have_offload
= false;
1424 unsigned lto_argc
= 0, ltoobj_argc
= 0;
1425 char **lto_argv
, **ltoobj_argv
;
1426 bool linker_output_rel
= false;
1427 bool skip_debug
= false;
1428 unsigned n_debugobj
;
1429 const char *incoming_dumppfx
= dumppfx
= NULL
;
1430 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1432 /* Get the driver and options. */
1433 collect_gcc
= getenv ("COLLECT_GCC");
1435 fatal_error (input_location
,
1436 "environment variable %<COLLECT_GCC%> must be set");
1437 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
1438 if (!collect_gcc_options
)
1439 fatal_error (input_location
,
1440 "environment variable %<COLLECT_GCC_OPTIONS%> must be set");
1442 char *collect_as_options
= getenv ("COLLECT_AS_OPTIONS");
1444 /* Prepend -Xassembler to each option, and append the string
1445 to collect_gcc_options. */
1446 if (collect_as_options
)
1448 obstack temporary_obstack
;
1449 obstack_init (&temporary_obstack
);
1451 prepend_xassembler_to_collect_as_options (collect_as_options
,
1452 &temporary_obstack
);
1453 obstack_1grow (&temporary_obstack
, '\0');
1455 char *xassembler_opts_string
1456 = XOBFINISH (&temporary_obstack
, char *);
1457 collect_gcc_options
= concat (collect_gcc_options
, xassembler_opts_string
,
1461 vec
<cl_decoded_option
> decoded_options
1462 = get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
);
1464 /* Allocate array for input object files with LTO IL,
1465 and for possible preceding arguments. */
1466 lto_argv
= XNEWVEC (char *, argc
);
1467 ltoobj_argv
= XNEWVEC (char *, argc
);
1469 /* Look at saved options in the IL files. */
1470 for (i
= 1; i
< argc
; ++i
)
1474 off_t file_offset
= 0;
1477 char *filename
= argv
[i
];
1479 if (startswith (argv
[i
], "-foffload-objects="))
1481 have_offload
= true;
1482 offload_objects_file_name
1483 = argv
[i
] + sizeof ("-foffload-objects=") - 1;
1487 if ((p
= strrchr (argv
[i
], '@'))
1489 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1490 && strlen (p
) == (unsigned int) consumed
)
1492 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
1493 memcpy (filename
, argv
[i
], p
- argv
[i
]);
1494 filename
[p
- argv
[i
]] = '\0';
1495 file_offset
= (off_t
) loffset
;
1497 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1498 /* Linker plugin passes -fresolution and -flinker-output options.
1499 -flinker-output is passed only when user did not specify one and thus
1500 we do not need to worry about duplicities with the option handling
1504 lto_argv
[lto_argc
++] = argv
[i
];
1505 if (strcmp (argv
[i
], "-flinker-output=rel") == 0)
1506 linker_output_rel
= true;
1510 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
1511 decoded_options
, &fdecoded_options
,
1515 ltoobj_argv
[ltoobj_argc
++] = argv
[i
];
1520 /* Initalize the common arguments for the driver. */
1521 obstack_init (&argv_obstack
);
1522 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
1523 obstack_ptr_grow (&argv_obstack
, "-xlto");
1524 obstack_ptr_grow (&argv_obstack
, "-c");
1526 append_compiler_options (&argv_obstack
, fdecoded_options
);
1527 append_linker_options (&argv_obstack
, decoded_options
);
1529 /* Scan linker driver arguments for things that are of relevance to us. */
1530 for (j
= 1; j
< decoded_options
.length (); ++j
)
1532 cl_decoded_option
*option
= &decoded_options
[j
];
1533 switch (option
->opt_index
)
1536 linker_output
= option
->arg
;
1539 /* We don't have to distinguish between -save-temps=* and
1540 -save-temps, -dumpdir already carries that
1542 case OPT_save_temps_
:
1543 case OPT_save_temps
:
1551 case OPT_flto_partition_
:
1552 if (strcmp (option
->arg
, "none") == 0)
1553 no_partition
= true;
1557 /* Merge linker -flto= option with what we have in IL files. */
1558 merge_flto_options (fdecoded_options
, option
);
1559 if (strcmp (option
->arg
, "jobserver") == 0)
1560 jobserver_requested
= true;
1563 case OPT_flinker_output_
:
1564 linker_output_rel
= !strcmp (option
->arg
, "rel");
1568 /* Recognize -g0. */
1569 skip_debug
= option
->arg
&& !strcmp (option
->arg
, "0");
1573 incoming_dumppfx
= dumppfx
= option
->arg
;
1581 /* Process LTO-related options on merged options. */
1582 for (j
= 1; j
< fdecoded_options
.length (); ++j
)
1584 cl_decoded_option
*option
= &fdecoded_options
[j
];
1585 switch (option
->opt_index
)
1588 if (strcmp (option
->arg
, "jobserver") == 0)
1593 else if (strcmp (option
->arg
, "auto") == 0)
1600 parallel
= atoi (option
->arg
);
1607 lto_mode
= LTO_MODE_WHOPR
;
1612 /* Output lto-wrapper invocation command. */
1615 for (i
= 0; i
< argc
; ++i
)
1617 fputs (argv
[i
], stderr
);
1618 fputc (' ', stderr
);
1620 fputc ('\n', stderr
);
1623 if (linker_output_rel
)
1624 no_partition
= true;
1628 lto_mode
= LTO_MODE_LTO
;
1630 jobserver_requested
= false;
1636 jobserver_error
= jobserver_active_p ();
1637 if (jobserver
&& jobserver_error
!= NULL
)
1639 /* Fall back to auto parallelism. */
1643 else if (!jobserver
&& jobserver_error
== NULL
)
1650 /* We need make working for a parallel execution. */
1651 if (parallel
&& !make_exists ())
1657 || strcmp (linker_output
, HOST_BIT_BUCKET
) == 0)
1661 const char *obase
= lbasename (linker_output
), *temp
;
1663 /* Strip the executable extension. */
1664 size_t blen
= strlen (obase
), xlen
;
1665 if ((temp
= strrchr (obase
+ 1, '.'))
1666 && (xlen
= strlen (temp
))
1667 && (strcmp (temp
, ".exe") == 0
1668 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
1669 || strcmp (temp
, TARGET_EXECUTABLE_SUFFIX
) == 0
1671 || strcmp (obase
, "a.out") == 0))
1672 dumppfx
= xstrndup (linker_output
,
1673 obase
- linker_output
+ blen
- xlen
+ 1);
1675 dumppfx
= concat (linker_output
, ".", NULL
);
1679 /* If there's no directory component in the dumppfx, add one, so
1680 that, when it is used as -dumpbase, it overrides any occurrence
1681 of -dumpdir that might have been passed in. */
1682 if (!dumppfx
|| lbasename (dumppfx
) == dumppfx
)
1683 dumppfx
= concat (current_dir
, dumppfx
, NULL
);
1685 /* Make sure some -dumpdir is passed, so as to get predictable
1686 -dumpbase overriding semantics. If we got an incoming -dumpdir
1687 argument, we'll pass it on, so don't bother with another one
1689 if (!incoming_dumppfx
)
1691 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1692 obstack_ptr_grow (&argv_obstack
, "");
1694 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1696 /* Remember at which point we can scrub args to re-use the commons. */
1697 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1701 unsigned i
, num_offload_files
;
1702 char **offload_argv
;
1705 f
= fopen (offload_objects_file_name
, "r");
1707 fatal_error (input_location
, "cannot open %s: %m",
1708 offload_objects_file_name
);
1709 if (fscanf (f
, "%u ", &num_offload_files
) != 1)
1710 fatal_error (input_location
, "cannot read %s: %m",
1711 offload_objects_file_name
);
1712 offload_argv
= XCNEWVEC (char *, num_offload_files
);
1714 /* Read names of object files with offload. */
1715 for (i
= 0; i
< num_offload_files
; i
++)
1717 const unsigned piece
= 32;
1718 char *buf
, *filename
= XNEWVEC (char, piece
);
1723 if (!fgets (buf
, piece
, f
))
1725 len
= strlen (filename
);
1726 if (filename
[len
- 1] != '\n')
1728 filename
= XRESIZEVEC (char, filename
, len
+ piece
);
1729 buf
= filename
+ len
;
1732 filename
[len
- 1] = '\0';
1733 offload_argv
[i
] = filename
;
1736 if (offload_argv
[num_offload_files
- 1] == NULL
)
1737 fatal_error (input_location
, "invalid format of %s",
1738 offload_objects_file_name
);
1739 maybe_unlink (offload_objects_file_name
);
1740 offload_objects_file_name
= NULL
;
1742 /* Look at saved offload options in files. */
1743 for (i
= 0; i
< num_offload_files
; i
++)
1748 off_t file_offset
= 0;
1749 char *filename
= offload_argv
[i
];
1751 if ((p
= strrchr (offload_argv
[i
], '@'))
1752 && p
!= offload_argv
[i
]
1753 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1754 && strlen (p
) == (unsigned int) consumed
)
1756 filename
= XNEWVEC (char, p
- offload_argv
[i
] + 1);
1757 memcpy (filename
, offload_argv
[i
], p
- offload_argv
[i
]);
1758 filename
[p
- offload_argv
[i
]] = '\0';
1759 file_offset
= (off_t
) loffset
;
1761 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1763 fatal_error (input_location
, "cannot open %s: %m", filename
);
1764 if (!find_and_merge_options (fd
, file_offset
,
1765 OFFLOAD_SECTION_NAME_PREFIX
,
1766 decoded_options
, &offload_fdecoded_options
,
1768 fatal_error (input_location
, "cannot read %s: %m", filename
);
1770 if (filename
!= offload_argv
[i
])
1771 XDELETEVEC (filename
);
1774 compile_images_for_offload_targets (num_offload_files
, offload_argv
,
1775 offload_fdecoded_options
, decoded_options
);
1777 free_array_of_ptrs ((void **) offload_argv
, num_offload_files
);
1781 find_crtoffloadtable (save_temps
, dumppfx
);
1782 for (i
= 0; offload_names
[i
]; i
++)
1783 printf ("%s\n", offload_names
[i
]);
1784 free_array_of_ptrs ((void **) offload_names
, i
);
1788 /* If object files contain offload sections, but do not contain LTO sections,
1789 then there is no need to perform a link-time recompilation, i.e.
1790 lto-wrapper is used only for a compilation of offload images. */
1791 if (have_offload
&& !have_lto
)
1794 if (lto_mode
== LTO_MODE_LTO
)
1796 /* -dumpbase argument for LTO. */
1797 flto_out
= concat (dumppfx
, "lto.o", NULL
);
1798 obstack_ptr_grow (&argv_obstack
, flto_out
);
1801 flto_out
= make_temp_file (".lto.o");
1802 obstack_ptr_grow (&argv_obstack
, "-o");
1803 obstack_ptr_grow (&argv_obstack
, flto_out
);
1807 const char *list_option
= "-fltrans-output-list=";
1809 /* -dumpbase argument for WPA. */
1810 char *dumpbase
= concat (dumppfx
, "wpa", NULL
);
1811 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1814 ltrans_output_file
= concat (dumppfx
, "ltrans.out", NULL
);
1816 ltrans_output_file
= make_temp_file (".ltrans.out");
1817 list_option_full
= concat (list_option
, ltrans_output_file
, NULL
);
1818 obstack_ptr_grow (&argv_obstack
, list_option_full
);
1823 fprintf (stderr
, "Using make jobserver\n");
1824 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1826 else if (auto_parallel
)
1829 init_num_threads ();
1830 if (nthreads_var
== 0)
1833 fprintf (stderr
, "LTO parallelism level set to %ld\n",
1835 sprintf (buf
, "-fwpa=%ld", nthreads_var
);
1836 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1838 else if (parallel
> 1)
1841 sprintf (buf
, "-fwpa=%i", parallel
);
1842 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1845 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1848 /* Append input arguments. */
1849 for (i
= 0; i
< lto_argc
; ++i
)
1850 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1851 /* Append the input objects. */
1852 for (i
= 0; i
< ltoobj_argc
; ++i
)
1853 obstack_ptr_grow (&argv_obstack
, ltoobj_argv
[i
]);
1854 obstack_ptr_grow (&argv_obstack
, NULL
);
1856 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1857 argv_ptr
= &new_argv
[new_head_argc
];
1858 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true,
1861 /* Copy the early generated debug info from the objects to temporary
1862 files and append those to the partial link commandline. */
1864 early_debug_object_names
= NULL
;
1867 early_debug_object_names
= XCNEWVEC (const char *, ltoobj_argc
+ 1);
1868 num_deb_objs
= ltoobj_argc
;
1869 for (i
= 0; i
< ltoobj_argc
; ++i
)
1872 if ((tem
= debug_objcopy (ltoobj_argv
[i
], !linker_output_rel
)))
1874 early_debug_object_names
[i
] = tem
;
1880 if (lto_mode
== LTO_MODE_LTO
)
1882 printf ("%s\n", flto_out
);
1885 for (i
= 0; i
< ltoobj_argc
; ++i
)
1886 if (early_debug_object_names
[i
] != NULL
)
1887 printf ("%s\n", early_debug_object_names
[i
]);
1889 /* These now belong to collect2. */
1892 free (early_debug_object_names
);
1893 early_debug_object_names
= NULL
;
1897 FILE *stream
= fopen (ltrans_output_file
, "r");
1898 FILE *mstream
= NULL
;
1899 struct obstack env_obstack
;
1903 fatal_error (input_location
, "%<fopen%>: %s: %m", ltrans_output_file
);
1905 /* Parse the list of LTRANS inputs from the WPA stage. */
1906 obstack_init (&env_obstack
);
1910 const unsigned piece
= 32;
1911 char *output_name
= NULL
;
1912 char *buf
, *input_name
= (char *)xmalloc (piece
);
1916 if (fscanf (stream
, "%i\n", &priority
) != 1)
1919 fatal_error (input_location
,
1920 "corrupted ltrans output file %s",
1921 ltrans_output_file
);
1925 if (!fgets (buf
, piece
, stream
))
1927 len
= strlen (input_name
);
1928 if (input_name
[len
- 1] != '\n')
1930 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1931 buf
= input_name
+ len
;
1934 input_name
[len
- 1] = '\0';
1936 if (input_name
[0] == '*')
1937 output_name
= &input_name
[1];
1941 = (int *)xrealloc (ltrans_priorities
, nr
* sizeof (int) * 2);
1942 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1943 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1944 ltrans_priorities
[(nr
-1)*2] = priority
;
1945 ltrans_priorities
[(nr
-1)*2+1] = nr
-1;
1946 input_names
[nr
-1] = input_name
;
1947 output_names
[nr
-1] = output_name
;
1950 maybe_unlink (ltrans_output_file
);
1951 ltrans_output_file
= NULL
;
1955 if (jobserver_requested
&& jobserver_error
!= NULL
)
1957 warning (0, jobserver_error
);
1958 print_lto_docs_link ();
1960 else if (parallel
== 0)
1962 warning (0, "using serial compilation of %d LTRANS jobs", nr
);
1963 print_lto_docs_link ();
1969 makefile
= make_temp_file (".mk");
1970 mstream
= fopen (makefile
, "w");
1971 qsort (ltrans_priorities
, nr
, sizeof (int) * 2, cmp_priority
);
1974 /* Execute the LTRANS stage for each input file (or prepare a
1975 makefile to invoke this in parallel). */
1976 for (i
= 0; i
< nr
; ++i
)
1979 char *input_name
= input_names
[i
];
1980 /* If it's a pass-through file do nothing. */
1981 if (output_names
[i
])
1984 /* Replace the .o suffix with a .ltrans.o suffix and write
1985 the resulting name to the LTRANS output list. */
1986 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1987 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1988 output_name
= XOBFINISH (&env_obstack
, char *);
1990 /* Adjust the dumpbase if the linker output file was seen. */
1991 int dumpbase_len
= (strlen (dumppfx
)
1992 + sizeof (DUMPBASE_SUFFIX
)
1993 + sizeof (".ltrans"));
1994 char *dumpbase
= (char *) xmalloc (dumpbase_len
+ 1);
1995 snprintf (dumpbase
, dumpbase_len
, "%sltrans%u.ltrans", dumppfx
, i
);
1996 argv_ptr
[0] = dumpbase
;
1998 argv_ptr
[1] = "-fltrans";
2000 argv_ptr
[3] = output_name
;
2001 argv_ptr
[4] = input_name
;
2005 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
2006 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
2007 fprintf (mstream
, " '%s'", new_argv
[j
]);
2008 fprintf (mstream
, "\n");
2009 /* If we are not preserving the ltrans input files then
2010 truncate them as soon as we have processed it. This
2011 reduces temporary disk-space usage. */
2013 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
2014 "&& mv %s.tem %s\n",
2015 input_name
, input_name
, input_name
, input_name
);
2019 char argsuffix
[sizeof (DUMPBASE_SUFFIX
)
2020 + sizeof (".ltrans_args") + 1];
2022 snprintf (argsuffix
,
2023 sizeof (DUMPBASE_SUFFIX
) + sizeof (".ltrans_args"),
2024 "ltrans%u.ltrans_args", i
);
2025 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
2026 true, save_temps
? argsuffix
: NULL
);
2027 maybe_unlink (input_name
);
2030 output_names
[i
] = output_name
;
2034 struct pex_obj
*pex
;
2040 for (i
= 0; i
< nr
; ++i
)
2042 int j
= ltrans_priorities
[i
*2 + 1];
2043 fprintf (mstream
, " \\\n\t%s", output_names
[j
]);
2045 fprintf (mstream
, "\n");
2049 /* Avoid passing --jobserver-fd= and similar flags
2050 unless jobserver mode is explicitly enabled. */
2051 putenv (xstrdup ("MAKEFLAGS="));
2052 putenv (xstrdup ("MFLAGS="));
2055 char **make_argv
= buildargv (getenv ("MAKE"));
2058 for (unsigned argc
= 0; make_argv
[argc
]; argc
++)
2059 obstack_ptr_grow (&argv_obstack
, make_argv
[argc
]);
2062 obstack_ptr_grow (&argv_obstack
, "make");
2064 obstack_ptr_grow (&argv_obstack
, "-f");
2065 obstack_ptr_grow (&argv_obstack
, makefile
);
2068 snprintf (jobs
, 31, "-j%ld",
2069 auto_parallel
? nthreads_var
: parallel
);
2070 obstack_ptr_grow (&argv_obstack
, jobs
);
2072 obstack_ptr_grow (&argv_obstack
, "all");
2073 obstack_ptr_grow (&argv_obstack
, NULL
);
2074 new_argv
= XOBFINISH (&argv_obstack
, const char **);
2076 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
2077 NULL
, NULL
, PEX_SEARCH
, false, NULL
);
2078 do_wait (new_argv
[0], pex
);
2079 freeargv (make_argv
);
2080 maybe_unlink (makefile
);
2082 for (i
= 0; i
< nr
; ++i
)
2083 maybe_unlink (input_names
[i
]);
2085 for (i
= 0; i
< nr
; ++i
)
2087 fputs (output_names
[i
], stdout
);
2088 putc ('\n', stdout
);
2089 free (input_names
[i
]);
2093 for (i
= 0; i
< ltoobj_argc
; ++i
)
2094 if (early_debug_object_names
[i
] != NULL
)
2095 printf ("%s\n", early_debug_object_names
[i
]);
2098 free (ltrans_priorities
);
2099 free (output_names
);
2100 output_names
= NULL
;
2101 free (early_debug_object_names
);
2102 early_debug_object_names
= NULL
;
2104 free (list_option_full
);
2105 obstack_free (&env_obstack
, NULL
);
2110 obstack_free (&argv_obstack
, NULL
);
2117 main (int argc
, char *argv
[])
2121 init_opts_obstack ();
2123 p
= argv
[0] + strlen (argv
[0]);
2124 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
2128 xmalloc_set_program_name (progname
);
2130 gcc_init_libintl ();
2132 diagnostic_initialize (global_dc
, 0);
2134 if (atexit (lto_wrapper_cleanup
) != 0)
2135 fatal_error (input_location
, "%<atexit%> failed");
2139 /* We may be called with all the arguments stored in some file and
2140 passed with @file. Expand them into argv before processing. */
2141 expandargv (&argc
, &argv
);
2143 run_gcc (argc
, argv
);