1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2015 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"
52 /* Environment variable, used for passing the names of offload targets from GCC
53 driver to lto-wrapper. */
54 #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
57 LTO_MODE_NONE
, /* Not doing LTO. */
58 LTO_MODE_LTO
, /* Normal LTO. */
59 LTO_MODE_WHOPR
/* WHOPR. */
62 /* Current LTO mode. */
63 static enum lto_mode_d lto_mode
= LTO_MODE_NONE
;
65 static char *ltrans_output_file
;
66 static char *flto_out
;
67 static unsigned int nr
;
68 static char **input_names
;
69 static char **output_names
;
70 static char **offload_names
;
71 static const char *offloadbegin
, *offloadend
;
72 static char *makefile
;
74 const char tool_name
[] = "lto-wrapper";
76 /* Delete tempfiles. Called from utils_cleanup. */
83 if (ltrans_output_file
)
84 maybe_unlink (ltrans_output_file
);
86 maybe_unlink (flto_out
);
88 maybe_unlink (makefile
);
89 for (i
= 0; i
< nr
; ++i
)
91 maybe_unlink (input_names
[i
]);
93 maybe_unlink (output_names
[i
]);
98 lto_wrapper_cleanup (void)
100 utils_cleanup (false);
103 /* Unlink a temporary LTRANS file unless requested otherwise. */
106 maybe_unlink (const char *file
)
110 if (unlink_if_ordinary (file
)
112 fatal_error (input_location
, "deleting LTRANS file %s: %m", file
);
115 fprintf (stderr
, "[Leaving LTRANS %s]\n", file
);
118 /* Template of LTRANS dumpbase suffix. */
119 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
121 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
122 environment according to LANG_MASK. */
125 get_options_from_collect_gcc_options (const char *collect_gcc
,
126 const char *collect_gcc_options
,
127 unsigned int lang_mask
,
128 struct cl_decoded_option
**decoded_options
,
129 unsigned int *decoded_options_count
)
131 struct obstack argv_obstack
;
136 argv_storage
= xstrdup (collect_gcc_options
);
137 obstack_init (&argv_obstack
);
138 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
140 for (j
= 0, k
= 0; argv_storage
[j
] != '\0'; ++j
)
142 if (argv_storage
[j
] == '\'')
144 obstack_ptr_grow (&argv_obstack
, &argv_storage
[k
]);
148 if (argv_storage
[j
] == '\0')
149 fatal_error (input_location
, "malformed COLLECT_GCC_OPTIONS");
150 else if (strncmp (&argv_storage
[j
], "'\\''", 4) == 0)
152 argv_storage
[k
++] = '\'';
155 else if (argv_storage
[j
] == '\'')
158 argv_storage
[k
++] = argv_storage
[j
++];
161 argv_storage
[k
++] = '\0';
165 obstack_ptr_grow (&argv_obstack
, NULL
);
166 argc
= obstack_object_size (&argv_obstack
) / sizeof (void *) - 1;
167 argv
= XOBFINISH (&argv_obstack
, const char **);
169 decode_cmdline_options_to_array (argc
, (const char **)argv
,
171 decoded_options
, decoded_options_count
);
172 obstack_free (&argv_obstack
, NULL
);
175 /* Append OPTION to the options array DECODED_OPTIONS with size
176 DECODED_OPTIONS_COUNT. */
179 append_option (struct cl_decoded_option
**decoded_options
,
180 unsigned int *decoded_options_count
,
181 struct cl_decoded_option
*option
)
183 ++*decoded_options_count
;
185 = (struct cl_decoded_option
*)
186 xrealloc (*decoded_options
,
187 (*decoded_options_count
188 * sizeof (struct cl_decoded_option
)));
189 memcpy (&(*decoded_options
)[*decoded_options_count
- 1], option
,
190 sizeof (struct cl_decoded_option
));
193 /* Try to merge and complain about options FDECODED_OPTIONS when applied
194 ontop of DECODED_OPTIONS. */
197 merge_and_complain (struct cl_decoded_option
**decoded_options
,
198 unsigned int *decoded_options_count
,
199 struct cl_decoded_option
*fdecoded_options
,
200 unsigned int fdecoded_options_count
)
204 /* ??? Merge options from files. Most cases can be
205 handled by either unioning or intersecting
206 (for example -fwrapv is a case for unioning,
207 -ffast-math is for intersection). Most complaints
208 about real conflicts between different options can
209 be deferred to the compiler proper. Options that
210 we can neither safely handle by intersection nor
211 unioning would need to be complained about here.
212 Ideally we'd have a flag in the opt files that
213 tells whether to union or intersect or reject.
214 In absence of that it's unclear what a good default is.
215 It's also difficult to get positional handling correct. */
217 /* The following does what the old LTO option code did,
218 union all target and a selected set of common options. */
219 for (i
= 0; i
< fdecoded_options_count
; ++i
)
221 struct cl_decoded_option
*foption
= &fdecoded_options
[i
];
222 switch (foption
->opt_index
)
224 case OPT_SPECIAL_unknown
:
225 case OPT_SPECIAL_ignore
:
226 case OPT_SPECIAL_program_name
:
227 case OPT_SPECIAL_input_file
:
231 if (!(cl_options
[foption
->opt_index
].flags
& CL_TARGET
))
240 case OPT_fexceptions
:
241 case OPT_fnon_call_exceptions
:
243 /* Do what the old LTO code did - collect exactly one option
244 setting per OPT code, we pick the first we encounter.
245 ??? This doesn't make too much sense, but when it doesn't
246 then we should complain. */
247 for (j
= 0; j
< *decoded_options_count
; ++j
)
248 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
250 if (j
== *decoded_options_count
)
251 append_option (decoded_options
, decoded_options_count
, foption
);
255 case OPT_fstrict_overflow
:
256 case OPT_ffp_contract_
:
257 /* For selected options we can merge conservatively. */
258 for (j
= 0; j
< *decoded_options_count
; ++j
)
259 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
261 if (j
== *decoded_options_count
)
262 append_option (decoded_options
, decoded_options_count
, foption
);
263 /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST,
264 -fno-trapv < -ftrapv,
265 -fno-strict-overflow < -fstrict-overflow */
266 else if (foption
->value
< (*decoded_options
)[j
].value
)
267 (*decoded_options
)[j
] = *foption
;
270 case OPT_fmath_errno
:
271 case OPT_fsigned_zeros
:
272 case OPT_ftrapping_math
:
276 case OPT_fcheck_pointer_bounds
:
277 /* For selected options we can merge conservatively. */
278 for (j
= 0; j
< *decoded_options_count
; ++j
)
279 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
281 if (j
== *decoded_options_count
)
282 append_option (decoded_options
, decoded_options_count
, foption
);
283 /* -fmath-errno > -fno-math-errno,
284 -fsigned-zeros > -fno-signed-zeros,
285 -ftrapping-math -> -fno-trapping-math,
286 -fwrapv > -fno-wrapv. */
287 else if (foption
->value
> (*decoded_options
)[j
].value
)
288 (*decoded_options
)[j
] = *foption
;
291 case OPT_freg_struct_return
:
292 case OPT_fpcc_struct_return
:
293 case OPT_fshort_double
:
294 for (j
= 0; j
< *decoded_options_count
; ++j
)
295 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
297 if (j
== *decoded_options_count
)
298 fatal_error (input_location
,
299 "Option %s not used consistently in all LTO input"
300 " files", foption
->orig_option_with_args_text
);
303 case OPT_foffload_abi_
:
304 for (j
= 0; j
< *decoded_options_count
; ++j
)
305 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
307 if (j
== *decoded_options_count
)
308 append_option (decoded_options
, decoded_options_count
, foption
);
309 else if (foption
->value
!= (*decoded_options
)[j
].value
)
310 fatal_error (input_location
,
311 "Option %s not used consistently in all LTO input"
312 " files", foption
->orig_option_with_args_text
);
319 for (j
= 0; j
< *decoded_options_count
; ++j
)
320 if ((*decoded_options
)[j
].opt_index
== OPT_O
321 || (*decoded_options
)[j
].opt_index
== OPT_Ofast
322 || (*decoded_options
)[j
].opt_index
== OPT_Og
323 || (*decoded_options
)[j
].opt_index
== OPT_Os
)
325 if (j
== *decoded_options_count
)
326 append_option (decoded_options
, decoded_options_count
, foption
);
327 else if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
328 && foption
->opt_index
!= OPT_O
)
329 /* Exact same options get merged. */
333 /* For mismatched option kinds preserve the optimization
334 level only, thus merge it as -On. This also handles
335 merging of same optimization level -On. */
337 switch (foption
->opt_index
)
340 if (foption
->arg
[0] == '\0')
341 level
= MAX (level
, 1);
343 level
= MAX (level
, atoi (foption
->arg
));
346 level
= MAX (level
, 3);
349 level
= MAX (level
, 1);
352 level
= MAX (level
, 2);
357 switch ((*decoded_options
)[j
].opt_index
)
360 if ((*decoded_options
)[j
].arg
[0] == '\0')
361 level
= MAX (level
, 1);
363 level
= MAX (level
, atoi ((*decoded_options
)[j
].arg
));
366 level
= MAX (level
, 3);
369 level
= MAX (level
, 1);
372 level
= MAX (level
, 2);
377 (*decoded_options
)[j
].opt_index
= OPT_O
;
379 tem
= xasprintf ("-O%d", level
);
380 (*decoded_options
)[j
].arg
= &tem
[2];
381 (*decoded_options
)[j
].canonical_option
[0] = tem
;
382 (*decoded_options
)[j
].value
= 1;
387 append_option (decoded_options
, decoded_options_count
, foption
);
393 /* Auxiliary function that frees elements of PTR and PTR itself.
394 N is number of elements to be freed. If PTR is NULL, nothing is freed.
395 If an element is NULL, subsequent elements are not freed. */
398 free_array_of_ptrs (void **ptr
, unsigned n
)
402 for (unsigned i
= 0; i
< n
; i
++)
412 /* Parse STR, saving found tokens into PVALUES and return their number.
413 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
414 append it to every token we find. */
417 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
419 const char *curval
, *nextval
;
423 curval
= strchr (str
, ':');
427 curval
= strchr (curval
+ 1, ':');
430 values
= (char**) xmalloc (num
* sizeof (char*));
432 nextval
= strchr (curval
, ':');
434 nextval
= strchr (curval
, '\0');
436 int append_len
= append
? strlen (append
) : 0;
437 for (i
= 0; i
< num
; i
++)
439 int l
= nextval
- curval
;
440 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
441 memcpy (values
[i
], curval
, l
);
444 strcat (values
[i
], append
);
445 curval
= nextval
+ 1;
446 nextval
= strchr (curval
, ':');
448 nextval
= strchr (curval
, '\0');
454 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
457 append_compiler_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
460 /* Append compiler driver arguments as far as they were merged. */
461 for (unsigned int j
= 1; j
< count
; ++j
)
463 struct cl_decoded_option
*option
= &opts
[j
];
465 /* File options have been properly filtered by lto-opts.c. */
466 switch (option
->opt_index
)
468 /* Drop arguments that we want to take from the link line. */
471 case OPT_flto_partition_
:
478 /* For now do what the original LTO option code was doing - pass
479 on any CL_TARGET flag and a few selected others. */
480 switch (option
->opt_index
)
487 case OPT_fexceptions
:
488 case OPT_fnon_call_exceptions
:
490 case OPT_freg_struct_return
:
491 case OPT_fpcc_struct_return
:
492 case OPT_fshort_double
:
493 case OPT_ffp_contract_
:
494 case OPT_fmath_errno
:
495 case OPT_fsigned_zeros
:
496 case OPT_ftrapping_math
:
501 case OPT_fstrict_overflow
:
502 case OPT_foffload_abi_
:
507 case OPT_fcheck_pointer_bounds
:
511 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
515 /* Pass the option on. */
516 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
517 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
521 /* Append linker options OPTS to ARGV_OBSTACK. */
524 append_linker_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
527 /* Append linker driver arguments. Compiler options from the linker
528 driver arguments will override / merge with those from the compiler. */
529 for (unsigned int j
= 1; j
< count
; ++j
)
531 struct cl_decoded_option
*option
= &opts
[j
];
533 /* Do not pass on frontend specific flags not suitable for lto. */
534 if (!(cl_options
[option
->opt_index
].flags
535 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
538 switch (option
->opt_index
)
543 /* We've handled these LTO options, do not pass them on. */
546 case OPT_freg_struct_return
:
547 case OPT_fpcc_struct_return
:
548 case OPT_fshort_double
:
549 /* Ignore these, they are determined by the input files.
550 ??? We fail to diagnose a possible mismatch here. */
557 /* Pass the option on. */
558 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
559 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
563 /* Extract options for TARGET offload compiler from OPTIONS and append
564 them to ARGV_OBSTACK. */
567 append_offload_options (obstack
*argv_obstack
, const char *target
,
568 struct cl_decoded_option
*options
,
569 unsigned int options_count
)
571 for (unsigned i
= 0; i
< options_count
; i
++)
573 const char *cur
, *next
, *opts
;
576 struct cl_decoded_option
*option
= &options
[i
];
578 if (option
->opt_index
!= OPT_foffload_
)
581 /* If option argument starts with '-' then no target is specified. That
582 means offload options are specified for all targets, so we need to
584 if (option
->arg
[0] == '-')
588 opts
= strchr (option
->arg
, '=');
596 next
= strchr (cur
, ',');
599 next
= (next
> opts
) ? opts
: next
;
601 if (strlen (target
) == (size_t) (next
- cur
)
602 && strncmp (target
, cur
, next
- cur
) == 0)
614 argv
= buildargv (opts
);
615 for (argc
= 0; argv
[argc
]; argc
++)
616 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
620 /* Check whether NAME can be accessed in MODE. This is like access,
621 except that it never considers directories to be executable. */
624 access_check (const char *name
, int mode
)
630 if (stat (name
, &st
) < 0
631 || S_ISDIR (st
.st_mode
))
635 return access (name
, mode
);
638 /* Prepare a target image for offload TARGET, using mkoffload tool from
639 COMPILER_PATH. Return the name of the resultant object file. */
642 compile_offload_image (const char *target
, const char *compiler_path
,
643 unsigned in_argc
, char *in_argv
[],
644 struct cl_decoded_option
*compiler_opts
,
645 unsigned int compiler_opt_count
,
646 struct cl_decoded_option
*linker_opts
,
647 unsigned int linker_opt_count
)
649 char *filename
= NULL
;
652 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
653 strcpy (suffix
, "/accel/");
654 strcat (suffix
, target
);
655 strcat (suffix
, "/mkoffload");
658 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
660 const char *compiler
= NULL
;
661 for (unsigned i
= 0; i
< n_paths
; i
++)
662 if (access_check (paths
[i
], X_OK
) == 0)
670 /* Generate temporary output file name. */
671 filename
= make_temp_file (".target.o");
673 struct obstack argv_obstack
;
674 obstack_init (&argv_obstack
);
675 obstack_ptr_grow (&argv_obstack
, compiler
);
676 obstack_ptr_grow (&argv_obstack
, "-o");
677 obstack_ptr_grow (&argv_obstack
, filename
);
679 /* Append names of input object files. */
680 for (unsigned i
= 0; i
< in_argc
; i
++)
681 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
683 /* Append options from offload_lto sections. */
684 append_compiler_options (&argv_obstack
, compiler_opts
,
687 /* Append options specified by -foffload last. In case of conflicting
688 options we expect offload compiler to choose the latest. */
689 append_offload_options (&argv_obstack
, target
, compiler_opts
,
691 append_offload_options (&argv_obstack
, target
, linker_opts
,
694 obstack_ptr_grow (&argv_obstack
, NULL
);
695 argv
= XOBFINISH (&argv_obstack
, char **);
696 fork_execute (argv
[0], argv
, true);
697 obstack_free (&argv_obstack
, NULL
);
700 free_array_of_ptrs ((void **) paths
, n_paths
);
705 /* The main routine dealing with offloading.
706 The routine builds a target image for each offload target. IN_ARGC and
707 IN_ARGV specify options and input object files. As all of them could contain
708 target sections, we pass them all to target compilers. */
711 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
712 struct cl_decoded_option
*compiler_opts
,
713 unsigned int compiler_opt_count
,
714 struct cl_decoded_option
*linker_opts
,
715 unsigned int linker_opt_count
)
718 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
721 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
723 const char *compiler_path
= getenv ("COMPILER_PATH");
727 /* Prepare an image for each target and save the name of the resultant object
728 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
729 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
730 for (unsigned i
= 0; i
< num_targets
; i
++)
733 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
734 compiler_opts
, compiler_opt_count
,
735 linker_opts
, linker_opt_count
);
736 if (!offload_names
[i
])
737 fatal_error (input_location
,
738 "problem with building target image for %s\n", names
[i
]);
742 free_array_of_ptrs ((void **) names
, num_targets
);
745 /* Copy a file from SRC to DEST. */
748 copy_file (const char *dest
, const char *src
)
750 FILE *d
= fopen (dest
, "wb");
751 FILE *s
= fopen (src
, "rb");
755 size_t len
= fread (buffer
, 1, 512, s
);
757 fatal_error (input_location
, "reading input file");
760 fwrite (buffer
, 1, len
, d
);
762 fatal_error (input_location
, "writing output file");
767 /* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make
768 copies and store the names of the copies in offloadbegin and offloadend. */
771 find_offloadbeginend (void)
774 const char *library_path
= getenv ("LIBRARY_PATH");
777 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadbegin.o");
780 for (i
= 0; i
< n_paths
; i
++)
781 if (access_check (paths
[i
], R_OK
) == 0)
783 size_t len
= strlen (paths
[i
]);
784 char *tmp
= xstrdup (paths
[i
]);
785 strcpy (paths
[i
] + len
- strlen ("begin.o"), "end.o");
786 if (access_check (paths
[i
], R_OK
) != 0)
787 fatal_error (input_location
,
788 "installation error, can't find crtoffloadend.o");
789 /* The linker will delete the filenames we give it, so make
791 offloadbegin
= make_temp_file (".o");
792 offloadend
= make_temp_file (".o");
793 copy_file (offloadbegin
, tmp
);
794 copy_file (offloadend
, paths
[i
]);
799 fatal_error (input_location
,
800 "installation error, can't find crtoffloadbegin.o");
802 free_array_of_ptrs ((void **) paths
, n_paths
);
805 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
806 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
807 and OPT_COUNT. Return true if we found a matchingn section, false
808 otherwise. COLLECT_GCC holds the value of the environment variable with
812 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
813 struct cl_decoded_option
**opts
,
814 unsigned int *opt_count
, const char *collect_gcc
)
816 off_t offset
, length
;
821 struct cl_decoded_option
*fdecoded_options
= *opts
;
822 unsigned int fdecoded_options_count
= *opt_count
;
824 simple_object_read
*sobj
;
825 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
830 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
831 strcpy (secname
, prefix
);
832 strcat (secname
, ".opts");
833 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
836 simple_object_release_read (sobj
);
840 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
841 data
= (char *)xmalloc (length
);
842 read (fd
, data
, length
);
846 struct cl_decoded_option
*f2decoded_options
;
847 unsigned int f2decoded_options_count
;
848 get_options_from_collect_gcc_options (collect_gcc
,
851 &f2decoded_options_count
);
852 if (!fdecoded_options
)
854 fdecoded_options
= f2decoded_options
;
855 fdecoded_options_count
= f2decoded_options_count
;
858 merge_and_complain (&fdecoded_options
,
859 &fdecoded_options_count
,
860 f2decoded_options
, f2decoded_options_count
);
862 fopts
+= strlen (fopts
) + 1;
864 while (fopts
- data
< length
);
867 simple_object_release_read (sobj
);
868 *opts
= fdecoded_options
;
869 *opt_count
= fdecoded_options_count
;
873 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
876 run_gcc (unsigned argc
, char *argv
[])
879 const char **new_argv
;
880 const char **argv_ptr
;
881 char *list_option_full
= NULL
;
882 const char *linker_output
= NULL
;
883 const char *collect_gcc
, *collect_gcc_options
;
886 bool no_partition
= false;
887 struct cl_decoded_option
*fdecoded_options
= NULL
;
888 struct cl_decoded_option
*offload_fdecoded_options
= NULL
;
889 unsigned int fdecoded_options_count
= 0;
890 unsigned int offload_fdecoded_options_count
= 0;
891 struct cl_decoded_option
*decoded_options
;
892 unsigned int decoded_options_count
;
893 struct obstack argv_obstack
;
895 bool have_lto
= false;
896 bool have_offload
= false;
897 unsigned lto_argc
= 0, offload_argc
= 0;
898 char **lto_argv
, **offload_argv
;
900 /* Get the driver and options. */
901 collect_gcc
= getenv ("COLLECT_GCC");
903 fatal_error (input_location
,
904 "environment variable COLLECT_GCC must be set");
905 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
906 if (!collect_gcc_options
)
907 fatal_error (input_location
,
908 "environment variable COLLECT_GCC_OPTIONS must be set");
909 get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
,
912 &decoded_options_count
);
914 /* Allocate arrays for input object files with LTO or offload IL,
915 and for possible preceding arguments. */
916 lto_argv
= XNEWVEC (char *, argc
);
917 offload_argv
= XNEWVEC (char *, argc
);
919 /* Look at saved options in the IL files. */
920 for (i
= 1; i
< argc
; ++i
)
924 off_t file_offset
= 0;
927 char *filename
= argv
[i
];
929 if ((p
= strrchr (argv
[i
], '@'))
931 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
932 && strlen (p
) == (unsigned int) consumed
)
934 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
935 memcpy (filename
, argv
[i
], p
- argv
[i
]);
936 filename
[p
- argv
[i
]] = '\0';
937 file_offset
= (off_t
) loffset
;
939 fd
= open (filename
, O_RDONLY
| O_BINARY
);
942 lto_argv
[lto_argc
++] = argv
[i
];
946 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
947 &fdecoded_options
, &fdecoded_options_count
,
951 lto_argv
[lto_argc
++] = argv
[i
];
954 if (find_and_merge_options (fd
, file_offset
, OFFLOAD_SECTION_NAME_PREFIX
,
955 &offload_fdecoded_options
,
956 &offload_fdecoded_options_count
, collect_gcc
))
959 offload_argv
[offload_argc
++] = argv
[i
];
965 /* Initalize the common arguments for the driver. */
966 obstack_init (&argv_obstack
);
967 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
968 obstack_ptr_grow (&argv_obstack
, "-xlto");
969 obstack_ptr_grow (&argv_obstack
, "-c");
971 append_compiler_options (&argv_obstack
, fdecoded_options
,
972 fdecoded_options_count
);
973 append_linker_options (&argv_obstack
, decoded_options
, decoded_options_count
);
975 /* Scan linker driver arguments for things that are of relevance to us. */
976 for (j
= 1; j
< decoded_options_count
; ++j
)
978 struct cl_decoded_option
*option
= &decoded_options
[j
];
979 switch (option
->opt_index
)
982 linker_output
= option
->arg
;
993 case OPT_flto_partition_
:
994 if (strcmp (option
->arg
, "none") == 0)
999 if (strcmp (option
->arg
, "jobserver") == 0)
1006 parallel
= atoi (option
->arg
);
1013 lto_mode
= LTO_MODE_WHOPR
;
1023 lto_mode
= LTO_MODE_LTO
;
1030 char *output_dir
, *base
, *name
;
1031 bool bit_bucket
= strcmp (linker_output
, HOST_BIT_BUCKET
) == 0;
1033 output_dir
= xstrdup (linker_output
);
1035 for (name
= base
; *name
; name
++)
1036 if (IS_DIR_SEPARATOR (*name
))
1040 linker_output
= &linker_output
[base
- output_dir
];
1041 if (*output_dir
== '\0')
1043 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1044 output_dir
= current_dir
;
1048 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1049 obstack_ptr_grow (&argv_obstack
, output_dir
);
1052 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1055 /* Remember at which point we can scrub args to re-use the commons. */
1056 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1060 compile_images_for_offload_targets (offload_argc
, offload_argv
,
1061 offload_fdecoded_options
,
1062 offload_fdecoded_options_count
,
1064 decoded_options_count
);
1067 find_offloadbeginend ();
1068 for (i
= 0; offload_names
[i
]; i
++)
1069 printf ("%s\n", offload_names
[i
]);
1070 free_array_of_ptrs ((void **) offload_names
, i
);
1075 printf ("%s\n", offloadbegin
);
1077 /* If object files contain offload sections, but do not contain LTO sections,
1078 then there is no need to perform a link-time recompilation, i.e.
1079 lto-wrapper is used only for a compilation of offload images. */
1080 if (have_offload
&& !have_lto
)
1082 for (i
= 1; i
< argc
; ++i
)
1083 if (strncmp (argv
[i
], "-fresolution=", sizeof ("-fresolution=") - 1))
1086 /* Can be ".o" or ".so". */
1087 char *ext
= strrchr (argv
[i
], '.');
1089 out_file
= make_temp_file ("");
1091 out_file
= make_temp_file (ext
);
1092 /* The linker will delete the files we give it, so make copies. */
1093 copy_file (out_file
, argv
[i
]);
1094 printf ("%s\n", out_file
);
1099 if (lto_mode
== LTO_MODE_LTO
)
1101 flto_out
= make_temp_file (".lto.o");
1103 obstack_ptr_grow (&argv_obstack
, linker_output
);
1104 obstack_ptr_grow (&argv_obstack
, "-o");
1105 obstack_ptr_grow (&argv_obstack
, flto_out
);
1109 const char *list_option
= "-fltrans-output-list=";
1110 size_t list_option_len
= strlen (list_option
);
1115 char *dumpbase
= (char *) xmalloc (strlen (linker_output
)
1116 + sizeof (".wpa") + 1);
1117 strcpy (dumpbase
, linker_output
);
1118 strcat (dumpbase
, ".wpa");
1119 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1122 if (linker_output
&& save_temps
)
1124 ltrans_output_file
= (char *) xmalloc (strlen (linker_output
)
1125 + sizeof (".ltrans.out") + 1);
1126 strcpy (ltrans_output_file
, linker_output
);
1127 strcat (ltrans_output_file
, ".ltrans.out");
1130 ltrans_output_file
= make_temp_file (".ltrans.out");
1131 list_option_full
= (char *) xmalloc (sizeof (char) *
1132 (strlen (ltrans_output_file
) + list_option_len
+ 1));
1133 tmp
= list_option_full
;
1135 obstack_ptr_grow (&argv_obstack
, tmp
);
1136 strcpy (tmp
, list_option
);
1137 tmp
+= list_option_len
;
1138 strcpy (tmp
, ltrans_output_file
);
1141 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1142 else if (parallel
> 1)
1145 sprintf (buf
, "-fwpa=%i", parallel
);
1146 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1149 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1152 /* Append the input objects and possible preceding arguments. */
1153 for (i
= 0; i
< lto_argc
; ++i
)
1154 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1155 obstack_ptr_grow (&argv_obstack
, NULL
);
1157 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1158 argv_ptr
= &new_argv
[new_head_argc
];
1159 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true);
1161 if (lto_mode
== LTO_MODE_LTO
)
1163 printf ("%s\n", flto_out
);
1169 FILE *stream
= fopen (ltrans_output_file
, "r");
1170 FILE *mstream
= NULL
;
1171 struct obstack env_obstack
;
1174 fatal_error (input_location
, "fopen: %s: %m", ltrans_output_file
);
1176 /* Parse the list of LTRANS inputs from the WPA stage. */
1177 obstack_init (&env_obstack
);
1181 const unsigned piece
= 32;
1182 char *output_name
= NULL
;
1183 char *buf
, *input_name
= (char *)xmalloc (piece
);
1188 if (!fgets (buf
, piece
, stream
))
1190 len
= strlen (input_name
);
1191 if (input_name
[len
- 1] != '\n')
1193 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1194 buf
= input_name
+ len
;
1197 input_name
[len
- 1] = '\0';
1199 if (input_name
[0] == '*')
1200 output_name
= &input_name
[1];
1203 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1204 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1205 input_names
[nr
-1] = input_name
;
1206 output_names
[nr
-1] = output_name
;
1209 maybe_unlink (ltrans_output_file
);
1210 ltrans_output_file
= NULL
;
1214 makefile
= make_temp_file (".mk");
1215 mstream
= fopen (makefile
, "w");
1218 /* Execute the LTRANS stage for each input file (or prepare a
1219 makefile to invoke this in parallel). */
1220 for (i
= 0; i
< nr
; ++i
)
1223 char *input_name
= input_names
[i
];
1224 /* If it's a pass-through file do nothing. */
1225 if (output_names
[i
])
1228 /* Replace the .o suffix with a .ltrans.o suffix and write
1229 the resulting name to the LTRANS output list. */
1230 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1231 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1232 output_name
= XOBFINISH (&env_obstack
, char *);
1234 /* Adjust the dumpbase if the linker output file was seen. */
1238 = (char *) xmalloc (strlen (linker_output
)
1239 + sizeof (DUMPBASE_SUFFIX
) + 1);
1241 strlen (linker_output
) + sizeof (DUMPBASE_SUFFIX
),
1242 "%s.ltrans%u", linker_output
, i
);
1243 argv_ptr
[0] = dumpbase
;
1246 argv_ptr
[1] = "-fltrans";
1248 argv_ptr
[3] = output_name
;
1249 argv_ptr
[4] = input_name
;
1253 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
1254 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
1255 fprintf (mstream
, " '%s'", new_argv
[j
]);
1256 fprintf (mstream
, "\n");
1257 /* If we are not preserving the ltrans input files then
1258 truncate them as soon as we have processed it. This
1259 reduces temporary disk-space usage. */
1261 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1262 "&& mv %s.tem %s\n",
1263 input_name
, input_name
, input_name
, input_name
);
1267 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1269 maybe_unlink (input_name
);
1272 output_names
[i
] = output_name
;
1276 struct pex_obj
*pex
;
1279 fprintf (mstream
, "all:");
1280 for (i
= 0; i
< nr
; ++i
)
1281 fprintf (mstream
, " \\\n\t%s", output_names
[i
]);
1282 fprintf (mstream
, "\n");
1286 /* Avoid passing --jobserver-fd= and similar flags
1287 unless jobserver mode is explicitly enabled. */
1288 putenv (xstrdup ("MAKEFLAGS="));
1289 putenv (xstrdup ("MFLAGS="));
1291 new_argv
[0] = getenv ("MAKE");
1293 new_argv
[0] = "make";
1295 new_argv
[2] = makefile
;
1299 snprintf (jobs
, 31, "-j%d", parallel
);
1300 new_argv
[i
++] = jobs
;
1302 new_argv
[i
++] = "all";
1303 new_argv
[i
++] = NULL
;
1304 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1305 NULL
, NULL
, PEX_SEARCH
, false);
1306 do_wait (new_argv
[0], pex
);
1307 maybe_unlink (makefile
);
1309 for (i
= 0; i
< nr
; ++i
)
1310 maybe_unlink (input_names
[i
]);
1312 for (i
= 0; i
< nr
; ++i
)
1314 fputs (output_names
[i
], stdout
);
1315 putc ('\n', stdout
);
1316 free (input_names
[i
]);
1319 free (output_names
);
1321 free (list_option_full
);
1322 obstack_free (&env_obstack
, NULL
);
1327 printf ("%s\n", offloadend
);
1330 XDELETE (offload_argv
);
1331 obstack_free (&argv_obstack
, NULL
);
1338 main (int argc
, char *argv
[])
1342 gcc_obstack_init (&opts_obstack
);
1344 p
= argv
[0] + strlen (argv
[0]);
1345 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1349 xmalloc_set_program_name (progname
);
1351 gcc_init_libintl ();
1353 diagnostic_initialize (global_dc
, 0);
1355 if (atexit (lto_wrapper_cleanup
) != 0)
1356 fatal_error (input_location
, "atexit failed");
1358 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1359 signal (SIGINT
, fatal_signal
);
1361 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1362 signal (SIGHUP
, fatal_signal
);
1364 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
1365 signal (SIGTERM
, fatal_signal
);
1367 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
1368 signal (SIGPIPE
, fatal_signal
);
1371 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1372 receive the signal. A different setting is inheritable */
1373 signal (SIGCHLD
, SIG_DFL
);
1376 /* We may be called with all the arguments stored in some file and
1377 passed with @file. Expand them into argv before processing. */
1378 expandargv (&argc
, &argv
);
1380 run_gcc (argc
, argv
);