1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2018 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 char *offload_objects_file_name
;
72 static char *makefile
;
73 static char *debug_obj
;
75 const char tool_name
[] = "lto-wrapper";
77 /* Delete tempfiles. Called from utils_cleanup. */
84 if (ltrans_output_file
)
85 maybe_unlink (ltrans_output_file
);
87 maybe_unlink (flto_out
);
88 if (offload_objects_file_name
)
89 maybe_unlink (offload_objects_file_name
);
91 maybe_unlink (makefile
);
93 maybe_unlink (debug_obj
);
94 for (i
= 0; i
< nr
; ++i
)
96 maybe_unlink (input_names
[i
]);
98 maybe_unlink (output_names
[i
]);
103 lto_wrapper_cleanup (void)
105 utils_cleanup (false);
108 /* Unlink a temporary LTRANS file unless requested otherwise. */
111 maybe_unlink (const char *file
)
115 if (unlink_if_ordinary (file
)
117 fatal_error (input_location
, "deleting LTRANS file %s: %m", file
);
120 fprintf (stderr
, "[Leaving LTRANS %s]\n", file
);
123 /* Template of LTRANS dumpbase suffix. */
124 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
126 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
127 environment according to LANG_MASK. */
130 get_options_from_collect_gcc_options (const char *collect_gcc
,
131 const char *collect_gcc_options
,
132 unsigned int lang_mask
,
133 struct cl_decoded_option
**decoded_options
,
134 unsigned int *decoded_options_count
)
136 struct obstack argv_obstack
;
141 argv_storage
= xstrdup (collect_gcc_options
);
142 obstack_init (&argv_obstack
);
143 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
145 for (j
= 0, k
= 0; argv_storage
[j
] != '\0'; ++j
)
147 if (argv_storage
[j
] == '\'')
149 obstack_ptr_grow (&argv_obstack
, &argv_storage
[k
]);
153 if (argv_storage
[j
] == '\0')
154 fatal_error (input_location
, "malformed COLLECT_GCC_OPTIONS");
155 else if (strncmp (&argv_storage
[j
], "'\\''", 4) == 0)
157 argv_storage
[k
++] = '\'';
160 else if (argv_storage
[j
] == '\'')
163 argv_storage
[k
++] = argv_storage
[j
++];
166 argv_storage
[k
++] = '\0';
170 obstack_ptr_grow (&argv_obstack
, NULL
);
171 argc
= obstack_object_size (&argv_obstack
) / sizeof (void *) - 1;
172 argv
= XOBFINISH (&argv_obstack
, const char **);
174 decode_cmdline_options_to_array (argc
, (const char **)argv
,
176 decoded_options
, decoded_options_count
);
177 obstack_free (&argv_obstack
, NULL
);
180 /* Append OPTION to the options array DECODED_OPTIONS with size
181 DECODED_OPTIONS_COUNT. */
184 append_option (struct cl_decoded_option
**decoded_options
,
185 unsigned int *decoded_options_count
,
186 struct cl_decoded_option
*option
)
188 ++*decoded_options_count
;
190 = (struct cl_decoded_option
*)
191 xrealloc (*decoded_options
,
192 (*decoded_options_count
193 * sizeof (struct cl_decoded_option
)));
194 memcpy (&(*decoded_options
)[*decoded_options_count
- 1], option
,
195 sizeof (struct cl_decoded_option
));
198 /* Remove option number INDEX from DECODED_OPTIONS, update
199 DECODED_OPTIONS_COUNT. */
202 remove_option (struct cl_decoded_option
**decoded_options
,
203 int index
, unsigned int *decoded_options_count
)
205 --*decoded_options_count
;
206 memmove (&(*decoded_options
)[index
+ 1],
207 &(*decoded_options
)[index
],
208 sizeof (struct cl_decoded_option
)
209 * (*decoded_options_count
- index
));
212 /* Try to merge and complain about options FDECODED_OPTIONS when applied
213 ontop of DECODED_OPTIONS. */
216 merge_and_complain (struct cl_decoded_option
**decoded_options
,
217 unsigned int *decoded_options_count
,
218 struct cl_decoded_option
*fdecoded_options
,
219 unsigned int fdecoded_options_count
)
222 struct cl_decoded_option
*pic_option
= NULL
;
223 struct cl_decoded_option
*pie_option
= NULL
;
225 /* ??? Merge options from files. Most cases can be
226 handled by either unioning or intersecting
227 (for example -fwrapv is a case for unioning,
228 -ffast-math is for intersection). Most complaints
229 about real conflicts between different options can
230 be deferred to the compiler proper. Options that
231 we can neither safely handle by intersection nor
232 unioning would need to be complained about here.
233 Ideally we'd have a flag in the opt files that
234 tells whether to union or intersect or reject.
235 In absence of that it's unclear what a good default is.
236 It's also difficult to get positional handling correct. */
238 /* The following does what the old LTO option code did,
239 union all target and a selected set of common options. */
240 for (i
= 0; i
< fdecoded_options_count
; ++i
)
242 struct cl_decoded_option
*foption
= &fdecoded_options
[i
];
243 switch (foption
->opt_index
)
245 case OPT_SPECIAL_unknown
:
246 case OPT_SPECIAL_ignore
:
247 case OPT_SPECIAL_program_name
:
248 case OPT_SPECIAL_input_file
:
252 if (!(cl_options
[foption
->opt_index
].flags
& CL_TARGET
))
256 case OPT_fdiagnostics_show_caret
:
257 case OPT_fdiagnostics_show_option
:
258 case OPT_fdiagnostics_show_location_
:
259 case OPT_fshow_column
:
262 /* Do what the old LTO code did - collect exactly one option
263 setting per OPT code, we pick the first we encounter.
264 ??? This doesn't make too much sense, but when it doesn't
265 then we should complain. */
266 for (j
= 0; j
< *decoded_options_count
; ++j
)
267 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
269 if (j
== *decoded_options_count
)
270 append_option (decoded_options
, decoded_options_count
, foption
);
273 /* Figure out what PIC/PIE level wins and merge the results. */
276 pic_option
= foption
;
280 pie_option
= foption
;
285 case OPT_fcheck_pointer_bounds
:
286 /* For selected options we can merge conservatively. */
287 for (j
= 0; j
< *decoded_options_count
; ++j
)
288 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
290 if (j
== *decoded_options_count
)
291 append_option (decoded_options
, decoded_options_count
, foption
);
292 /* -fopenmp > -fno-openmp,
293 -fopenacc > -fno-openacc,
294 -fcheck_pointer_bounds > -fcheck_pointer_bounds */
295 else if (foption
->value
> (*decoded_options
)[j
].value
)
296 (*decoded_options
)[j
] = *foption
;
299 case OPT_fopenacc_dim_
:
300 /* Append or check identical. */
301 for (j
= 0; j
< *decoded_options_count
; ++j
)
302 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
304 if (j
== *decoded_options_count
)
305 append_option (decoded_options
, decoded_options_count
, foption
);
306 else if (strcmp ((*decoded_options
)[j
].arg
, foption
->arg
))
307 fatal_error (input_location
,
308 "Option %s with different values",
309 foption
->orig_option_with_args_text
);
316 for (j
= 0; j
< *decoded_options_count
; ++j
)
317 if ((*decoded_options
)[j
].opt_index
== OPT_O
318 || (*decoded_options
)[j
].opt_index
== OPT_Ofast
319 || (*decoded_options
)[j
].opt_index
== OPT_Og
320 || (*decoded_options
)[j
].opt_index
== OPT_Os
)
322 if (j
== *decoded_options_count
)
323 append_option (decoded_options
, decoded_options_count
, foption
);
324 else if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
325 && foption
->opt_index
!= OPT_O
)
326 /* Exact same options get merged. */
330 /* For mismatched option kinds preserve the optimization
331 level only, thus merge it as -On. This also handles
332 merging of same optimization level -On. */
334 switch (foption
->opt_index
)
337 if (foption
->arg
[0] == '\0')
338 level
= MAX (level
, 1);
340 level
= MAX (level
, atoi (foption
->arg
));
343 level
= MAX (level
, 3);
346 level
= MAX (level
, 1);
349 level
= MAX (level
, 2);
354 switch ((*decoded_options
)[j
].opt_index
)
357 if ((*decoded_options
)[j
].arg
[0] == '\0')
358 level
= MAX (level
, 1);
360 level
= MAX (level
, atoi ((*decoded_options
)[j
].arg
));
363 level
= MAX (level
, 3);
366 level
= MAX (level
, 1);
369 level
= MAX (level
, 2);
374 (*decoded_options
)[j
].opt_index
= OPT_O
;
376 tem
= xasprintf ("-O%d", level
);
377 (*decoded_options
)[j
].arg
= &tem
[2];
378 (*decoded_options
)[j
].canonical_option
[0] = tem
;
379 (*decoded_options
)[j
].value
= 1;
384 case OPT_foffload_abi_
:
385 for (j
= 0; j
< *decoded_options_count
; ++j
)
386 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
388 if (j
== *decoded_options_count
)
389 append_option (decoded_options
, decoded_options_count
, foption
);
390 else if (foption
->value
!= (*decoded_options
)[j
].value
)
391 fatal_error (input_location
,
392 "Option %s not used consistently in all LTO input"
393 " files", foption
->orig_option_with_args_text
);
398 append_option (decoded_options
, decoded_options_count
, foption
);
403 /* Merge PIC options:
404 -fPIC + -fpic = -fpic
405 -fPIC + -fno-pic = -fno-pic
406 -fpic/-fPIC + nothin = nothing.
407 It is a common mistake to mix few -fPIC compiled objects into otherwise
408 non-PIC code. We do not want to build everything with PIC then.
410 It would be good to warn on mismatches, but it is bit hard to do as
411 we do not know what nothing translates to. */
413 for (unsigned int j
= 0; j
< *decoded_options_count
;)
414 if ((*decoded_options
)[j
].opt_index
== OPT_fPIC
415 || (*decoded_options
)[j
].opt_index
== OPT_fpic
)
418 || (pic_option
->value
> 0) != ((*decoded_options
)[j
].value
> 0))
419 remove_option (decoded_options
, j
, decoded_options_count
);
420 else if (pic_option
->opt_index
== OPT_fPIC
421 && (*decoded_options
)[j
].opt_index
== OPT_fpic
)
423 (*decoded_options
)[j
] = *pic_option
;
429 else if ((*decoded_options
)[j
].opt_index
== OPT_fPIE
430 || (*decoded_options
)[j
].opt_index
== OPT_fpie
)
433 || pie_option
->value
!= (*decoded_options
)[j
].value
)
434 remove_option (decoded_options
, j
, decoded_options_count
);
435 else if (pie_option
->opt_index
== OPT_fPIE
436 && (*decoded_options
)[j
].opt_index
== OPT_fpie
)
438 (*decoded_options
)[j
] = *pie_option
;
448 /* Auxiliary function that frees elements of PTR and PTR itself.
449 N is number of elements to be freed. If PTR is NULL, nothing is freed.
450 If an element is NULL, subsequent elements are not freed. */
453 free_array_of_ptrs (void **ptr
, unsigned n
)
457 for (unsigned i
= 0; i
< n
; i
++)
467 /* Parse STR, saving found tokens into PVALUES and return their number.
468 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
469 append it to every token we find. */
472 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
474 const char *curval
, *nextval
;
478 curval
= strchr (str
, ':');
482 curval
= strchr (curval
+ 1, ':');
485 values
= (char**) xmalloc (num
* sizeof (char*));
487 nextval
= strchr (curval
, ':');
489 nextval
= strchr (curval
, '\0');
491 int append_len
= append
? strlen (append
) : 0;
492 for (i
= 0; i
< num
; i
++)
494 int l
= nextval
- curval
;
495 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
496 memcpy (values
[i
], curval
, l
);
499 strcat (values
[i
], append
);
500 curval
= nextval
+ 1;
501 nextval
= strchr (curval
, ':');
503 nextval
= strchr (curval
, '\0');
509 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
512 append_compiler_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
515 /* Append compiler driver arguments as far as they were merged. */
516 for (unsigned int j
= 1; j
< count
; ++j
)
518 struct cl_decoded_option
*option
= &opts
[j
];
520 /* File options have been properly filtered by lto-opts.c. */
521 switch (option
->opt_index
)
523 /* Drop arguments that we want to take from the link line. */
526 case OPT_flto_partition_
:
533 /* For now do what the original LTO option code was doing - pass
534 on any CL_TARGET flag and a few selected others. */
535 switch (option
->opt_index
)
537 case OPT_fdiagnostics_show_caret
:
538 case OPT_fdiagnostics_show_option
:
539 case OPT_fdiagnostics_show_location_
:
540 case OPT_fshow_column
:
549 case OPT_fopenacc_dim_
:
550 case OPT_foffload_abi_
:
555 case OPT_fcheck_pointer_bounds
:
559 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
563 /* Pass the option on. */
564 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
565 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
569 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
572 append_diag_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
575 /* Append compiler driver arguments as far as they were merged. */
576 for (unsigned int j
= 1; j
< count
; ++j
)
578 struct cl_decoded_option
*option
= &opts
[j
];
580 switch (option
->opt_index
)
582 case OPT_fdiagnostics_color_
:
583 case OPT_fdiagnostics_show_caret
:
584 case OPT_fdiagnostics_show_option
:
585 case OPT_fdiagnostics_show_location_
:
586 case OPT_fshow_column
:
592 /* Pass the option on. */
593 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
594 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
599 /* Append linker options OPTS to ARGV_OBSTACK. */
602 append_linker_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
605 /* Append linker driver arguments. Compiler options from the linker
606 driver arguments will override / merge with those from the compiler. */
607 for (unsigned int j
= 1; j
< count
; ++j
)
609 struct cl_decoded_option
*option
= &opts
[j
];
611 /* Do not pass on frontend specific flags not suitable for lto. */
612 if (!(cl_options
[option
->opt_index
].flags
613 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
616 switch (option
->opt_index
)
621 /* We've handled these LTO options, do not pass them on. */
626 /* Ignore -fno-XXX form of these options, as otherwise
627 corresponding builtins will not be enabled. */
628 if (option
->value
== 0)
636 /* Pass the option on. */
637 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
638 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
642 /* Extract options for TARGET offload compiler from OPTIONS and append
643 them to ARGV_OBSTACK. */
646 append_offload_options (obstack
*argv_obstack
, const char *target
,
647 struct cl_decoded_option
*options
,
648 unsigned int options_count
)
650 for (unsigned i
= 0; i
< options_count
; i
++)
652 const char *cur
, *next
, *opts
;
655 struct cl_decoded_option
*option
= &options
[i
];
657 if (option
->opt_index
!= OPT_foffload_
)
660 /* If option argument starts with '-' then no target is specified. That
661 means offload options are specified for all targets, so we need to
663 if (option
->arg
[0] == '-')
667 opts
= strchr (option
->arg
, '=');
668 /* If there are offload targets specified, but no actual options,
669 there is nothing to do here. */
677 next
= strchr (cur
, ',');
680 next
= (next
> opts
) ? opts
: next
;
682 /* Are we looking for this offload target? */
683 if (strlen (target
) == (size_t) (next
- cur
)
684 && strncmp (target
, cur
, next
- cur
) == 0)
687 /* Skip the comma or equal sign. */
697 argv
= buildargv (opts
);
698 for (argc
= 0; argv
[argc
]; argc
++)
699 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
703 /* Check whether NAME can be accessed in MODE. This is like access,
704 except that it never considers directories to be executable. */
707 access_check (const char *name
, int mode
)
713 if (stat (name
, &st
) < 0
714 || S_ISDIR (st
.st_mode
))
718 return access (name
, mode
);
721 /* Prepare a target image for offload TARGET, using mkoffload tool from
722 COMPILER_PATH. Return the name of the resultant object file. */
725 compile_offload_image (const char *target
, const char *compiler_path
,
726 unsigned in_argc
, char *in_argv
[],
727 struct cl_decoded_option
*compiler_opts
,
728 unsigned int compiler_opt_count
,
729 struct cl_decoded_option
*linker_opts
,
730 unsigned int linker_opt_count
)
732 char *filename
= NULL
;
735 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
736 strcpy (suffix
, "/accel/");
737 strcat (suffix
, target
);
738 strcat (suffix
, "/mkoffload");
741 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
743 const char *compiler
= NULL
;
744 for (unsigned i
= 0; i
< n_paths
; i
++)
745 if (access_check (paths
[i
], X_OK
) == 0)
753 /* Generate temporary output file name. */
754 filename
= make_temp_file (".target.o");
756 struct obstack argv_obstack
;
757 obstack_init (&argv_obstack
);
758 obstack_ptr_grow (&argv_obstack
, compiler
);
760 obstack_ptr_grow (&argv_obstack
, "-save-temps");
762 obstack_ptr_grow (&argv_obstack
, "-v");
763 obstack_ptr_grow (&argv_obstack
, "-o");
764 obstack_ptr_grow (&argv_obstack
, filename
);
766 /* Append names of input object files. */
767 for (unsigned i
= 0; i
< in_argc
; i
++)
768 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
770 /* Append options from offload_lto sections. */
771 append_compiler_options (&argv_obstack
, compiler_opts
,
773 append_diag_options (&argv_obstack
, linker_opts
, linker_opt_count
);
775 /* Append options specified by -foffload last. In case of conflicting
776 options we expect offload compiler to choose the latest. */
777 append_offload_options (&argv_obstack
, target
, compiler_opts
,
779 append_offload_options (&argv_obstack
, target
, linker_opts
,
782 obstack_ptr_grow (&argv_obstack
, NULL
);
783 argv
= XOBFINISH (&argv_obstack
, char **);
784 fork_execute (argv
[0], argv
, true);
785 obstack_free (&argv_obstack
, NULL
);
788 free_array_of_ptrs ((void **) paths
, n_paths
);
793 /* The main routine dealing with offloading.
794 The routine builds a target image for each offload target. IN_ARGC and
795 IN_ARGV specify options and input object files. As all of them could contain
796 target sections, we pass them all to target compilers. */
799 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
800 struct cl_decoded_option
*compiler_opts
,
801 unsigned int compiler_opt_count
,
802 struct cl_decoded_option
*linker_opts
,
803 unsigned int linker_opt_count
)
806 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
809 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
811 int next_name_entry
= 0;
812 const char *compiler_path
= getenv ("COMPILER_PATH");
816 /* Prepare an image for each target and save the name of the resultant object
817 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
818 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
819 for (unsigned i
= 0; i
< num_targets
; i
++)
821 /* HSA does not use LTO-like streaming and a different compiler, skip
823 if (strcmp (names
[i
], "hsa") == 0)
826 offload_names
[next_name_entry
]
827 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
828 compiler_opts
, compiler_opt_count
,
829 linker_opts
, linker_opt_count
);
830 if (!offload_names
[next_name_entry
])
831 fatal_error (input_location
,
832 "problem with building target image for %s\n", names
[i
]);
837 free_array_of_ptrs ((void **) names
, num_targets
);
840 /* Copy a file from SRC to DEST. */
843 copy_file (const char *dest
, const char *src
)
845 FILE *d
= fopen (dest
, "wb");
846 FILE *s
= fopen (src
, "rb");
850 size_t len
= fread (buffer
, 1, 512, s
);
852 fatal_error (input_location
, "reading input file");
855 fwrite (buffer
, 1, len
, d
);
857 fatal_error (input_location
, "writing output file");
864 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
865 the copy to the linker. */
868 find_crtoffloadtable (void)
871 const char *library_path
= getenv ("LIBRARY_PATH");
874 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadtable.o");
877 for (i
= 0; i
< n_paths
; i
++)
878 if (access_check (paths
[i
], R_OK
) == 0)
880 /* The linker will delete the filename we give it, so make a copy. */
881 char *crtoffloadtable
= make_temp_file (".crtoffloadtable.o");
882 copy_file (crtoffloadtable
, paths
[i
]);
883 printf ("%s\n", crtoffloadtable
);
884 XDELETEVEC (crtoffloadtable
);
888 fatal_error (input_location
,
889 "installation error, can't find crtoffloadtable.o");
891 free_array_of_ptrs ((void **) paths
, n_paths
);
894 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
895 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
896 and OPT_COUNT. Return true if we found a matchingn section, false
897 otherwise. COLLECT_GCC holds the value of the environment variable with
901 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
902 struct cl_decoded_option
**opts
,
903 unsigned int *opt_count
, const char *collect_gcc
)
905 off_t offset
, length
;
910 struct cl_decoded_option
*fdecoded_options
= *opts
;
911 unsigned int fdecoded_options_count
= *opt_count
;
913 simple_object_read
*sobj
;
914 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
919 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
920 strcpy (secname
, prefix
);
921 strcat (secname
, ".opts");
922 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
925 simple_object_release_read (sobj
);
929 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
930 data
= (char *)xmalloc (length
);
931 read (fd
, data
, length
);
935 struct cl_decoded_option
*f2decoded_options
;
936 unsigned int f2decoded_options_count
;
937 get_options_from_collect_gcc_options (collect_gcc
,
940 &f2decoded_options_count
);
941 if (!fdecoded_options
)
943 fdecoded_options
= f2decoded_options
;
944 fdecoded_options_count
= f2decoded_options_count
;
947 merge_and_complain (&fdecoded_options
,
948 &fdecoded_options_count
,
949 f2decoded_options
, f2decoded_options_count
);
951 fopts
+= strlen (fopts
) + 1;
953 while (fopts
- data
< length
);
956 simple_object_release_read (sobj
);
957 *opts
= fdecoded_options
;
958 *opt_count
= fdecoded_options_count
;
962 /* Copy early debug info sections from INFILE to a new file whose name
963 is returned. Return NULL on error. */
966 debug_objcopy (const char *infile
)
976 if ((p
= strrchr (infile
, '@'))
978 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
979 && strlen (p
) == (unsigned int) consumed
)
981 char *fname
= xstrdup (infile
);
982 fname
[p
- infile
] = '\0';
984 inoff
= (off_t
) loffset
;
986 int infd
= open (infile
, O_RDONLY
| O_BINARY
);
989 simple_object_read
*inobj
= simple_object_start_read (infd
, inoff
,
996 if (simple_object_find_section (inobj
, ".gnu.debuglto_.debug_info",
997 &off
, &len
, &errmsg
, &err
) != 1)
1000 fatal_error (0, "%s: %s\n", errmsg
, xstrerror (err
));
1002 simple_object_release_read (inobj
);
1007 outfile
= make_temp_file ("debugobjtem");
1008 errmsg
= simple_object_copy_lto_debug_sections (inobj
, outfile
, &err
);
1011 unlink_if_ordinary (outfile
);
1012 fatal_error (0, "%s: %s\n", errmsg
, xstrerror (err
));
1015 simple_object_release_read (inobj
);
1023 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1026 run_gcc (unsigned argc
, char *argv
[])
1029 const char **new_argv
;
1030 const char **argv_ptr
;
1031 char *list_option_full
= NULL
;
1032 const char *linker_output
= NULL
;
1033 const char *collect_gcc
, *collect_gcc_options
;
1036 bool no_partition
= false;
1037 struct cl_decoded_option
*fdecoded_options
= NULL
;
1038 struct cl_decoded_option
*offload_fdecoded_options
= NULL
;
1039 unsigned int fdecoded_options_count
= 0;
1040 unsigned int offload_fdecoded_options_count
= 0;
1041 struct cl_decoded_option
*decoded_options
;
1042 unsigned int decoded_options_count
;
1043 struct obstack argv_obstack
;
1045 bool have_lto
= false;
1046 bool have_offload
= false;
1047 unsigned lto_argc
= 0, ltoobj_argc
= 0;
1048 char **lto_argv
, **ltoobj_argv
;
1049 bool skip_debug
= false;
1050 unsigned n_debugobj
;
1052 /* Get the driver and options. */
1053 collect_gcc
= getenv ("COLLECT_GCC");
1055 fatal_error (input_location
,
1056 "environment variable COLLECT_GCC must be set");
1057 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
1058 if (!collect_gcc_options
)
1059 fatal_error (input_location
,
1060 "environment variable COLLECT_GCC_OPTIONS must be set");
1061 get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
,
1064 &decoded_options_count
);
1066 /* Allocate array for input object files with LTO IL,
1067 and for possible preceding arguments. */
1068 lto_argv
= XNEWVEC (char *, argc
);
1069 ltoobj_argv
= XNEWVEC (char *, argc
);
1071 /* Look at saved options in the IL files. */
1072 for (i
= 1; i
< argc
; ++i
)
1076 off_t file_offset
= 0;
1079 char *filename
= argv
[i
];
1081 if (strncmp (argv
[i
], "-foffload-objects=",
1082 sizeof ("-foffload-objects=") - 1) == 0)
1084 have_offload
= true;
1085 offload_objects_file_name
1086 = argv
[i
] + sizeof ("-foffload-objects=") - 1;
1090 if ((p
= strrchr (argv
[i
], '@'))
1092 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1093 && strlen (p
) == (unsigned int) consumed
)
1095 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
1096 memcpy (filename
, argv
[i
], p
- argv
[i
]);
1097 filename
[p
- argv
[i
]] = '\0';
1098 file_offset
= (off_t
) loffset
;
1100 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1103 lto_argv
[lto_argc
++] = argv
[i
];
1107 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
1108 &fdecoded_options
, &fdecoded_options_count
,
1112 ltoobj_argv
[ltoobj_argc
++] = argv
[i
];
1117 /* Initalize the common arguments for the driver. */
1118 obstack_init (&argv_obstack
);
1119 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
1120 obstack_ptr_grow (&argv_obstack
, "-xlto");
1121 obstack_ptr_grow (&argv_obstack
, "-c");
1123 append_compiler_options (&argv_obstack
, fdecoded_options
,
1124 fdecoded_options_count
);
1125 append_linker_options (&argv_obstack
, decoded_options
, decoded_options_count
);
1127 /* Scan linker driver arguments for things that are of relevance to us. */
1128 for (j
= 1; j
< decoded_options_count
; ++j
)
1130 struct cl_decoded_option
*option
= &decoded_options
[j
];
1131 switch (option
->opt_index
)
1134 linker_output
= option
->arg
;
1137 case OPT_save_temps
:
1145 case OPT_flto_partition_
:
1146 if (strcmp (option
->arg
, "none") == 0)
1147 no_partition
= true;
1151 if (strcmp (option
->arg
, "jobserver") == 0)
1158 parallel
= atoi (option
->arg
);
1165 lto_mode
= LTO_MODE_WHOPR
;
1173 /* Output lto-wrapper invocation command. */
1176 for (i
= 0; i
< argc
; ++i
)
1178 fputs (argv
[i
], stderr
);
1179 fputc (' ', stderr
);
1181 fputc ('\n', stderr
);
1186 lto_mode
= LTO_MODE_LTO
;
1193 char *output_dir
, *base
, *name
;
1194 bool bit_bucket
= strcmp (linker_output
, HOST_BIT_BUCKET
) == 0;
1196 output_dir
= xstrdup (linker_output
);
1198 for (name
= base
; *name
; name
++)
1199 if (IS_DIR_SEPARATOR (*name
))
1203 linker_output
= &linker_output
[base
- output_dir
];
1204 if (*output_dir
== '\0')
1206 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1207 output_dir
= current_dir
;
1211 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1212 obstack_ptr_grow (&argv_obstack
, output_dir
);
1215 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1218 /* Remember at which point we can scrub args to re-use the commons. */
1219 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1223 unsigned i
, num_offload_files
;
1224 char **offload_argv
;
1227 f
= fopen (offload_objects_file_name
, "r");
1229 fatal_error (input_location
, "cannot open %s: %m",
1230 offload_objects_file_name
);
1231 if (fscanf (f
, "%u ", &num_offload_files
) != 1)
1232 fatal_error (input_location
, "cannot read %s: %m",
1233 offload_objects_file_name
);
1234 offload_argv
= XCNEWVEC (char *, num_offload_files
);
1236 /* Read names of object files with offload. */
1237 for (i
= 0; i
< num_offload_files
; i
++)
1239 const unsigned piece
= 32;
1240 char *buf
, *filename
= XNEWVEC (char, piece
);
1245 if (!fgets (buf
, piece
, f
))
1247 len
= strlen (filename
);
1248 if (filename
[len
- 1] != '\n')
1250 filename
= XRESIZEVEC (char, filename
, len
+ piece
);
1251 buf
= filename
+ len
;
1254 filename
[len
- 1] = '\0';
1255 offload_argv
[i
] = filename
;
1258 if (offload_argv
[num_offload_files
- 1] == NULL
)
1259 fatal_error (input_location
, "invalid format of %s",
1260 offload_objects_file_name
);
1261 maybe_unlink (offload_objects_file_name
);
1262 offload_objects_file_name
= NULL
;
1264 /* Look at saved offload options in files. */
1265 for (i
= 0; i
< num_offload_files
; i
++)
1270 off_t file_offset
= 0;
1271 char *filename
= offload_argv
[i
];
1273 if ((p
= strrchr (offload_argv
[i
], '@'))
1274 && p
!= offload_argv
[i
]
1275 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1276 && strlen (p
) == (unsigned int) consumed
)
1278 filename
= XNEWVEC (char, p
- offload_argv
[i
] + 1);
1279 memcpy (filename
, offload_argv
[i
], p
- offload_argv
[i
]);
1280 filename
[p
- offload_argv
[i
]] = '\0';
1281 file_offset
= (off_t
) loffset
;
1283 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1285 fatal_error (input_location
, "cannot open %s: %m", filename
);
1286 if (!find_and_merge_options (fd
, file_offset
,
1287 OFFLOAD_SECTION_NAME_PREFIX
,
1288 &offload_fdecoded_options
,
1289 &offload_fdecoded_options_count
,
1291 fatal_error (input_location
, "cannot read %s: %m", filename
);
1293 if (filename
!= offload_argv
[i
])
1294 XDELETEVEC (filename
);
1297 compile_images_for_offload_targets (num_offload_files
, offload_argv
,
1298 offload_fdecoded_options
,
1299 offload_fdecoded_options_count
,
1301 decoded_options_count
);
1303 free_array_of_ptrs ((void **) offload_argv
, num_offload_files
);
1307 find_crtoffloadtable ();
1308 for (i
= 0; offload_names
[i
]; i
++)
1309 printf ("%s\n", offload_names
[i
]);
1310 free_array_of_ptrs ((void **) offload_names
, i
);
1314 /* If object files contain offload sections, but do not contain LTO sections,
1315 then there is no need to perform a link-time recompilation, i.e.
1316 lto-wrapper is used only for a compilation of offload images. */
1317 if (have_offload
&& !have_lto
)
1320 if (lto_mode
== LTO_MODE_LTO
)
1322 flto_out
= make_temp_file (".lto.o");
1324 obstack_ptr_grow (&argv_obstack
, linker_output
);
1325 obstack_ptr_grow (&argv_obstack
, "-o");
1326 obstack_ptr_grow (&argv_obstack
, flto_out
);
1330 const char *list_option
= "-fltrans-output-list=";
1331 size_t list_option_len
= strlen (list_option
);
1336 char *dumpbase
= (char *) xmalloc (strlen (linker_output
)
1337 + sizeof (".wpa") + 1);
1338 strcpy (dumpbase
, linker_output
);
1339 strcat (dumpbase
, ".wpa");
1340 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1343 if (linker_output
&& save_temps
)
1345 ltrans_output_file
= (char *) xmalloc (strlen (linker_output
)
1346 + sizeof (".ltrans.out") + 1);
1347 strcpy (ltrans_output_file
, linker_output
);
1348 strcat (ltrans_output_file
, ".ltrans.out");
1351 ltrans_output_file
= make_temp_file (".ltrans.out");
1352 list_option_full
= (char *) xmalloc (sizeof (char) *
1353 (strlen (ltrans_output_file
) + list_option_len
+ 1));
1354 tmp
= list_option_full
;
1356 obstack_ptr_grow (&argv_obstack
, tmp
);
1357 strcpy (tmp
, list_option
);
1358 tmp
+= list_option_len
;
1359 strcpy (tmp
, ltrans_output_file
);
1362 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1363 else if (parallel
> 1)
1366 sprintf (buf
, "-fwpa=%i", parallel
);
1367 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1370 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1373 /* Append input arguments. */
1374 for (i
= 0; i
< lto_argc
; ++i
)
1375 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1376 /* Append the input objects. */
1377 for (i
= 0; i
< ltoobj_argc
; ++i
)
1378 obstack_ptr_grow (&argv_obstack
, ltoobj_argv
[i
]);
1379 obstack_ptr_grow (&argv_obstack
, NULL
);
1381 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1382 argv_ptr
= &new_argv
[new_head_argc
];
1383 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true);
1385 /* Handle early generated debug information. At compile-time
1386 we output early DWARF debug info into .gnu.debuglto_ prefixed
1387 sections. LTRANS object DWARF debug info refers to that.
1388 So we need to transfer the .gnu.debuglto_ sections to the final
1389 link. Ideally the linker plugin interface would allow us to
1390 not claim those sections and instruct the linker to keep
1391 them, renaming them in the process. For now we extract and
1392 rename those sections via a simple-object interface to produce
1393 regular objects containing only the early debug info. We
1394 then partially link those to a single early debug info object
1395 and pass that as additional output back to the linker plugin. */
1397 /* Prepare the partial link to gather the compile-time generated
1398 debug-info into a single input for the final link. */
1399 debug_obj
= make_temp_file ("debugobj");
1400 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
1401 for (i
= 1; i
< decoded_options_count
; ++i
)
1403 /* Retain linker choice and -B. */
1404 if (decoded_options
[i
].opt_index
== OPT_B
1405 || decoded_options
[i
].opt_index
== OPT_fuse_ld_bfd
1406 || decoded_options
[i
].opt_index
== OPT_fuse_ld_gold
)
1407 append_linker_options (&argv_obstack
, &decoded_options
[i
-1], 2);
1408 /* Retain all target options, this preserves -m32 for example. */
1409 if (cl_options
[decoded_options
[i
].opt_index
].flags
& CL_TARGET
)
1410 append_linker_options (&argv_obstack
, &decoded_options
[i
-1], 2);
1411 /* Recognize -g0. */
1412 if (decoded_options
[i
].opt_index
== OPT_g
1413 && strcmp (decoded_options
[i
].arg
, "0") == 0)
1416 obstack_ptr_grow (&argv_obstack
, "-r");
1417 obstack_ptr_grow (&argv_obstack
, "-nostdlib");
1418 obstack_ptr_grow (&argv_obstack
, "-o");
1419 obstack_ptr_grow (&argv_obstack
, debug_obj
);
1421 /* Copy the early generated debug info from the objects to temporary
1422 files and append those to the partial link commandline. */
1425 for (i
= 0; i
< ltoobj_argc
; ++i
)
1428 if ((tem
= debug_objcopy (ltoobj_argv
[i
])))
1430 obstack_ptr_grow (&argv_obstack
, tem
);
1435 /* Link them all into a single object. Ideally this would reduce
1436 disk space usage mainly due to .debug_str merging but unfortunately
1437 GNU ld doesn't perform this with -r. */
1440 obstack_ptr_grow (&argv_obstack
, NULL
);
1441 const char **debug_link_argv
= XOBFINISH (&argv_obstack
, const char **);
1442 fork_execute (debug_link_argv
[0],
1443 CONST_CAST (char **, debug_link_argv
), false);
1445 /* And dispose the temporaries. */
1446 for (i
= 0; debug_link_argv
[i
]; ++i
)
1448 for (--i
; i
> 0; --i
)
1450 if (strcmp (debug_link_argv
[i
], debug_obj
) == 0)
1452 maybe_unlink (debug_link_argv
[i
]);
1457 unlink_if_ordinary (debug_obj
);
1463 if (lto_mode
== LTO_MODE_LTO
)
1465 printf ("%s\n", flto_out
);
1468 printf ("%s\n", debug_obj
);
1477 FILE *stream
= fopen (ltrans_output_file
, "r");
1478 FILE *mstream
= NULL
;
1479 struct obstack env_obstack
;
1482 fatal_error (input_location
, "fopen: %s: %m", ltrans_output_file
);
1484 /* Parse the list of LTRANS inputs from the WPA stage. */
1485 obstack_init (&env_obstack
);
1489 const unsigned piece
= 32;
1490 char *output_name
= NULL
;
1491 char *buf
, *input_name
= (char *)xmalloc (piece
);
1496 if (!fgets (buf
, piece
, stream
))
1498 len
= strlen (input_name
);
1499 if (input_name
[len
- 1] != '\n')
1501 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1502 buf
= input_name
+ len
;
1505 input_name
[len
- 1] = '\0';
1507 if (input_name
[0] == '*')
1508 output_name
= &input_name
[1];
1511 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1512 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1513 input_names
[nr
-1] = input_name
;
1514 output_names
[nr
-1] = output_name
;
1517 maybe_unlink (ltrans_output_file
);
1518 ltrans_output_file
= NULL
;
1522 makefile
= make_temp_file (".mk");
1523 mstream
= fopen (makefile
, "w");
1526 /* Execute the LTRANS stage for each input file (or prepare a
1527 makefile to invoke this in parallel). */
1528 for (i
= 0; i
< nr
; ++i
)
1531 char *input_name
= input_names
[i
];
1532 /* If it's a pass-through file do nothing. */
1533 if (output_names
[i
])
1536 /* Replace the .o suffix with a .ltrans.o suffix and write
1537 the resulting name to the LTRANS output list. */
1538 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1539 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1540 output_name
= XOBFINISH (&env_obstack
, char *);
1542 /* Adjust the dumpbase if the linker output file was seen. */
1546 = (char *) xmalloc (strlen (linker_output
)
1547 + sizeof (DUMPBASE_SUFFIX
) + 1);
1549 strlen (linker_output
) + sizeof (DUMPBASE_SUFFIX
),
1550 "%s.ltrans%u", linker_output
, i
);
1551 argv_ptr
[0] = dumpbase
;
1554 argv_ptr
[1] = "-fltrans";
1556 argv_ptr
[3] = output_name
;
1557 argv_ptr
[4] = input_name
;
1561 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
1562 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
1563 fprintf (mstream
, " '%s'", new_argv
[j
]);
1564 fprintf (mstream
, "\n");
1565 /* If we are not preserving the ltrans input files then
1566 truncate them as soon as we have processed it. This
1567 reduces temporary disk-space usage. */
1569 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1570 "&& mv %s.tem %s\n",
1571 input_name
, input_name
, input_name
, input_name
);
1575 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1577 maybe_unlink (input_name
);
1580 output_names
[i
] = output_name
;
1584 struct pex_obj
*pex
;
1587 fprintf (mstream
, "all:");
1588 for (i
= 0; i
< nr
; ++i
)
1589 fprintf (mstream
, " \\\n\t%s", output_names
[i
]);
1590 fprintf (mstream
, "\n");
1594 /* Avoid passing --jobserver-fd= and similar flags
1595 unless jobserver mode is explicitly enabled. */
1596 putenv (xstrdup ("MAKEFLAGS="));
1597 putenv (xstrdup ("MFLAGS="));
1599 new_argv
[0] = getenv ("MAKE");
1601 new_argv
[0] = "make";
1603 new_argv
[2] = makefile
;
1607 snprintf (jobs
, 31, "-j%d", parallel
);
1608 new_argv
[i
++] = jobs
;
1610 new_argv
[i
++] = "all";
1611 new_argv
[i
++] = NULL
;
1612 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1613 NULL
, NULL
, PEX_SEARCH
, false);
1614 do_wait (new_argv
[0], pex
);
1615 maybe_unlink (makefile
);
1617 for (i
= 0; i
< nr
; ++i
)
1618 maybe_unlink (input_names
[i
]);
1622 printf ("%s\n", debug_obj
);
1626 for (i
= 0; i
< nr
; ++i
)
1628 fputs (output_names
[i
], stdout
);
1629 putc ('\n', stdout
);
1630 free (input_names
[i
]);
1633 free (output_names
);
1635 free (list_option_full
);
1636 obstack_free (&env_obstack
, NULL
);
1641 obstack_free (&argv_obstack
, NULL
);
1648 main (int argc
, char *argv
[])
1652 init_opts_obstack ();
1654 p
= argv
[0] + strlen (argv
[0]);
1655 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1659 xmalloc_set_program_name (progname
);
1661 gcc_init_libintl ();
1663 diagnostic_initialize (global_dc
, 0);
1665 if (atexit (lto_wrapper_cleanup
) != 0)
1666 fatal_error (input_location
, "atexit failed");
1668 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1669 signal (SIGINT
, fatal_signal
);
1671 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1672 signal (SIGHUP
, fatal_signal
);
1674 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
1675 signal (SIGTERM
, fatal_signal
);
1677 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
1678 signal (SIGPIPE
, fatal_signal
);
1681 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1682 receive the signal. A different setting is inheritable */
1683 signal (SIGCHLD
, SIG_DFL
);
1686 /* We may be called with all the arguments stored in some file and
1687 passed with @file. Expand them into argv before processing. */
1688 expandargv (&argc
, &argv
);
1690 run_gcc (argc
, argv
);