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 ("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 ("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
:
274 /* For selected options we can merge conservatively. */
275 for (j
= 0; j
< *decoded_options_count
; ++j
)
276 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
278 if (j
== *decoded_options_count
)
279 append_option (decoded_options
, decoded_options_count
, foption
);
280 /* -fmath-errno > -fno-math-errno,
281 -fsigned-zeros > -fno-signed-zeros,
282 -ftrapping-math -> -fno-trapping-math,
283 -fwrapv > -fno-wrapv. */
284 else if (foption
->value
> (*decoded_options
)[j
].value
)
285 (*decoded_options
)[j
] = *foption
;
288 case OPT_freg_struct_return
:
289 case OPT_fpcc_struct_return
:
290 case OPT_fshort_double
:
291 for (j
= 0; j
< *decoded_options_count
; ++j
)
292 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
294 if (j
== *decoded_options_count
)
295 fatal_error ("Option %s not used consistently in all LTO input"
296 " files", foption
->orig_option_with_args_text
);
299 case OPT_foffload_abi_
:
300 for (j
= 0; j
< *decoded_options_count
; ++j
)
301 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
303 if (j
== *decoded_options_count
)
304 append_option (decoded_options
, decoded_options_count
, foption
);
305 else if (foption
->value
!= (*decoded_options
)[j
].value
)
306 fatal_error ("Option %s not used consistently in all LTO input"
307 " files", foption
->orig_option_with_args_text
);
314 for (j
= 0; j
< *decoded_options_count
; ++j
)
315 if ((*decoded_options
)[j
].opt_index
== OPT_O
316 || (*decoded_options
)[j
].opt_index
== OPT_Ofast
317 || (*decoded_options
)[j
].opt_index
== OPT_Og
318 || (*decoded_options
)[j
].opt_index
== OPT_Os
)
320 if (j
== *decoded_options_count
)
321 append_option (decoded_options
, decoded_options_count
, foption
);
322 else if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
323 && foption
->opt_index
!= OPT_O
)
324 /* Exact same options get merged. */
328 /* For mismatched option kinds preserve the optimization
329 level only, thus merge it as -On. This also handles
330 merging of same optimization level -On. */
332 switch (foption
->opt_index
)
335 if (foption
->arg
[0] == '\0')
336 level
= MAX (level
, 1);
338 level
= MAX (level
, atoi (foption
->arg
));
341 level
= MAX (level
, 3);
344 level
= MAX (level
, 1);
347 level
= MAX (level
, 2);
352 switch ((*decoded_options
)[j
].opt_index
)
355 if ((*decoded_options
)[j
].arg
[0] == '\0')
356 level
= MAX (level
, 1);
358 level
= MAX (level
, atoi ((*decoded_options
)[j
].arg
));
361 level
= MAX (level
, 3);
364 level
= MAX (level
, 1);
367 level
= MAX (level
, 2);
372 (*decoded_options
)[j
].opt_index
= OPT_O
;
374 tem
= xasprintf ("-O%d", level
);
375 (*decoded_options
)[j
].arg
= &tem
[2];
376 (*decoded_options
)[j
].canonical_option
[0] = tem
;
377 (*decoded_options
)[j
].value
= 1;
382 append_option (decoded_options
, decoded_options_count
, foption
);
388 /* Auxiliary function that frees elements of PTR and PTR itself.
389 N is number of elements to be freed. If PTR is NULL, nothing is freed.
390 If an element is NULL, subsequent elements are not freed. */
393 free_array_of_ptrs (void **ptr
, unsigned n
)
397 for (unsigned i
= 0; i
< n
; i
++)
407 /* Parse STR, saving found tokens into PVALUES and return their number.
408 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
409 append it to every token we find. */
412 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
414 const char *curval
, *nextval
;
418 curval
= strchr (str
, ':');
422 curval
= strchr (curval
+ 1, ':');
425 values
= (char**) xmalloc (num
* sizeof (char*));
427 nextval
= strchr (curval
, ':');
429 nextval
= strchr (curval
, '\0');
431 int append_len
= append
? strlen (append
) : 0;
432 for (i
= 0; i
< num
; i
++)
434 int l
= nextval
- curval
;
435 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
436 memcpy (values
[i
], curval
, l
);
439 strcat (values
[i
], append
);
440 curval
= nextval
+ 1;
441 nextval
= strchr (curval
, ':');
443 nextval
= strchr (curval
, '\0');
449 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
452 append_compiler_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
455 /* Append compiler driver arguments as far as they were merged. */
456 for (unsigned int j
= 1; j
< count
; ++j
)
458 struct cl_decoded_option
*option
= &opts
[j
];
460 /* File options have been properly filtered by lto-opts.c. */
461 switch (option
->opt_index
)
463 /* Drop arguments that we want to take from the link line. */
466 case OPT_flto_partition_
:
473 /* For now do what the original LTO option code was doing - pass
474 on any CL_TARGET flag and a few selected others. */
475 switch (option
->opt_index
)
482 case OPT_fexceptions
:
483 case OPT_fnon_call_exceptions
:
485 case OPT_freg_struct_return
:
486 case OPT_fpcc_struct_return
:
487 case OPT_fshort_double
:
488 case OPT_ffp_contract_
:
489 case OPT_fmath_errno
:
490 case OPT_fsigned_zeros
:
491 case OPT_ftrapping_math
:
494 case OPT_fstrict_overflow
:
495 case OPT_foffload_abi_
:
503 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
507 /* Pass the option on. */
508 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
509 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
513 /* Append linker options OPTS to ARGV_OBSTACK. */
516 append_linker_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
519 /* Append linker driver arguments. Compiler options from the linker
520 driver arguments will override / merge with those from the compiler. */
521 for (unsigned int j
= 1; j
< count
; ++j
)
523 struct cl_decoded_option
*option
= &opts
[j
];
525 /* Do not pass on frontend specific flags not suitable for lto. */
526 if (!(cl_options
[option
->opt_index
].flags
527 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
530 switch (option
->opt_index
)
535 /* We've handled these LTO options, do not pass them on. */
538 case OPT_freg_struct_return
:
539 case OPT_fpcc_struct_return
:
540 case OPT_fshort_double
:
541 /* Ignore these, they are determined by the input files.
542 ??? We fail to diagnose a possible mismatch here. */
549 /* Pass the option on. */
550 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
551 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
555 /* Extract options for TARGET offload compiler from OPTIONS and append
556 them to ARGV_OBSTACK. */
559 append_offload_options (obstack
*argv_obstack
, const char *target
,
560 struct cl_decoded_option
*options
,
561 unsigned int options_count
)
563 for (unsigned i
= 0; i
< options_count
; i
++)
565 const char *cur
, *next
, *opts
;
568 struct cl_decoded_option
*option
= &options
[i
];
570 if (option
->opt_index
!= OPT_foffload_
)
573 /* If option argument starts with '-' then no target is specified. That
574 means offload options are specified for all targets, so we need to
576 if (option
->arg
[0] == '-')
580 opts
= strchr (option
->arg
, '=');
588 next
= strchr (cur
, ',');
591 next
= (next
> opts
) ? opts
: next
;
593 if (strlen (target
) == (size_t) (next
- cur
)
594 && strncmp (target
, cur
, next
- cur
) == 0)
606 argv
= buildargv (opts
);
607 for (argc
= 0; argv
[argc
]; argc
++)
608 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
612 /* Check whether NAME can be accessed in MODE. This is like access,
613 except that it never considers directories to be executable. */
616 access_check (const char *name
, int mode
)
622 if (stat (name
, &st
) < 0
623 || S_ISDIR (st
.st_mode
))
627 return access (name
, mode
);
630 /* Prepare a target image for offload TARGET, using mkoffload tool from
631 COMPILER_PATH. Return the name of the resultant object file. */
634 compile_offload_image (const char *target
, const char *compiler_path
,
635 unsigned in_argc
, char *in_argv
[],
636 struct cl_decoded_option
*compiler_opts
,
637 unsigned int compiler_opt_count
,
638 struct cl_decoded_option
*linker_opts
,
639 unsigned int linker_opt_count
)
641 char *filename
= NULL
;
644 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
645 strcpy (suffix
, "/accel/");
646 strcat (suffix
, target
);
647 strcat (suffix
, "/mkoffload");
650 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
652 const char *compiler
= NULL
;
653 for (unsigned i
= 0; i
< n_paths
; i
++)
654 if (access_check (paths
[i
], X_OK
) == 0)
662 /* Generate temporary output file name. */
663 filename
= make_temp_file (".target.o");
665 struct obstack argv_obstack
;
666 obstack_init (&argv_obstack
);
667 obstack_ptr_grow (&argv_obstack
, compiler
);
668 obstack_ptr_grow (&argv_obstack
, "-o");
669 obstack_ptr_grow (&argv_obstack
, filename
);
671 /* Append names of input object files. */
672 for (unsigned i
= 0; i
< in_argc
; i
++)
673 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
675 /* Append options from offload_lto sections. */
676 append_compiler_options (&argv_obstack
, compiler_opts
,
679 /* Append options specified by -foffload last. In case of conflicting
680 options we expect offload compiler to choose the latest. */
681 append_offload_options (&argv_obstack
, target
, compiler_opts
,
683 append_offload_options (&argv_obstack
, target
, linker_opts
,
686 obstack_ptr_grow (&argv_obstack
, NULL
);
687 argv
= XOBFINISH (&argv_obstack
, char **);
688 fork_execute (argv
[0], argv
, true);
689 obstack_free (&argv_obstack
, NULL
);
692 free_array_of_ptrs ((void **) paths
, n_paths
);
697 /* The main routine dealing with offloading.
698 The routine builds a target image for each offload target. IN_ARGC and
699 IN_ARGV specify options and input object files. As all of them could contain
700 target sections, we pass them all to target compilers. */
703 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
704 struct cl_decoded_option
*compiler_opts
,
705 unsigned int compiler_opt_count
,
706 struct cl_decoded_option
*linker_opts
,
707 unsigned int linker_opt_count
)
710 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
713 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
715 const char *compiler_path
= getenv ("COMPILER_PATH");
719 /* Prepare an image for each target and save the name of the resultant object
720 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
721 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
722 for (unsigned i
= 0; i
< num_targets
; i
++)
725 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
726 compiler_opts
, compiler_opt_count
,
727 linker_opts
, linker_opt_count
);
728 if (!offload_names
[i
])
729 fatal_error ("problem with building target image for %s\n", names
[i
]);
733 free_array_of_ptrs ((void **) names
, num_targets
);
736 /* Copy a file from SRC to DEST. */
739 copy_file (const char *dest
, const char *src
)
741 FILE *d
= fopen (dest
, "wb");
742 FILE *s
= fopen (src
, "rb");
746 size_t len
= fread (buffer
, 1, 512, s
);
748 fatal_error ("reading input file");
751 fwrite (buffer
, 1, len
, d
);
753 fatal_error ("writing output file");
758 /* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make
759 copies and store the names of the copies in offloadbegin and offloadend. */
762 find_offloadbeginend (void)
765 const char *library_path
= getenv ("LIBRARY_PATH");
768 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadbegin.o");
771 for (i
= 0; i
< n_paths
; i
++)
772 if (access_check (paths
[i
], R_OK
) == 0)
774 size_t len
= strlen (paths
[i
]);
775 char *tmp
= xstrdup (paths
[i
]);
776 strcpy (paths
[i
] + len
- strlen ("begin.o"), "end.o");
777 if (access_check (paths
[i
], R_OK
) != 0)
778 fatal_error ("installation error, can't find crtoffloadend.o");
779 /* The linker will delete the filenames we give it, so make
781 offloadbegin
= make_temp_file (".o");
782 offloadend
= make_temp_file (".o");
783 copy_file (offloadbegin
, tmp
);
784 copy_file (offloadend
, paths
[i
]);
789 fatal_error ("installation error, can't find crtoffloadbegin.o");
791 free_array_of_ptrs ((void **) paths
, n_paths
);
794 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
795 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
796 and OPT_COUNT. Return true if we found a matchingn section, false
797 otherwise. COLLECT_GCC holds the value of the environment variable with
801 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
802 struct cl_decoded_option
**opts
,
803 unsigned int *opt_count
, const char *collect_gcc
)
805 off_t offset
, length
;
810 struct cl_decoded_option
*fdecoded_options
= *opts
;
811 unsigned int fdecoded_options_count
= *opt_count
;
813 simple_object_read
*sobj
;
814 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
819 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
820 strcpy (secname
, prefix
);
821 strcat (secname
, ".opts");
822 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
825 simple_object_release_read (sobj
);
829 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
830 data
= (char *)xmalloc (length
);
831 read (fd
, data
, length
);
835 struct cl_decoded_option
*f2decoded_options
;
836 unsigned int f2decoded_options_count
;
837 get_options_from_collect_gcc_options (collect_gcc
,
840 &f2decoded_options_count
);
841 if (!fdecoded_options
)
843 fdecoded_options
= f2decoded_options
;
844 fdecoded_options_count
= f2decoded_options_count
;
847 merge_and_complain (&fdecoded_options
,
848 &fdecoded_options_count
,
849 f2decoded_options
, f2decoded_options_count
);
851 fopts
+= strlen (fopts
) + 1;
853 while (fopts
- data
< length
);
856 simple_object_release_read (sobj
);
857 *opts
= fdecoded_options
;
858 *opt_count
= fdecoded_options_count
;
862 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
865 run_gcc (unsigned argc
, char *argv
[])
868 const char **new_argv
;
869 const char **argv_ptr
;
870 char *list_option_full
= NULL
;
871 const char *linker_output
= NULL
;
872 const char *collect_gcc
, *collect_gcc_options
;
875 bool no_partition
= false;
876 struct cl_decoded_option
*fdecoded_options
= NULL
;
877 struct cl_decoded_option
*offload_fdecoded_options
= NULL
;
878 unsigned int fdecoded_options_count
= 0;
879 unsigned int offload_fdecoded_options_count
= 0;
880 struct cl_decoded_option
*decoded_options
;
881 unsigned int decoded_options_count
;
882 struct obstack argv_obstack
;
884 bool have_lto
= false;
885 bool have_offload
= false;
886 unsigned lto_argc
= 0, offload_argc
= 0;
887 char **lto_argv
, **offload_argv
;
889 /* Get the driver and options. */
890 collect_gcc
= getenv ("COLLECT_GCC");
892 fatal_error ("environment variable COLLECT_GCC must be set");
893 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
894 if (!collect_gcc_options
)
895 fatal_error ("environment variable COLLECT_GCC_OPTIONS must be set");
896 get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
,
899 &decoded_options_count
);
901 /* Allocate arrays for input object files with LTO or offload IL,
902 and for possible preceding arguments. */
903 lto_argv
= XNEWVEC (char *, argc
);
904 offload_argv
= XNEWVEC (char *, argc
);
906 /* Look at saved options in the IL files. */
907 for (i
= 1; i
< argc
; ++i
)
911 off_t file_offset
= 0;
914 char *filename
= argv
[i
];
916 if ((p
= strrchr (argv
[i
], '@'))
918 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
919 && strlen (p
) == (unsigned int) consumed
)
921 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
922 memcpy (filename
, argv
[i
], p
- argv
[i
]);
923 filename
[p
- argv
[i
]] = '\0';
924 file_offset
= (off_t
) loffset
;
926 fd
= open (argv
[i
], O_RDONLY
);
929 lto_argv
[lto_argc
++] = argv
[i
];
933 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
934 &fdecoded_options
, &fdecoded_options_count
,
938 lto_argv
[lto_argc
++] = argv
[i
];
941 if (find_and_merge_options (fd
, file_offset
, OFFLOAD_SECTION_NAME_PREFIX
,
942 &offload_fdecoded_options
,
943 &offload_fdecoded_options_count
, collect_gcc
))
946 offload_argv
[offload_argc
++] = argv
[i
];
952 /* Initalize the common arguments for the driver. */
953 obstack_init (&argv_obstack
);
954 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
955 obstack_ptr_grow (&argv_obstack
, "-xlto");
956 obstack_ptr_grow (&argv_obstack
, "-c");
958 append_compiler_options (&argv_obstack
, fdecoded_options
,
959 fdecoded_options_count
);
960 append_linker_options (&argv_obstack
, decoded_options
, decoded_options_count
);
962 /* Scan linker driver arguments for things that are of relevance to us. */
963 for (j
= 1; j
< decoded_options_count
; ++j
)
965 struct cl_decoded_option
*option
= &decoded_options
[j
];
966 switch (option
->opt_index
)
969 linker_output
= option
->arg
;
980 case OPT_flto_partition_
:
981 if (strcmp (option
->arg
, "none") == 0)
986 if (strcmp (option
->arg
, "jobserver") == 0)
993 parallel
= atoi (option
->arg
);
1000 lto_mode
= LTO_MODE_WHOPR
;
1010 lto_mode
= LTO_MODE_LTO
;
1017 char *output_dir
, *base
, *name
;
1018 bool bit_bucket
= strcmp (linker_output
, HOST_BIT_BUCKET
) == 0;
1020 output_dir
= xstrdup (linker_output
);
1022 for (name
= base
; *name
; name
++)
1023 if (IS_DIR_SEPARATOR (*name
))
1027 linker_output
= &linker_output
[base
- output_dir
];
1028 if (*output_dir
== '\0')
1030 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1031 output_dir
= current_dir
;
1035 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1036 obstack_ptr_grow (&argv_obstack
, output_dir
);
1039 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1042 /* Remember at which point we can scrub args to re-use the commons. */
1043 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1047 compile_images_for_offload_targets (offload_argc
, offload_argv
,
1048 offload_fdecoded_options
,
1049 offload_fdecoded_options_count
,
1051 decoded_options_count
);
1054 find_offloadbeginend ();
1055 for (i
= 0; offload_names
[i
]; i
++)
1056 printf ("%s\n", offload_names
[i
]);
1057 free_array_of_ptrs ((void **) offload_names
, i
);
1062 printf ("%s\n", offloadbegin
);
1064 /* If object files contain offload sections, but do not contain LTO sections,
1065 then there is no need to perform a link-time recompilation, i.e.
1066 lto-wrapper is used only for a compilation of offload images. */
1067 if (have_offload
&& !have_lto
)
1069 for (i
= 1; i
< argc
; ++i
)
1070 if (strncmp (argv
[i
], "-fresolution=", sizeof ("-fresolution=") - 1))
1073 /* Can be ".o" or ".so". */
1074 char *ext
= strrchr (argv
[i
], '.');
1076 out_file
= make_temp_file ("");
1078 out_file
= make_temp_file (ext
);
1079 /* The linker will delete the files we give it, so make copies. */
1080 copy_file (out_file
, argv
[i
]);
1081 printf ("%s\n", out_file
);
1086 if (lto_mode
== LTO_MODE_LTO
)
1088 flto_out
= make_temp_file (".lto.o");
1090 obstack_ptr_grow (&argv_obstack
, linker_output
);
1091 obstack_ptr_grow (&argv_obstack
, "-o");
1092 obstack_ptr_grow (&argv_obstack
, flto_out
);
1096 const char *list_option
= "-fltrans-output-list=";
1097 size_t list_option_len
= strlen (list_option
);
1102 char *dumpbase
= (char *) xmalloc (strlen (linker_output
)
1103 + sizeof (".wpa") + 1);
1104 strcpy (dumpbase
, linker_output
);
1105 strcat (dumpbase
, ".wpa");
1106 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1109 if (linker_output
&& save_temps
)
1111 ltrans_output_file
= (char *) xmalloc (strlen (linker_output
)
1112 + sizeof (".ltrans.out") + 1);
1113 strcpy (ltrans_output_file
, linker_output
);
1114 strcat (ltrans_output_file
, ".ltrans.out");
1117 ltrans_output_file
= make_temp_file (".ltrans.out");
1118 list_option_full
= (char *) xmalloc (sizeof (char) *
1119 (strlen (ltrans_output_file
) + list_option_len
+ 1));
1120 tmp
= list_option_full
;
1122 obstack_ptr_grow (&argv_obstack
, tmp
);
1123 strcpy (tmp
, list_option
);
1124 tmp
+= list_option_len
;
1125 strcpy (tmp
, ltrans_output_file
);
1128 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1129 else if (parallel
> 1)
1132 sprintf (buf
, "-fwpa=%i", parallel
);
1133 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1136 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1139 /* Append the input objects and possible preceding arguments. */
1140 for (i
= 0; i
< lto_argc
; ++i
)
1141 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1142 obstack_ptr_grow (&argv_obstack
, NULL
);
1144 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1145 argv_ptr
= &new_argv
[new_head_argc
];
1146 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true);
1148 if (lto_mode
== LTO_MODE_LTO
)
1150 printf ("%s\n", flto_out
);
1156 FILE *stream
= fopen (ltrans_output_file
, "r");
1157 FILE *mstream
= NULL
;
1158 struct obstack env_obstack
;
1161 fatal_error ("fopen: %s: %m", ltrans_output_file
);
1163 /* Parse the list of LTRANS inputs from the WPA stage. */
1164 obstack_init (&env_obstack
);
1168 const unsigned piece
= 32;
1169 char *output_name
= NULL
;
1170 char *buf
, *input_name
= (char *)xmalloc (piece
);
1175 if (!fgets (buf
, piece
, stream
))
1177 len
= strlen (input_name
);
1178 if (input_name
[len
- 1] != '\n')
1180 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1181 buf
= input_name
+ len
;
1184 input_name
[len
- 1] = '\0';
1186 if (input_name
[0] == '*')
1187 output_name
= &input_name
[1];
1190 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1191 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1192 input_names
[nr
-1] = input_name
;
1193 output_names
[nr
-1] = output_name
;
1196 maybe_unlink (ltrans_output_file
);
1197 ltrans_output_file
= NULL
;
1201 makefile
= make_temp_file (".mk");
1202 mstream
= fopen (makefile
, "w");
1205 /* Execute the LTRANS stage for each input file (or prepare a
1206 makefile to invoke this in parallel). */
1207 for (i
= 0; i
< nr
; ++i
)
1210 char *input_name
= input_names
[i
];
1211 /* If it's a pass-through file do nothing. */
1212 if (output_names
[i
])
1215 /* Replace the .o suffix with a .ltrans.o suffix and write
1216 the resulting name to the LTRANS output list. */
1217 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1218 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1219 output_name
= XOBFINISH (&env_obstack
, char *);
1221 /* Adjust the dumpbase if the linker output file was seen. */
1225 = (char *) xmalloc (strlen (linker_output
)
1226 + sizeof (DUMPBASE_SUFFIX
) + 1);
1228 strlen (linker_output
) + sizeof (DUMPBASE_SUFFIX
),
1229 "%s.ltrans%u", linker_output
, i
);
1230 argv_ptr
[0] = dumpbase
;
1233 argv_ptr
[1] = "-fltrans";
1235 argv_ptr
[3] = output_name
;
1236 argv_ptr
[4] = input_name
;
1240 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
1241 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
1242 fprintf (mstream
, " '%s'", new_argv
[j
]);
1243 fprintf (mstream
, "\n");
1244 /* If we are not preserving the ltrans input files then
1245 truncate them as soon as we have processed it. This
1246 reduces temporary disk-space usage. */
1248 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1249 "&& mv %s.tem %s\n",
1250 input_name
, input_name
, input_name
, input_name
);
1254 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1256 maybe_unlink (input_name
);
1259 output_names
[i
] = output_name
;
1263 struct pex_obj
*pex
;
1266 fprintf (mstream
, "all:");
1267 for (i
= 0; i
< nr
; ++i
)
1268 fprintf (mstream
, " \\\n\t%s", output_names
[i
]);
1269 fprintf (mstream
, "\n");
1273 /* Avoid passing --jobserver-fd= and similar flags
1274 unless jobserver mode is explicitly enabled. */
1275 putenv (xstrdup ("MAKEFLAGS="));
1276 putenv (xstrdup ("MFLAGS="));
1278 new_argv
[0] = getenv ("MAKE");
1280 new_argv
[0] = "make";
1282 new_argv
[2] = makefile
;
1286 snprintf (jobs
, 31, "-j%d", parallel
);
1287 new_argv
[i
++] = jobs
;
1289 new_argv
[i
++] = "all";
1290 new_argv
[i
++] = NULL
;
1291 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1292 NULL
, NULL
, PEX_SEARCH
, false);
1293 do_wait (new_argv
[0], pex
);
1294 maybe_unlink (makefile
);
1296 for (i
= 0; i
< nr
; ++i
)
1297 maybe_unlink (input_names
[i
]);
1299 for (i
= 0; i
< nr
; ++i
)
1301 fputs (output_names
[i
], stdout
);
1302 putc ('\n', stdout
);
1303 free (input_names
[i
]);
1306 free (output_names
);
1308 free (list_option_full
);
1309 obstack_free (&env_obstack
, NULL
);
1314 printf ("%s\n", offloadend
);
1317 XDELETE (offload_argv
);
1318 obstack_free (&argv_obstack
, NULL
);
1325 main (int argc
, char *argv
[])
1329 gcc_obstack_init (&opts_obstack
);
1331 p
= argv
[0] + strlen (argv
[0]);
1332 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1336 xmalloc_set_program_name (progname
);
1338 gcc_init_libintl ();
1340 diagnostic_initialize (global_dc
, 0);
1342 if (atexit (lto_wrapper_cleanup
) != 0)
1343 fatal_error ("atexit failed");
1345 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1346 signal (SIGINT
, fatal_signal
);
1348 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1349 signal (SIGHUP
, fatal_signal
);
1351 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
1352 signal (SIGTERM
, fatal_signal
);
1354 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
1355 signal (SIGPIPE
, fatal_signal
);
1358 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1359 receive the signal. A different setting is inheritable */
1360 signal (SIGCHLD
, SIG_DFL
);
1363 /* We may be called with all the arguments stored in some file and
1364 passed with @file. Expand them into argv before processing. */
1365 expandargv (&argc
, &argv
);
1367 run_gcc (argc
, argv
);