1 /* Wrapper to call lto. Used by collect2 and the linker plugin.
2 Copyright (C) 2009, 2010 Free Software Foundation, Inc.
4 Factored out of collect2 by Rafael Espindola <espindola@google.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* This program is passed a gcc, a list of gcc arguments and a list of
24 object files containing IL. It scans the argument list to check if
25 we are in whopr mode or not modifies the arguments and needed and
26 prints a list of output files on stdout.
30 $ lto-wrapper gcc/xgcc -B gcc a.o b.o -o test -flto
32 The above will print something like
35 If WHOPR is used instead, more than one file might be produced
36 ./ccXj2DTk.lto.ltrans.o
37 ./ccCJuXGv.lto.ltrans.o
42 #include "coretypes.h"
44 #include "diagnostic.h"
49 int debug; /* true if -save-temps. */
50 int verbose; /* true if -v. */
53 LTO_MODE_NONE, /* Not doing LTO. */
54 LTO_MODE_LTO, /* Normal LTO. */
55 LTO_MODE_WHOPR /* WHOPR. */
58 /* Current LTO mode. */
59 static enum lto_mode_d lto_mode = LTO_MODE_NONE;
61 static char *ltrans_output_file;
62 static char *flto_out;
63 static char *args_name;
64 static unsigned int nr;
65 static char **input_names;
66 static char **output_names;
67 static char *makefile;
69 static void maybe_unlink_file (const char *);
71 /* Delete tempfiles. */
74 lto_wrapper_cleanup (void)
76 static bool cleanup_done = false;
82 /* Setting cleanup_done prevents an infinite loop if one of the
83 calls to maybe_unlink_file fails. */
86 if (ltrans_output_file)
87 maybe_unlink_file (ltrans_output_file);
89 maybe_unlink_file (flto_out);
91 maybe_unlink_file (args_name);
93 maybe_unlink_file (makefile);
94 for (i = 0; i < nr; ++i)
96 maybe_unlink_file (input_names[i]);
98 maybe_unlink_file (output_names[i]);
103 fatal_signal (int signum)
105 signal (signum, SIG_DFL);
106 lto_wrapper_cleanup ();
107 /* Get the same signal again, this time not handled,
108 so its normal effect occurs. */
109 kill (getpid (), signum);
112 /* Just die. CMSGID is the error message. */
114 static void __attribute__ ((format (printf, 1, 2)))
115 fatal (const char * cmsgid, ...)
119 va_start (ap, cmsgid);
120 fprintf (stderr, "lto-wrapper: ");
121 vfprintf (stderr, _(cmsgid), ap);
122 fprintf (stderr, "\n");
125 lto_wrapper_cleanup ();
126 exit (FATAL_EXIT_CODE);
130 /* Die when sys call fails. CMSGID is the error message. */
132 static void __attribute__ ((format (printf, 1, 2)))
133 fatal_perror (const char *cmsgid, ...)
138 va_start (ap, cmsgid);
139 fprintf (stderr, "lto-wrapper: ");
140 vfprintf (stderr, _(cmsgid), ap);
141 fprintf (stderr, ": %s\n", xstrerror (e));
144 lto_wrapper_cleanup ();
145 exit (FATAL_EXIT_CODE);
149 /* Execute a program, and wait for the reply. ARGV are the arguments. The
150 last one must be NULL. */
152 static struct pex_obj *
153 collect_execute (char **argv)
164 for (p_argv = argv; (str = *p_argv) != (char *) 0; p_argv++)
165 fprintf (stderr, " %s", str);
167 fprintf (stderr, "\n");
173 pex = pex_init (0, "lto-wrapper", NULL);
175 fatal_perror ("pex_init failed");
177 /* Do not use PEX_LAST here, we use our stdout for communicating with
178 collect2 or the linker-plugin. Any output from the sub-process
179 will confuse that. */
180 errmsg = pex_run (pex, PEX_SEARCH, argv[0], argv, NULL,
187 fatal_perror (errmsg);
197 /* Wait for a process to finish, and exit if a nonzero status is found.
198 PROG is the program name. PEX is the process we should wait for. */
201 collect_wait (const char *prog, struct pex_obj *pex)
205 if (!pex_get_status (pex, 1, &status))
206 fatal_perror ("can't get program status");
211 if (WIFSIGNALED (status))
213 int sig = WTERMSIG (status);
214 if (WCOREDUMP (status))
215 fatal ("%s terminated with signal %d [%s], core dumped",
216 prog, sig, strsignal (sig));
218 fatal ("%s terminated with signal %d [%s]",
219 prog, sig, strsignal (sig));
222 if (WIFEXITED (status))
223 fatal ("%s returned %d exit status", prog, WEXITSTATUS (status));
230 /* Unlink a temporary LTRANS file unless requested otherwise. */
233 maybe_unlink_file (const char *file)
237 if (unlink_if_ordinary (file)
239 fatal_perror ("deleting LTRANS file %s", file);
242 fprintf (stderr, "[Leaving LTRANS %s]\n", file);
246 /* Execute program ARGV[0] with arguments ARGV. Wait for it to finish. */
249 fork_execute (char **argv)
257 args_name = make_temp_file (".args");
258 at_args = concat ("@", args_name, NULL);
259 args = fopen (args_name, "w");
261 fatal ("failed to open %s", args_name);
263 status = writeargv (&argv[1], args);
266 fatal ("could not write to temporary file %s", args_name);
270 new_argv[0] = argv[0];
271 new_argv[1] = at_args;
274 pex = collect_execute (new_argv);
275 collect_wait (new_argv[0], pex);
277 maybe_unlink_file (args_name);
282 /* Template of LTRANS dumpbase suffix. */
283 #define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
285 /* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
286 environment according to LANG_MASK. */
289 get_options_from_collect_gcc_options (const char *collect_gcc,
290 const char *collect_gcc_options,
291 unsigned int lang_mask,
292 struct cl_decoded_option **decoded_options,
293 unsigned int *decoded_options_count)
295 struct obstack argv_obstack;
300 argv_storage = xstrdup (collect_gcc_options);
301 obstack_init (&argv_obstack);
302 obstack_ptr_grow (&argv_obstack, collect_gcc);
304 for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
306 if (argv_storage[j] == '\'')
308 obstack_ptr_grow (&argv_obstack, &argv_storage[k]);
312 if (argv_storage[j] == '\0')
313 fatal ("malformed COLLECT_GCC_OPTIONS");
314 else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
316 argv_storage[k++] = '\'';
319 else if (argv_storage[j] == '\'')
322 argv_storage[k++] = argv_storage[j++];
325 argv_storage[k++] = '\0';
329 obstack_ptr_grow (&argv_obstack, NULL);
330 argc = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
331 argv = XOBFINISH (&argv_obstack, const char **);
333 decode_cmdline_options_to_array (argc, (const char **)argv,
335 decoded_options, decoded_options_count);
336 obstack_free (&argv_obstack, NULL);
340 /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. */
343 run_gcc (unsigned argc, char *argv[])
346 const char **new_argv;
347 const char **argv_ptr;
348 char *list_option_full = NULL;
349 const char *linker_output = NULL;
350 const char *collect_gcc, *collect_gcc_options;
353 bool no_partition = false;
354 struct cl_decoded_option *decoded_options;
355 unsigned int decoded_options_count;
356 struct obstack argv_obstack;
359 /* Get the driver and options. */
360 collect_gcc = getenv ("COLLECT_GCC");
362 fatal ("environment variable COLLECT_GCC must be set");
363 collect_gcc_options = getenv ("COLLECT_GCC_OPTIONS");
364 if (!collect_gcc_options)
365 fatal ("environment variable COLLECT_GCC_OPTIONS must be set");
366 get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
369 &decoded_options_count);
371 /* Initalize the common arguments for the driver. */
372 obstack_init (&argv_obstack);
373 obstack_ptr_grow (&argv_obstack, collect_gcc);
374 obstack_ptr_grow (&argv_obstack, "-xlto");
375 obstack_ptr_grow (&argv_obstack, "-c");
376 for (j = 1; j < decoded_options_count; ++j)
378 struct cl_decoded_option *option = &decoded_options[j];
380 /* Do not pass on frontend specific flags not suitable for lto. */
381 if (!(cl_options[option->opt_index].flags
382 & (CL_COMMON|CL_TARGET|CL_DRIVER|CL_LTO)))
385 switch (option->opt_index)
388 linker_output = option->arg;
389 /* We generate new intermediate output, drop this arg. */
400 case OPT_flto_partition_none:
405 if (strcmp (option->arg, "jobserver") == 0)
412 parallel = atoi (option->arg);
419 lto_mode = LTO_MODE_WHOPR;
420 /* We've handled these LTO options, do not pass them on. */
427 /* Pass the option on. */
428 for (i = 0; i < option->canonical_option_num_elements; ++i)
429 obstack_ptr_grow (&argv_obstack, option->canonical_option[i]);
434 lto_mode = LTO_MODE_LTO;
441 char *output_dir, *base, *name;
442 bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
444 output_dir = xstrdup (linker_output);
446 for (name = base; *name; name++)
447 if (IS_DIR_SEPARATOR (*name))
451 linker_output = &linker_output[base - output_dir];
452 if (*output_dir == '\0')
454 static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
455 output_dir = current_dir;
459 obstack_ptr_grow (&argv_obstack, "-dumpdir");
460 obstack_ptr_grow (&argv_obstack, output_dir);
463 obstack_ptr_grow (&argv_obstack, "-dumpbase");
466 /* Remember at which point we can scrub args to re-use the commons. */
467 new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
469 if (lto_mode == LTO_MODE_LTO)
471 flto_out = make_temp_file (".lto.o");
473 obstack_ptr_grow (&argv_obstack, linker_output);
474 obstack_ptr_grow (&argv_obstack, "-o");
475 obstack_ptr_grow (&argv_obstack, flto_out);
479 const char *list_option = "-fltrans-output-list=";
480 size_t list_option_len = strlen (list_option);
485 char *dumpbase = (char *) xmalloc (strlen (linker_output)
486 + sizeof (".wpa") + 1);
487 strcpy (dumpbase, linker_output);
488 strcat (dumpbase, ".wpa");
489 obstack_ptr_grow (&argv_obstack, dumpbase);
492 if (linker_output && debug)
494 ltrans_output_file = (char *) xmalloc (strlen (linker_output)
495 + sizeof (".ltrans.out") + 1);
496 strcpy (ltrans_output_file, linker_output);
497 strcat (ltrans_output_file, ".ltrans.out");
500 ltrans_output_file = make_temp_file (".ltrans.out");
501 list_option_full = (char *) xmalloc (sizeof (char) *
502 (strlen (ltrans_output_file) + list_option_len + 1));
503 tmp = list_option_full;
505 obstack_ptr_grow (&argv_obstack, tmp);
506 strcpy (tmp, list_option);
507 tmp += list_option_len;
508 strcpy (tmp, ltrans_output_file);
510 obstack_ptr_grow (&argv_obstack, "-fwpa");
513 /* Append the input objects and possible preceeding arguments. */
514 for (i = 1; i < argc; ++i)
515 obstack_ptr_grow (&argv_obstack, argv[i]);
516 obstack_ptr_grow (&argv_obstack, NULL);
518 new_argv = XOBFINISH (&argv_obstack, const char **);
519 argv_ptr = &new_argv[new_head_argc];
520 fork_execute (CONST_CAST (char **, new_argv));
522 if (lto_mode == LTO_MODE_LTO)
524 printf("%s\n", flto_out);
530 FILE *stream = fopen (ltrans_output_file, "r");
531 FILE *mstream = NULL;
532 struct obstack env_obstack;
535 fatal_perror ("fopen: %s", ltrans_output_file);
537 /* Parse the list of LTRANS inputs from the WPA stage. */
538 obstack_init (&env_obstack);
542 const unsigned piece = 32;
543 char *output_name = NULL;
544 char *buf, *input_name = (char *)xmalloc (piece);
549 if (!fgets (buf, piece, stream))
551 len = strlen (input_name);
552 if (input_name[len - 1] != '\n')
554 input_name = (char *)xrealloc (input_name, len + piece);
555 buf = input_name + len;
558 input_name[len - 1] = '\0';
560 if (input_name[0] == '*')
561 output_name = &input_name[1];
564 input_names = (char **)xrealloc (input_names, nr * sizeof (char *));
565 output_names = (char **)xrealloc (output_names, nr * sizeof (char *));
566 input_names[nr-1] = input_name;
567 output_names[nr-1] = output_name;
570 maybe_unlink_file (ltrans_output_file);
571 ltrans_output_file = NULL;
575 makefile = make_temp_file (".mk");
576 mstream = fopen (makefile, "w");
579 /* Execute the LTRANS stage for each input file (or prepare a
580 makefile to invoke this in parallel). */
581 for (i = 0; i < nr; ++i)
584 char *input_name = input_names[i];
585 /* If it's a pass-through file do nothing. */
589 /* Replace the .o suffix with a .ltrans.o suffix and write
590 the resulting name to the LTRANS output list. */
591 obstack_grow (&env_obstack, input_name, strlen (input_name) - 2);
592 obstack_grow (&env_obstack, ".ltrans.o", sizeof (".ltrans.o"));
593 output_name = XOBFINISH (&env_obstack, char *);
595 /* Adjust the dumpbase if the linker output file was seen. */
599 = (char *) xmalloc (strlen (linker_output)
600 + sizeof(DUMPBASE_SUFFIX) + 1);
602 strlen (linker_output) + sizeof(DUMPBASE_SUFFIX),
603 "%s.ltrans%u", linker_output, i);
604 argv_ptr[0] = dumpbase;
607 argv_ptr[1] = "-fltrans";
609 argv_ptr[3] = output_name;
610 argv_ptr[4] = input_name;
614 fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]);
615 for (j = 1; new_argv[j] != NULL; ++j)
616 fprintf (mstream, " '%s'", new_argv[j]);
617 fprintf (mstream, "\n");
620 fork_execute (CONST_CAST (char **, new_argv));
622 output_names[i] = output_name;
629 fprintf (mstream, "all:");
630 for (i = 0; i < nr; ++i)
631 fprintf (mstream, " \\\n\t%s", output_names[i]);
632 fprintf (mstream, "\n");
636 /* Avoid passing --jobserver-fd= and similar flags
637 unless jobserver mode is explicitly enabled. */
638 putenv (xstrdup ("MAKEFLAGS="));
639 putenv (xstrdup ("MFLAGS="));
641 new_argv[0] = getenv ("MAKE");
643 new_argv[0] = "make";
645 new_argv[2] = makefile;
649 snprintf (jobs, 31, "-j%d", parallel);
650 new_argv[i++] = jobs;
652 new_argv[i++] = "all";
653 new_argv[i++] = NULL;
654 pex = collect_execute (CONST_CAST (char **, new_argv));
655 collect_wait (new_argv[0], pex);
656 maybe_unlink_file (makefile);
659 for (i = 0; i < nr; ++i)
661 fputs (output_names[i], stdout);
663 maybe_unlink_file (input_names[i]);
664 free (input_names[i]);
669 free (list_option_full);
670 obstack_free (&env_obstack, NULL);
673 obstack_free (&argv_obstack, NULL);
680 main (int argc, char *argv[])
684 p = argv[0] + strlen (argv[0]);
685 while (p != argv[0] && !IS_DIR_SEPARATOR (p[-1]))
689 xmalloc_set_program_name (progname);
693 diagnostic_initialize (global_dc, 0);
695 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
696 signal (SIGINT, fatal_signal);
698 if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
699 signal (SIGHUP, fatal_signal);
701 if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
702 signal (SIGTERM, fatal_signal);
704 if (signal (SIGPIPE, SIG_IGN) != SIG_IGN)
705 signal (SIGPIPE, fatal_signal);
708 /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
709 receive the signal. A different setting is inheritable */
710 signal (SIGCHLD, SIG_DFL);
713 /* We may be called with all the arguments stored in some file and
714 passed with @file. Expand them into argv before processing. */
715 expandargv (&argc, &argv);
717 run_gcc (argc, argv);