diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2014-06-26 09:16:28 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2014-06-26 09:16:28 +0000 |
commit | 5f0ad6a5613a3b436dfd91ce7c3b969aeeaa55eb (patch) | |
tree | ca9b56a1959b3c1e842cc178449311307ce1841f /gcc/collect2.c | |
parent | 608508a67719de05d2144200325662bda7204adc (diff) | |
download | gcc-5f0ad6a5613a3b436dfd91ce7c3b969aeeaa55eb.zip gcc-5f0ad6a5613a3b436dfd91ce7c3b969aeeaa55eb.tar.gz gcc-5f0ad6a5613a3b436dfd91ce7c3b969aeeaa55eb.tar.bz2 |
Part 2 of the collect-utils library, now also used for collect2.
* Makefile.in (COLLECT2_OBJS): Add collect-utils.o.
(LTO_WRAPPER_OBJS): New variable.
(lto-wrapper$(exeext)): Use it.
* collect2.c: Include "collect-utils.h".
(verbose, debug): Remove variables.
(at_file_supplied): No longer static.
(tool_name): New variable.
(do_wait, fork_execute, maybe_unlink): Don't declare.
(tool_cleanup): No longer static.
(notice): Remove function.
(maybe_run_lto_and_relink, main, do_dsymutil): Add new arg to
fork_execute calls.
(collect_wait, do_wait, collect_execute): Remove functions.
(maybe_unlink): No longer static.
* collect2.h (verbose, debug): Don't declare.
(at_file_supplied): Declare.
* collect-utils.c (utils_cleanup): New arg from_signal. All callers
changed.
(collect_execute): Replace with implementation from collect2, plus a
new arg use_atfile. All callers changed.
(collect_wait): Replace with implementation from collect2.
(maybe_unlink_file): Remove function.
(fork_execute): Replace with implementation from collect2, plus a
new arg use_atfile. All callers changed.
(do_wait): Add call to utils_cleanup to the error path.
* collect-utils.h (collect_execute, fork_execute, utils_cleanup,
tool_cleanup): Adjust declarations.
* lto-wrapper.c (tool_cleanup): Add unused bool argument.
* tlink.c: Include "collect-utils.h".
(tlink_execute): New arg use_atfile. All callers changed.
(tlink_init, tlink_execute): Remove declarations.
From-SVN: r212020
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r-- | gcc/collect2.c | 196 |
1 files changed, 15 insertions, 181 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index 5de1bb3..c54e6fb 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "collect2.h" #include "collect2-aix.h" +#include "collect-utils.h" #include "diagnostic.h" #include "demangle.h" #include "obstack.h" @@ -175,7 +176,6 @@ struct head int number; }; -bool verbose; /* true if -v or --version */ static int rflag; /* true if -r */ static int strip_flag; /* true if -s */ #ifdef COLLECT_EXPORT_LIST @@ -198,7 +198,6 @@ static enum lto_mode_d lto_mode = LTO_MODE_WHOPR; static enum lto_mode_d lto_mode = LTO_MODE_NONE; #endif -bool debug; /* true if -debug */ bool helpflag; /* true if --help */ static int shared_obj; /* true if -shared */ @@ -234,8 +233,7 @@ static struct head exports; /* list of exported symbols */ #endif static struct head frame_tables; /* list of frame unwind info tables */ -static bool at_file_supplied; /* Whether to use @file arguments */ -static char *response_file; /* Name of any current response file */ +bool at_file_supplied; /* Whether to use @file arguments */ struct obstack temporary_obstack; char * temporary_firstobj; @@ -296,12 +294,11 @@ typedef enum { SYM_AIXD = 7 } symkind; +const char tool_name[] = "collect2"; + static symkind is_ctor_dtor (const char *); static void handler (int); -static void do_wait (const char *, struct pex_obj *); -static void fork_execute (const char *, char **); -static void maybe_unlink (const char *); static void maybe_unlink_list (char **); static void add_to_list (struct head *, const char *); static int extract_init_priority (const char *); @@ -382,7 +379,7 @@ static void scan_prog_file (const char *, scanpass, scanfilter); /* Delete tempfiles and exit function. */ -static void +void tool_cleanup (bool from_signal) { if (c_file != 0 && c_file[0]) @@ -428,18 +425,6 @@ handler (int signo) signal (signo, SIG_DFL); raise (signo); } - -/* Notify user of a non-error. */ -void -notice (const char *cmsgid, ...) -{ - va_list ap; - - va_start (ap, cmsgid); - vfprintf (stderr, _(cmsgid), ap); - va_end (ap); -} - /* Notify user of a non-error, without translating the format string. */ void notice_translated (const char *cmsgid, ...) @@ -737,7 +722,8 @@ maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst, *lto_c_ptr = NULL; /* Run the LTO back end. */ - pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH); + pex = collect_execute (prog, lto_c_argv, NULL, NULL, PEX_SEARCH, + at_file_supplied); { int c; FILE *stream; @@ -817,7 +803,7 @@ maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst, /* Run the linker again, this time replacing the object files optimized by the LTO with the temporary file generated by the LTO. */ - fork_execute ("ld", out_lto_ld_argv); + fork_execute ("ld", out_lto_ld_argv, HAVE_GNU_LD && at_file_supplied); post_ld_pass (true); free (lto_ld_argv); @@ -827,7 +813,7 @@ maybe_run_lto_and_relink (char **lto_ld_argv, char **object_lst, { /* Our caller is relying on us to do the link even though there is no LTO back end work to be done. */ - fork_execute ("ld", lto_ld_argv); + fork_execute ("ld", lto_ld_argv, HAVE_GNU_LD && at_file_supplied); post_ld_pass (false); } else @@ -1713,7 +1699,7 @@ main (int argc, char **argv) strip_argv[0] = strip_file_name; strip_argv[1] = output_file; strip_argv[2] = (char *) 0; - fork_execute ("strip", real_strip_argv); + fork_execute ("strip", real_strip_argv, false); } #ifdef COLLECT_EXPORT_LIST @@ -1799,7 +1785,7 @@ main (int argc, char **argv) /* Assemble the constructor and destructor tables. Link the tables in with the rest of the program. */ - fork_execute ("gcc", c_argv); + fork_execute ("gcc", c_argv, at_file_supplied); #ifdef COLLECT_EXPORT_LIST /* On AIX we must call tlink because of possible templates resolution. */ do_tlink (ld2_argv, object_lst); @@ -1812,7 +1798,7 @@ main (int argc, char **argv) maybe_run_lto_and_relink (ld2_argv, object_lst, object, true); else { - fork_execute ("ld", ld2_argv); + fork_execute ("ld", ld2_argv, HAVE_GNU_LD && at_file_supplied); post_ld_pass (false); } @@ -1832,163 +1818,10 @@ main (int argc, char **argv) } -/* Wait for a process to finish, and exit if a nonzero status is found. */ - -int -collect_wait (const char *prog, struct pex_obj *pex) -{ - int status; - - if (!pex_get_status (pex, 1, &status)) - fatal_error ("can't get program status: %m"); - pex_free (pex); - - if (status) - { - if (WIFSIGNALED (status)) - { - int sig = WTERMSIG (status); - error ("%s terminated with signal %d [%s]%s", - prog, sig, strsignal (sig), - WCOREDUMP (status) ? ", core dumped" : ""); - exit (FATAL_EXIT_CODE); - } - - if (WIFEXITED (status)) - return WEXITSTATUS (status); - } - return 0; -} - -static void -do_wait (const char *prog, struct pex_obj *pex) -{ - int ret = collect_wait (prog, pex); - if (ret != 0) - { - error ("%s returned %d exit status", prog, ret); - exit (ret); - } - - if (response_file) - { - unlink (response_file); - response_file = NULL; - } -} - - -/* Execute a program, and wait for the reply. */ - -struct pex_obj * -collect_execute (const char *prog, char **argv, const char *outname, - const char *errname, int flags) -{ - struct pex_obj *pex; - const char *errmsg; - int err; - char *response_arg = NULL; - char *response_argv[3] ATTRIBUTE_UNUSED; - - if (HAVE_GNU_LD && at_file_supplied && argv[0] != NULL) - { - /* If using @file arguments, create a temporary file and put the - contents of argv into it. Then change argv to an array corresponding - to a single argument @FILE, where FILE is the temporary filename. */ - - char **current_argv = argv + 1; - char *argv0 = argv[0]; - int status; - FILE *f; - - /* Note: we assume argv contains at least one element; this is - checked above. */ - - response_file = make_temp_file (""); - - f = fopen (response_file, "w"); - - if (f == NULL) - fatal_error ("could not open response file %s", response_file); - - status = writeargv (current_argv, f); - - if (status) - fatal_error ("could not write to response file %s", response_file); - - status = fclose (f); - - if (EOF == status) - fatal_error ("could not close response file %s", response_file); - - response_arg = concat ("@", response_file, NULL); - response_argv[0] = argv0; - response_argv[1] = response_arg; - response_argv[2] = NULL; - - argv = response_argv; - } - - if (verbose || debug) - { - char **p_argv; - const char *str; - - if (argv[0]) - fprintf (stderr, "%s", argv[0]); - else - notice ("[cannot find %s]", prog); - - for (p_argv = &argv[1]; (str = *p_argv) != (char *) 0; p_argv++) - fprintf (stderr, " %s", str); - - fprintf (stderr, "\n"); - } - - fflush (stdout); - fflush (stderr); - - /* If we cannot find a program we need, complain error. Do this here - since we might not end up needing something that we could not find. */ - - if (argv[0] == 0) - fatal_error ("cannot find '%s'", prog); - - pex = pex_init (0, "collect2", NULL); - if (pex == NULL) - fatal_error ("pex_init failed: %m"); - - errmsg = pex_run (pex, flags, argv[0], argv, outname, - errname, &err); - if (errmsg != NULL) - { - if (err != 0) - { - errno = err; - fatal_error ("%s: %m", _(errmsg)); - } - else - fatal_error (errmsg); - } - - free (response_arg); - - return pex; -} - -static void -fork_execute (const char *prog, char **argv) -{ - struct pex_obj *pex; - - pex = collect_execute (prog, argv, NULL, NULL, PEX_LAST | PEX_SEARCH); - do_wait (prog, pex); -} - /* Unlink FILE unless we are debugging or this is the output_file and we may not unlink it. */ -static void +void maybe_unlink (const char *file) { if (debug) @@ -3177,7 +3010,8 @@ do_dsymutil (const char *output_file) { argv[1] = output_file; argv[2] = (char *) 0; - pex = collect_execute (dsymutil, real_argv, NULL, NULL, PEX_LAST | PEX_SEARCH); + pex = collect_execute (dsymutil, real_argv, NULL, NULL, + PEX_LAST | PEX_SEARCH, false); do_wait (dsymutil, pex); } |