1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009-2017 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
;
286 case OPT_fcheck_pointer_bounds
:
287 /* For selected options we can merge conservatively. */
288 for (j
= 0; j
< *decoded_options_count
; ++j
)
289 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
291 if (j
== *decoded_options_count
)
292 append_option (decoded_options
, decoded_options_count
, foption
);
293 /* -fopenmp > -fno-openmp,
294 -fopenacc > -fno-openacc,
295 -fcilkplus > -fno-cilkplus,
296 -fcheck_pointer_bounds > -fcheck_pointer_bounds */
297 else if (foption
->value
> (*decoded_options
)[j
].value
)
298 (*decoded_options
)[j
] = *foption
;
301 case OPT_fopenacc_dim_
:
302 /* Append or check identical. */
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 (strcmp ((*decoded_options
)[j
].arg
, foption
->arg
))
309 fatal_error (input_location
,
310 "Option %s with different values",
311 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 case OPT_foffload_abi_
:
387 for (j
= 0; j
< *decoded_options_count
; ++j
)
388 if ((*decoded_options
)[j
].opt_index
== foption
->opt_index
)
390 if (j
== *decoded_options_count
)
391 append_option (decoded_options
, decoded_options_count
, foption
);
392 else if (foption
->value
!= (*decoded_options
)[j
].value
)
393 fatal_error (input_location
,
394 "Option %s not used consistently in all LTO input"
395 " files", foption
->orig_option_with_args_text
);
400 append_option (decoded_options
, decoded_options_count
, foption
);
405 /* Merge PIC options:
406 -fPIC + -fpic = -fpic
407 -fPIC + -fno-pic = -fno-pic
408 -fpic/-fPIC + nothin = nothing.
409 It is a common mistake to mix few -fPIC compiled objects into otherwise
410 non-PIC code. We do not want to build everything with PIC then.
412 It would be good to warn on mismatches, but it is bit hard to do as
413 we do not know what nothing translates to. */
415 for (unsigned int j
= 0; j
< *decoded_options_count
;)
416 if ((*decoded_options
)[j
].opt_index
== OPT_fPIC
417 || (*decoded_options
)[j
].opt_index
== OPT_fpic
)
420 || (pic_option
->value
> 0) != ((*decoded_options
)[j
].value
> 0))
421 remove_option (decoded_options
, j
, decoded_options_count
);
422 else if (pic_option
->opt_index
== OPT_fPIC
423 && (*decoded_options
)[j
].opt_index
== OPT_fpic
)
425 (*decoded_options
)[j
] = *pic_option
;
431 else if ((*decoded_options
)[j
].opt_index
== OPT_fPIE
432 || (*decoded_options
)[j
].opt_index
== OPT_fpie
)
435 || pie_option
->value
!= (*decoded_options
)[j
].value
)
436 remove_option (decoded_options
, j
, decoded_options_count
);
437 else if (pie_option
->opt_index
== OPT_fPIE
438 && (*decoded_options
)[j
].opt_index
== OPT_fpie
)
440 (*decoded_options
)[j
] = *pie_option
;
450 /* Auxiliary function that frees elements of PTR and PTR itself.
451 N is number of elements to be freed. If PTR is NULL, nothing is freed.
452 If an element is NULL, subsequent elements are not freed. */
455 free_array_of_ptrs (void **ptr
, unsigned n
)
459 for (unsigned i
= 0; i
< n
; i
++)
469 /* Parse STR, saving found tokens into PVALUES and return their number.
470 Tokens are assumed to be delimited by ':'. If APPEND is non-null,
471 append it to every token we find. */
474 parse_env_var (const char *str
, char ***pvalues
, const char *append
)
476 const char *curval
, *nextval
;
480 curval
= strchr (str
, ':');
484 curval
= strchr (curval
+ 1, ':');
487 values
= (char**) xmalloc (num
* sizeof (char*));
489 nextval
= strchr (curval
, ':');
491 nextval
= strchr (curval
, '\0');
493 int append_len
= append
? strlen (append
) : 0;
494 for (i
= 0; i
< num
; i
++)
496 int l
= nextval
- curval
;
497 values
[i
] = (char*) xmalloc (l
+ 1 + append_len
);
498 memcpy (values
[i
], curval
, l
);
501 strcat (values
[i
], append
);
502 curval
= nextval
+ 1;
503 nextval
= strchr (curval
, ':');
505 nextval
= strchr (curval
, '\0');
511 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK. */
514 append_compiler_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
517 /* Append compiler driver arguments as far as they were merged. */
518 for (unsigned int j
= 1; j
< count
; ++j
)
520 struct cl_decoded_option
*option
= &opts
[j
];
522 /* File options have been properly filtered by lto-opts.c. */
523 switch (option
->opt_index
)
525 /* Drop arguments that we want to take from the link line. */
528 case OPT_flto_partition_
:
535 /* For now do what the original LTO option code was doing - pass
536 on any CL_TARGET flag and a few selected others. */
537 switch (option
->opt_index
)
539 case OPT_fdiagnostics_show_caret
:
540 case OPT_fdiagnostics_show_option
:
541 case OPT_fdiagnostics_show_location_
:
542 case OPT_fshow_column
:
551 case OPT_fopenacc_dim_
:
553 case OPT_foffload_abi_
:
558 case OPT_fcheck_pointer_bounds
:
562 if (!(cl_options
[option
->opt_index
].flags
& CL_TARGET
))
566 /* Pass the option on. */
567 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
568 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
572 /* Append diag options in OPTS with length COUNT to ARGV_OBSTACK. */
575 append_diag_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
578 /* Append compiler driver arguments as far as they were merged. */
579 for (unsigned int j
= 1; j
< count
; ++j
)
581 struct cl_decoded_option
*option
= &opts
[j
];
583 switch (option
->opt_index
)
585 case OPT_fdiagnostics_color_
:
586 case OPT_fdiagnostics_show_caret
:
587 case OPT_fdiagnostics_show_option
:
588 case OPT_fdiagnostics_show_location_
:
589 case OPT_fshow_column
:
595 /* Pass the option on. */
596 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
597 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
602 /* Append linker options OPTS to ARGV_OBSTACK. */
605 append_linker_options (obstack
*argv_obstack
, struct cl_decoded_option
*opts
,
608 /* Append linker driver arguments. Compiler options from the linker
609 driver arguments will override / merge with those from the compiler. */
610 for (unsigned int j
= 1; j
< count
; ++j
)
612 struct cl_decoded_option
*option
= &opts
[j
];
614 /* Do not pass on frontend specific flags not suitable for lto. */
615 if (!(cl_options
[option
->opt_index
].flags
616 & (CL_COMMON
|CL_TARGET
|CL_DRIVER
|CL_LTO
)))
619 switch (option
->opt_index
)
624 /* We've handled these LTO options, do not pass them on. */
630 /* Ignore -fno-XXX form of these options, as otherwise
631 corresponding builtins will not be enabled. */
632 if (option
->value
== 0)
640 /* Pass the option on. */
641 for (unsigned int i
= 0; i
< option
->canonical_option_num_elements
; ++i
)
642 obstack_ptr_grow (argv_obstack
, option
->canonical_option
[i
]);
646 /* Extract options for TARGET offload compiler from OPTIONS and append
647 them to ARGV_OBSTACK. */
650 append_offload_options (obstack
*argv_obstack
, const char *target
,
651 struct cl_decoded_option
*options
,
652 unsigned int options_count
)
654 for (unsigned i
= 0; i
< options_count
; i
++)
656 const char *cur
, *next
, *opts
;
659 struct cl_decoded_option
*option
= &options
[i
];
661 if (option
->opt_index
!= OPT_foffload_
)
664 /* If option argument starts with '-' then no target is specified. That
665 means offload options are specified for all targets, so we need to
667 if (option
->arg
[0] == '-')
671 opts
= strchr (option
->arg
, '=');
672 /* If there are offload targets specified, but no actual options,
673 there is nothing to do here. */
681 next
= strchr (cur
, ',');
684 next
= (next
> opts
) ? opts
: next
;
686 /* Are we looking for this offload target? */
687 if (strlen (target
) == (size_t) (next
- cur
)
688 && strncmp (target
, cur
, next
- cur
) == 0)
691 /* Skip the comma or equal sign. */
701 argv
= buildargv (opts
);
702 for (argc
= 0; argv
[argc
]; argc
++)
703 obstack_ptr_grow (argv_obstack
, argv
[argc
]);
707 /* Check whether NAME can be accessed in MODE. This is like access,
708 except that it never considers directories to be executable. */
711 access_check (const char *name
, int mode
)
717 if (stat (name
, &st
) < 0
718 || S_ISDIR (st
.st_mode
))
722 return access (name
, mode
);
725 /* Prepare a target image for offload TARGET, using mkoffload tool from
726 COMPILER_PATH. Return the name of the resultant object file. */
729 compile_offload_image (const char *target
, const char *compiler_path
,
730 unsigned in_argc
, char *in_argv
[],
731 struct cl_decoded_option
*compiler_opts
,
732 unsigned int compiler_opt_count
,
733 struct cl_decoded_option
*linker_opts
,
734 unsigned int linker_opt_count
)
736 char *filename
= NULL
;
739 = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target
));
740 strcpy (suffix
, "/accel/");
741 strcat (suffix
, target
);
742 strcat (suffix
, "/mkoffload");
745 unsigned n_paths
= parse_env_var (compiler_path
, &paths
, suffix
);
747 const char *compiler
= NULL
;
748 for (unsigned i
= 0; i
< n_paths
; i
++)
749 if (access_check (paths
[i
], X_OK
) == 0)
757 /* Generate temporary output file name. */
758 filename
= make_temp_file (".target.o");
760 struct obstack argv_obstack
;
761 obstack_init (&argv_obstack
);
762 obstack_ptr_grow (&argv_obstack
, compiler
);
764 obstack_ptr_grow (&argv_obstack
, "-save-temps");
766 obstack_ptr_grow (&argv_obstack
, "-v");
767 obstack_ptr_grow (&argv_obstack
, "-o");
768 obstack_ptr_grow (&argv_obstack
, filename
);
770 /* Append names of input object files. */
771 for (unsigned i
= 0; i
< in_argc
; i
++)
772 obstack_ptr_grow (&argv_obstack
, in_argv
[i
]);
774 /* Append options from offload_lto sections. */
775 append_compiler_options (&argv_obstack
, compiler_opts
,
777 append_diag_options (&argv_obstack
, linker_opts
, linker_opt_count
);
779 /* Append options specified by -foffload last. In case of conflicting
780 options we expect offload compiler to choose the latest. */
781 append_offload_options (&argv_obstack
, target
, compiler_opts
,
783 append_offload_options (&argv_obstack
, target
, linker_opts
,
786 obstack_ptr_grow (&argv_obstack
, NULL
);
787 argv
= XOBFINISH (&argv_obstack
, char **);
788 fork_execute (argv
[0], argv
, true);
789 obstack_free (&argv_obstack
, NULL
);
792 free_array_of_ptrs ((void **) paths
, n_paths
);
797 /* The main routine dealing with offloading.
798 The routine builds a target image for each offload target. IN_ARGC and
799 IN_ARGV specify options and input object files. As all of them could contain
800 target sections, we pass them all to target compilers. */
803 compile_images_for_offload_targets (unsigned in_argc
, char *in_argv
[],
804 struct cl_decoded_option
*compiler_opts
,
805 unsigned int compiler_opt_count
,
806 struct cl_decoded_option
*linker_opts
,
807 unsigned int linker_opt_count
)
810 const char *target_names
= getenv (OFFLOAD_TARGET_NAMES_ENV
);
813 unsigned num_targets
= parse_env_var (target_names
, &names
, NULL
);
815 int next_name_entry
= 0;
816 const char *compiler_path
= getenv ("COMPILER_PATH");
820 /* Prepare an image for each target and save the name of the resultant object
821 file to the OFFLOAD_NAMES array. It is terminated by a NULL entry. */
822 offload_names
= XCNEWVEC (char *, num_targets
+ 1);
823 for (unsigned i
= 0; i
< num_targets
; i
++)
825 /* HSA does not use LTO-like streaming and a different compiler, skip
827 if (strcmp (names
[i
], "hsa") == 0)
830 offload_names
[next_name_entry
]
831 = compile_offload_image (names
[i
], compiler_path
, in_argc
, in_argv
,
832 compiler_opts
, compiler_opt_count
,
833 linker_opts
, linker_opt_count
);
834 if (!offload_names
[next_name_entry
])
835 fatal_error (input_location
,
836 "problem with building target image for %s\n", names
[i
]);
841 free_array_of_ptrs ((void **) names
, num_targets
);
844 /* Copy a file from SRC to DEST. */
847 copy_file (const char *dest
, const char *src
)
849 FILE *d
= fopen (dest
, "wb");
850 FILE *s
= fopen (src
, "rb");
854 size_t len
= fread (buffer
, 1, 512, s
);
856 fatal_error (input_location
, "reading input file");
859 fwrite (buffer
, 1, len
, d
);
861 fatal_error (input_location
, "writing output file");
868 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
869 the copy to the linker. */
872 find_crtoffloadtable (void)
875 const char *library_path
= getenv ("LIBRARY_PATH");
878 unsigned n_paths
= parse_env_var (library_path
, &paths
, "/crtoffloadtable.o");
881 for (i
= 0; i
< n_paths
; i
++)
882 if (access_check (paths
[i
], R_OK
) == 0)
884 /* The linker will delete the filename we give it, so make a copy. */
885 char *crtoffloadtable
= make_temp_file (".crtoffloadtable.o");
886 copy_file (crtoffloadtable
, paths
[i
]);
887 printf ("%s\n", crtoffloadtable
);
888 XDELETEVEC (crtoffloadtable
);
892 fatal_error (input_location
,
893 "installation error, can't find crtoffloadtable.o");
895 free_array_of_ptrs ((void **) paths
, n_paths
);
898 /* A subroutine of run_gcc. Examine the open file FD for lto sections with
899 name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
900 and OPT_COUNT. Return true if we found a matchingn section, false
901 otherwise. COLLECT_GCC holds the value of the environment variable with
905 find_and_merge_options (int fd
, off_t file_offset
, const char *prefix
,
906 struct cl_decoded_option
**opts
,
907 unsigned int *opt_count
, const char *collect_gcc
)
909 off_t offset
, length
;
914 struct cl_decoded_option
*fdecoded_options
= *opts
;
915 unsigned int fdecoded_options_count
= *opt_count
;
917 simple_object_read
*sobj
;
918 sobj
= simple_object_start_read (fd
, file_offset
, "__GNU_LTO",
923 char *secname
= XALLOCAVEC (char, strlen (prefix
) + sizeof (".opts"));
924 strcpy (secname
, prefix
);
925 strcat (secname
, ".opts");
926 if (!simple_object_find_section (sobj
, secname
, &offset
, &length
,
929 simple_object_release_read (sobj
);
933 lseek (fd
, file_offset
+ offset
, SEEK_SET
);
934 data
= (char *)xmalloc (length
);
935 read (fd
, data
, length
);
939 struct cl_decoded_option
*f2decoded_options
;
940 unsigned int f2decoded_options_count
;
941 get_options_from_collect_gcc_options (collect_gcc
,
944 &f2decoded_options_count
);
945 if (!fdecoded_options
)
947 fdecoded_options
= f2decoded_options
;
948 fdecoded_options_count
= f2decoded_options_count
;
951 merge_and_complain (&fdecoded_options
,
952 &fdecoded_options_count
,
953 f2decoded_options
, f2decoded_options_count
);
955 fopts
+= strlen (fopts
) + 1;
957 while (fopts
- data
< length
);
960 simple_object_release_read (sobj
);
961 *opts
= fdecoded_options
;
962 *opt_count
= fdecoded_options_count
;
966 /* Copy early debug info sections from INFILE to a new file whose name
967 is returned. Return NULL on error. */
970 debug_objcopy (const char *infile
)
980 if ((p
= strrchr (infile
, '@'))
982 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
983 && strlen (p
) == (unsigned int) consumed
)
985 char *fname
= xstrdup (infile
);
986 fname
[p
- infile
] = '\0';
988 inoff
= (off_t
) loffset
;
990 int infd
= open (infile
, O_RDONLY
);
993 simple_object_read
*inobj
= simple_object_start_read (infd
, inoff
,
1000 if (simple_object_find_section (inobj
, ".gnu.debuglto_.debug_info",
1001 &off
, &len
, &errmsg
, &err
) != 1)
1004 fatal_error (0, "%s: %s\n", errmsg
, xstrerror (err
));
1006 simple_object_release_read (inobj
);
1011 outfile
= make_temp_file ("debugobjtem");
1012 errmsg
= simple_object_copy_lto_debug_sections (inobj
, outfile
, &err
);
1015 unlink_if_ordinary (outfile
);
1016 fatal_error (0, "%s: %s\n", errmsg
, xstrerror (err
));
1019 simple_object_release_read (inobj
);
1027 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1030 run_gcc (unsigned argc
, char *argv
[])
1033 const char **new_argv
;
1034 const char **argv_ptr
;
1035 char *list_option_full
= NULL
;
1036 const char *linker_output
= NULL
;
1037 const char *collect_gcc
, *collect_gcc_options
;
1040 bool no_partition
= false;
1041 struct cl_decoded_option
*fdecoded_options
= NULL
;
1042 struct cl_decoded_option
*offload_fdecoded_options
= NULL
;
1043 unsigned int fdecoded_options_count
= 0;
1044 unsigned int offload_fdecoded_options_count
= 0;
1045 struct cl_decoded_option
*decoded_options
;
1046 unsigned int decoded_options_count
;
1047 struct obstack argv_obstack
;
1049 bool have_lto
= false;
1050 bool have_offload
= false;
1051 unsigned lto_argc
= 0, ltoobj_argc
= 0;
1052 char **lto_argv
, **ltoobj_argv
;
1053 bool skip_debug
= false;
1054 unsigned n_debugobj
;
1056 /* Get the driver and options. */
1057 collect_gcc
= getenv ("COLLECT_GCC");
1059 fatal_error (input_location
,
1060 "environment variable COLLECT_GCC must be set");
1061 collect_gcc_options
= getenv ("COLLECT_GCC_OPTIONS");
1062 if (!collect_gcc_options
)
1063 fatal_error (input_location
,
1064 "environment variable COLLECT_GCC_OPTIONS must be set");
1065 get_options_from_collect_gcc_options (collect_gcc
, collect_gcc_options
,
1068 &decoded_options_count
);
1070 /* Allocate array for input object files with LTO IL,
1071 and for possible preceding arguments. */
1072 lto_argv
= XNEWVEC (char *, argc
);
1073 ltoobj_argv
= XNEWVEC (char *, argc
);
1075 /* Look at saved options in the IL files. */
1076 for (i
= 1; i
< argc
; ++i
)
1080 off_t file_offset
= 0;
1083 char *filename
= argv
[i
];
1085 if (strncmp (argv
[i
], "-foffload-objects=",
1086 sizeof ("-foffload-objects=") - 1) == 0)
1088 have_offload
= true;
1089 offload_objects_file_name
1090 = argv
[i
] + sizeof ("-foffload-objects=") - 1;
1094 if ((p
= strrchr (argv
[i
], '@'))
1096 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1097 && strlen (p
) == (unsigned int) consumed
)
1099 filename
= XNEWVEC (char, p
- argv
[i
] + 1);
1100 memcpy (filename
, argv
[i
], p
- argv
[i
]);
1101 filename
[p
- argv
[i
]] = '\0';
1102 file_offset
= (off_t
) loffset
;
1104 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1107 lto_argv
[lto_argc
++] = argv
[i
];
1111 if (find_and_merge_options (fd
, file_offset
, LTO_SECTION_NAME_PREFIX
,
1112 &fdecoded_options
, &fdecoded_options_count
,
1116 ltoobj_argv
[ltoobj_argc
++] = argv
[i
];
1121 /* Initalize the common arguments for the driver. */
1122 obstack_init (&argv_obstack
);
1123 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
1124 obstack_ptr_grow (&argv_obstack
, "-xlto");
1125 obstack_ptr_grow (&argv_obstack
, "-c");
1127 append_compiler_options (&argv_obstack
, fdecoded_options
,
1128 fdecoded_options_count
);
1129 append_linker_options (&argv_obstack
, decoded_options
, decoded_options_count
);
1131 /* Scan linker driver arguments for things that are of relevance to us. */
1132 for (j
= 1; j
< decoded_options_count
; ++j
)
1134 struct cl_decoded_option
*option
= &decoded_options
[j
];
1135 switch (option
->opt_index
)
1138 linker_output
= option
->arg
;
1141 case OPT_save_temps
:
1149 case OPT_flto_partition_
:
1150 if (strcmp (option
->arg
, "none") == 0)
1151 no_partition
= true;
1155 if (strcmp (option
->arg
, "jobserver") == 0)
1162 parallel
= atoi (option
->arg
);
1169 lto_mode
= LTO_MODE_WHOPR
;
1177 /* Output lto-wrapper invocation command. */
1180 for (i
= 0; i
< argc
; ++i
)
1182 fputs (argv
[i
], stderr
);
1183 fputc (' ', stderr
);
1185 fputc ('\n', stderr
);
1190 lto_mode
= LTO_MODE_LTO
;
1197 char *output_dir
, *base
, *name
;
1198 bool bit_bucket
= strcmp (linker_output
, HOST_BIT_BUCKET
) == 0;
1200 output_dir
= xstrdup (linker_output
);
1202 for (name
= base
; *name
; name
++)
1203 if (IS_DIR_SEPARATOR (*name
))
1207 linker_output
= &linker_output
[base
- output_dir
];
1208 if (*output_dir
== '\0')
1210 static char current_dir
[] = { '.', DIR_SEPARATOR
, '\0' };
1211 output_dir
= current_dir
;
1215 obstack_ptr_grow (&argv_obstack
, "-dumpdir");
1216 obstack_ptr_grow (&argv_obstack
, output_dir
);
1219 obstack_ptr_grow (&argv_obstack
, "-dumpbase");
1222 /* Remember at which point we can scrub args to re-use the commons. */
1223 new_head_argc
= obstack_object_size (&argv_obstack
) / sizeof (void *);
1227 unsigned i
, num_offload_files
;
1228 char **offload_argv
;
1231 f
= fopen (offload_objects_file_name
, "r");
1233 fatal_error (input_location
, "cannot open %s: %m",
1234 offload_objects_file_name
);
1235 if (fscanf (f
, "%u ", &num_offload_files
) != 1)
1236 fatal_error (input_location
, "cannot read %s: %m",
1237 offload_objects_file_name
);
1238 offload_argv
= XCNEWVEC (char *, num_offload_files
);
1240 /* Read names of object files with offload. */
1241 for (i
= 0; i
< num_offload_files
; i
++)
1243 const unsigned piece
= 32;
1244 char *buf
, *filename
= XNEWVEC (char, piece
);
1249 if (!fgets (buf
, piece
, f
))
1251 len
= strlen (filename
);
1252 if (filename
[len
- 1] != '\n')
1254 filename
= XRESIZEVEC (char, filename
, len
+ piece
);
1255 buf
= filename
+ len
;
1258 filename
[len
- 1] = '\0';
1259 offload_argv
[i
] = filename
;
1262 if (offload_argv
[num_offload_files
- 1] == NULL
)
1263 fatal_error (input_location
, "invalid format of %s",
1264 offload_objects_file_name
);
1265 maybe_unlink (offload_objects_file_name
);
1266 offload_objects_file_name
= NULL
;
1268 /* Look at saved offload options in files. */
1269 for (i
= 0; i
< num_offload_files
; i
++)
1274 off_t file_offset
= 0;
1275 char *filename
= offload_argv
[i
];
1277 if ((p
= strrchr (offload_argv
[i
], '@'))
1278 && p
!= offload_argv
[i
]
1279 && sscanf (p
, "@%li%n", &loffset
, &consumed
) >= 1
1280 && strlen (p
) == (unsigned int) consumed
)
1282 filename
= XNEWVEC (char, p
- offload_argv
[i
] + 1);
1283 memcpy (filename
, offload_argv
[i
], p
- offload_argv
[i
]);
1284 filename
[p
- offload_argv
[i
]] = '\0';
1285 file_offset
= (off_t
) loffset
;
1287 fd
= open (filename
, O_RDONLY
| O_BINARY
);
1289 fatal_error (input_location
, "cannot open %s: %m", filename
);
1290 if (!find_and_merge_options (fd
, file_offset
,
1291 OFFLOAD_SECTION_NAME_PREFIX
,
1292 &offload_fdecoded_options
,
1293 &offload_fdecoded_options_count
,
1295 fatal_error (input_location
, "cannot read %s: %m", filename
);
1297 if (filename
!= offload_argv
[i
])
1298 XDELETEVEC (filename
);
1301 compile_images_for_offload_targets (num_offload_files
, offload_argv
,
1302 offload_fdecoded_options
,
1303 offload_fdecoded_options_count
,
1305 decoded_options_count
);
1307 free_array_of_ptrs ((void **) offload_argv
, num_offload_files
);
1311 find_crtoffloadtable ();
1312 for (i
= 0; offload_names
[i
]; i
++)
1313 printf ("%s\n", offload_names
[i
]);
1314 free_array_of_ptrs ((void **) offload_names
, i
);
1318 /* If object files contain offload sections, but do not contain LTO sections,
1319 then there is no need to perform a link-time recompilation, i.e.
1320 lto-wrapper is used only for a compilation of offload images. */
1321 if (have_offload
&& !have_lto
)
1324 if (lto_mode
== LTO_MODE_LTO
)
1326 flto_out
= make_temp_file (".lto.o");
1328 obstack_ptr_grow (&argv_obstack
, linker_output
);
1329 obstack_ptr_grow (&argv_obstack
, "-o");
1330 obstack_ptr_grow (&argv_obstack
, flto_out
);
1334 const char *list_option
= "-fltrans-output-list=";
1335 size_t list_option_len
= strlen (list_option
);
1340 char *dumpbase
= (char *) xmalloc (strlen (linker_output
)
1341 + sizeof (".wpa") + 1);
1342 strcpy (dumpbase
, linker_output
);
1343 strcat (dumpbase
, ".wpa");
1344 obstack_ptr_grow (&argv_obstack
, dumpbase
);
1347 if (linker_output
&& save_temps
)
1349 ltrans_output_file
= (char *) xmalloc (strlen (linker_output
)
1350 + sizeof (".ltrans.out") + 1);
1351 strcpy (ltrans_output_file
, linker_output
);
1352 strcat (ltrans_output_file
, ".ltrans.out");
1355 ltrans_output_file
= make_temp_file (".ltrans.out");
1356 list_option_full
= (char *) xmalloc (sizeof (char) *
1357 (strlen (ltrans_output_file
) + list_option_len
+ 1));
1358 tmp
= list_option_full
;
1360 obstack_ptr_grow (&argv_obstack
, tmp
);
1361 strcpy (tmp
, list_option
);
1362 tmp
+= list_option_len
;
1363 strcpy (tmp
, ltrans_output_file
);
1366 obstack_ptr_grow (&argv_obstack
, xstrdup ("-fwpa=jobserver"));
1367 else if (parallel
> 1)
1370 sprintf (buf
, "-fwpa=%i", parallel
);
1371 obstack_ptr_grow (&argv_obstack
, xstrdup (buf
));
1374 obstack_ptr_grow (&argv_obstack
, "-fwpa");
1377 /* Append input arguments. */
1378 for (i
= 0; i
< lto_argc
; ++i
)
1379 obstack_ptr_grow (&argv_obstack
, lto_argv
[i
]);
1380 /* Append the input objects. */
1381 for (i
= 0; i
< ltoobj_argc
; ++i
)
1382 obstack_ptr_grow (&argv_obstack
, ltoobj_argv
[i
]);
1383 obstack_ptr_grow (&argv_obstack
, NULL
);
1385 new_argv
= XOBFINISH (&argv_obstack
, const char **);
1386 argv_ptr
= &new_argv
[new_head_argc
];
1387 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
), true);
1389 /* Handle early generated debug information. At compile-time
1390 we output early DWARF debug info into .gnu.debuglto_ prefixed
1391 sections. LTRANS object DWARF debug info refers to that.
1392 So we need to transfer the .gnu.debuglto_ sections to the final
1393 link. Ideally the linker plugin interface would allow us to
1394 not claim those sections and instruct the linker to keep
1395 them, renaming them in the process. For now we extract and
1396 rename those sections via a simple-object interface to produce
1397 regular objects containing only the early debug info. We
1398 then partially link those to a single early debug info object
1399 and pass that as additional output back to the linker plugin. */
1401 /* Prepare the partial link to gather the compile-time generated
1402 debug-info into a single input for the final link. */
1403 debug_obj
= make_temp_file ("debugobj");
1404 obstack_ptr_grow (&argv_obstack
, collect_gcc
);
1405 for (i
= 1; i
< decoded_options_count
; ++i
)
1407 /* Retain linker choice and -B. */
1408 if (decoded_options
[i
].opt_index
== OPT_B
1409 || decoded_options
[i
].opt_index
== OPT_fuse_ld_bfd
1410 || decoded_options
[i
].opt_index
== OPT_fuse_ld_gold
)
1411 append_linker_options (&argv_obstack
, &decoded_options
[i
-1], 2);
1412 /* Retain all target options, this preserves -m32 for example. */
1413 if (cl_options
[decoded_options
[i
].opt_index
].flags
& CL_TARGET
)
1414 append_linker_options (&argv_obstack
, &decoded_options
[i
-1], 2);
1415 /* Recognize -g0. */
1416 if (decoded_options
[i
].opt_index
== OPT_g
1417 && strcmp (decoded_options
[i
].arg
, "0") == 0)
1420 obstack_ptr_grow (&argv_obstack
, "-r");
1421 obstack_ptr_grow (&argv_obstack
, "-nostdlib");
1422 obstack_ptr_grow (&argv_obstack
, "-o");
1423 obstack_ptr_grow (&argv_obstack
, debug_obj
);
1425 /* Copy the early generated debug info from the objects to temporary
1426 files and append those to the partial link commandline. */
1429 for (i
= 0; i
< ltoobj_argc
; ++i
)
1432 if ((tem
= debug_objcopy (ltoobj_argv
[i
])))
1434 obstack_ptr_grow (&argv_obstack
, tem
);
1439 /* Link them all into a single object. Ideally this would reduce
1440 disk space usage mainly due to .debug_str merging but unfortunately
1441 GNU ld doesn't perform this with -r. */
1444 obstack_ptr_grow (&argv_obstack
, NULL
);
1445 const char **debug_link_argv
= XOBFINISH (&argv_obstack
, const char **);
1446 fork_execute (debug_link_argv
[0],
1447 CONST_CAST (char **, debug_link_argv
), false);
1449 /* And dispose the temporaries. */
1450 for (i
= 0; debug_link_argv
[i
]; ++i
)
1452 for (--i
; i
> 0; --i
)
1454 if (strcmp (debug_link_argv
[i
], debug_obj
) == 0)
1456 maybe_unlink (debug_link_argv
[i
]);
1461 unlink_if_ordinary (debug_obj
);
1467 if (lto_mode
== LTO_MODE_LTO
)
1469 printf ("%s\n", flto_out
);
1472 printf ("%s\n", debug_obj
);
1481 FILE *stream
= fopen (ltrans_output_file
, "r");
1482 FILE *mstream
= NULL
;
1483 struct obstack env_obstack
;
1486 fatal_error (input_location
, "fopen: %s: %m", ltrans_output_file
);
1488 /* Parse the list of LTRANS inputs from the WPA stage. */
1489 obstack_init (&env_obstack
);
1493 const unsigned piece
= 32;
1494 char *output_name
= NULL
;
1495 char *buf
, *input_name
= (char *)xmalloc (piece
);
1500 if (!fgets (buf
, piece
, stream
))
1502 len
= strlen (input_name
);
1503 if (input_name
[len
- 1] != '\n')
1505 input_name
= (char *)xrealloc (input_name
, len
+ piece
);
1506 buf
= input_name
+ len
;
1509 input_name
[len
- 1] = '\0';
1511 if (input_name
[0] == '*')
1512 output_name
= &input_name
[1];
1515 input_names
= (char **)xrealloc (input_names
, nr
* sizeof (char *));
1516 output_names
= (char **)xrealloc (output_names
, nr
* sizeof (char *));
1517 input_names
[nr
-1] = input_name
;
1518 output_names
[nr
-1] = output_name
;
1521 maybe_unlink (ltrans_output_file
);
1522 ltrans_output_file
= NULL
;
1526 makefile
= make_temp_file (".mk");
1527 mstream
= fopen (makefile
, "w");
1530 /* Execute the LTRANS stage for each input file (or prepare a
1531 makefile to invoke this in parallel). */
1532 for (i
= 0; i
< nr
; ++i
)
1535 char *input_name
= input_names
[i
];
1536 /* If it's a pass-through file do nothing. */
1537 if (output_names
[i
])
1540 /* Replace the .o suffix with a .ltrans.o suffix and write
1541 the resulting name to the LTRANS output list. */
1542 obstack_grow (&env_obstack
, input_name
, strlen (input_name
) - 2);
1543 obstack_grow (&env_obstack
, ".ltrans.o", sizeof (".ltrans.o"));
1544 output_name
= XOBFINISH (&env_obstack
, char *);
1546 /* Adjust the dumpbase if the linker output file was seen. */
1550 = (char *) xmalloc (strlen (linker_output
)
1551 + sizeof (DUMPBASE_SUFFIX
) + 1);
1553 strlen (linker_output
) + sizeof (DUMPBASE_SUFFIX
),
1554 "%s.ltrans%u", linker_output
, i
);
1555 argv_ptr
[0] = dumpbase
;
1558 argv_ptr
[1] = "-fltrans";
1560 argv_ptr
[3] = output_name
;
1561 argv_ptr
[4] = input_name
;
1565 fprintf (mstream
, "%s:\n\t@%s ", output_name
, new_argv
[0]);
1566 for (j
= 1; new_argv
[j
] != NULL
; ++j
)
1567 fprintf (mstream
, " '%s'", new_argv
[j
]);
1568 fprintf (mstream
, "\n");
1569 /* If we are not preserving the ltrans input files then
1570 truncate them as soon as we have processed it. This
1571 reduces temporary disk-space usage. */
1573 fprintf (mstream
, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1574 "&& mv %s.tem %s\n",
1575 input_name
, input_name
, input_name
, input_name
);
1579 fork_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1581 maybe_unlink (input_name
);
1584 output_names
[i
] = output_name
;
1588 struct pex_obj
*pex
;
1591 fprintf (mstream
, "all:");
1592 for (i
= 0; i
< nr
; ++i
)
1593 fprintf (mstream
, " \\\n\t%s", output_names
[i
]);
1594 fprintf (mstream
, "\n");
1598 /* Avoid passing --jobserver-fd= and similar flags
1599 unless jobserver mode is explicitly enabled. */
1600 putenv (xstrdup ("MAKEFLAGS="));
1601 putenv (xstrdup ("MFLAGS="));
1603 new_argv
[0] = getenv ("MAKE");
1605 new_argv
[0] = "make";
1607 new_argv
[2] = makefile
;
1611 snprintf (jobs
, 31, "-j%d", parallel
);
1612 new_argv
[i
++] = jobs
;
1614 new_argv
[i
++] = "all";
1615 new_argv
[i
++] = NULL
;
1616 pex
= collect_execute (new_argv
[0], CONST_CAST (char **, new_argv
),
1617 NULL
, NULL
, PEX_SEARCH
, false);
1618 do_wait (new_argv
[0], pex
);
1619 maybe_unlink (makefile
);
1621 for (i
= 0; i
< nr
; ++i
)
1622 maybe_unlink (input_names
[i
]);
1626 printf ("%s\n", debug_obj
);
1630 for (i
= 0; i
< nr
; ++i
)
1632 fputs (output_names
[i
], stdout
);
1633 putc ('\n', stdout
);
1634 free (input_names
[i
]);
1637 free (output_names
);
1639 free (list_option_full
);
1640 obstack_free (&env_obstack
, NULL
);
1645 obstack_free (&argv_obstack
, NULL
);
1652 main (int argc
, char *argv
[])
1656 init_opts_obstack ();
1658 p
= argv
[0] + strlen (argv
[0]);
1659 while (p
!= argv
[0] && !IS_DIR_SEPARATOR (p
[-1]))
1663 xmalloc_set_program_name (progname
);
1665 gcc_init_libintl ();
1667 diagnostic_initialize (global_dc
, 0);
1669 if (atexit (lto_wrapper_cleanup
) != 0)
1670 fatal_error (input_location
, "atexit failed");
1672 if (signal (SIGINT
, SIG_IGN
) != SIG_IGN
)
1673 signal (SIGINT
, fatal_signal
);
1675 if (signal (SIGHUP
, SIG_IGN
) != SIG_IGN
)
1676 signal (SIGHUP
, fatal_signal
);
1678 if (signal (SIGTERM
, SIG_IGN
) != SIG_IGN
)
1679 signal (SIGTERM
, fatal_signal
);
1681 if (signal (SIGPIPE
, SIG_IGN
) != SIG_IGN
)
1682 signal (SIGPIPE
, fatal_signal
);
1685 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1686 receive the signal. A different setting is inheritable */
1687 signal (SIGCHLD
, SIG_DFL
);
1690 /* We may be called with all the arguments stored in some file and
1691 passed with @file. Expand them into argv before processing. */
1692 expandargv (&argc
, &argv
);
1694 run_gcc (argc
, argv
);