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 /* For selected options we can merge conservatively. */
277 for (j
= 0; j
< *decoded_options_count
; ++j
)
278 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
280 if (j
== *decoded_options_count
)
281 append_option (decoded_options
, decoded_options_count
, foption
);
282 /* -fmath-errno > -fno-math-errno,
283 -fsigned-zeros > -fno-signed-zeros,
284 -ftrapping-math -> -fno-trapping-math,
285 -fwrapv > -fno-wrapv. */
286 else if (foption
->value
> (*decoded_options
)[j
].value
)
287 (*decoded_options
)[j
] = *foption
;
290 case OPT_freg_struct_return
:
291 case OPT_fpcc_struct_return
:
292 case OPT_fshort_double
:
293 for (j
= 0; j
< *decoded_options_count
; ++j
)
294 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
296 if (j
== *decoded_options_count
)
297 fatal_error (input_location
,
298 "Option %s not used consistently in all LTO input"
299 " files", foption
->orig_option_with_args_text
);
302 case OPT_foffload_abi_
:
303 for (j
= 0; j
< *decoded_options_count
; ++j
)
304 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
306 if (j
== *decoded_options_count
)
307 append_option (decoded_options
, decoded_options_count
, foption
);
308 else if (foption
->value
!= (*decoded_options
)[j
].value
)
309 fatal_error (input_location
,
310 "Option %s not used consistently in all LTO input"
311 " files", foption
->orig_option_with_args_text
);
318 for (j
= 0; j
< *decoded_options_count
; ++j
)
319 if ((*decoded_options
)[j
].opt_index
== OPT_O
320 || (*decoded_options
)[j
].opt_index
== OPT_Ofast
321 || (*decoded_options
)[j
].opt_index
== OPT_Og
322 || (*decoded_options
)[j
].opt_index
== OPT_Os
)
324 if (j
== *decoded_options_count
)
325 append_option (decoded_options
, decoded_options_count
, foption
);
326 else if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
327 && foption
->opt_index
!= OPT_O
)
328 /* Exact same options get merged. */
332 /* For mismatched option kinds preserve the optimization
333 level only, thus merge it as -On. This also handles
334 merging of same optimization level -On. */
336 switch (foption
->opt_index
)
339 if (foption
->arg
[0] == '\0')
340 level
= MAX (level
, 1);
342 level
= MAX (level
, atoi (foption
->arg
));
345 level
= MAX (level
, 3);
348 level
= MAX (level
, 1);
351 level
= MAX (level
, 2);
356 switch ((*decoded_options
)[j
].opt_index
)
359 if ((*decoded_options
)[j
].arg
[0] == '\0')
360 level
= MAX (level
, 1);
362 level
= MAX (level
, atoi ((*decoded_options
)[j
].arg
));
365 level
= MAX (level
, 3);
368 level
= MAX (level
, 1);
371 level
= MAX (level
, 2);
376 (*decoded_options
)[j
].opt_index
= OPT_O
;
378 tem
= xasprintf ("-O%d", level
);
379 (*decoded_options
)[j
].arg
= &tem
[2];
380 (*decoded_options
)[j
].canonical_option
[0] = tem
;
381 (*decoded_options
)[j
].value
= 1;
386 append_option (decoded_options
, decoded_options_count
, foption
);
392 /* Auxiliary function that frees elements of PTR and PTR itself.
393 N is number of elements to be freed. If PTR is NULL, nothing is freed.
394 If an element is NULL, subsequent elements are not freed. */
397 free_array_of_ptrs (void **ptr
, unsigned n
)
401 for (unsigned i
= 0; i
< n
; i
++)
411 /* Parse STR, saving found tokens into PVALUES and return their number.
412 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
413 append it to every token we find. */
416 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
418 const char *curval
, *nextval
;
422 curval
= strchr (str
, ':');
426 curval
= strchr (curval
+ 1, ':');
429 values
= (char**) xmalloc (num
* sizeof (char*));
431 nextval
= strchr (curval
, ':');
433 nextval
= strchr (curval
, '\0');
435 int append_len
= append
? strlen (append
) : 0;
436 for (i
= 0; i
< num
; i
++)
438 int l
= nextval
- curval
;
439 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
440 memcpy (values
[i
], curval
, l
);
443 strcat (values
[i
], append
);
444 curval
= nextval
+ 1;
445 nextval
= strchr (curval
, ':');
447 nextval
= strchr (curval
, '\0');
453 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
456 append_compiler_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
459 /* Append compiler driver arguments as far as they were merged. */
460 for (unsigned int j
= 1; j
< count
; ++j
)
462 struct cl_decoded_option
*option
= &opts
[j
];
464 /* File options have been properly filtered by lto-opts.c. */
465 switch (option
->opt_index
)
467 /* Drop arguments that we want to take from the link line. */
470 case OPT_flto_partition_
:
477 /* For now do what the original LTO option code was doing - pass
478 on any CL_TARGET flag and a few selected others. */
479 switch (option
->opt_index
)
486 case OPT_fexceptions
:
487 case OPT_fnon_call_exceptions
:
489 case OPT_freg_struct_return
:
490 case OPT_fpcc_struct_return
:
491 case OPT_fshort_double
:
492 case OPT_ffp_contract_
:
493 case OPT_fmath_errno
:
494 case OPT_fsigned_zeros
:
495 case OPT_ftrapping_math
:
500 case OPT_fstrict_overflow
:
501 case OPT_foffload_abi_
:
509 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
513 /* Pass the option on. */
514 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
515 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
519 /* Append linker options OPTS to ARGV_OBSTACK. */
522 append_linker_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
525 /* Append linker driver arguments. Compiler options from the linker
526 driver arguments will override / merge with those from the compiler. */
527 for (unsigned int j
= 1; j
< count
; ++j
)
529 struct cl_decoded_option
*option
= &opts
[j
];
531 /* Do not pass on frontend specific flags not suitable for lto. */
532 if (!(cl_options
[option
->opt_index
].flags
533 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
536 switch (option
->opt_index
)
541 /* We've handled these LTO options, do not pass them on. */
544 case OPT_freg_struct_return
:
545 case OPT_fpcc_struct_return
:
546 case OPT_fshort_double
:
547 /* Ignore these, they are determined by the input files.
548 ??? We fail to diagnose a possible mismatch here. */
555 /* Pass the option on. */
556 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
557 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
561 /* Extract options for TARGET offload compiler from OPTIONS and append
562 them to ARGV_OBSTACK. */
565 append_offload_options (obstack
*argv_obstack
, const char *target
,
566 struct cl_decoded_option
*options
,
567 unsigned int options_count
)
569 for (unsigned i
= 0; i
< options_count
; i
++)
571 const char *cur
, *next
, *opts
;
574 struct cl_decoded_option
*option
= &options
[i
];
576 if (option
->opt_index
!= OPT_foffload_
)
579 /* If option argument starts with '-' then no target is specified. That
580 means offload options are specified for all targets, so we need to
582 if (option
->arg
[0] == '-')
586 opts
= strchr (option
->arg
, '=');
594 next
= strchr (cur
, ',');
597 next
= (next
> opts
) ? opts
: next
;
599 if (strlen (target
) == (size_t) (next
- cur
)
600 && strncmp (target
, cur
, next
- cur
) == 0)
612 argv
= buildargv (opts
);
613 for (argc
= 0; argv
[argc
]; argc
++)
614 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
618 /* Check whether NAME can be accessed in MODE. This is like access,
619 except that it never considers directories to be executable. */
622 access_check (const char *name
, int mode
)
628 if (stat (name
, &st
) < 0
629 || S_ISDIR (st
.st_mode
))
633 return access (name
, mode
);
636 /* Prepare a target image for offload TARGET, using mkoffload tool from
637 COMPILER_PATH. Return the name of the resultant object file. */
640 compile_offload_image (const char *target
, const char *compiler_path
,
641 unsigned in_argc
, char *in_argv
[],
642 struct cl_decoded_option
*compiler_opts
,
643 unsigned int compiler_opt_count
,
644 struct cl_decoded_option
*linker_opts
,
645 unsigned int linker_opt_count
)
647 char *filename
= NULL
;
650 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
651 strcpy (suffix
, "/accel/");
652 strcat (suffix
, target
);
653 strcat (suffix
, "/mkoffload");
656 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
658 const char *compiler
= NULL
;
659 for (unsigned i
= 0; i
< n_paths
; i
++)
660 if (access_check (paths
[i
], X_OK
) == 0)
668 /* Generate temporary output file name. */
669 filename
= make_temp_file (".target.o");
671 struct obstack argv_obstack
;
672 obstack_init (&argv_obstack
);
673 obstack_ptr_grow (&argv_obstack
, compiler
);
674 obstack_ptr_grow (&argv_obstack
, "-o");
675 obstack_ptr_grow (&argv_obstack
, filename
);
677 /* Append names of input object files. */
678 for (unsigned i
= 0; i
< in_argc
; i
++)
679 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
681 /* Append options from offload_lto sections. */
682 append_compiler_options (&argv_obstack
, compiler_opts
,
685 /* Append options specified by -foffload last. In case of conflicting
686 options we expect offload compiler to choose the latest. */
687 append_offload_options (&argv_obstack
, target
, compiler_opts
,
689 append_offload_options (&argv_obstack
, target
, linker_opts
,
692 obstack_ptr_grow (&argv_obstack
, NULL
);
693 argv
= XOBFINISH (&argv_obstack
, char **);
694 fork_execute (argv
[0], argv
, true);
695 obstack_free (&argv_obstack
, NULL
);
698 free_array_of_ptrs ((void **) paths
, n_paths
);
703 /* The main routine dealing with offloading.
704 The routine builds a target image for each offload target. IN_ARGC and
705 IN_ARGV specify options and input object files. As all of them could contain
706 target sections, we pass them all to target compilers. */
709 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
710 struct cl_decoded_option
*compiler_opts
,
711 unsigned int compiler_opt_count
,
712 struct cl_decoded_option
*linker_opts
,
713 unsigned int linker_opt_count
)
716 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
719 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
721 const char *compiler_path
= getenv ("COMPILER_PATH");
725 /* Prepare an image for each target and save the name of the resultant object
726 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
727 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
728 for (unsigned i
= 0; i
< num_targets
; i
++)
731 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
732 compiler_opts
, compiler_opt_count
,
733 linker_opts
, linker_opt_count
);
734 if (!offload_names
[i
])
735 fatal_error (input_location
,
736 "problem with building target image for %s\n", names
[i
]);
740 free_array_of_ptrs ((void **) names
, num_targets
);
743 /* Copy a file from SRC to DEST. */
746 copy_file (const char *dest
, const char *src
)
748 FILE *d
= fopen (dest
, "wb");
749 FILE *s
= fopen (src
, "rb");
753 size_t len
= fread (buffer
, 1, 512, s
);
755 fatal_error (input_location
, "reading input file");
758 fwrite (buffer
, 1, len
, d
);
760 fatal_error (input_location
, "writing output file");
765 /* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make
766 copies and store the names of the copies in offloadbegin and offloadend. */
769 find_offloadbeginend (void)
772 const char *library_path
= getenv ("LIBRARY_PATH");
775 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadbegin.o");
778 for (i
= 0; i
< n_paths
; i
++)
779 if (access_check (paths
[i
], R_OK
) == 0)
781 size_t len
= strlen (paths
[i
]);
782 char *tmp
= xstrdup (paths
[i
]);
783 strcpy (paths
[i
] + len
- strlen ("begin.o"), "end.o");
784 if (access_check (paths
[i
], R_OK
) != 0)
785 fatal_error (input_location
,
786 "installation error, can't find crtoffloadend.o");
787 /* The linker will delete the filenames we give it, so make
789 offloadbegin
= make_temp_file (".o");
790 offloadend
= make_temp_file (".o");
791 copy_file (offloadbegin
, tmp
);
792 copy_file (offloadend
, paths
[i
]);
797 fatal_error (input_location
,
798 "installation error, can't find crtoffloadbegin.o");
800 free_array_of_ptrs ((void **) paths
, n_paths
);
803 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
804 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
805 and OPT_COUNT. Return true if we found a matchingn section, false
806 otherwise. COLLECT_GCC holds the value of the environment variable with
810 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
811 struct cl_decoded_option
**opts
,
812 unsigned int *opt_count
, const char *collect_gcc
)
814 off_t offset
, length
;
819 struct cl_decoded_option
*fdecoded_options
= *opts
;
820 unsigned int fdecoded_options_count
= *opt_count
;
822 simple_object_read
*sobj
;
823 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
828 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
829 strcpy (secname
, prefix
);
830 strcat (secname
, ".opts");
831 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
834 simple_object_release_read (sobj
);
838 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
839 data
= (char *)xmalloc (length
);
840 read (fd
, data
, length
);
844 struct cl_decoded_option
*f2decoded_options
;
845 unsigned int f2decoded_options_count
;
846 get_options_from_collect_gcc_options (collect_gcc
,
849 &f2decoded_options_count
);
850 if (!fdecoded_options
)
852 fdecoded_options
= f2decoded_options
;
853 fdecoded_options_count
= f2decoded_options_count
;
856 merge_and_complain (&fdecoded_options
,
857 &fdecoded_options_count
,
858 f2decoded_options
, f2decoded_options_count
);
860 fopts
+= strlen (fopts
) + 1;
862 while (fopts
- data
< length
);
865 simple_object_release_read (sobj
);
866 *opts
= fdecoded_options
;
867 *opt_count
= fdecoded_options_count
;
871 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
874 run_gcc (unsigned argc
, char *argv
[])
877 const char **new_argv
;
878 const char **argv_ptr
;
879 char *list_option_full
= NULL
;
880 const char *linker_output
= NULL
;
881 const char *collect_gcc
, *collect_gcc_options
;
884 bool no_partition
= false;
885 struct cl_decoded_option
*fdecoded_options
= NULL
;
886 struct cl_decoded_option
*offload_fdecoded_options
= NULL
;
887 unsigned int fdecoded_options_count
= 0;
888 unsigned int offload_fdecoded_options_count
= 0;
889 struct cl_decoded_option
*decoded_options
;
890 unsigned int decoded_options_count
;
891 struct obstack argv_obstack
;
893 bool have_lto
= false;
894 bool have_offload
= false;
895 unsigned lto_argc
= 0, offload_argc
= 0;
896 char **lto_argv
, **offload_argv
;
898 /* Get the driver and options. */
899 collect_gcc
= getenv ("COLLECT_GCC");
901 fatal_error (input_location
,
902 "environment variable COLLECT_GCC must be set");
903 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
904 if (!collect_gcc_options
)
905 fatal_error (input_location
,
906 "environment variable COLLECT_GCC_OPTIONS must be set");
907 get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
,
910 &decoded_options_count
);
912 /* Allocate arrays for input object files with LTO or offload IL,
913 and for possible preceding arguments. */
914 lto_argv
= XNEWVEC (char *, argc
);
915 offload_argv
= XNEWVEC (char *, argc
);
917 /* Look at saved options in the IL files. */
918 for (i
= 1; i
< argc
; ++i
)
922 off_t file_offset
= 0;
925 char *filename
= argv
[i
];
927 if ((p
= strrchr (argv
[i
], '@'))
929 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
930 && strlen (p
) == (unsigned int) consumed
)
932 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
933 memcpy (filename
, argv
[i
], p
- argv
[i
]);
934 filename
[p
- argv
[i
]] = '\0';
935 file_offset
= (off_t
) loffset
;
937 fd
= open (argv
[i
], O_RDONLY
);
940 lto_argv
[lto_argc
++] = argv
[i
];
944 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
945 &fdecoded_options
, &fdecoded_options_count
,
949 lto_argv
[lto_argc
++] = argv
[i
];
952 if (find_and_merge_options (fd
, file_offset
, OFFLOAD_SECTION_NAME_PREFIX
,
953 &offload_fdecoded_options
,
954 &offload_fdecoded_options_count
, collect_gcc
))
957 offload_argv
[offload_argc
++] = argv
[i
];
963 /* Initalize the common arguments for the driver. */
964 obstack_init (&argv_obstack
);
965 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
966 obstack_ptr_grow (&argv_obstack
, "-xlto");
967 obstack_ptr_grow (&argv_obstack
, "-c");
969 append_compiler_options (&argv_obstack
, fdecoded_options
,
970 fdecoded_options_count
);
971 append_linker_options (&argv_obstack
, decoded_options
, decoded_options_count
);
973 /* Scan linker driver arguments for things that are of relevance to us. */
974 for (j
= 1; j
< decoded_options_count
; ++j
)
976 struct cl_decoded_option
*option
= &decoded_options
[j
];
977 switch (option
->opt_index
)
980 linker_output
= option
->arg
;
991 case OPT_flto_partition_
:
992 if (strcmp (option
->arg
, "none") == 0)
997 if (strcmp (option
->arg
, "jobserver") == 0)
1004 parallel
= atoi (option
->arg
);
1011 lto_mode
= LTO_MODE_WHOPR
;
1021 lto_mode
= LTO_MODE_LTO
;
1028 char *output_dir
, *base
, *name
;
1029 bool bit_bucket
= strcmp (linker_output
, HOST_BIT_BUCKET
) == 0;
1031 output_dir
= xstrdup (linker_output
);
1033 for (name
= base
; *name
; name
++)
1034 if (IS_DIR_SEPARATOR (*name
))
1038 linker_output
= &linker_output
[base
- output_dir
];
1039 if (*output_dir
== '\0')
1041 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1042 output_dir
= current_dir
;
1046 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1047 obstack_ptr_grow (&argv_obstack
, output_dir
);
1050 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1053 /* Remember at which point we can scrub args to re-use the commons. */
1054 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1058 compile_images_for_offload_targets (offload_argc
, offload_argv
,
1059 offload_fdecoded_options
,
1060 offload_fdecoded_options_count
,
1062 decoded_options_count
);
1065 find_offloadbeginend ();
1066 for (i
= 0; offload_names
[i
]; i
++)
1067 printf ("%s\n", offload_names
[i
]);
1068 free_array_of_ptrs ((void **) offload_names
, i
);
1073 printf ("%s\n", offloadbegin
);
1075 /* If object files contain offload sections, but do not contain LTO sections,
1076 then there is no need to perform a link-time recompilation, i.e.
1077 lto-wrapper is used only for a compilation of offload images. */
1078 if (have_offload
&& !have_lto
)
1080 for (i
= 1; i
< argc
; ++i
)
1081 if (strncmp (argv
[i
], "-fresolution=", sizeof ("-fresolution=") - 1))
1084 /* Can be ".o" or ".so". */
1085 char *ext
= strrchr (argv
[i
], '.');
1087 out_file
= make_temp_file ("");
1089 out_file
= make_temp_file (ext
);
1090 /* The linker will delete the files we give it, so make copies. */
1091 copy_file (out_file
, argv
[i
]);
1092 printf ("%s\n", out_file
);
1097 if (lto_mode
== LTO_MODE_LTO
)
1099 flto_out
= make_temp_file (".lto.o");
1101 obstack_ptr_grow (&argv_obstack
, linker_output
);
1102 obstack_ptr_grow (&argv_obstack
, "-o");
1103 obstack_ptr_grow (&argv_obstack
, flto_out
);
1107 const char *list_option
= "-fltrans-output-list=";
1108 size_t list_option_len
= strlen (list_option
);
1113 char *dumpbase
= (char *) xmalloc (strlen (linker_output
)
1114 + sizeof (".wpa") + 1);
1115 strcpy (dumpbase
, linker_output
);
1116 strcat (dumpbase
, ".wpa");
1117 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1120 if (linker_output
&& save_temps
)
1122 ltrans_output_file
= (char *) xmalloc (strlen (linker_output
)
1123 + sizeof (".ltrans.out") + 1);
1124 strcpy (ltrans_output_file
, linker_output
);
1125 strcat (ltrans_output_file
, ".ltrans.out");
1128 ltrans_output_file
= make_temp_file (".ltrans.out");
1129 list_option_full
= (char *) xmalloc (sizeof (char) *
1130 (strlen (ltrans_output_file
) + list_option_len
+ 1));
1131 tmp
= list_option_full
;
1133 obstack_ptr_grow (&argv_obstack
, tmp
);
1134 strcpy (tmp
, list_option
);
1135 tmp
+= list_option_len
;
1136 strcpy (tmp
, ltrans_output_file
);
1139 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1140 else if (parallel
> 1)
1143 sprintf (buf
, "-fwpa=%i", parallel
);
1144 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1147 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1150 /* Append the input objects and possible preceding arguments. */
1151 for (i
= 0; i
< lto_argc
; ++i
)
1152 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1153 obstack_ptr_grow (&argv_obstack
, NULL
);
1155 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1156 argv_ptr
= &new_argv
[new_head_argc
];
1157 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true);
1159 if (lto_mode
== LTO_MODE_LTO
)
1161 printf ("%s\n", flto_out
);
1167 FILE *stream
= fopen (ltrans_output_file
, "r");
1168 FILE *mstream
= NULL
;
1169 struct obstack env_obstack
;
1172 fatal_error (input_location
, "fopen: %s: %m", ltrans_output_file
);
1174 /* Parse the list of LTRANS inputs from the WPA stage. */
1175 obstack_init (&env_obstack
);
1179 const unsigned piece
= 32;
1180 char *output_name
= NULL
;
1181 char *buf
, *input_name
= (char *)xmalloc (piece
);
1186 if (!fgets (buf
, piece
, stream
))
1188 len
= strlen (input_name
);
1189 if (input_name
[len
- 1] != '\n')
1191 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1192 buf
= input_name
+ len
;
1195 input_name
[len
- 1] = '\0';
1197 if (input_name
[0] == '*')
1198 output_name
= &input_name
[1];
1201 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1202 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1203 input_names
[nr
-1] = input_name
;
1204 output_names
[nr
-1] = output_name
;
1207 maybe_unlink (ltrans_output_file
);
1208 ltrans_output_file
= NULL
;
1212 makefile
= make_temp_file (".mk");
1213 mstream
= fopen (makefile
, "w");
1216 /* Execute the LTRANS stage for each input file (or prepare a
1217 makefile to invoke this in parallel). */
1218 for (i
= 0; i
< nr
; ++i
)
1221 char *input_name
= input_names
[i
];
1222 /* If it's a pass-through file do nothing. */
1223 if (output_names
[i
])
1226 /* Replace the .o suffix with a .ltrans.o suffix and write
1227 the resulting name to the LTRANS output list. */
1228 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1229 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1230 output_name
= XOBFINISH (&env_obstack
, char *);
1232 /* Adjust the dumpbase if the linker output file was seen. */
1236 = (char *) xmalloc (strlen (linker_output
)
1237 + sizeof (DUMPBASE_SUFFIX
) + 1);
1239 strlen (linker_output
) + sizeof (DUMPBASE_SUFFIX
),
1240 "%s.ltrans%u", linker_output
, i
);
1241 argv_ptr
[0] = dumpbase
;
1244 argv_ptr
[1] = "-fltrans";
1246 argv_ptr
[3] = output_name
;
1247 argv_ptr
[4] = input_name
;
1251 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
1252 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
1253 fprintf (mstream
, " '%s'", new_argv
[j
]);
1254 fprintf (mstream
, "\n");
1255 /* If we are not preserving the ltrans input files then
1256 truncate them as soon as we have processed it. This
1257 reduces temporary disk-space usage. */
1259 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1260 "&& mv %s.tem %s\n",
1261 input_name
, input_name
, input_name
, input_name
);
1265 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1267 maybe_unlink (input_name
);
1270 output_names
[i
] = output_name
;
1274 struct pex_obj
*pex
;
1277 fprintf (mstream
, "all:");
1278 for (i
= 0; i
< nr
; ++i
)
1279 fprintf (mstream
, " \\\n\t%s", output_names
[i
]);
1280 fprintf (mstream
, "\n");
1284 /* Avoid passing --jobserver-fd= and similar flags
1285 unless jobserver mode is explicitly enabled. */
1286 putenv (xstrdup ("MAKEFLAGS="));
1287 putenv (xstrdup ("MFLAGS="));
1289 new_argv
[0] = getenv ("MAKE");
1291 new_argv
[0] = "make";
1293 new_argv
[2] = makefile
;
1297 snprintf (jobs
, 31, "-j%d", parallel
);
1298 new_argv
[i
++] = jobs
;
1300 new_argv
[i
++] = "all";
1301 new_argv
[i
++] = NULL
;
1302 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1303 NULL
, NULL
, PEX_SEARCH
, false);
1304 do_wait (new_argv
[0], pex
);
1305 maybe_unlink (makefile
);
1307 for (i
= 0; i
< nr
; ++i
)
1308 maybe_unlink (input_names
[i
]);
1310 for (i
= 0; i
< nr
; ++i
)
1312 fputs (output_names
[i
], stdout
);
1313 putc ('\n', stdout
);
1314 free (input_names
[i
]);
1317 free (output_names
);
1319 free (list_option_full
);
1320 obstack_free (&env_obstack
, NULL
);
1325 printf ("%s\n", offloadend
);
1328 XDELETE (offload_argv
);
1329 obstack_free (&argv_obstack
, NULL
);
1336 main (int argc
, char *argv
[])
1340 gcc_obstack_init (&opts_obstack
);
1342 p
= argv
[0] + strlen (argv
[0]);
1343 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1347 xmalloc_set_program_name (progname
);
1349 gcc_init_libintl ();
1351 diagnostic_initialize (global_dc
, 0);
1353 if (atexit (lto_wrapper_cleanup
) != 0)
1354 fatal_error (input_location
, "atexit failed");
1356 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1357 signal (SIGINT
, fatal_signal
);
1359 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1360 signal (SIGHUP
, fatal_signal
);
1362 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
1363 signal (SIGTERM
, fatal_signal
);
1365 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
1366 signal (SIGPIPE
, fatal_signal
);
1369 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1370 receive the signal. A different setting is inheritable */
1371 signal (SIGCHLD
, SIG_DFL
);
1374 /* We may be called with all the arguments stored in some file and
1375 passed with @file. Expand them into argv before processing. */
1376 expandargv (&argc
, &argv
);
1378 run_gcc (argc
, argv
);