1/* Wrapper to call lto.  Used by collect2 and the linker plugin.
2   Copyright (C) 2009-2015 Free Software Foundation, Inc.
3
4   Factored out of collect2 by Rafael Espindola <espindola@google.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3.  If not see
20<http://www.gnu.org/licenses/>.  */
21
22
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.
27
28   Example:
29
30   $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto
31
32   The above will print something like
33   /tmp/ccwbQ8B2.lto.o
34
35   If WHOPR is used instead, more than one file might be produced
36   ./ccXj2DTk.lto.ltrans.o
37   ./ccCJuXGv.lto.ltrans.o
38*/
39
40#include "config.h"
41#include "system.h"
42#include "coretypes.h"
43#include "intl.h"
44#include "diagnostic.h"
45#include "obstack.h"
46#include "opts.h"
47#include "options.h"
48#include "simple-object.h"
49#include "lto-section-names.h"
50#include "collect-utils.h"
51
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"
55
56enum lto_mode_d {
57  LTO_MODE_NONE,			/* Not doing LTO.  */
58  LTO_MODE_LTO,				/* Normal LTO.  */
59  LTO_MODE_WHOPR			/* WHOPR.  */
60};
61
62/* Current LTO mode.  */
63static enum lto_mode_d lto_mode = LTO_MODE_NONE;
64
65static char *ltrans_output_file;
66static char *flto_out;
67static unsigned int nr;
68static char **input_names;
69static char **output_names;
70static char **offload_names;
71static const char *offloadbegin, *offloadend;
72static char *makefile;
73
74const char tool_name[] = "lto-wrapper";
75
76/* Delete tempfiles.  Called from utils_cleanup.  */
77
78void
79tool_cleanup (bool)
80{
81  unsigned int i;
82
83  if (ltrans_output_file)
84    maybe_unlink (ltrans_output_file);
85  if (flto_out)
86    maybe_unlink (flto_out);
87  if (makefile)
88    maybe_unlink (makefile);
89  for (i = 0; i < nr; ++i)
90    {
91      maybe_unlink (input_names[i]);
92      if (output_names[i])
93	maybe_unlink (output_names[i]);
94    }
95}
96
97static void
98lto_wrapper_cleanup (void)
99{
100  utils_cleanup (false);
101}
102
103/* Unlink a temporary LTRANS file unless requested otherwise.  */
104
105void
106maybe_unlink (const char *file)
107{
108  if (!save_temps)
109    {
110      if (unlink_if_ordinary (file)
111	  && errno != ENOENT)
112	fatal_error (input_location, "deleting LTRANS file %s: %m", file);
113    }
114  else if (verbose)
115    fprintf (stderr, "[Leaving LTRANS %s]\n", file);
116}
117
118/* Template of LTRANS dumpbase suffix.  */
119#define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
120
121/* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
122   environment according to LANG_MASK.  */
123
124static void
125get_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)
130{
131  struct obstack argv_obstack;
132  char *argv_storage;
133  const char **argv;
134  int j, k, argc;
135
136  argv_storage = xstrdup (collect_gcc_options);
137  obstack_init (&argv_obstack);
138  obstack_ptr_grow (&argv_obstack, collect_gcc);
139
140  for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
141    {
142      if (argv_storage[j] == '\'')
143	{
144	  obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
145	  ++j;
146	  do
147	    {
148	      if (argv_storage[j] == '\0')
149		fatal_error (input_location, "malformed COLLECT_GCC_OPTIONS");
150	      else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
151		{
152		  argv_storage[k++] = '\'';
153		  j += 4;
154		}
155	      else if (argv_storage[j] == '\'')
156		break;
157	      else
158		argv_storage[k++] = argv_storage[j++];
159	    }
160	  while (1);
161	  argv_storage[k++] = '\0';
162	}
163    }
164
165  obstack_ptr_grow (&argv_obstack, NULL);
166  argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
167  argv = XOBFINISH (&argv_obstack, const char **);
168
169  decode_cmdline_options_to_array (argc, (const char **)argv,
170				   lang_mask,
171				   decoded_options, decoded_options_count);
172  obstack_free (&argv_obstack, NULL);
173}
174
175/* Append OPTION to the options array DECODED_OPTIONS with size
176   DECODED_OPTIONS_COUNT.  */
177
178static void
179append_option (struct cl_decoded_option **decoded_options,
180	       unsigned int *decoded_options_count,
181	       struct cl_decoded_option *option)
182{
183  ++*decoded_options_count;
184  *decoded_options
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));
191}
192
193/* Try to merge and complain about options FDECODED_OPTIONS when applied
194   ontop of DECODED_OPTIONS.  */
195
196static void
197merge_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)
201{
202  unsigned int i, j;
203
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.  */
216
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)
220    {
221      struct cl_decoded_option *foption = &fdecoded_options[i];
222      switch (foption->opt_index)
223	{
224	case OPT_SPECIAL_unknown:
225	case OPT_SPECIAL_ignore:
226	case OPT_SPECIAL_program_name:
227	case OPT_SPECIAL_input_file:
228	  break;
229
230	default:
231	  if (!(cl_options[foption->opt_index].flags & CL_TARGET))
232	    break;
233
234	  /* Fallthru.  */
235	case OPT_fPIC:
236	case OPT_fpic:
237	case OPT_fPIE:
238	case OPT_fpie:
239	case OPT_fcommon:
240	case OPT_fexceptions:
241	case OPT_fnon_call_exceptions:
242	case OPT_fgnu_tm:
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)
249	      break;
250	  if (j == *decoded_options_count)
251	    append_option (decoded_options, decoded_options_count, foption);
252	  break;
253
254	case OPT_ftrapv:
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)
260	      break;
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;
268	  break;
269
270	case OPT_fmath_errno:
271	case OPT_fsigned_zeros:
272	case OPT_ftrapping_math:
273	case OPT_fwrapv:
274	case OPT_fopenmp:
275	case OPT_fopenacc:
276	case OPT_fcheck_pointer_bounds:
277	  /* For selected options we can merge conservatively.  */
278	  for (j = 0; j < *decoded_options_count; ++j)
279	    if ((*decoded_options)[j].opt_index == foption->opt_index)
280	      break;
281	  if (j == *decoded_options_count)
282	    append_option (decoded_options, decoded_options_count, foption);
283	  /* -fmath-errno > -fno-math-errno,
284	     -fsigned-zeros > -fno-signed-zeros,
285	     -ftrapping-math -> -fno-trapping-math,
286	     -fwrapv > -fno-wrapv.  */
287	  else if (foption->value > (*decoded_options)[j].value)
288	    (*decoded_options)[j] = *foption;
289	  break;
290
291	case OPT_freg_struct_return:
292	case OPT_fpcc_struct_return:
293	case OPT_fshort_double:
294	  for (j = 0; j < *decoded_options_count; ++j)
295	    if ((*decoded_options)[j].opt_index == foption->opt_index)
296	      break;
297	  if (j == *decoded_options_count)
298	    fatal_error (input_location,
299			 "Option %s not used consistently in all LTO input"
300			 " files", foption->orig_option_with_args_text);
301	  break;
302
303	case OPT_foffload_abi_:
304	  for (j = 0; j < *decoded_options_count; ++j)
305	    if ((*decoded_options)[j].opt_index == foption->opt_index)
306	      break;
307	    if (j == *decoded_options_count)
308	      append_option (decoded_options, decoded_options_count, foption);
309	    else if (foption->value != (*decoded_options)[j].value)
310	      fatal_error (input_location,
311			   "Option %s not used consistently in all LTO input"
312			   " files", foption->orig_option_with_args_text);
313	    break;
314
315	case OPT_O:
316	case OPT_Ofast:
317	case OPT_Og:
318	case OPT_Os:
319	  for (j = 0; j < *decoded_options_count; ++j)
320	    if ((*decoded_options)[j].opt_index == OPT_O
321		|| (*decoded_options)[j].opt_index == OPT_Ofast
322		|| (*decoded_options)[j].opt_index == OPT_Og
323		|| (*decoded_options)[j].opt_index == OPT_Os)
324	      break;
325	  if (j == *decoded_options_count)
326	    append_option (decoded_options, decoded_options_count, foption);
327	  else if ((*decoded_options)[j].opt_index == foption->opt_index
328		   && foption->opt_index != OPT_O)
329	    /* Exact same options get merged.  */
330	    ;
331	  else
332	    {
333	      /* For mismatched option kinds preserve the optimization
334	         level only, thus merge it as -On.  This also handles
335		 merging of same optimization level -On.  */
336	      int level = 0;
337	      switch (foption->opt_index)
338		{
339		case OPT_O:
340		  if (foption->arg[0] == '\0')
341		    level = MAX (level, 1);
342		  else
343		    level = MAX (level, atoi (foption->arg));
344		  break;
345		case OPT_Ofast:
346		  level = MAX (level, 3);
347		  break;
348		case OPT_Og:
349		  level = MAX (level, 1);
350		  break;
351		case OPT_Os:
352		  level = MAX (level, 2);
353		  break;
354		default:
355		  gcc_unreachable ();
356		}
357	      switch ((*decoded_options)[j].opt_index)
358		{
359		case OPT_O:
360		  if ((*decoded_options)[j].arg[0] == '\0')
361		    level = MAX (level, 1);
362		  else
363		    level = MAX (level, atoi ((*decoded_options)[j].arg));
364		  break;
365		case OPT_Ofast:
366		  level = MAX (level, 3);
367		  break;
368		case OPT_Og:
369		  level = MAX (level, 1);
370		  break;
371		case OPT_Os:
372		  level = MAX (level, 2);
373		  break;
374		default:
375		  gcc_unreachable ();
376		}
377	      (*decoded_options)[j].opt_index = OPT_O;
378	      char *tem;
379	      tem = xasprintf ("-O%d", level);
380	      (*decoded_options)[j].arg = &tem[2];
381	      (*decoded_options)[j].canonical_option[0] = tem;
382	      (*decoded_options)[j].value = 1;
383	    }
384	  break;
385
386	case OPT_foffload_:
387	  append_option (decoded_options, decoded_options_count, foption);
388	  break;
389	}
390    }
391}
392
393/* Auxiliary function that frees elements of PTR and PTR itself.
394   N is number of elements to be freed.  If PTR is NULL, nothing is freed.
395   If an element is NULL, subsequent elements are not freed.  */
396
397static void **
398free_array_of_ptrs (void **ptr, unsigned n)
399{
400  if (!ptr)
401    return NULL;
402  for (unsigned i = 0; i < n; i++)
403    {
404      if (!ptr[i])
405	break;
406      free (ptr[i]);
407    }
408  free (ptr);
409  return NULL;
410}
411
412/* Parse STR, saving found tokens into PVALUES and return their number.
413   Tokens are assumed to be delimited by ':'.  If APPEND is non-null,
414   append it to every token we find.  */
415
416static unsigned
417parse_env_var (const char *str, char ***pvalues, const char *append)
418{
419  const char *curval, *nextval;
420  char **values;
421  unsigned num = 1, i;
422
423  curval = strchr (str, ':');
424  while (curval)
425    {
426      num++;
427      curval = strchr (curval + 1, ':');
428    }
429
430  values = (char**) xmalloc (num * sizeof (char*));
431  curval = str;
432  nextval = strchr (curval, ':');
433  if (nextval == NULL)
434    nextval = strchr (curval, '\0');
435
436  int append_len = append ? strlen (append) : 0;
437  for (i = 0; i < num; i++)
438    {
439      int l = nextval - curval;
440      values[i] = (char*) xmalloc (l + 1 + append_len);
441      memcpy (values[i], curval, l);
442      values[i][l] = 0;
443      if (append)
444	strcat (values[i], append);
445      curval = nextval + 1;
446      nextval = strchr (curval, ':');
447      if (nextval == NULL)
448	nextval = strchr (curval, '\0');
449    }
450  *pvalues = values;
451  return num;
452}
453
454/* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK.  */
455
456static void
457append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
458			 unsigned int count)
459{
460  /* Append compiler driver arguments as far as they were merged.  */
461  for (unsigned int j = 1; j < count; ++j)
462    {
463      struct cl_decoded_option *option = &opts[j];
464
465      /* File options have been properly filtered by lto-opts.c.  */
466      switch (option->opt_index)
467	{
468	/* Drop arguments that we want to take from the link line.  */
469	case OPT_flto_:
470	case OPT_flto:
471	case OPT_flto_partition_:
472	  continue;
473
474	default:
475	  break;
476	}
477
478      /* For now do what the original LTO option code was doing - pass
479	 on any CL_TARGET flag and a few selected others.  */
480      switch (option->opt_index)
481	{
482	case OPT_fPIC:
483	case OPT_fpic:
484	case OPT_fPIE:
485	case OPT_fpie:
486	case OPT_fcommon:
487	case OPT_fexceptions:
488	case OPT_fnon_call_exceptions:
489	case OPT_fgnu_tm:
490	case OPT_freg_struct_return:
491	case OPT_fpcc_struct_return:
492	case OPT_fshort_double:
493	case OPT_ffp_contract_:
494	case OPT_fmath_errno:
495	case OPT_fsigned_zeros:
496	case OPT_ftrapping_math:
497	case OPT_fwrapv:
498	case OPT_fopenmp:
499	case OPT_fopenacc:
500	case OPT_ftrapv:
501	case OPT_fstrict_overflow:
502	case OPT_foffload_abi_:
503	case OPT_O:
504	case OPT_Ofast:
505	case OPT_Og:
506	case OPT_Os:
507	case OPT_fcheck_pointer_bounds:
508	  break;
509
510	default:
511	  if (!(cl_options[option->opt_index].flags & CL_TARGET))
512	    continue;
513	}
514
515      /* Pass the option on.  */
516      for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
517	obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
518    }
519}
520
521/* Append linker options OPTS to ARGV_OBSTACK.  */
522
523static void
524append_linker_options (obstack *argv_obstack, struct cl_decoded_option *opts,
525		       unsigned int count)
526{
527  /* Append linker driver arguments.  Compiler options from the linker
528     driver arguments will override / merge with those from the compiler.  */
529  for (unsigned int j = 1; j < count; ++j)
530    {
531      struct cl_decoded_option *option = &opts[j];
532
533      /* Do not pass on frontend specific flags not suitable for lto.  */
534      if (!(cl_options[option->opt_index].flags
535	    & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
536	continue;
537
538      switch (option->opt_index)
539	{
540	case OPT_o:
541	case OPT_flto_:
542	case OPT_flto:
543	  /* We've handled these LTO options, do not pass them on.  */
544	  continue;
545
546	case OPT_freg_struct_return:
547	case OPT_fpcc_struct_return:
548	case OPT_fshort_double:
549	  /* Ignore these, they are determined by the input files.
550	     ???  We fail to diagnose a possible mismatch here.  */
551	  continue;
552
553	default:
554	  break;
555	}
556
557      /* Pass the option on.  */
558      for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
559	obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
560    }
561}
562
563/* Extract options for TARGET offload compiler from OPTIONS and append
564   them to ARGV_OBSTACK.  */
565
566static void
567append_offload_options (obstack *argv_obstack, const char *target,
568			struct cl_decoded_option *options,
569			unsigned int options_count)
570{
571  for (unsigned i = 0; i < options_count; i++)
572    {
573      const char *cur, *next, *opts;
574      char **argv;
575      unsigned argc;
576      struct cl_decoded_option *option = &options[i];
577
578      if (option->opt_index != OPT_foffload_)
579	continue;
580
581      /* If option argument starts with '-' then no target is specified.  That
582	 means offload options are specified for all targets, so we need to
583	 append them.  */
584      if (option->arg[0] == '-')
585	opts = option->arg;
586      else
587	{
588	  opts = strchr (option->arg, '=');
589	  if (!opts)
590	    continue;
591
592	  cur = option->arg;
593
594	  while (cur < opts)
595	    {
596	      next = strchr (cur, ',');
597	      if (next == NULL)
598		next = opts;
599	      next = (next > opts) ? opts : next;
600
601	      if (strlen (target) == (size_t) (next - cur)
602		  && strncmp (target, cur, next - cur) == 0)
603		break;
604
605	      cur = next + 1;
606	    }
607
608	  if (cur >= opts)
609	    continue;
610
611	  opts++;
612	}
613
614      argv = buildargv (opts);
615      for (argc = 0; argv[argc]; argc++)
616	obstack_ptr_grow (argv_obstack, argv[argc]);
617    }
618}
619
620/* Check whether NAME can be accessed in MODE.  This is like access,
621   except that it never considers directories to be executable.  */
622
623static int
624access_check (const char *name, int mode)
625{
626  if (mode == X_OK)
627    {
628      struct stat st;
629
630      if (stat (name, &st) < 0
631	  || S_ISDIR (st.st_mode))
632	return -1;
633    }
634
635  return access (name, mode);
636}
637
638/* Prepare a target image for offload TARGET, using mkoffload tool from
639   COMPILER_PATH.  Return the name of the resultant object file.  */
640
641static char *
642compile_offload_image (const char *target, const char *compiler_path,
643		       unsigned in_argc, char *in_argv[],
644		       struct cl_decoded_option *compiler_opts,
645		       unsigned int compiler_opt_count,
646		       struct cl_decoded_option *linker_opts,
647		       unsigned int linker_opt_count)
648{
649  char *filename = NULL;
650  char **argv;
651  char *suffix
652    = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
653  strcpy (suffix, "/accel/");
654  strcat (suffix, target);
655  strcat (suffix, "/mkoffload");
656
657  char **paths = NULL;
658  unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
659
660  const char *compiler = NULL;
661  for (unsigned i = 0; i < n_paths; i++)
662    if (access_check (paths[i], X_OK) == 0)
663      {
664	compiler = paths[i];
665	break;
666      }
667
668  if (compiler)
669    {
670      /* Generate temporary output file name.  */
671      filename = make_temp_file (".target.o");
672
673      struct obstack argv_obstack;
674      obstack_init (&argv_obstack);
675      obstack_ptr_grow (&argv_obstack, compiler);
676      obstack_ptr_grow (&argv_obstack, "-o");
677      obstack_ptr_grow (&argv_obstack, filename);
678
679      /* Append names of input object files.  */
680      for (unsigned i = 0; i < in_argc; i++)
681	obstack_ptr_grow (&argv_obstack, in_argv[i]);
682
683      /* Append options from offload_lto sections.  */
684      append_compiler_options (&argv_obstack, compiler_opts,
685			       compiler_opt_count);
686
687      /* Append options specified by -foffload last.  In case of conflicting
688	 options we expect offload compiler to choose the latest.  */
689      append_offload_options (&argv_obstack, target, compiler_opts,
690			      compiler_opt_count);
691      append_offload_options (&argv_obstack, target, linker_opts,
692			      linker_opt_count);
693
694      obstack_ptr_grow (&argv_obstack, NULL);
695      argv = XOBFINISH (&argv_obstack, char **);
696      fork_execute (argv[0], argv, true);
697      obstack_free (&argv_obstack, NULL);
698    }
699
700  free_array_of_ptrs ((void **) paths, n_paths);
701  return filename;
702}
703
704
705/* The main routine dealing with offloading.
706   The routine builds a target image for each offload target.  IN_ARGC and
707   IN_ARGV specify options and input object files.  As all of them could contain
708   target sections, we pass them all to target compilers.  */
709
710static void
711compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
712				    struct cl_decoded_option *compiler_opts,
713				    unsigned int compiler_opt_count,
714				    struct cl_decoded_option *linker_opts,
715				    unsigned int linker_opt_count)
716{
717  char **names = NULL;
718  const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
719  if (!target_names)
720    return;
721  unsigned num_targets = parse_env_var (target_names, &names, NULL);
722
723  const char *compiler_path = getenv ("COMPILER_PATH");
724  if (!compiler_path)
725    goto out;
726
727  /* Prepare an image for each target and save the name of the resultant object
728     file to the OFFLOAD_NAMES array.  It is terminated by a NULL entry.  */
729  offload_names = XCNEWVEC (char *, num_targets + 1);
730  for (unsigned i = 0; i < num_targets; i++)
731    {
732      offload_names[i]
733	= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
734				 compiler_opts, compiler_opt_count,
735				 linker_opts, linker_opt_count);
736      if (!offload_names[i])
737	fatal_error (input_location,
738		     "problem with building target image for %s\n", names[i]);
739    }
740
741 out:
742  free_array_of_ptrs ((void **) names, num_targets);
743}
744
745/* Copy a file from SRC to DEST.  */
746
747static void
748copy_file (const char *dest, const char *src)
749{
750  FILE *d = fopen (dest, "wb");
751  FILE *s = fopen (src, "rb");
752  char buffer[512];
753  while (!feof (s))
754    {
755      size_t len = fread (buffer, 1, 512, s);
756      if (ferror (s) != 0)
757	fatal_error (input_location, "reading input file");
758      if (len > 0)
759	{
760	  fwrite (buffer, 1, len, d);
761	  if (ferror (d) != 0)
762	    fatal_error (input_location, "writing output file");
763	}
764    }
765}
766
767/* Find the crtoffloadbegin.o and crtoffloadend.o files in LIBRARY_PATH, make
768   copies and store the names of the copies in offloadbegin and offloadend.  */
769
770static void
771find_offloadbeginend (void)
772{
773  char **paths = NULL;
774  const char *library_path = getenv ("LIBRARY_PATH");
775  if (!library_path)
776    return;
777  unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadbegin.o");
778
779  unsigned i;
780  for (i = 0; i < n_paths; i++)
781    if (access_check (paths[i], R_OK) == 0)
782      {
783	size_t len = strlen (paths[i]);
784	char *tmp = xstrdup (paths[i]);
785	strcpy (paths[i] + len - strlen ("begin.o"), "end.o");
786	if (access_check (paths[i], R_OK) != 0)
787	  fatal_error (input_location,
788		       "installation error, can't find crtoffloadend.o");
789	/* The linker will delete the filenames we give it, so make
790	   copies.  */
791	offloadbegin = make_temp_file (".o");
792	offloadend = make_temp_file (".o");
793	copy_file (offloadbegin, tmp);
794	copy_file (offloadend, paths[i]);
795	free (tmp);
796	break;
797      }
798  if (i == n_paths)
799    fatal_error (input_location,
800		 "installation error, can't find crtoffloadbegin.o");
801
802  free_array_of_ptrs ((void **) paths, n_paths);
803}
804
805/* A subroutine of run_gcc.  Examine the open file FD for lto sections with
806   name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS
807   and OPT_COUNT.  Return true if we found a matchingn section, false
808   otherwise.  COLLECT_GCC holds the value of the environment variable with
809   the same name.  */
810
811static bool
812find_and_merge_options (int fd, off_t file_offset, const char *prefix,
813			struct cl_decoded_option **opts,
814			unsigned int *opt_count, const char *collect_gcc)
815{
816  off_t offset, length;
817  char *data;
818  char *fopts;
819  const char *errmsg;
820  int err;
821  struct cl_decoded_option *fdecoded_options = *opts;
822  unsigned int fdecoded_options_count = *opt_count;
823
824  simple_object_read *sobj;
825  sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
826				   &errmsg, &err);
827  if (!sobj)
828    return false;
829
830  char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
831  strcpy (secname, prefix);
832  strcat (secname, ".opts");
833  if (!simple_object_find_section (sobj, secname, &offset, &length,
834				   &errmsg, &err))
835    {
836      simple_object_release_read (sobj);
837      return false;
838    }
839
840  lseek (fd, file_offset + offset, SEEK_SET);
841  data = (char *)xmalloc (length);
842  read (fd, data, length);
843  fopts = data;
844  do
845    {
846      struct cl_decoded_option *f2decoded_options;
847      unsigned int f2decoded_options_count;
848      get_options_from_collect_gcc_options (collect_gcc,
849					    fopts, CL_LANG_ALL,
850					    &f2decoded_options,
851					    &f2decoded_options_count);
852      if (!fdecoded_options)
853       {
854	 fdecoded_options = f2decoded_options;
855	 fdecoded_options_count = f2decoded_options_count;
856       }
857      else
858	merge_and_complain (&fdecoded_options,
859			    &fdecoded_options_count,
860			    f2decoded_options, f2decoded_options_count);
861
862      fopts += strlen (fopts) + 1;
863    }
864  while (fopts - data < length);
865
866  free (data);
867  simple_object_release_read (sobj);
868  *opts = fdecoded_options;
869  *opt_count = fdecoded_options_count;
870  return true;
871}
872
873/* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
874
875static void
876run_gcc (unsigned argc, char *argv[])
877{
878  unsigned i, j;
879  const char **new_argv;
880  const char **argv_ptr;
881  char *list_option_full = NULL;
882  const char *linker_output = NULL;
883  const char *collect_gcc, *collect_gcc_options;
884  int parallel = 0;
885  int jobserver = 0;
886  bool no_partition = false;
887  struct cl_decoded_option *fdecoded_options = NULL;
888  struct cl_decoded_option *offload_fdecoded_options = NULL;
889  unsigned int fdecoded_options_count = 0;
890  unsigned int offload_fdecoded_options_count = 0;
891  struct cl_decoded_option *decoded_options;
892  unsigned int decoded_options_count;
893  struct obstack argv_obstack;
894  int new_head_argc;
895  bool have_lto = false;
896  bool have_offload = false;
897  unsigned lto_argc = 0, offload_argc = 0;
898  char **lto_argv, **offload_argv;
899
900  /* Get the driver and options.  */
901  collect_gcc = getenv ("COLLECT_GCC");
902  if (!collect_gcc)
903    fatal_error (input_location,
904		 "environment variable COLLECT_GCC must be set");
905  collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
906  if (!collect_gcc_options)
907    fatal_error (input_location,
908		 "environment variable COLLECT_GCC_OPTIONS must be set");
909  get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
910					CL_LANG_ALL,
911					&decoded_options,
912					&decoded_options_count);
913
914  /* Allocate arrays for input object files with LTO or offload IL,
915     and for possible preceding arguments.  */
916  lto_argv = XNEWVEC (char *, argc);
917  offload_argv = XNEWVEC (char *, argc);
918
919  /* Look at saved options in the IL files.  */
920  for (i = 1; i < argc; ++i)
921    {
922      char *p;
923      int fd;
924      off_t file_offset = 0;
925      long loffset;
926      int consumed;
927      char *filename = argv[i];
928
929      if ((p = strrchr (argv[i], '@'))
930	  && p != argv[i]
931	  && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
932	  && strlen (p) == (unsigned int) consumed)
933	{
934	  filename = XNEWVEC (char, p - argv[i] + 1);
935	  memcpy (filename, argv[i], p - argv[i]);
936	  filename[p - argv[i]] = '\0';
937	  file_offset = (off_t) loffset;
938	}
939      fd = open (filename, O_RDONLY | O_BINARY);
940      if (fd == -1)
941	{
942	  lto_argv[lto_argc++] = argv[i];
943	  continue;
944	}
945
946      if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
947				  &fdecoded_options, &fdecoded_options_count,
948				  collect_gcc))
949	{
950	  have_lto = true;
951	  lto_argv[lto_argc++] = argv[i];
952	}
953
954      if (find_and_merge_options (fd, file_offset, OFFLOAD_SECTION_NAME_PREFIX,
955				  &offload_fdecoded_options,
956				  &offload_fdecoded_options_count, collect_gcc))
957	{
958	  have_offload = true;
959	  offload_argv[offload_argc++] = argv[i];
960	}
961
962      close (fd);
963    }
964
965  /* Initalize the common arguments for the driver.  */
966  obstack_init (&argv_obstack);
967  obstack_ptr_grow (&argv_obstack, collect_gcc);
968  obstack_ptr_grow (&argv_obstack, "-xlto");
969  obstack_ptr_grow (&argv_obstack, "-c");
970
971  append_compiler_options (&argv_obstack, fdecoded_options,
972			   fdecoded_options_count);
973  append_linker_options (&argv_obstack, decoded_options, decoded_options_count);
974
975  /* Scan linker driver arguments for things that are of relevance to us.  */
976  for (j = 1; j < decoded_options_count; ++j)
977    {
978      struct cl_decoded_option *option = &decoded_options[j];
979      switch (option->opt_index)
980	{
981	case OPT_o:
982	  linker_output = option->arg;
983	  break;
984
985	case OPT_save_temps:
986	  save_temps = 1;
987	  break;
988
989	case OPT_v:
990	  verbose = 1;
991	  break;
992
993	case OPT_flto_partition_:
994	  if (strcmp (option->arg, "none") == 0)
995	    no_partition = true;
996	  break;
997
998	case OPT_flto_:
999	  if (strcmp (option->arg, "jobserver") == 0)
1000	    {
1001	      jobserver = 1;
1002	      parallel = 1;
1003	    }
1004	  else
1005	    {
1006	      parallel = atoi (option->arg);
1007	      if (parallel <= 1)
1008		parallel = 0;
1009	    }
1010	  /* Fallthru.  */
1011
1012	case OPT_flto:
1013	  lto_mode = LTO_MODE_WHOPR;
1014	  break;
1015
1016	default:
1017	  break;
1018	}
1019    }
1020
1021  if (no_partition)
1022    {
1023      lto_mode = LTO_MODE_LTO;
1024      jobserver = 0;
1025      parallel = 0;
1026    }
1027
1028  if (linker_output)
1029    {
1030      char *output_dir, *base, *name;
1031      bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
1032
1033      output_dir = xstrdup (linker_output);
1034      base = output_dir;
1035      for (name = base; *name; name++)
1036	if (IS_DIR_SEPARATOR (*name))
1037	  base = name + 1;
1038      *base = '\0';
1039
1040      linker_output = &linker_output[base - output_dir];
1041      if (*output_dir == '\0')
1042	{
1043	  static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1044	  output_dir = current_dir;
1045	}
1046      if (!bit_bucket)
1047	{
1048	  obstack_ptr_grow (&argv_obstack, "-dumpdir");
1049	  obstack_ptr_grow (&argv_obstack, output_dir);
1050	}
1051
1052      obstack_ptr_grow (&argv_obstack, "-dumpbase");
1053    }
1054
1055  /* Remember at which point we can scrub args to re-use the commons.  */
1056  new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1057
1058  if (have_offload)
1059    {
1060      compile_images_for_offload_targets (offload_argc, offload_argv,
1061					  offload_fdecoded_options,
1062					  offload_fdecoded_options_count,
1063					  decoded_options,
1064					  decoded_options_count);
1065      if (offload_names)
1066	{
1067	  find_offloadbeginend ();
1068	  for (i = 0; offload_names[i]; i++)
1069	    printf ("%s\n", offload_names[i]);
1070	  free_array_of_ptrs ((void **) offload_names, i);
1071	}
1072    }
1073
1074  if (offloadbegin)
1075    printf ("%s\n", offloadbegin);
1076
1077  /* If object files contain offload sections, but do not contain LTO sections,
1078     then there is no need to perform a link-time recompilation, i.e.
1079     lto-wrapper is used only for a compilation of offload images.  */
1080  if (have_offload && !have_lto)
1081    {
1082      for (i = 1; i < argc; ++i)
1083	if (strncmp (argv[i], "-fresolution=", sizeof ("-fresolution=") - 1))
1084	  {
1085	    char *out_file;
1086	    /* Can be ".o" or ".so".  */
1087	    char *ext = strrchr (argv[i], '.');
1088	    if (ext == NULL)
1089	      out_file = make_temp_file ("");
1090	    else
1091	      out_file = make_temp_file (ext);
1092	    /* The linker will delete the files we give it, so make copies.  */
1093	    copy_file (out_file, argv[i]);
1094	    printf ("%s\n", out_file);
1095	  }
1096      goto finish;
1097    }
1098
1099  if (lto_mode == LTO_MODE_LTO)
1100    {
1101      flto_out = make_temp_file (".lto.o");
1102      if (linker_output)
1103	obstack_ptr_grow (&argv_obstack, linker_output);
1104      obstack_ptr_grow (&argv_obstack, "-o");
1105      obstack_ptr_grow (&argv_obstack, flto_out);
1106    }
1107  else
1108    {
1109      const char *list_option = "-fltrans-output-list=";
1110      size_t list_option_len = strlen (list_option);
1111      char *tmp;
1112
1113      if (linker_output)
1114	{
1115	  char *dumpbase = (char *) xmalloc (strlen (linker_output)
1116					     + sizeof (".wpa") + 1);
1117	  strcpy (dumpbase, linker_output);
1118	  strcat (dumpbase, ".wpa");
1119	  obstack_ptr_grow (&argv_obstack, dumpbase);
1120	}
1121
1122      if (linker_output && save_temps)
1123	{
1124	  ltrans_output_file = (char *) xmalloc (strlen (linker_output)
1125						 + sizeof (".ltrans.out") + 1);
1126	  strcpy (ltrans_output_file, linker_output);
1127	  strcat (ltrans_output_file, ".ltrans.out");
1128	}
1129      else
1130	ltrans_output_file = make_temp_file (".ltrans.out");
1131      list_option_full = (char *) xmalloc (sizeof (char) *
1132		         (strlen (ltrans_output_file) + list_option_len + 1));
1133      tmp = list_option_full;
1134
1135      obstack_ptr_grow (&argv_obstack, tmp);
1136      strcpy (tmp, list_option);
1137      tmp += list_option_len;
1138      strcpy (tmp, ltrans_output_file);
1139
1140      if (jobserver)
1141	obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1142      else if (parallel > 1)
1143	{
1144	  char buf[256];
1145	  sprintf (buf, "-fwpa=%i", parallel);
1146	  obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1147	}
1148      else
1149        obstack_ptr_grow (&argv_obstack, "-fwpa");
1150    }
1151
1152  /* Append the input objects and possible preceding arguments.  */
1153  for (i = 0; i < lto_argc; ++i)
1154    obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1155  obstack_ptr_grow (&argv_obstack, NULL);
1156
1157  new_argv = XOBFINISH (&argv_obstack, const char **);
1158  argv_ptr = &new_argv[new_head_argc];
1159  fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
1160
1161  if (lto_mode == LTO_MODE_LTO)
1162    {
1163      printf ("%s\n", flto_out);
1164      free (flto_out);
1165      flto_out = NULL;
1166    }
1167  else
1168    {
1169      FILE *stream = fopen (ltrans_output_file, "r");
1170      FILE *mstream = NULL;
1171      struct obstack env_obstack;
1172
1173      if (!stream)
1174	fatal_error (input_location, "fopen: %s: %m", ltrans_output_file);
1175
1176      /* Parse the list of LTRANS inputs from the WPA stage.  */
1177      obstack_init (&env_obstack);
1178      nr = 0;
1179      for (;;)
1180	{
1181	  const unsigned piece = 32;
1182	  char *output_name = NULL;
1183	  char *buf, *input_name = (char *)xmalloc (piece);
1184	  size_t len;
1185
1186	  buf = input_name;
1187cont:
1188	  if (!fgets (buf, piece, stream))
1189	    break;
1190	  len = strlen (input_name);
1191	  if (input_name[len - 1] != '\n')
1192	    {
1193	      input_name = (char *)xrealloc (input_name, len + piece);
1194	      buf = input_name + len;
1195	      goto cont;
1196	    }
1197	  input_name[len - 1] = '\0';
1198
1199	  if (input_name[0] == '*')
1200	    output_name = &input_name[1];
1201
1202	  nr++;
1203	  input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1204	  output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1205	  input_names[nr-1] = input_name;
1206	  output_names[nr-1] = output_name;
1207	}
1208      fclose (stream);
1209      maybe_unlink (ltrans_output_file);
1210      ltrans_output_file = NULL;
1211
1212      if (parallel)
1213	{
1214	  makefile = make_temp_file (".mk");
1215	  mstream = fopen (makefile, "w");
1216	}
1217
1218      /* Execute the LTRANS stage for each input file (or prepare a
1219	 makefile to invoke this in parallel).  */
1220      for (i = 0; i < nr; ++i)
1221	{
1222	  char *output_name;
1223	  char *input_name = input_names[i];
1224	  /* If it's a pass-through file do nothing.  */
1225	  if (output_names[i])
1226	    continue;
1227
1228	  /* Replace the .o suffix with a .ltrans.o suffix and write
1229	     the resulting name to the LTRANS output list.  */
1230	  obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1231	  obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1232	  output_name = XOBFINISH (&env_obstack, char *);
1233
1234	  /* Adjust the dumpbase if the linker output file was seen.  */
1235	  if (linker_output)
1236	    {
1237	      char *dumpbase
1238		  = (char *) xmalloc (strlen (linker_output)
1239				      + sizeof (DUMPBASE_SUFFIX) + 1);
1240	      snprintf (dumpbase,
1241			strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
1242			"%s.ltrans%u", linker_output, i);
1243	      argv_ptr[0] = dumpbase;
1244	    }
1245
1246	  argv_ptr[1] = "-fltrans";
1247	  argv_ptr[2] = "-o";
1248	  argv_ptr[3] = output_name;
1249	  argv_ptr[4] = input_name;
1250	  argv_ptr[5] = NULL;
1251	  if (parallel)
1252	    {
1253	      fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
1254	      for (j = 1; new_argv[j] != NULL; ++j)
1255		fprintf (mstream, " '%s'", new_argv[j]);
1256	      fprintf (mstream, "\n");
1257	      /* If we are not preserving the ltrans input files then
1258	         truncate them as soon as we have processed it.  This
1259		 reduces temporary disk-space usage.  */
1260	      if (! save_temps)
1261		fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
1262			 "&& mv %s.tem %s\n",
1263			 input_name, input_name, input_name, input_name);
1264	    }
1265	  else
1266	    {
1267	      fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
1268			    true);
1269	      maybe_unlink (input_name);
1270	    }
1271
1272	  output_names[i] = output_name;
1273	}
1274      if (parallel)
1275	{
1276	  struct pex_obj *pex;
1277	  char jobs[32];
1278
1279	  fprintf (mstream, "all:");
1280	  for (i = 0; i < nr; ++i)
1281	    fprintf (mstream, " \\\n\t%s", output_names[i]);
1282	  fprintf (mstream, "\n");
1283	  fclose (mstream);
1284	  if (!jobserver)
1285	    {
1286	      /* Avoid passing --jobserver-fd= and similar flags
1287		 unless jobserver mode is explicitly enabled.  */
1288	      putenv (xstrdup ("MAKEFLAGS="));
1289	      putenv (xstrdup ("MFLAGS="));
1290	    }
1291	  new_argv[0] = getenv ("MAKE");
1292	  if (!new_argv[0])
1293	    new_argv[0] = "make";
1294	  new_argv[1] = "-f";
1295	  new_argv[2] = makefile;
1296	  i = 3;
1297	  if (!jobserver)
1298	    {
1299	      snprintf (jobs, 31, "-j%d", parallel);
1300	      new_argv[i++] = jobs;
1301	    }
1302	  new_argv[i++] = "all";
1303	  new_argv[i++] = NULL;
1304	  pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
1305				 NULL, NULL, PEX_SEARCH, false);
1306	  do_wait (new_argv[0], pex);
1307	  maybe_unlink (makefile);
1308	  makefile = NULL;
1309	  for (i = 0; i < nr; ++i)
1310	    maybe_unlink (input_names[i]);
1311	}
1312      for (i = 0; i < nr; ++i)
1313	{
1314	  fputs (output_names[i], stdout);
1315	  putc ('\n', stdout);
1316	  free (input_names[i]);
1317	}
1318      nr = 0;
1319      free (output_names);
1320      free (input_names);
1321      free (list_option_full);
1322      obstack_free (&env_obstack, NULL);
1323    }
1324
1325 finish:
1326  if (offloadend)
1327    printf ("%s\n", offloadend);
1328
1329  XDELETE (lto_argv);
1330  XDELETE (offload_argv);
1331  obstack_free (&argv_obstack, NULL);
1332}
1333
1334
1335/* Entry point.  */
1336
1337int
1338main (int argc, char *argv[])
1339{
1340  const char *p;
1341
1342  gcc_obstack_init (&opts_obstack);
1343
1344  p = argv[0] + strlen (argv[0]);
1345  while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
1346    --p;
1347  progname = p;
1348
1349  xmalloc_set_program_name (progname);
1350
1351  gcc_init_libintl ();
1352
1353  diagnostic_initialize (global_dc, 0);
1354
1355  if (atexit (lto_wrapper_cleanup) != 0)
1356    fatal_error (input_location, "atexit failed");
1357
1358  if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1359    signal (SIGINT, fatal_signal);
1360#ifdef SIGHUP
1361  if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1362    signal (SIGHUP, fatal_signal);
1363#endif
1364  if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1365    signal (SIGTERM, fatal_signal);
1366#ifdef SIGPIPE
1367  if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
1368    signal (SIGPIPE, fatal_signal);
1369#endif
1370#ifdef SIGCHLD
1371  /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
1372     receive the signal.  A different setting is inheritable */
1373  signal (SIGCHLD, SIG_DFL);
1374#endif
1375
1376  /* We may be called with all the arguments stored in some file and
1377     passed with @file.  Expand them into argv before processing.  */
1378  expandargv (&argc, &argv);
1379
1380  run_gcc (argc, argv);
1381
1382  return 0;
1383}
1384