xref: /netbsd-src/external/gpl3/gcc/dist/gcc/lto-wrapper.cc (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /* Wrapper to call lto.  Used by collect2 and the linker plugin.
2    Copyright (C) 2009-2022 Free Software Foundation, Inc.
3 
4    Factored out of collect2 by Rafael Espindola <espindola@google.com>
5 
6 This file is part of GCC.
7 
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
11 version.
12 
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
16 for more details.
17 
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/>.  */
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 #define INCLUDE_STRING
41 #include "config.h"
42 #include "system.h"
43 #include "coretypes.h"
44 #include "intl.h"
45 #include "diagnostic.h"
46 #include "obstack.h"
47 #include "opts.h"
48 #include "options.h"
49 #include "simple-object.h"
50 #include "lto-section-names.h"
51 #include "collect-utils.h"
52 #include "opts-diagnostic.h"
53 #include "opt-suggestions.h"
54 #include "opts-jobserver.h"
55 
56 /* Environment variable, used for passing the names of offload targets from GCC
57    driver to lto-wrapper.  */
58 #define OFFLOAD_TARGET_NAMES_ENV	"OFFLOAD_TARGET_NAMES"
59 #define OFFLOAD_TARGET_DEFAULT_ENV	"OFFLOAD_TARGET_DEFAULT"
60 
61 /* By default there is no special suffix for target executables.  */
62 #ifdef TARGET_EXECUTABLE_SUFFIX
63 #define HAVE_TARGET_EXECUTABLE_SUFFIX
64 #else
65 #define TARGET_EXECUTABLE_SUFFIX ""
66 #endif
67 
68 enum lto_mode_d {
69   LTO_MODE_NONE,			/* Not doing LTO.  */
70   LTO_MODE_LTO,				/* Normal LTO.  */
71   LTO_MODE_WHOPR			/* WHOPR.  */
72 };
73 
74 /* Current LTO mode.  */
75 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
76 
77 static char *ltrans_output_file;
78 static char *flto_out;
79 static unsigned int nr;
80 static int *ltrans_priorities;
81 static char **input_names;
82 static char **output_names;
83 static char **offload_names;
84 static char *offload_objects_file_name;
85 static char *makefile;
86 static unsigned int num_deb_objs;
87 static const char **early_debug_object_names;
88 static bool xassembler_options_error = false;
89 
90 const char tool_name[] = "lto-wrapper";
91 
92 /* Delete tempfiles.  Called from utils_cleanup.  */
93 
94 void
tool_cleanup(bool)95 tool_cleanup (bool)
96 {
97   unsigned int i;
98 
99   if (ltrans_output_file)
100     maybe_unlink (ltrans_output_file);
101   if (flto_out)
102     maybe_unlink (flto_out);
103   if (offload_objects_file_name)
104     maybe_unlink (offload_objects_file_name);
105   if (makefile)
106     maybe_unlink (makefile);
107   if (early_debug_object_names)
108     for (i = 0; i < num_deb_objs; ++i)
109       if (early_debug_object_names[i])
110 	maybe_unlink (early_debug_object_names[i]);
111   for (i = 0; i < nr; ++i)
112     {
113       maybe_unlink (input_names[i]);
114       if (output_names[i])
115 	maybe_unlink (output_names[i]);
116     }
117 }
118 
119 static void
lto_wrapper_cleanup(void)120 lto_wrapper_cleanup (void)
121 {
122   utils_cleanup (false);
123 }
124 
125 /* Unlink a temporary LTRANS file unless requested otherwise.  */
126 
127 void
maybe_unlink(const char * file)128 maybe_unlink (const char *file)
129 {
130   if (!save_temps)
131     {
132       if (unlink_if_ordinary (file)
133 	  && errno != ENOENT)
134 	fatal_error (input_location, "deleting LTRANS file %s: %m", file);
135     }
136   else if (verbose)
137     fprintf (stderr, "[Leaving LTRANS %s]\n", file);
138 }
139 
140 /* Template of LTRANS dumpbase suffix.  */
141 #define DUMPBASE_SUFFIX "ltrans18446744073709551615"
142 
143 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
144    environment.  */
145 
146 static vec<cl_decoded_option>
get_options_from_collect_gcc_options(const char * collect_gcc,const char * collect_gcc_options)147 get_options_from_collect_gcc_options (const char *collect_gcc,
148 				      const char *collect_gcc_options)
149 {
150   cl_decoded_option *decoded_options;
151   unsigned int decoded_options_count;
152   struct obstack argv_obstack;
153   const char **argv;
154   int argc;
155 
156   obstack_init (&argv_obstack);
157   obstack_ptr_grow (&argv_obstack, collect_gcc);
158 
159   parse_options_from_collect_gcc_options (collect_gcc_options,
160 					  &argv_obstack, &argc);
161   argv = XOBFINISH (&argv_obstack, const char **);
162 
163   decode_cmdline_options_to_array (argc, (const char **)argv, CL_DRIVER,
164 				   &decoded_options, &decoded_options_count);
165   vec<cl_decoded_option> decoded;
166   decoded.create (decoded_options_count);
167   for (unsigned i = 0; i < decoded_options_count; ++i)
168     decoded.quick_push (decoded_options[i]);
169   free (decoded_options);
170 
171   obstack_free (&argv_obstack, NULL);
172 
173   return decoded;
174 }
175 
176 /* Find option in OPTIONS based on OPT_INDEX, starting at START.  -1
177    value is returned if the option is not present.  */
178 
179 static int
find_option(vec<cl_decoded_option> & options,size_t opt_index,unsigned start=0)180 find_option (vec<cl_decoded_option> &options, size_t opt_index,
181 	     unsigned start = 0)
182 {
183   for (unsigned i = start; i < options.length (); ++i)
184     if (options[i].opt_index == opt_index)
185       return i;
186 
187   return -1;
188 }
189 
190 static int
find_option(vec<cl_decoded_option> & options,cl_decoded_option * option)191 find_option (vec<cl_decoded_option> &options, cl_decoded_option *option)
192 {
193   return find_option (options, option->opt_index);
194 }
195 
196 /* Merge -flto FOPTION into vector of DECODED_OPTIONS.  If FORCE is true
197    then FOPTION overrides previous settings.  */
198 
199 static void
merge_flto_options(vec<cl_decoded_option> & decoded_options,cl_decoded_option * foption,bool force)200 merge_flto_options (vec<cl_decoded_option> &decoded_options,
201 		    cl_decoded_option *foption, bool force)
202 {
203   int existing_opt = find_option (decoded_options, foption);
204   if (existing_opt == -1)
205     decoded_options.safe_push (*foption);
206   else if (force)
207     decoded_options[existing_opt].arg = foption->arg;
208   else
209     {
210       if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
211 	{
212 	  /* -flto=auto is preferred.  */
213 	  if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
214 	    ;
215 	  else if (strcmp (foption->arg, "auto") == 0
216 		   || strcmp (foption->arg, "jobserver") == 0)
217 	    decoded_options[existing_opt].arg = foption->arg;
218 	  else if (strcmp (decoded_options[existing_opt].arg,
219 			   "jobserver") != 0)
220 	    {
221 	      int n = atoi (foption->arg);
222 	      int original_n = atoi (decoded_options[existing_opt].arg);
223 	      if (n > original_n)
224 		decoded_options[existing_opt].arg = foption->arg;
225 	    }
226 	}
227     }
228 }
229 
230 /* Try to merge and complain about options FDECODED_OPTIONS when applied
231    ontop of DECODED_OPTIONS.  */
232 
233 static void
merge_and_complain(vec<cl_decoded_option> & decoded_options,vec<cl_decoded_option> fdecoded_options,vec<cl_decoded_option> decoded_cl_options)234 merge_and_complain (vec<cl_decoded_option> &decoded_options,
235 		    vec<cl_decoded_option> fdecoded_options,
236 		    vec<cl_decoded_option> decoded_cl_options)
237 {
238   unsigned int i, j;
239   cl_decoded_option *pic_option = NULL;
240   cl_decoded_option *pie_option = NULL;
241   cl_decoded_option *cf_protection_option = NULL;
242 
243   /* ???  Merge options from files.  Most cases can be
244      handled by either unioning or intersecting
245      (for example -fwrapv is a case for unioning,
246      -ffast-math is for intersection).  Most complaints
247      about real conflicts between different options can
248      be deferred to the compiler proper.  Options that
249      we can neither safely handle by intersection nor
250      unioning would need to be complained about here.
251      Ideally we'd have a flag in the opt files that
252      tells whether to union or intersect or reject.
253      In absence of that it's unclear what a good default is.
254      It's also difficult to get positional handling correct.  */
255 
256   /* Look for a -fcf-protection option in the link-time options
257      which overrides any -fcf-protection from the lto sections.  */
258   for (i = 0; i < decoded_cl_options.length (); ++i)
259     {
260       cl_decoded_option *foption = &decoded_cl_options[i];
261       if (foption->opt_index == OPT_fcf_protection_)
262 	{
263 	  cf_protection_option = foption;
264 	}
265     }
266 
267   /* The following does what the old LTO option code did,
268      union all target and a selected set of common options.  */
269   for (i = 0; i < fdecoded_options.length (); ++i)
270     {
271       cl_decoded_option *foption = &fdecoded_options[i];
272       int existing_opt = find_option (decoded_options, foption);
273       switch (foption->opt_index)
274 	{
275 	case OPT_SPECIAL_unknown:
276 	case OPT_SPECIAL_ignore:
277 	case OPT_SPECIAL_warn_removed:
278 	case OPT_SPECIAL_program_name:
279 	case OPT_SPECIAL_input_file:
280 	  break;
281 
282 	default:
283 	  if (!(cl_options[foption->opt_index].flags & CL_TARGET))
284 	    break;
285 
286 	  /* Fallthru.  */
287 	case OPT_fdiagnostics_show_caret:
288 	case OPT_fdiagnostics_show_labels:
289 	case OPT_fdiagnostics_show_line_numbers:
290 	case OPT_fdiagnostics_show_option:
291 	case OPT_fdiagnostics_show_location_:
292 	case OPT_fshow_column:
293 	case OPT_fcommon:
294 	case OPT_fgnu_tm:
295 	case OPT_g:
296 	  /* Do what the old LTO code did - collect exactly one option
297 	     setting per OPT code, we pick the first we encounter.
298 	     ???  This doesn't make too much sense, but when it doesn't
299 	     then we should complain.  */
300 	  if (existing_opt == -1)
301 	    decoded_options.safe_push (*foption);
302 	  break;
303 
304 	/* Figure out what PIC/PIE level wins and merge the results.  */
305 	case OPT_fPIC:
306 	case OPT_fpic:
307 	  pic_option = foption;
308 	  break;
309 	case OPT_fPIE:
310 	case OPT_fpie:
311 	  pie_option = foption;
312 	  break;
313 
314 	case OPT_fopenmp:
315 	case OPT_fopenacc:
316 	  /* For selected options we can merge conservatively.  */
317 	  if (existing_opt == -1)
318 	    decoded_options.safe_push (*foption);
319 	  /* -fopenmp > -fno-openmp,
320 	     -fopenacc > -fno-openacc  */
321 	  else if (foption->value > decoded_options[existing_opt].value)
322 	    decoded_options[existing_opt] = *foption;
323 	  break;
324 
325 	case OPT_fopenacc_dim_:
326 	  /* Append or check identical.  */
327 	  if (existing_opt == -1)
328 	    decoded_options.safe_push (*foption);
329 	  else if (strcmp (decoded_options[existing_opt].arg, foption->arg))
330 	    fatal_error (input_location,
331 			 "option %s with different values",
332 			 foption->orig_option_with_args_text);
333 	  break;
334 
335 	case OPT_fcf_protection_:
336 	  /* Default to link-time option, else append or check identical.  */
337 	  if (!cf_protection_option
338 	      || cf_protection_option->value == CF_CHECK)
339 	    {
340 	      if (existing_opt == -1)
341 		decoded_options.safe_push (*foption);
342 	      else if (decoded_options[existing_opt].value != foption->value)
343 		{
344 		  if (cf_protection_option
345 		      && cf_protection_option->value == CF_CHECK)
346 		    fatal_error (input_location,
347 				 "option %qs with mismatching values"
348 				 " (%s, %s)",
349 				 "-fcf-protection",
350 				 decoded_options[existing_opt].arg,
351 				 foption->arg);
352 		  else
353 		    {
354 		      /* Merge and update the -fcf-protection option.  */
355 		      decoded_options[existing_opt].value
356 			&= (foption->value & CF_FULL);
357 		      switch (decoded_options[existing_opt].value)
358 			{
359 			case CF_NONE:
360 			  decoded_options[existing_opt].arg = "none";
361 			  break;
362 			case CF_BRANCH:
363 			  decoded_options[existing_opt].arg = "branch";
364 			  break;
365 			case CF_RETURN:
366 			  decoded_options[existing_opt].arg = "return";
367 			  break;
368 			default:
369 			  gcc_unreachable ();
370 			}
371 		    }
372 		}
373 	    }
374 	  break;
375 
376 	case OPT_O:
377 	case OPT_Ofast:
378 	case OPT_Og:
379 	case OPT_Os:
380 	case OPT_Oz:
381 	  existing_opt = -1;
382 	  for (j = 0; j < decoded_options.length (); ++j)
383 	    if (decoded_options[j].opt_index == OPT_O
384 		|| decoded_options[j].opt_index == OPT_Ofast
385 		|| decoded_options[j].opt_index == OPT_Og
386 		|| decoded_options[j].opt_index == OPT_Os
387 		|| decoded_options[j].opt_index == OPT_Oz)
388 	      {
389 		existing_opt = j;
390 		break;
391 	      }
392 	  if (existing_opt == -1)
393 	    decoded_options.safe_push (*foption);
394 	  else if (decoded_options[existing_opt].opt_index == foption->opt_index
395 		   && foption->opt_index != OPT_O)
396 	    /* Exact same options get merged.  */
397 	    ;
398 	  else
399 	    {
400 	      /* For mismatched option kinds preserve the optimization
401 	         level only, thus merge it as -On.  This also handles
402 		 merging of same optimization level -On.  */
403 	      int level = 0;
404 	      switch (foption->opt_index)
405 		{
406 		case OPT_O:
407 		  if (foption->arg[0] == '\0')
408 		    level = MAX (level, 1);
409 		  else
410 		    level = MAX (level, atoi (foption->arg));
411 		  break;
412 		case OPT_Ofast:
413 		  level = MAX (level, 3);
414 		  break;
415 		case OPT_Og:
416 		  level = MAX (level, 1);
417 		  break;
418 		case OPT_Os:
419 		case OPT_Oz:
420 		  level = MAX (level, 2);
421 		  break;
422 		default:
423 		  gcc_unreachable ();
424 		}
425 	      switch (decoded_options[existing_opt].opt_index)
426 		{
427 		case OPT_O:
428 		  if (decoded_options[existing_opt].arg[0] == '\0')
429 		    level = MAX (level, 1);
430 		  else
431 		    level = MAX (level,
432 				 atoi (decoded_options[existing_opt].arg));
433 		  break;
434 		case OPT_Ofast:
435 		  level = MAX (level, 3);
436 		  break;
437 		case OPT_Og:
438 		  level = MAX (level, 1);
439 		  break;
440 		case OPT_Os:
441 		case OPT_Oz:
442 		  level = MAX (level, 2);
443 		  break;
444 		default:
445 		  gcc_unreachable ();
446 		}
447 	      decoded_options[existing_opt].opt_index = OPT_O;
448 	      char *tem;
449 	      tem = xasprintf ("-O%d", level);
450 	      decoded_options[existing_opt].arg = &tem[2];
451 	      decoded_options[existing_opt].canonical_option[0] = tem;
452 	      decoded_options[existing_opt].value = 1;
453 	    }
454 	  break;
455 
456 
457 	case OPT_foffload_abi_:
458 	  if (existing_opt == -1)
459 	    decoded_options.safe_push (*foption);
460 	  else if (foption->value != decoded_options[existing_opt].value)
461 	    fatal_error (input_location,
462 			 "option %s not used consistently in all LTO input"
463 			 " files", foption->orig_option_with_args_text);
464 	  break;
465 
466 
467 	case OPT_foffload_options_:
468 	  decoded_options.safe_push (*foption);
469 	  break;
470 
471 	case OPT_flto_:
472 	  merge_flto_options (decoded_options, foption, false);
473 	  break;
474 	}
475     }
476 
477   /* Merge PIC options:
478       -fPIC + -fpic = -fpic
479       -fPIC + -fno-pic = -fno-pic
480       -fpic/-fPIC + nothing = nothing.
481      It is a common mistake to mix few -fPIC compiled objects into otherwise
482      non-PIC code.  We do not want to build everything with PIC then.
483 
484      Similarly we merge PIE options, however in addition we keep
485       -fPIC + -fPIE = -fPIE
486       -fpic + -fPIE = -fpie
487       -fPIC/-fpic + -fpie = -fpie
488 
489      It would be good to warn on mismatches, but it is bit hard to do as
490      we do not know what nothing translates to.  */
491 
492   for (unsigned int j = 0; j < decoded_options.length ();)
493     if (decoded_options[j].opt_index == OPT_fPIC
494 	|| decoded_options[j].opt_index == OPT_fpic)
495       {
496 	/* -fno-pic in one unit implies -fno-pic everywhere.  */
497 	if (decoded_options[j].value == 0)
498 	  j++;
499 	/* If we have no pic option or merge in -fno-pic, we still may turn
500 	   existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present.  */
501 	else if ((pic_option && pic_option->value == 0)
502 		 || !pic_option)
503 	  {
504 	    if (pie_option)
505 	      {
506 		bool big = decoded_options[j].opt_index == OPT_fPIC
507 			   && pie_option->opt_index == OPT_fPIE;
508 		decoded_options[j].opt_index = big ? OPT_fPIE : OPT_fpie;
509 		if (pie_option->value)
510 		  decoded_options[j].canonical_option[0]
511 		    = big ? "-fPIE" : "-fpie";
512 		else
513 		  decoded_options[j].canonical_option[0] = "-fno-pie";
514 		decoded_options[j].value = pie_option->value;
515 		j++;
516 	      }
517 	    else if (pic_option)
518 	      {
519 		decoded_options[j] = *pic_option;
520 		j++;
521 	      }
522 	    /* We do not know if target defaults to pic or not, so just remove
523 	       option if it is missing in one unit but enabled in other.  */
524 	    else
525 	      decoded_options.ordered_remove (j);
526 	  }
527 	else if (pic_option->opt_index == OPT_fpic
528 		 && decoded_options[j].opt_index == OPT_fPIC)
529 	  {
530 	    decoded_options[j] = *pic_option;
531 	    j++;
532 	  }
533 	else
534 	  j++;
535       }
536    else if (decoded_options[j].opt_index == OPT_fPIE
537 	    || decoded_options[j].opt_index == OPT_fpie)
538       {
539 	/* -fno-pie in one unit implies -fno-pie everywhere.  */
540 	if (decoded_options[j].value == 0)
541 	  j++;
542 	/* If we have no pie option or merge in -fno-pie, we still preserve
543 	   PIE/pie if pic/PIC is present.  */
544 	else if ((pie_option && pie_option->value == 0)
545 		 || !pie_option)
546 	  {
547 	    /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie.  */
548 	    if (pic_option)
549 	      {
550 		if (pic_option->opt_index == OPT_fpic
551 		    && decoded_options[j].opt_index == OPT_fPIE)
552 		  {
553 		    decoded_options[j].opt_index = OPT_fpie;
554 		    decoded_options[j].canonical_option[0]
555 		      = pic_option->value ? "-fpie" : "-fno-pie";
556 		  }
557 		else if (!pic_option->value)
558 		  decoded_options[j].canonical_option[0] = "-fno-pie";
559 		decoded_options[j].value = pic_option->value;
560 		j++;
561 	      }
562 	    else if (pie_option)
563 	      {
564 		decoded_options[j] = *pie_option;
565 		j++;
566 	      }
567 	    /* Because we always append pic/PIE options this code path should
568 	       not happen unless the LTO object was built by old lto1 which
569 	       did not contain that logic yet.  */
570 	    else
571 	      decoded_options.ordered_remove (j);
572 	  }
573 	else if (pie_option->opt_index == OPT_fpie
574 		 && decoded_options[j].opt_index == OPT_fPIE)
575 	  {
576 	    decoded_options[j] = *pie_option;
577 	    j++;
578 	  }
579 	else
580 	  j++;
581       }
582    else
583      j++;
584 
585   int existing_opt_index, existing_opt2_index;
586   if (!xassembler_options_error)
587     for (existing_opt_index = existing_opt2_index = 0; ;
588 	 existing_opt_index++, existing_opt2_index++)
589       {
590 	existing_opt_index
591 	  = find_option (decoded_options, OPT_Xassembler, existing_opt_index);
592 	existing_opt2_index
593 	  = find_option (fdecoded_options, OPT_Xassembler,
594 			 existing_opt2_index);
595 
596 	cl_decoded_option *existing_opt = NULL;
597 	cl_decoded_option *existing_opt2 = NULL;
598 	if (existing_opt_index != -1)
599 	  existing_opt = &decoded_options[existing_opt_index];
600 	if (existing_opt2_index != -1)
601 	  existing_opt2 = &fdecoded_options[existing_opt2_index];
602 
603 	if (existing_opt == NULL && existing_opt2 == NULL)
604 	  break;
605 	else if (existing_opt != NULL && existing_opt2 == NULL)
606 	  {
607 	    warning (0, "Extra option to %<-Xassembler%>: %s,"
608 		     " dropping all %<-Xassembler%> and %<-Wa%> options.",
609 		     existing_opt->arg);
610 	    xassembler_options_error = true;
611 	    break;
612 	  }
613 	else if (existing_opt == NULL && existing_opt2 != NULL)
614 	  {
615 	    warning (0, "Extra option to %<-Xassembler%>: %s,"
616 		     " dropping all %<-Xassembler%> and %<-Wa%> options.",
617 		     existing_opt2->arg);
618 	    xassembler_options_error = true;
619 	    break;
620 	  }
621 	else if (strcmp (existing_opt->arg, existing_opt2->arg) != 0)
622 	  {
623 	    warning (0, "Options to %<-Xassembler%> do not match: %s, %s,"
624 		     " dropping all %<-Xassembler%> and %<-Wa%> options.",
625 		     existing_opt->arg, existing_opt2->arg);
626 	    xassembler_options_error = true;
627 	    break;
628 	  }
629       }
630 }
631 
632 /* Auxiliary function that frees elements of PTR and PTR itself.
633    N is number of elements to be freed.  If PTR is NULL, nothing is freed.
634    If an element is NULL, subsequent elements are not freed.  */
635 
636 static void **
free_array_of_ptrs(void ** ptr,unsigned n)637 free_array_of_ptrs (void **ptr, unsigned n)
638 {
639   if (!ptr)
640     return NULL;
641   for (unsigned i = 0; i < n; i++)
642     {
643       if (!ptr[i])
644 	break;
645       free (ptr[i]);
646     }
647   free (ptr);
648   return NULL;
649 }
650 
651 /* Parse STR, saving found tokens into PVALUES and return their number.
652    Tokens are assumed to be delimited by ':'.  If APPEND is non-null,
653    append it to every token we find.  */
654 
655 static unsigned
parse_env_var(const char * str,char *** pvalues,const char * append)656 parse_env_var (const char *str, char ***pvalues, const char *append)
657 {
658   const char *curval, *nextval;
659   char **values;
660   unsigned num = 1, i;
661 
662   curval = strchr (str, ':');
663   while (curval)
664     {
665       num++;
666       curval = strchr (curval + 1, ':');
667     }
668 
669   values = (char**) xmalloc (num * sizeof (char*));
670   curval = str;
671   nextval = strchr (curval, ':');
672   if (nextval == NULL)
673     nextval = strchr (curval, '\0');
674 
675   int append_len = append ? strlen (append) : 0;
676   for (i = 0; i < num; i++)
677     {
678       int l = nextval - curval;
679       values[i] = (char*) xmalloc (l + 1 + append_len);
680       memcpy (values[i], curval, l);
681       values[i][l] = 0;
682       if (append)
683 	strcat (values[i], append);
684       curval = nextval + 1;
685       nextval = strchr (curval, ':');
686       if (nextval == NULL)
687 	nextval = strchr (curval, '\0');
688     }
689   *pvalues = values;
690   return num;
691 }
692 
693 /* Append options OPTS from lto or offload_lto sections to ARGV_OBSTACK.  */
694 
695 static void
append_compiler_options(obstack * argv_obstack,vec<cl_decoded_option> opts)696 append_compiler_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
697 {
698   /* Append compiler driver arguments as far as they were merged.  */
699   for (unsigned int j = 1; j < opts.length (); ++j)
700     {
701       cl_decoded_option *option = &opts[j];
702 
703       /* File options have been properly filtered by lto-opts.cc.  */
704       switch (option->opt_index)
705 	{
706 	/* Drop arguments that we want to take from the link line.  */
707 	case OPT_flto_:
708 	case OPT_flto:
709 	case OPT_flto_partition_:
710 	  continue;
711 
712 	default:
713 	  break;
714 	}
715 
716       /* For now do what the original LTO option code was doing - pass
717 	 on any CL_TARGET flag and a few selected others.  */
718       switch (option->opt_index)
719 	{
720 	case OPT_fdiagnostics_show_caret:
721 	case OPT_fdiagnostics_show_labels:
722 	case OPT_fdiagnostics_show_line_numbers:
723 	case OPT_fdiagnostics_show_option:
724 	case OPT_fdiagnostics_show_location_:
725 	case OPT_fshow_column:
726 	case OPT_fPIC:
727 	case OPT_fpic:
728 	case OPT_fPIE:
729 	case OPT_fpie:
730 	case OPT_fcommon:
731 	case OPT_fgnu_tm:
732 	case OPT_fopenmp:
733 	case OPT_fopenacc:
734 	case OPT_fopenacc_dim_:
735 	case OPT_foffload_abi_:
736 	case OPT_fcf_protection_:
737 	case OPT_g:
738 	case OPT_O:
739 	case OPT_Ofast:
740 	case OPT_Og:
741 	case OPT_Os:
742 	case OPT_Oz:
743 	  break;
744 
745 	case OPT_Xassembler:
746 	  /* When we detected a mismatch in assembler options between
747 	     the input TU's fall back to previous behavior of ignoring them.  */
748 	  if (xassembler_options_error)
749 	    continue;
750 	  break;
751 
752 	default:
753 	  if (!(cl_options[option->opt_index].flags & CL_TARGET))
754 	    continue;
755 	}
756 
757       /* Pass the option on.  */
758       for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
759 	obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
760     }
761 }
762 
763 /* Append diag options in OPTS to ARGV_OBSTACK.  */
764 
765 static void
append_diag_options(obstack * argv_obstack,vec<cl_decoded_option> opts)766 append_diag_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
767 {
768   /* Append compiler driver arguments as far as they were merged.  */
769   for (unsigned int j = 1; j < opts.length (); ++j)
770     {
771       cl_decoded_option *option = &opts[j];
772 
773       switch (option->opt_index)
774 	{
775 	case OPT_fdiagnostics_color_:
776 	case OPT_fdiagnostics_format_:
777 	case OPT_fdiagnostics_show_caret:
778 	case OPT_fdiagnostics_show_labels:
779 	case OPT_fdiagnostics_show_line_numbers:
780 	case OPT_fdiagnostics_show_option:
781 	case OPT_fdiagnostics_show_location_:
782 	case OPT_fshow_column:
783 	  break;
784 	default:
785 	  continue;
786 	}
787 
788       /* Pass the option on.  */
789       for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
790 	obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
791     }
792 }
793 
794 
795 /* Append linker options OPTS to ARGV_OBSTACK.  */
796 
797 static void
append_linker_options(obstack * argv_obstack,vec<cl_decoded_option> opts)798 append_linker_options (obstack *argv_obstack, vec<cl_decoded_option> opts)
799 {
800   /* Append linker driver arguments.  Compiler options from the linker
801      driver arguments will override / merge with those from the compiler.  */
802   for (unsigned int j = 1; j < opts.length (); ++j)
803     {
804       cl_decoded_option *option = &opts[j];
805 
806       /* Do not pass on frontend specific flags not suitable for lto.  */
807       if (!(cl_options[option->opt_index].flags
808 	    & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
809 	continue;
810 
811       switch (option->opt_index)
812 	{
813 	case OPT_o:
814 	case OPT_flto_:
815 	case OPT_flto:
816 	  /* We've handled these LTO options, do not pass them on.  */
817 	  continue;
818 
819 	case OPT_fopenmp:
820 	case OPT_fopenacc:
821 	  /* Ignore -fno-XXX form of these options, as otherwise
822 	     corresponding builtins will not be enabled.  */
823 	  if (option->value == 0)
824 	    continue;
825 	  break;
826 
827 	default:
828 	  break;
829 	}
830 
831       /* Pass the option on.  */
832       for (unsigned int i = 0; i < option->canonical_option_num_elements; ++i)
833 	obstack_ptr_grow (argv_obstack, option->canonical_option[i]);
834     }
835 }
836 
837 /* Extract options for TARGET offload compiler from OPTIONS and append
838    them to ARGV_OBSTACK.  */
839 
840 static void
append_offload_options(obstack * argv_obstack,const char * target,vec<cl_decoded_option> options)841 append_offload_options (obstack *argv_obstack, const char *target,
842 			vec<cl_decoded_option> options)
843 {
844   for (unsigned i = 0; i < options.length (); i++)
845     {
846       const char *cur, *next, *opts;
847       char **argv;
848       unsigned argc;
849       cl_decoded_option *option = &options[i];
850 
851       if (option->opt_index != OPT_foffload_options_)
852 	continue;
853 
854       /* If option argument starts with '-' then no target is specified.  That
855 	 means offload options are specified for all targets, so we need to
856 	 append them.  */
857       if (option->arg[0] == '-')
858 	opts = option->arg;
859       else
860 	{
861 	  opts = strchr (option->arg, '=');
862 	  gcc_assert (opts);
863 	  cur = option->arg;
864 
865 	  while (cur < opts)
866 	    {
867 	      next = strchr (cur, ',');
868 	      if (next == NULL)
869 		next = opts;
870 	      next = (next > opts) ? opts : next;
871 
872 	      /* Are we looking for this offload target?  */
873 	      if (strlen (target) == (size_t) (next - cur)
874 		  && strncmp (target, cur, next - cur) == 0)
875 		break;
876 
877 	      /* Skip the comma or equal sign.  */
878 	      cur = next + 1;
879 	    }
880 
881 	  if (cur >= opts)
882 	    continue;
883 
884 	  opts++;
885 	}
886 
887       argv = buildargv (opts);
888       for (argc = 0; argv[argc]; argc++)
889 	obstack_ptr_grow (argv_obstack, argv[argc]);
890     }
891 }
892 
893 /* Check whether NAME can be accessed in MODE.  This is like access,
894    except that it never considers directories to be executable.  */
895 
896 static int
access_check(const char * name,int mode)897 access_check (const char *name, int mode)
898 {
899   if (mode == X_OK)
900     {
901       struct stat st;
902 
903       if (stat (name, &st) < 0
904 	  || S_ISDIR (st.st_mode))
905 	return -1;
906     }
907 
908   return access (name, mode);
909 }
910 
911 /* Prepare a target image for offload TARGET, using mkoffload tool from
912    COMPILER_PATH.  Return the name of the resultant object file.  */
913 
914 static char *
compile_offload_image(const char * target,const char * compiler_path,unsigned in_argc,char * in_argv[],vec<cl_decoded_option> compiler_opts,vec<cl_decoded_option> linker_opts)915 compile_offload_image (const char *target, const char *compiler_path,
916 		       unsigned in_argc, char *in_argv[],
917 		       vec<cl_decoded_option> compiler_opts,
918 		       vec<cl_decoded_option> linker_opts)
919 {
920   char *filename = NULL;
921   char *dumpbase;
922   char **argv;
923   char *suffix
924     = XALLOCAVEC (char, sizeof ("/accel//mkoffload") + strlen (target));
925   strcpy (suffix, "/accel/");
926   strcat (suffix, target);
927   strcat (suffix, "/mkoffload");
928 
929   char **paths = NULL;
930   unsigned n_paths = parse_env_var (compiler_path, &paths, suffix);
931 
932   const char *compiler = NULL;
933   for (unsigned i = 0; i < n_paths; i++)
934     if (access_check (paths[i], X_OK) == 0)
935       {
936 	compiler = paths[i];
937 	break;
938       }
939 #if OFFLOAD_DEFAULTED
940   if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV))
941     {
942       free_array_of_ptrs ((void **) paths, n_paths);
943       return NULL;
944     }
945 #endif
946 
947   if (!compiler)
948     fatal_error (input_location,
949 		 "could not find %s in %s (consider using %<-B%>)",
950 		 suffix + 1, compiler_path);
951 
952   dumpbase = concat (dumppfx, "x", target, NULL);
953 
954   /* Generate temporary output file name.  */
955   if (save_temps)
956     filename = concat (dumpbase, ".o", NULL);
957   else
958     filename = make_temp_file (".target.o");
959 
960   struct obstack argv_obstack;
961   obstack_init (&argv_obstack);
962   obstack_ptr_grow (&argv_obstack, compiler);
963   if (save_temps)
964     obstack_ptr_grow (&argv_obstack, "-save-temps");
965   if (verbose)
966     obstack_ptr_grow (&argv_obstack, "-v");
967   obstack_ptr_grow (&argv_obstack, "-o");
968   obstack_ptr_grow (&argv_obstack, filename);
969 
970   /* Append names of input object files.  */
971   for (unsigned i = 0; i < in_argc; i++)
972     obstack_ptr_grow (&argv_obstack, in_argv[i]);
973 
974   /* Append options from offload_lto sections.  */
975   append_compiler_options (&argv_obstack, compiler_opts);
976   append_diag_options (&argv_obstack, linker_opts);
977 
978   obstack_ptr_grow (&argv_obstack, "-dumpbase");
979   obstack_ptr_grow (&argv_obstack, dumpbase);
980 
981   /* Append options specified by -foffload last.  In case of conflicting
982      options we expect offload compiler to choose the latest.  */
983   append_offload_options (&argv_obstack, target, compiler_opts);
984   append_offload_options (&argv_obstack, target, linker_opts);
985 
986   obstack_ptr_grow (&argv_obstack, NULL);
987   argv = XOBFINISH (&argv_obstack, char **);
988   fork_execute (argv[0], argv, true, "offload_args");
989   obstack_free (&argv_obstack, NULL);
990 
991   free_array_of_ptrs ((void **) paths, n_paths);
992   return filename;
993 }
994 
995 
996 /* The main routine dealing with offloading.
997    The routine builds a target image for each offload target.  IN_ARGC and
998    IN_ARGV specify options and input object files.  As all of them could contain
999    target sections, we pass them all to target compilers.  */
1000 
1001 static void
compile_images_for_offload_targets(unsigned in_argc,char * in_argv[],vec<cl_decoded_option> compiler_opts,vec<cl_decoded_option> linker_opts)1002 compile_images_for_offload_targets (unsigned in_argc, char *in_argv[],
1003 				    vec<cl_decoded_option> compiler_opts,
1004 				    vec<cl_decoded_option> linker_opts)
1005 {
1006   char **names = NULL;
1007   const char *target_names = getenv (OFFLOAD_TARGET_NAMES_ENV);
1008   if (!target_names)
1009     return;
1010   unsigned num_targets = parse_env_var (target_names, &names, NULL);
1011   int next_name_entry = 0;
1012 
1013   const char *compiler_path = getenv ("COMPILER_PATH");
1014   if (!compiler_path)
1015     goto out;
1016 
1017   /* Prepare an image for each target and save the name of the resultant object
1018      file to the OFFLOAD_NAMES array.  It is terminated by a NULL entry.  */
1019   offload_names = XCNEWVEC (char *, num_targets + 1);
1020   for (unsigned i = 0; i < num_targets; i++)
1021     {
1022       offload_names[next_name_entry]
1023 	= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
1024 				 compiler_opts, linker_opts);
1025       if (!offload_names[next_name_entry])
1026 #if OFFLOAD_DEFAULTED
1027 	continue;
1028 #else
1029 	fatal_error (input_location,
1030 		     "problem with building target image for %s", names[i]);
1031 #endif
1032       next_name_entry++;
1033     }
1034 
1035 #if OFFLOAD_DEFAULTED
1036   if (next_name_entry == 0)
1037     {
1038       free (offload_names);
1039       offload_names = NULL;
1040     }
1041 #endif
1042 
1043  out:
1044   free_array_of_ptrs ((void **) names, num_targets);
1045 }
1046 
1047 /* Copy a file from SRC to DEST.  */
1048 
1049 static void
copy_file(const char * dest,const char * src)1050 copy_file (const char *dest, const char *src)
1051 {
1052   FILE *d = fopen (dest, "wb");
1053   FILE *s = fopen (src, "rb");
1054   char buffer[512];
1055   while (!feof (s))
1056     {
1057       size_t len = fread (buffer, 1, 512, s);
1058       if (ferror (s) != 0)
1059 	fatal_error (input_location, "reading input file");
1060       if (len > 0)
1061 	{
1062 	  fwrite (buffer, 1, len, d);
1063 	  if (ferror (d) != 0)
1064 	    fatal_error (input_location, "writing output file");
1065 	}
1066     }
1067   fclose (d);
1068   fclose (s);
1069 }
1070 
1071 /* Find the crtoffloadtable.o file in LIBRARY_PATH, make copy and pass name of
1072    the copy to the linker.  */
1073 
1074 static void
find_crtoffloadtable(int save_temps,const char * dumppfx)1075 find_crtoffloadtable (int save_temps, const char *dumppfx)
1076 {
1077   char **paths = NULL;
1078   const char *library_path = getenv ("LIBRARY_PATH");
1079   if (!library_path)
1080     return;
1081   unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o");
1082 
1083   unsigned i;
1084   for (i = 0; i < n_paths; i++)
1085     if (access_check (paths[i], R_OK) == 0)
1086       {
1087 	/* The linker will delete the filename we give it, so make a copy.  */
1088 	char *crtoffloadtable;
1089 	if (!save_temps)
1090 	  crtoffloadtable = make_temp_file (".crtoffloadtable.o");
1091 	else
1092 	  crtoffloadtable = concat (dumppfx, "crtoffloadtable.o", NULL);
1093 	copy_file (crtoffloadtable, paths[i]);
1094 	printf ("%s\n", crtoffloadtable);
1095 	XDELETEVEC (crtoffloadtable);
1096 	break;
1097       }
1098   if (i == n_paths)
1099     fatal_error (input_location,
1100 		 "installation error, cannot find %<crtoffloadtable.o%>");
1101 
1102   free_array_of_ptrs ((void **) paths, n_paths);
1103 }
1104 
1105 /* A subroutine of run_gcc.  Examine the open file FD for lto sections with
1106    name prefix PREFIX, at FILE_OFFSET, and store any options we find in OPTS.
1107    Return true if we found a matching section, false
1108    otherwise.  COLLECT_GCC holds the value of the environment variable with
1109    the same name.  */
1110 
1111 static bool
find_and_merge_options(int fd,off_t file_offset,const char * prefix,vec<cl_decoded_option> decoded_cl_options,bool first,vec<cl_decoded_option> * opts,const char * collect_gcc)1112 find_and_merge_options (int fd, off_t file_offset, const char *prefix,
1113 			vec<cl_decoded_option> decoded_cl_options, bool first,
1114 			vec<cl_decoded_option> *opts, const char *collect_gcc)
1115 {
1116   off_t offset, length;
1117   char *data;
1118   char *fopts;
1119   const char *errmsg;
1120   int err;
1121   vec<cl_decoded_option> fdecoded_options;
1122 
1123   if (!first)
1124     fdecoded_options = *opts;
1125 
1126   simple_object_read *sobj;
1127   sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
1128 				   &errmsg, &err);
1129   if (!sobj)
1130     return false;
1131 
1132   char *secname = XALLOCAVEC (char, strlen (prefix) + sizeof (".opts"));
1133   strcpy (secname, prefix);
1134   strcat (secname, ".opts");
1135   if (!simple_object_find_section (sobj, secname, &offset, &length,
1136 				   &errmsg, &err))
1137     {
1138       simple_object_release_read (sobj);
1139       return false;
1140     }
1141 
1142   lseek (fd, file_offset + offset, SEEK_SET);
1143   data = (char *)xmalloc (length);
1144   read (fd, data, length);
1145   fopts = data;
1146   do
1147     {
1148       vec<cl_decoded_option> f2decoded_options
1149 	= get_options_from_collect_gcc_options (collect_gcc, fopts);
1150       if (first)
1151 	{
1152 	  fdecoded_options = f2decoded_options;
1153 	  first = false;
1154 	}
1155       else
1156 	merge_and_complain (fdecoded_options, f2decoded_options,
1157 			    decoded_cl_options);
1158 
1159       fopts += strlen (fopts) + 1;
1160     }
1161   while (fopts - data < length);
1162 
1163   free (data);
1164   simple_object_release_read (sobj);
1165   *opts = fdecoded_options;
1166   return true;
1167 }
1168 
1169 /* Copy early debug info sections from INFILE to a new file whose name
1170    is returned.  Return NULL on error.  */
1171 
1172 const char *
debug_objcopy(const char * infile,bool rename)1173 debug_objcopy (const char *infile, bool rename)
1174 {
1175   char *outfile;
1176   const char *errmsg;
1177   int err;
1178 
1179   const char *p;
1180   const char *orig_infile = infile;
1181   off_t inoff = 0;
1182   long loffset;
1183   int consumed;
1184   if ((p = strrchr (infile, '@'))
1185       && p != infile
1186       && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1187       && strlen (p) == (unsigned int) consumed)
1188     {
1189       char *fname = xstrdup (infile);
1190       fname[p - infile] = '\0';
1191       infile = fname;
1192       inoff = (off_t) loffset;
1193     }
1194   int infd = open (infile, O_RDONLY | O_BINARY);
1195   if (infd == -1)
1196     return NULL;
1197   simple_object_read *inobj = simple_object_start_read (infd, inoff,
1198 							"__GNU_LTO",
1199 							&errmsg, &err);
1200   if (!inobj)
1201     return NULL;
1202 
1203   off_t off, len;
1204   if (simple_object_find_section (inobj, ".gnu.debuglto_.debug_info",
1205 				  &off, &len, &errmsg, &err) != 1)
1206     {
1207       if (errmsg)
1208 	fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1209 
1210       simple_object_release_read (inobj);
1211       close (infd);
1212       return NULL;
1213     }
1214 
1215   if (save_temps)
1216     outfile = concat (orig_infile, ".debug.temp.o", NULL);
1217   else
1218     outfile = make_temp_file (".debug.temp.o");
1219   errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
1220   if (errmsg)
1221     {
1222       unlink_if_ordinary (outfile);
1223       fatal_error (0, "%s: %s", errmsg, xstrerror (err));
1224     }
1225 
1226   simple_object_release_read (inobj);
1227   close (infd);
1228 
1229   return outfile;
1230 }
1231 
1232 /* Helper for qsort: compare priorities for parallel compilation.  */
1233 
1234 int
cmp_priority(const void * a,const void * b)1235 cmp_priority (const void *a, const void *b)
1236 {
1237   return *((const int *)b)-*((const int *)a);
1238 }
1239 
1240 /* Number of CPUs that can be used for parallel LTRANS phase.  */
1241 
1242 static unsigned long nthreads_var = 0;
1243 
1244 #ifdef HAVE_PTHREAD_AFFINITY_NP
1245 unsigned long cpuset_size;
1246 static unsigned long get_cpuset_size;
1247 cpu_set_t *cpusetp;
1248 
1249 unsigned long
cpuset_popcount(unsigned long cpusetsize,cpu_set_t * cpusetp)1250 static cpuset_popcount (unsigned long cpusetsize, cpu_set_t *cpusetp)
1251 {
1252 #ifdef CPU_COUNT_S
1253   /* glibc 2.7 and above provide a macro for this.  */
1254   return CPU_COUNT_S (cpusetsize, cpusetp);
1255 #else
1256 #ifdef CPU_COUNT
1257   if (cpusetsize == sizeof (cpu_set_t))
1258     /* glibc 2.6 and above provide a macro for this.  */
1259     return CPU_COUNT (cpusetp);
1260 #endif
1261   size_t i;
1262   unsigned long ret = 0;
1263   STATIC_ASSERT (sizeof (cpusetp->__bits[0]) == sizeof (unsigned long int));
1264   for (i = 0; i < cpusetsize / sizeof (cpusetp->__bits[0]); i++)
1265     {
1266       unsigned long int mask = cpusetp->__bits[i];
1267       if (mask == 0)
1268 	continue;
1269       ret += __builtin_popcountl (mask);
1270     }
1271   return ret;
1272 #endif
1273 }
1274 #endif
1275 
1276 /* At startup, determine the default number of threads.  It would seem
1277    this should be related to the number of cpus online.  */
1278 
1279 static void
init_num_threads(void)1280 init_num_threads (void)
1281 {
1282 #ifdef HAVE_PTHREAD_AFFINITY_NP
1283 #if defined (_SC_NPROCESSORS_CONF) && defined (CPU_ALLOC_SIZE)
1284   cpuset_size = sysconf (_SC_NPROCESSORS_CONF);
1285   cpuset_size = CPU_ALLOC_SIZE (cpuset_size);
1286 #else
1287   cpuset_size = sizeof (cpu_set_t);
1288 #endif
1289 
1290   cpusetp = (cpu_set_t *) xmalloc (gomp_cpuset_size);
1291   do
1292     {
1293       int ret = pthread_getaffinity_np (pthread_self (), gomp_cpuset_size,
1294 					cpusetp);
1295       if (ret == 0)
1296 	{
1297 	  /* Count only the CPUs this process can use.  */
1298 	  nthreads_var = cpuset_popcount (cpuset_size, cpusetp);
1299 	  if (nthreads_var == 0)
1300 	    break;
1301 	  get_cpuset_size = cpuset_size;
1302 #ifdef CPU_ALLOC_SIZE
1303 	  unsigned long i;
1304 	  for (i = cpuset_size * 8; i; i--)
1305 	    if (CPU_ISSET_S (i - 1, cpuset_size, cpusetp))
1306 	      break;
1307 	  cpuset_size = CPU_ALLOC_SIZE (i);
1308 #endif
1309 	  return;
1310 	}
1311       if (ret != EINVAL)
1312 	break;
1313 #ifdef CPU_ALLOC_SIZE
1314       if (cpuset_size < sizeof (cpu_set_t))
1315 	cpuset_size = sizeof (cpu_set_t);
1316       else
1317 	cpuset_size = cpuset_size * 2;
1318       if (cpuset_size < 8 * sizeof (cpu_set_t))
1319 	cpusetp
1320 	  = (cpu_set_t *) realloc (cpusetp, cpuset_size);
1321       else
1322 	{
1323 	  /* Avoid fatal if too large memory allocation would be
1324 	     requested, e.g. kernel returning EINVAL all the time.  */
1325 	  void *p = realloc (cpusetp, cpuset_size);
1326 	  if (p == NULL)
1327 	    break;
1328 	  cpusetp = (cpu_set_t *) p;
1329 	}
1330 #else
1331       break;
1332 #endif
1333     }
1334   while (1);
1335   cpuset_size = 0;
1336   nthreads_var = 1;
1337   free (cpusetp);
1338   cpusetp = NULL;
1339 #endif
1340 #ifdef _SC_NPROCESSORS_ONLN
1341   nthreads_var = sysconf (_SC_NPROCESSORS_ONLN);
1342 #endif
1343 }
1344 
1345 /* Print link to -flto documentation with a hint message.  */
1346 
1347 void
print_lto_docs_link()1348 print_lto_docs_link ()
1349 {
1350   bool print_url = global_dc->printer->url_format != URL_FORMAT_NONE;
1351   const char *url = global_dc->get_option_url (global_dc, OPT_flto);
1352 
1353   pretty_printer pp;
1354   pp.url_format = URL_FORMAT_DEFAULT;
1355   pp_string (&pp, "see the ");
1356   if (print_url)
1357     pp_begin_url (&pp, url);
1358   pp_string (&pp, "%<-flto%> option documentation");
1359   if (print_url)
1360     pp_end_url (&pp);
1361   pp_string (&pp, " for more information");
1362   inform (UNKNOWN_LOCATION, pp_formatted_text (&pp));
1363 }
1364 
1365 /* Test that a make command is present and working, return true if so.  */
1366 
1367 static bool
make_exists(void)1368 make_exists (void)
1369 {
1370   const char *make = "make";
1371   char **make_argv = buildargv (getenv ("MAKE"));
1372   if (make_argv)
1373     make = make_argv[0];
1374   const char *make_args[] = {make, "--version", NULL};
1375 
1376   int exit_status = 0;
1377   int err = 0;
1378   const char *errmsg
1379     = pex_one (PEX_SEARCH, make_args[0], CONST_CAST (char **, make_args),
1380 	       "make", NULL, NULL, &exit_status, &err);
1381   freeargv (make_argv);
1382   return errmsg == NULL && exit_status == 0 && err == 0;
1383 }
1384 
1385 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
1386 
1387 static void
run_gcc(unsigned argc,char * argv[])1388 run_gcc (unsigned argc, char *argv[])
1389 {
1390   unsigned i, j;
1391   const char **new_argv;
1392   const char **argv_ptr;
1393   char *list_option_full = NULL;
1394   const char *linker_output = NULL;
1395   const char *collect_gcc;
1396   char *collect_gcc_options;
1397   int parallel = 0;
1398   int jobserver = 0;
1399   bool jobserver_requested = false;
1400   int auto_parallel = 0;
1401   bool no_partition = false;
1402   bool fdecoded_options_first = true;
1403   vec<cl_decoded_option> fdecoded_options;
1404   fdecoded_options.create (16);
1405   bool offload_fdecoded_options_first = true;
1406   vec<cl_decoded_option> offload_fdecoded_options = vNULL;
1407   struct obstack argv_obstack;
1408   int new_head_argc;
1409   bool have_lto = false;
1410   bool have_offload = false;
1411   unsigned lto_argc = 0, ltoobj_argc = 0;
1412   char **lto_argv, **ltoobj_argv;
1413   bool linker_output_rel = false;
1414   bool skip_debug = false;
1415   unsigned n_debugobj;
1416   const char *incoming_dumppfx = dumppfx = NULL;
1417   static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
1418 
1419   /* Get the driver and options.  */
1420   collect_gcc = getenv ("COLLECT_GCC");
1421   if (!collect_gcc)
1422     fatal_error (input_location,
1423 		 "environment variable %<COLLECT_GCC%> must be set");
1424   collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
1425   if (!collect_gcc_options)
1426     fatal_error (input_location,
1427 		 "environment variable %<COLLECT_GCC_OPTIONS%> must be set");
1428 
1429   char *collect_as_options = getenv ("COLLECT_AS_OPTIONS");
1430 
1431   /* Prepend -Xassembler to each option, and append the string
1432      to collect_gcc_options.  */
1433   if (collect_as_options)
1434     {
1435       obstack temporary_obstack;
1436       obstack_init (&temporary_obstack);
1437 
1438       prepend_xassembler_to_collect_as_options (collect_as_options,
1439 						&temporary_obstack);
1440       obstack_1grow (&temporary_obstack, '\0');
1441 
1442       char *xassembler_opts_string
1443 	= XOBFINISH (&temporary_obstack, char *);
1444       collect_gcc_options = concat (collect_gcc_options, xassembler_opts_string,
1445 				    NULL);
1446     }
1447 
1448   vec<cl_decoded_option> decoded_options
1449     = get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options);
1450 
1451   /* Allocate array for input object files with LTO IL,
1452      and for possible preceding arguments.  */
1453   lto_argv = XNEWVEC (char *, argc);
1454   ltoobj_argv = XNEWVEC (char *, argc);
1455 
1456   /* Look at saved options in the IL files.  */
1457   for (i = 1; i < argc; ++i)
1458     {
1459       char *p;
1460       int fd;
1461       off_t file_offset = 0;
1462       long loffset;
1463       int consumed;
1464       char *filename = argv[i];
1465 
1466       if (startswith (argv[i], "-foffload-objects="))
1467 	{
1468 	  have_offload = true;
1469 	  offload_objects_file_name
1470 	    = argv[i] + sizeof ("-foffload-objects=") - 1;
1471 	  continue;
1472 	}
1473 
1474       if ((p = strrchr (argv[i], '@'))
1475 	  && p != argv[i]
1476 	  && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1477 	  && strlen (p) == (unsigned int) consumed)
1478 	{
1479 	  filename = XNEWVEC (char, p - argv[i] + 1);
1480 	  memcpy (filename, argv[i], p - argv[i]);
1481 	  filename[p - argv[i]] = '\0';
1482 	  file_offset = (off_t) loffset;
1483 	}
1484       fd = open (filename, O_RDONLY | O_BINARY);
1485       /* Linker plugin passes -fresolution and -flinker-output options.
1486 	 -flinker-output is passed only when user did not specify one and thus
1487 	 we do not need to worry about duplicities with the option handling
1488 	 below. */
1489       if (fd == -1)
1490 	{
1491 	  lto_argv[lto_argc++] = argv[i];
1492 	  if (strcmp (argv[i], "-flinker-output=rel") == 0)
1493 	    linker_output_rel = true;
1494 	  continue;
1495 	}
1496 
1497       if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
1498 				  decoded_options, fdecoded_options_first,
1499 				  &fdecoded_options,
1500 				  collect_gcc))
1501 	{
1502 	  have_lto = true;
1503 	  ltoobj_argv[ltoobj_argc++] = argv[i];
1504 	  fdecoded_options_first = false;
1505 	}
1506       close (fd);
1507     }
1508 
1509   /* Initalize the common arguments for the driver.  */
1510   obstack_init (&argv_obstack);
1511   obstack_ptr_grow (&argv_obstack, collect_gcc);
1512   obstack_ptr_grow (&argv_obstack, "-xlto");
1513   obstack_ptr_grow (&argv_obstack, "-c");
1514 
1515   append_compiler_options (&argv_obstack, fdecoded_options);
1516   append_linker_options (&argv_obstack, decoded_options);
1517 
1518   /* Scan linker driver arguments for things that are of relevance to us.  */
1519   for (j = 1; j < decoded_options.length (); ++j)
1520     {
1521       cl_decoded_option *option = &decoded_options[j];
1522       switch (option->opt_index)
1523 	{
1524 	case OPT_o:
1525 	  linker_output = option->arg;
1526 	  break;
1527 
1528 	  /* We don't have to distinguish between -save-temps=* and
1529 	     -save-temps, -dumpdir already carries that
1530 	     information.  */
1531 	case OPT_save_temps_:
1532 	case OPT_save_temps:
1533 	  save_temps = 1;
1534 	  break;
1535 
1536 	case OPT_v:
1537 	  verbose = 1;
1538 	  break;
1539 
1540 	case OPT_flto_partition_:
1541 	  if (strcmp (option->arg, "none") == 0)
1542 	    no_partition = true;
1543 	  break;
1544 
1545 	case OPT_flto_:
1546 	  /* Override IL file settings with a linker -flto= option.  */
1547 	  merge_flto_options (fdecoded_options, option, true);
1548 	  if (strcmp (option->arg, "jobserver") == 0)
1549 	    jobserver_requested = true;
1550 	  break;
1551 
1552 	case OPT_flinker_output_:
1553 	  linker_output_rel = !strcmp (option->arg, "rel");
1554 	  break;
1555 
1556 	case OPT_g:
1557 	  /* Recognize -g0.  */
1558 	  skip_debug = option->arg && !strcmp (option->arg, "0");
1559 	  break;
1560 
1561 	case OPT_gbtf:
1562 	case OPT_gctf:
1563 	case OPT_gdwarf:
1564 	case OPT_gdwarf_:
1565 	case OPT_ggdb:
1566 	case OPT_gvms:
1567 	  /* Negative forms, if allowed, enable debug info as well.  */
1568 	  skip_debug = false;
1569 	  break;
1570 
1571 	case OPT_dumpdir:
1572 	  incoming_dumppfx = dumppfx = option->arg;
1573 	  break;
1574 
1575 	case OPT_fdiagnostics_urls_:
1576 	  diagnostic_urls_init (global_dc, option->value);
1577 	  break;
1578 
1579 	case OPT_fdiagnostics_color_:
1580 	  diagnostic_color_init (global_dc, option->value);
1581 	  break;
1582 
1583 	default:
1584 	  break;
1585 	}
1586     }
1587 
1588   /* Process LTO-related options on merged options.  */
1589   for (j = 1; j < fdecoded_options.length (); ++j)
1590     {
1591       cl_decoded_option *option = &fdecoded_options[j];
1592       switch (option->opt_index)
1593 	{
1594 	case OPT_flto_:
1595 	  if (strcmp (option->arg, "jobserver") == 0)
1596 	    {
1597 	      parallel = 1;
1598 	      jobserver = 1;
1599 	    }
1600 	  else if (strcmp (option->arg, "auto") == 0)
1601 	    {
1602 	      parallel = 1;
1603 	      auto_parallel = 1;
1604 	    }
1605 	  else
1606 	    {
1607 	      parallel = atoi (option->arg);
1608 	      if (parallel <= 1)
1609 		parallel = 0;
1610 	    }
1611 	  /* Fallthru.  */
1612 
1613 	case OPT_flto:
1614 	  lto_mode = LTO_MODE_WHOPR;
1615 	  break;
1616 	}
1617     }
1618 
1619   /* Output lto-wrapper invocation command.  */
1620   if (verbose)
1621     {
1622       for (i = 0; i < argc; ++i)
1623 	{
1624 	  fputs (argv[i], stderr);
1625 	  fputc (' ', stderr);
1626 	}
1627       fputc ('\n', stderr);
1628     }
1629 
1630   if (linker_output_rel)
1631     no_partition = true;
1632 
1633   if (no_partition)
1634     {
1635       lto_mode = LTO_MODE_LTO;
1636       jobserver = 0;
1637       jobserver_requested = false;
1638       auto_parallel = 0;
1639       parallel = 0;
1640     }
1641   else
1642     {
1643       jobserver_info jinfo;
1644       if (jobserver && !jinfo.is_active)
1645 	{
1646 	  /* Fall back to auto parallelism.  */
1647 	  jobserver = 0;
1648 	  auto_parallel = 1;
1649 	}
1650       else if (!jobserver && jinfo.is_active)
1651 	{
1652 	  parallel = 1;
1653 	  jobserver = 1;
1654 	}
1655     }
1656 
1657   /* We need make working for a parallel execution.  */
1658   if (parallel && !make_exists ())
1659     parallel = 0;
1660 
1661   if (!dumppfx)
1662     {
1663       if (!linker_output
1664 	  || strcmp (linker_output, HOST_BIT_BUCKET) == 0)
1665 	dumppfx = "a.";
1666       else
1667 	{
1668 	  const char *obase = lbasename (linker_output), *temp;
1669 
1670 	  /* Strip the executable extension.  */
1671 	  size_t blen = strlen (obase), xlen;
1672 	  if ((temp = strrchr (obase + 1, '.'))
1673 	      && (xlen = strlen (temp))
1674 	      && (strcmp (temp, ".exe") == 0
1675 #if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
1676 		  || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
1677 #endif
1678 		  || strcmp (obase, "a.out") == 0))
1679 	    dumppfx = xstrndup (linker_output,
1680 				obase - linker_output + blen - xlen + 1);
1681 	  else
1682 	    dumppfx = concat (linker_output, ".", NULL);
1683 	}
1684     }
1685 
1686   /* If there's no directory component in the dumppfx, add one, so
1687      that, when it is used as -dumpbase, it overrides any occurrence
1688      of -dumpdir that might have been passed in.  */
1689   if (!dumppfx || lbasename (dumppfx) == dumppfx)
1690     dumppfx = concat (current_dir, dumppfx, NULL);
1691 
1692   /* Make sure some -dumpdir is passed, so as to get predictable
1693      -dumpbase overriding semantics.  If we got an incoming -dumpdir
1694      argument, we'll pass it on, so don't bother with another one
1695      then.  */
1696   if (!incoming_dumppfx)
1697     {
1698       obstack_ptr_grow (&argv_obstack, "-dumpdir");
1699       obstack_ptr_grow (&argv_obstack, "");
1700     }
1701   obstack_ptr_grow (&argv_obstack, "-dumpbase");
1702 
1703   /* Remember at which point we can scrub args to re-use the commons.  */
1704   new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
1705 
1706   if (have_offload)
1707     {
1708       unsigned i, num_offload_files;
1709       char **offload_argv;
1710       FILE *f;
1711 
1712       f = fopen (offload_objects_file_name, "r");
1713       if (f == NULL)
1714 	fatal_error (input_location, "cannot open %s: %m",
1715 		     offload_objects_file_name);
1716       if (fscanf (f, "%u ", &num_offload_files) != 1)
1717 	fatal_error (input_location, "cannot read %s: %m",
1718 		     offload_objects_file_name);
1719       offload_argv = XCNEWVEC (char *, num_offload_files);
1720 
1721       /* Read names of object files with offload.  */
1722       for (i = 0; i < num_offload_files; i++)
1723 	{
1724 	  const unsigned piece = 32;
1725 	  char *buf, *filename = XNEWVEC (char, piece);
1726 	  size_t len;
1727 
1728 	  buf = filename;
1729 cont1:
1730 	  if (!fgets (buf, piece, f))
1731 	    break;
1732 	  len = strlen (filename);
1733 	  if (filename[len - 1] != '\n')
1734 	    {
1735 	      filename = XRESIZEVEC (char, filename, len + piece);
1736 	      buf = filename + len;
1737 	      goto cont1;
1738 	    }
1739 	  filename[len - 1] = '\0';
1740 	  offload_argv[i] = filename;
1741 	}
1742       fclose (f);
1743       if (offload_argv[num_offload_files - 1] == NULL)
1744 	fatal_error (input_location, "invalid format of %s",
1745 		     offload_objects_file_name);
1746       maybe_unlink (offload_objects_file_name);
1747       offload_objects_file_name = NULL;
1748 
1749       /* Look at saved offload options in files.  */
1750       for (i = 0; i < num_offload_files; i++)
1751 	{
1752 	  char *p;
1753 	  long loffset;
1754 	  int fd, consumed;
1755 	  off_t file_offset = 0;
1756 	  char *filename = offload_argv[i];
1757 
1758 	  if ((p = strrchr (offload_argv[i], '@'))
1759 	      && p != offload_argv[i]
1760 	      && sscanf (p, "@%li%n", &loffset, &consumed) >= 1
1761 	      && strlen (p) == (unsigned int) consumed)
1762 	    {
1763 	      filename = XNEWVEC (char, p - offload_argv[i] + 1);
1764 	      memcpy (filename, offload_argv[i], p - offload_argv[i]);
1765 	      filename[p - offload_argv[i]] = '\0';
1766 	      file_offset = (off_t) loffset;
1767 	    }
1768 	  fd = open (filename, O_RDONLY | O_BINARY);
1769 	  if (fd == -1)
1770 	    fatal_error (input_location, "cannot open %s: %m", filename);
1771 	  if (!find_and_merge_options (fd, file_offset,
1772 				       OFFLOAD_SECTION_NAME_PREFIX,
1773 				       decoded_options,
1774 				       offload_fdecoded_options_first,
1775 				       &offload_fdecoded_options,
1776 				       collect_gcc))
1777 	    fatal_error (input_location, "cannot read %s: %m", filename);
1778 	  offload_fdecoded_options_first = false;
1779 	  close (fd);
1780 	  if (filename != offload_argv[i])
1781 	    XDELETEVEC (filename);
1782 	}
1783 
1784       compile_images_for_offload_targets (num_offload_files, offload_argv,
1785 					  offload_fdecoded_options, decoded_options);
1786 
1787       free_array_of_ptrs ((void **) offload_argv, num_offload_files);
1788 
1789       if (offload_names)
1790 	{
1791 	  find_crtoffloadtable (save_temps, dumppfx);
1792 	  for (i = 0; offload_names[i]; i++)
1793 	    printf ("%s\n", offload_names[i]);
1794 	  free_array_of_ptrs ((void **) offload_names, i);
1795 	}
1796     }
1797 
1798   /* If object files contain offload sections, but do not contain LTO sections,
1799      then there is no need to perform a link-time recompilation, i.e.
1800      lto-wrapper is used only for a compilation of offload images.  */
1801   if (have_offload && !have_lto)
1802     goto finish;
1803 
1804   if (lto_mode == LTO_MODE_LTO)
1805     {
1806       /* -dumpbase argument for LTO.  */
1807       flto_out = concat (dumppfx, "lto.o", NULL);
1808       obstack_ptr_grow (&argv_obstack, flto_out);
1809 
1810       if (!save_temps)
1811 	flto_out = make_temp_file (".lto.o");
1812       obstack_ptr_grow (&argv_obstack, "-o");
1813       obstack_ptr_grow (&argv_obstack, flto_out);
1814     }
1815   else
1816     {
1817       const char *list_option = "-fltrans-output-list=";
1818 
1819       /* -dumpbase argument for WPA.  */
1820       char *dumpbase = concat (dumppfx, "wpa", NULL);
1821       obstack_ptr_grow (&argv_obstack, dumpbase);
1822 
1823       if (save_temps)
1824 	ltrans_output_file = concat (dumppfx, "ltrans.out", NULL);
1825       else
1826 	ltrans_output_file = make_temp_file (".ltrans.out");
1827       list_option_full = concat (list_option, ltrans_output_file, NULL);
1828       obstack_ptr_grow (&argv_obstack, list_option_full);
1829 
1830       if (jobserver)
1831 	{
1832 	  if (verbose)
1833 	    fprintf (stderr, "Using make jobserver\n");
1834 	  obstack_ptr_grow (&argv_obstack, xstrdup ("-fwpa=jobserver"));
1835 	}
1836       else if (auto_parallel)
1837 	{
1838 	  char buf[256];
1839 	  init_num_threads ();
1840 	  if (nthreads_var == 0)
1841 	    nthreads_var = 1;
1842 	  if (verbose)
1843 	    fprintf (stderr, "LTO parallelism level set to %ld\n",
1844 		     nthreads_var);
1845 	  sprintf (buf, "-fwpa=%ld", nthreads_var);
1846 	  obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1847 	}
1848       else if (parallel > 1)
1849 	{
1850 	  char buf[256];
1851 	  sprintf (buf, "-fwpa=%i", parallel);
1852 	  obstack_ptr_grow (&argv_obstack, xstrdup (buf));
1853 	}
1854       else
1855         obstack_ptr_grow (&argv_obstack, "-fwpa");
1856     }
1857 
1858   /* Append input arguments.  */
1859   for (i = 0; i < lto_argc; ++i)
1860     obstack_ptr_grow (&argv_obstack, lto_argv[i]);
1861   /* Append the input objects.  */
1862   for (i = 0; i < ltoobj_argc; ++i)
1863     obstack_ptr_grow (&argv_obstack, ltoobj_argv[i]);
1864   obstack_ptr_grow (&argv_obstack, NULL);
1865 
1866   new_argv = XOBFINISH (&argv_obstack, const char **);
1867   argv_ptr = &new_argv[new_head_argc];
1868   fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true,
1869 		"ltrans_args");
1870 
1871   /* Copy the early generated debug info from the objects to temporary
1872      files and append those to the partial link commandline.  */
1873   n_debugobj = 0;
1874   early_debug_object_names = NULL;
1875   if (! skip_debug)
1876     {
1877       early_debug_object_names = XCNEWVEC (const char *, ltoobj_argc+ 1);
1878       num_deb_objs = ltoobj_argc;
1879       for (i = 0; i < ltoobj_argc; ++i)
1880 	{
1881 	  const char *tem;
1882 	  if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
1883 	    {
1884 	      early_debug_object_names[i] = tem;
1885 	      n_debugobj++;
1886 	    }
1887 	}
1888     }
1889 
1890   if (lto_mode == LTO_MODE_LTO)
1891     {
1892       printf ("%s\n", flto_out);
1893       if (!skip_debug)
1894 	{
1895 	  for (i = 0; i < ltoobj_argc; ++i)
1896 	    if (early_debug_object_names[i] != NULL)
1897 	      printf ("%s\n", early_debug_object_names[i]);
1898 	}
1899       /* These now belong to collect2.  */
1900       free (flto_out);
1901       flto_out = NULL;
1902       free (early_debug_object_names);
1903       early_debug_object_names = NULL;
1904     }
1905   else
1906     {
1907       FILE *stream = fopen (ltrans_output_file, "r");
1908       FILE *mstream = NULL;
1909       struct obstack env_obstack;
1910       int priority;
1911 
1912       if (!stream)
1913 	fatal_error (input_location, "%<fopen%>: %s: %m", ltrans_output_file);
1914 
1915       /* Parse the list of LTRANS inputs from the WPA stage.  */
1916       obstack_init (&env_obstack);
1917       nr = 0;
1918       for (;;)
1919 	{
1920 	  const unsigned piece = 32;
1921 	  char *output_name = NULL;
1922 	  char *buf, *input_name = (char *)xmalloc (piece);
1923 	  size_t len;
1924 
1925 	  buf = input_name;
1926           if (fscanf (stream, "%i\n", &priority) != 1)
1927 	    {
1928 	      if (!feof (stream))
1929 	        fatal_error (input_location,
1930 		             "corrupted ltrans output file %s",
1931 			     ltrans_output_file);
1932 	      break;
1933 	    }
1934 cont:
1935 	  if (!fgets (buf, piece, stream))
1936 	    break;
1937 	  len = strlen (input_name);
1938 	  if (input_name[len - 1] != '\n')
1939 	    {
1940 	      input_name = (char *)xrealloc (input_name, len + piece);
1941 	      buf = input_name + len;
1942 	      goto cont;
1943 	    }
1944 	  input_name[len - 1] = '\0';
1945 
1946 	  if (input_name[0] == '*')
1947 	    output_name = &input_name[1];
1948 
1949 	  nr++;
1950 	  ltrans_priorities
1951 	     = (int *)xrealloc (ltrans_priorities, nr * sizeof (int) * 2);
1952 	  input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
1953 	  output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
1954 	  ltrans_priorities[(nr-1)*2] = priority;
1955 	  ltrans_priorities[(nr-1)*2+1] = nr-1;
1956 	  input_names[nr-1] = input_name;
1957 	  output_names[nr-1] = output_name;
1958 	}
1959       fclose (stream);
1960       maybe_unlink (ltrans_output_file);
1961       ltrans_output_file = NULL;
1962 
1963       if (nr > 1)
1964 	{
1965 	  jobserver_info jinfo;
1966 	  if (jobserver_requested && !jinfo.is_active)
1967 	    {
1968 	      warning (0, jinfo.error_msg.c_str ());
1969 	      print_lto_docs_link ();
1970 	    }
1971 	  else if (parallel == 0)
1972 	    {
1973 	      warning (0, "using serial compilation of %d LTRANS jobs", nr);
1974 	      print_lto_docs_link ();
1975 	    }
1976 	}
1977 
1978       if (parallel)
1979 	{
1980 	  makefile = make_temp_file (".mk");
1981 	  mstream = fopen (makefile, "w");
1982 	  qsort (ltrans_priorities, nr, sizeof (int) * 2, cmp_priority);
1983 	}
1984 
1985       /* Execute the LTRANS stage for each input file (or prepare a
1986 	 makefile to invoke this in parallel).  */
1987       for (i = 0; i < nr; ++i)
1988 	{
1989 	  char *output_name;
1990 	  char *input_name = input_names[i];
1991 	  /* If it's a pass-through file do nothing.  */
1992 	  if (output_names[i])
1993 	    continue;
1994 
1995 	  /* Replace the .o suffix with a .ltrans.o suffix and write
1996 	     the resulting name to the LTRANS output list.  */
1997 	  obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
1998 	  obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
1999 	  output_name = XOBFINISH (&env_obstack, char *);
2000 
2001 	  /* Adjust the dumpbase if the linker output file was seen.  */
2002 	  int dumpbase_len = (strlen (dumppfx)
2003 			      + sizeof (DUMPBASE_SUFFIX)
2004 			      + sizeof (".ltrans"));
2005 	  char *dumpbase = (char *) xmalloc (dumpbase_len + 1);
2006 	  snprintf (dumpbase, dumpbase_len, "%sltrans%u.ltrans", dumppfx, i);
2007 	  argv_ptr[0] = dumpbase;
2008 
2009 	  argv_ptr[1] = "-fltrans";
2010 	  argv_ptr[2] = "-o";
2011 	  argv_ptr[3] = output_name;
2012 	  argv_ptr[4] = input_name;
2013 	  argv_ptr[5] = NULL;
2014 	  if (parallel)
2015 	    {
2016 	      fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
2017 	      for (j = 1; new_argv[j] != NULL; ++j)
2018 		fprintf (mstream, " '%s'", new_argv[j]);
2019 	      fprintf (mstream, "\n");
2020 	      /* If we are not preserving the ltrans input files then
2021 	         truncate them as soon as we have processed it.  This
2022 		 reduces temporary disk-space usage.  */
2023 	      if (! save_temps)
2024 		fprintf (mstream, "\t@-touch -r %s %s.tem > /dev/null 2>&1 "
2025 			 "&& mv %s.tem %s\n",
2026 			 input_name, input_name, input_name, input_name);
2027 	    }
2028 	  else
2029 	    {
2030 	      char argsuffix[sizeof (DUMPBASE_SUFFIX)
2031 			     + sizeof (".ltrans_args") + 1];
2032 	      if (save_temps)
2033 		snprintf (argsuffix,
2034 			  sizeof (DUMPBASE_SUFFIX) + sizeof (".ltrans_args"),
2035 			  "ltrans%u.ltrans_args", i);
2036 	      fork_execute (new_argv[0], CONST_CAST (char **, new_argv),
2037 			    true, save_temps ? argsuffix : NULL);
2038 	      maybe_unlink (input_name);
2039 	    }
2040 
2041 	  output_names[i] = output_name;
2042 	}
2043       if (parallel)
2044 	{
2045 	  struct pex_obj *pex;
2046 	  char jobs[32];
2047 
2048 	  fprintf (mstream,
2049 		   ".PHONY: all\n"
2050 		   "all:");
2051 	  for (i = 0; i < nr; ++i)
2052 	    {
2053 	      int j = ltrans_priorities[i*2 + 1];
2054 	      fprintf (mstream, " \\\n\t%s", output_names[j]);
2055 	    }
2056 	  fprintf (mstream, "\n");
2057 	  fclose (mstream);
2058 	  if (!jobserver)
2059 	    {
2060 	      /* Avoid passing --jobserver-fd= and similar flags
2061 		 unless jobserver mode is explicitly enabled.  */
2062 	      putenv (xstrdup ("MAKEFLAGS="));
2063 	      putenv (xstrdup ("MFLAGS="));
2064 	    }
2065 
2066 	  char **make_argv = buildargv (getenv ("MAKE"));
2067 	  if (make_argv)
2068 	    {
2069 	      for (unsigned argc = 0; make_argv[argc]; argc++)
2070 		obstack_ptr_grow (&argv_obstack, make_argv[argc]);
2071 	    }
2072 	  else
2073 	    obstack_ptr_grow (&argv_obstack, "make");
2074 
2075 	  obstack_ptr_grow (&argv_obstack, "-f");
2076 	  obstack_ptr_grow (&argv_obstack, makefile);
2077 	  if (!jobserver)
2078 	    {
2079 	      snprintf (jobs, 31, "-j%ld",
2080 			auto_parallel ? nthreads_var : parallel);
2081 	      obstack_ptr_grow (&argv_obstack, jobs);
2082 	    }
2083 	  obstack_ptr_grow (&argv_obstack, "all");
2084 	  obstack_ptr_grow (&argv_obstack, NULL);
2085 	  new_argv = XOBFINISH (&argv_obstack, const char **);
2086 
2087 	  pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv),
2088 				 NULL, NULL, PEX_SEARCH, false, NULL);
2089 	  do_wait (new_argv[0], pex);
2090 	  freeargv (make_argv);
2091 	  maybe_unlink (makefile);
2092 	  makefile = NULL;
2093 	  for (i = 0; i < nr; ++i)
2094 	    maybe_unlink (input_names[i]);
2095 	}
2096       for (i = 0; i < nr; ++i)
2097 	{
2098 	  fputs (output_names[i], stdout);
2099 	  putc ('\n', stdout);
2100 	  free (input_names[i]);
2101 	}
2102       if (!skip_debug)
2103 	{
2104 	  for (i = 0; i < ltoobj_argc; ++i)
2105 	    if (early_debug_object_names[i] != NULL)
2106 	      printf ("%s\n", early_debug_object_names[i]);
2107 	}
2108       nr = 0;
2109       free (ltrans_priorities);
2110       free (output_names);
2111       output_names = NULL;
2112       free (early_debug_object_names);
2113       early_debug_object_names = NULL;
2114       free (input_names);
2115       free (list_option_full);
2116       obstack_free (&env_obstack, NULL);
2117     }
2118 
2119  finish:
2120   XDELETE (lto_argv);
2121   obstack_free (&argv_obstack, NULL);
2122 }
2123 
2124 
2125 /* Entry point.  */
2126 
2127 int
main(int argc,char * argv[])2128 main (int argc, char *argv[])
2129 {
2130   const char *p;
2131 
2132   init_opts_obstack ();
2133 
2134   p = argv[0] + strlen (argv[0]);
2135   while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
2136     --p;
2137   progname = p;
2138 
2139   xmalloc_set_program_name (progname);
2140 
2141   gcc_init_libintl ();
2142 
2143   diagnostic_initialize (global_dc, 0);
2144   diagnostic_color_init (global_dc);
2145   diagnostic_urls_init (global_dc);
2146   global_dc->get_option_url = get_option_url;
2147 
2148   if (atexit (lto_wrapper_cleanup) != 0)
2149     fatal_error (input_location, "%<atexit%> failed");
2150 
2151   setup_signals ();
2152 
2153   /* We may be called with all the arguments stored in some file and
2154      passed with @file.  Expand them into argv before processing.  */
2155   expandargv (&argc, &argv);
2156 
2157   run_gcc (argc, argv);
2158 
2159   return 0;
2160 }
2161