From patchwork Thu May 22 12:02:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernd Schmidt X-Patchwork-Id: 351475 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 7E0B4140091 for ; Thu, 22 May 2014 22:03:11 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; q=dns; s=default; b=iEZyXcGG+umSbxOG3 wN4+QDs1TsrgpQnqAnbh8xkIFZc0xFe06cZ5//uVsH7Dk6VL8CLGsCDzL3fpCLa0 w6KxfgLOBZLL54c85/rDyhKOZ4fL/Nx3obfNEQywAjVzXPv0Je7y5BAQ/hexAfv8 qVfCzZ1EeOOBkh8XZWyHA0Rk3A= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:references :in-reply-to:content-type; s=default; bh=dqDFKgEyFEEjHKqu0BlKrKD dgaA=; b=oftQ3ICLQQH1Q3+vom5Vb5/lCjodNS4PVOq1+g4sorkFV+Cb9okMk3Y H48YSpTH71YmGjcxMnteTRI/Xwu5IVlLcciJKxlVArdyDCyQs+k0GgnYrreG5r00 bpBZTSf+b3ESaMbAiL7ks/TcoVIEW2zJ4JBoZMa/NE0GaH7KKzV0= Received: (qmail 6831 invoked by alias); 22 May 2014 12:03:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 6764 invoked by uid 89); 22 May 2014 12:03:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.2 required=5.0 tests=AWL, BAYES_50, KAM_STOCKGEN, UNSUBSCRIBE_BODY autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 22 May 2014 12:02:54 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1WnRhx-0004Co-Rg from Bernd_Schmidt@mentor.com for gcc-patches@gcc.gnu.org; Thu, 22 May 2014 05:02:49 -0700 Received: from SVR-IES-FEM-02.mgc.mentorg.com ([137.202.0.106]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 22 May 2014 05:02:49 -0700 Received: from [127.0.0.1] (137.202.0.76) by SVR-IES-FEM-02.mgc.mentorg.com (137.202.0.106) with Microsoft SMTP Server id 14.2.247.3; Thu, 22 May 2014 13:02:46 +0100 Message-ID: <537DE766.5040505@codesourcery.com> Date: Thu, 22 May 2014 14:02:46 +0200 From: Bernd Schmidt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: GCC Patches Subject: Create a library for tools like collect2 and lto-wrapper (2/2) References: <537DE6E7.7090908@codesourcery.com> In-Reply-To: <537DE6E7.7090908@codesourcery.com> This is the second part of making a set of utility functions to be used by collect2, lto-wrapper and mkoffload. The implementations of some functions like fork_execute are changed to those from collect2 and the calls in lto-wrapper adapted accordingly. There are some minor changes in these functions: for example I avoid calling fatal_error, instead using the fatal/fatal_perror functions so that the cleanup routine is called properly (lto-wrapper does not use atexit as collect2 does). Bootstrapped and tested on x86_64-linux, ok for trunk? Bernd commit 39e9b2e3b47c893fcc1d96dfa7bdd975da80633e Author: Bernd Schmidt Date: Wed May 21 16:44:03 2014 +0200 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". (vflag, debug): Remove variables. Rename all uses of vflag to verbose. (at_file_supplied): No longer static. (tool_name): New variable. (do_wait, fork_execute, maybe_unlink): Don't declare. (tool_cleanup): Renamed from collect_atexit. New arg from_signal. (collect_atexit): New static function. (notice): Remove function. (handler): Just call tool_cleanup. (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 (vflag, 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. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index ad9df57..c59a1fc 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1898,7 +1898,8 @@ gcc-ranlib.c: gcc-ar.c gcc-nm.c: gcc-ar.c cp $^ $@ -COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o vec.o ggc-none.o file-find.o +COLLECT2_OBJS = collect2.o collect2-aix.o tlink.o vec.o ggc-none.o \ + collect-utils.o file-find.o COLLECT2_LIBS = @COLLECT2_LIBS@ collect2$(exeext): $(COLLECT2_OBJS) $(LIBDEPS) # Don't try modifying collect2 (aka ld) in place--it might be linking this. diff --git a/gcc/collect-utils.c b/gcc/collect-utils.c index 22d90a4..5f5ace9 100644 --- a/gcc/collect-utils.c +++ b/gcc/collect-utils.c @@ -34,24 +34,6 @@ static char *response_file; bool debug; bool verbose; -/* Delete tempfiles. */ - -void -utils_cleanup (void) -{ - static bool cleanup_done = false; - - if (cleanup_done) - return; - - /* Setting cleanup_done prevents an infinite loop if one of the - calls to maybe_unlink fails. */ - cleanup_done = true; - - if (response_file) - maybe_unlink (response_file); - tool_cleanup (); -} /* Notify user of a non-error. */ void @@ -68,7 +50,7 @@ void fatal_signal (int signum) { signal (signum, SIG_DFL); - utils_cleanup (); + utils_cleanup (true); /* Get the same signal again, this time not handled, so its normal effect occurs. */ kill (getpid (), signum); @@ -87,7 +69,7 @@ fatal (const char * cmsgid, ...) fprintf (stderr, "\n"); va_end (ap); - utils_cleanup (); + utils_cleanup (false); exit (FATAL_EXIT_CODE); } @@ -106,61 +88,12 @@ fatal_perror (const char *cmsgid, ...) fprintf (stderr, ": %s\n", xstrerror (e)); va_end (ap); - utils_cleanup (); + utils_cleanup (false); exit (FATAL_EXIT_CODE); } - -/* Execute a program, and wait for the reply. ARGV are the arguments. The - last one must be NULL. */ - -struct pex_obj * -collect_execute (char **argv) -{ - struct pex_obj *pex; - const char *errmsg; - int err; - - if (verbose) - { - char **p_argv; - const char *str; - - for (p_argv = argv; (str = *p_argv) != (char *) 0; p_argv++) - fprintf (stderr, " %s", str); - - fprintf (stderr, "\n"); - } - - fflush (stdout); - fflush (stderr); - - pex = pex_init (0, tool_name, NULL); - if (pex == NULL) - fatal_perror ("pex_init failed"); - - /* Do not use PEX_LAST here, we use our stdout for communicating with - collect2 or the linker-plugin. Any output from the sub-process - will confuse that. */ - errmsg = pex_run (pex, PEX_SEARCH, argv[0], argv, NULL, - NULL, &err); - if (errmsg != NULL) - { - if (err != 0) - { - errno = err; - fatal_perror (errmsg); - } - else - fatal (errmsg); - } - - return pex; -} - - -/* Wait for a process to finish, and exit if a nonzero status is found. - PROG is the program name. PEX is the process we should wait for. */ + +/* Wait for a process to finish, and exit if a nonzero status is found. */ int collect_wait (const char *prog, struct pex_obj *pex) @@ -176,18 +109,14 @@ collect_wait (const char *prog, struct pex_obj *pex) if (WIFSIGNALED (status)) { int sig = WTERMSIG (status); - if (WCOREDUMP (status)) - fatal ("%s terminated with signal %d [%s], core dumped", - prog, sig, strsignal (sig)); - else - fatal ("%s terminated with signal %d [%s]", - prog, sig, strsignal (sig)); + fatal ("%s terminated with signal %d [%s]%s", + prog, sig, strsignal (sig), + WCOREDUMP (status) ? ", core dumped" : ""); } if (WIFEXITED (status)) - fatal ("%s returned %d exit status", prog, WEXITSTATUS (status)); + return WEXITSTATUS (status); } - return 0; } @@ -198,6 +127,7 @@ do_wait (const char *prog, struct pex_obj *pex) if (ret != 0) { error ("%s returned %d exit status", prog, ret); + utils_cleanup (false); exit (ret); } @@ -208,52 +138,130 @@ do_wait (const char *prog, struct pex_obj *pex) } } -/* Unlink a temporary LTRANS file unless requested otherwise. */ + +/* Execute a program, and wait for the reply. */ -void -maybe_unlink_file (const char *file) +struct pex_obj * +collect_execute (const char *prog, char **argv, const char *outname, + const char *errname, int flags, bool use_atfile) { - if (!debug) + struct pex_obj *pex; + const char *errmsg; + int err; + char *response_arg = NULL; + char *response_argv[3]; + + if (use_atfile && argv[0] != NULL) { - if (unlink_if_ordinary (file) - && errno != ENOENT) - fatal_perror ("deleting file %s", file); + /* 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 ("could not open response file %s", response_file); + + status = writeargv (current_argv, f); + + if (status) + fatal ("could not write to response file %s", response_file); + + status = fclose (f); + + if (EOF == status) + fatal ("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; } - else - fprintf (stderr, "[Leaving %s]\n", file); -} + 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 ("cannot find '%s'", prog); + + pex = pex_init (0, "collect2", NULL); + if (pex == NULL) + fatal_perror ("pex_init failed"); -/* Execute program ARGV[0] with arguments ARGV. Wait for it to finish. */ + errmsg = pex_run (pex, flags, argv[0], argv, outname, + errname, &err); + if (errmsg != NULL) + { + if (err != 0) + { + errno = err; + fatal_perror ("%s", _(errmsg)); + } + else + fatal ("%s", errmsg); + } + + free (response_arg); + + return pex; +} void -fork_execute (char **argv) +fork_execute (const char *prog, char **argv, bool use_atfile) { struct pex_obj *pex; - char *new_argv[3]; - char *at_args; - FILE *args; - int status; - response_file = make_temp_file (".args"); - at_args = concat ("@", response_file, NULL); - args = fopen (response_file, "w"); - if (args == NULL) - fatal ("failed to open %s", response_file); - - status = writeargv (&argv[1], args); + pex = collect_execute (prog, argv, NULL, NULL, + PEX_LAST | PEX_SEARCH, use_atfile); + do_wait (prog, pex); +} - if (status) - fatal ("could not write to temporary file %s", response_file); +/* Delete tempfiles. */ - fclose (args); +void +utils_cleanup (bool from_signal) +{ + static bool cleanup_done = false; - new_argv[0] = argv[0]; - new_argv[1] = at_args; - new_argv[2] = NULL; + if (cleanup_done) + return; - pex = collect_execute (new_argv); - do_wait (new_argv[0], pex); + /* Setting cleanup_done prevents an infinite loop if one of the + calls to maybe_unlink fails. */ + cleanup_done = true; - free (at_args); + if (response_file) + maybe_unlink (response_file); + tool_cleanup (from_signal); } diff --git a/gcc/collect-utils.h b/gcc/collect-utils.h index ea57b6b..31e87b1 100644 --- a/gcc/collect-utils.h +++ b/gcc/collect-utils.h @@ -26,11 +26,14 @@ extern void fatal (const char *, ...) extern void fatal_perror (const char *, ...) __attribute__ ((format (printf, 1, 2))); -extern struct pex_obj *collect_execute (char **); +extern struct pex_obj *collect_execute (const char *, char **, + const char *, const char *, + int, bool); extern int collect_wait (const char *, struct pex_obj *); extern void do_wait (const char *, struct pex_obj *); -extern void fork_execute (char **); -extern void utils_cleanup (void); +extern void fork_execute (const char *, char **, bool); +extern void utils_cleanup (bool); + extern bool debug; extern bool verbose; @@ -40,5 +43,5 @@ extern bool verbose; /* The name of the tool, printed in error messages. */ extern const char tool_name[]; /* Called by utils_cleanup. */ -extern void tool_cleanup (void); +extern void tool_cleanup (bool); extern void maybe_unlink (const char *); diff --git a/gcc/collect2.c b/gcc/collect2.c index f0ab6b8..4576d18 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 vflag; /* 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,8 +379,8 @@ static void scan_prog_file (const char *, scanpass, scanfilter); /* Delete tempfiles and exit function. */ -static void -collect_atexit (void) +void +tool_cleanup (bool from_signal) { if (c_file != 0 && c_file[0]) maybe_unlink (c_file); @@ -401,32 +398,34 @@ collect_atexit (void) if (ldout != 0 && ldout[0]) { - dump_ld_file (ldout, stdout); + if (!from_signal) + dump_ld_file (ldout, stdout); maybe_unlink (ldout); } if (lderrout != 0 && lderrout[0]) { - dump_ld_file (lderrout, stderr); + if (!from_signal) + dump_ld_file (lderrout, stderr); maybe_unlink (lderrout); } +} - if (response_file) - maybe_unlink (response_file); +static void +collect_atexit (void) +{ + utils_cleanup (false); } - -/* Notify user of a non-error. */ -void -notice (const char *cmsgid, ...) +static void +handler (int signo) { - va_list ap; + tool_cleanup (true); - va_start (ap, cmsgid); - vfprintf (stderr, _(cmsgid), ap); - va_end (ap); + signal (signo, SIG_DFL); + raise (signo); } - + /* Notify user of a non-error, without translating the format string. */ void notice_translated (const char *cmsgid, ...) @@ -438,37 +437,6 @@ notice_translated (const char *cmsgid, ...) va_end (ap); } -static void -handler (int signo) -{ - if (c_file != 0 && c_file[0]) - maybe_unlink (c_file); - - if (o_file != 0 && o_file[0]) - maybe_unlink (o_file); - - if (ldout != 0 && ldout[0]) - maybe_unlink (ldout); - - if (lderrout != 0 && lderrout[0]) - maybe_unlink (lderrout); - -#ifdef COLLECT_EXPORT_LIST - if (export_file != 0 && export_file[0]) - maybe_unlink (export_file); -#endif - - if (lto_o_files) - maybe_unlink_list (lto_o_files); - - if (response_file) - maybe_unlink (response_file); - - signal (signo, SIG_DFL); - raise (signo); -} - - int file_exists (const char *name) { @@ -755,7 +723,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; @@ -835,7 +804,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); @@ -845,7 +814,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); } } @@ -1054,7 +1023,7 @@ main (int argc, char **argv) aixlazy_flag = 1; #endif } - vflag = debug; + verbose = debug; find_file_set_debug (debug); if (use_plugin) lto_mode = LTO_MODE_NONE; @@ -1449,7 +1418,7 @@ main (int argc, char **argv) case 'v': if (arg[2] == '\0') - vflag = true; + verbose = true; break; case '-': @@ -1481,7 +1450,7 @@ main (int argc, char **argv) else if (strncmp (arg, "--sysroot=", 10) == 0) target_system_root = arg + 10; else if (strcmp (arg, "--version") == 0) - vflag = true; + verbose = true; else if (strcmp (arg, "--help") == 0) helpflag = true; break; @@ -1576,7 +1545,7 @@ main (int argc, char **argv) *c_ptr++ = c_file; *c_ptr = *ld1 = *object = (char *) 0; - if (vflag) + if (verbose) notice ("collect2 version %s\n", version_string); if (helpflag) @@ -1729,7 +1698,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 @@ -1815,7 +1784,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); @@ -1828,7 +1797,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); } @@ -1848,163 +1817,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 (vflag || 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) @@ -2507,7 +2323,7 @@ scan_prog_file (const char *prog_name, scanpass which_pass, nm_argv[argc++] = (char *) 0; /* Trace if needed. */ - if (vflag) + if (verbose) { const char **p_argv; const char *str; @@ -2704,7 +2520,7 @@ scan_libraries (const char *prog_name) ldd_argv[argc++] = (char *) 0; /* Trace if needed. */ - if (vflag) + if (verbose) { const char **p_argv; const char *str; @@ -3193,7 +3009,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); } diff --git a/gcc/collect2.h b/gcc/collect2.h index bbfd676..0fb7f51 100644 --- a/gcc/collect2.h +++ b/gcc/collect2.h @@ -36,10 +36,10 @@ extern const char *lderrout; extern const char *c_file_name; extern struct obstack temporary_obstack; extern char *temporary_firstobj; -extern bool vflag, debug; extern bool may_unlink_output_file; extern void notice_translated (const char *, ...) ATTRIBUTE_PRINTF_1; extern void notice (const char *, ...) ATTRIBUTE_PRINTF_1; +extern bool at_file_supplied; #endif /* ! GCC_COLLECT2_H */ diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 9a04f93..8c5698e 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -70,7 +70,7 @@ const char tool_name[] = "lto-wrapper"; /* Delete tempfiles. Called from utils_cleanup. */ void -tool_cleanup (void) +tool_cleanup (bool) { unsigned int i; @@ -678,7 +678,7 @@ run_gcc (unsigned argc, char *argv[]) new_argv = XOBFINISH (&argv_obstack, const char **); argv_ptr = &new_argv[new_head_argc]; - fork_execute (CONST_CAST (char **, new_argv)); + fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true); if (lto_mode == LTO_MODE_LTO) { @@ -786,7 +786,8 @@ cont: } else { - fork_execute (CONST_CAST (char **, new_argv)); + fork_execute (new_argv[0], CONST_CAST (char **, new_argv), + true); maybe_unlink (input_name); } @@ -822,8 +823,9 @@ cont: } new_argv[i++] = "all"; new_argv[i++] = NULL; - pex = collect_execute (CONST_CAST (char **, new_argv)); - collect_wait (new_argv[0], pex); + pex = collect_execute (new_argv[0], CONST_CAST (char **, new_argv), + NULL, NULL, PEX_SEARCH, false); + do_wait (new_argv[0], pex); maybe_unlink (makefile); makefile = NULL; for (i = 0; i < nr; ++i) diff --git a/gcc/tlink.c b/gcc/tlink.c index bc358b8..89777ff 100644 --- a/gcc/tlink.c +++ b/gcc/tlink.c @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3. If not see #include "hashtab.h" #include "demangle.h" #include "collect2.h" +#include "collect-utils.h" #include "filenames.h" #include "diagnostic-core.h" #include "vec.h" @@ -104,8 +105,6 @@ static void symbol_push (symbol *); static symbol * symbol_pop (void); static void file_push (file *); static file * file_pop (void); -static void tlink_init (void); -static int tlink_execute (const char *, char **, const char *, const char *); static char * frob_extension (const char *, const char *); static char * obstack_fgets (FILE *, struct obstack *); static char * tfgets (FILE *); @@ -275,7 +274,7 @@ tlink_init (void) else { tlink_verbose = 1; - if (vflag) + if (verbose) tlink_verbose = 2; if (debug) tlink_verbose = 3; @@ -286,11 +285,12 @@ tlink_init (void) static int tlink_execute (const char *prog, char **argv, const char *outname, - const char *errname) + const char *errname, bool use_atfile) { struct pex_obj *pex; - pex = collect_execute (prog, argv, outname, errname, PEX_LAST | PEX_SEARCH); + pex = collect_execute (prog, argv, outname, errname, + PEX_LAST | PEX_SEARCH, use_atfile); return collect_wait (prog, pex); } @@ -545,7 +545,7 @@ recompile_files (void) fprintf (stderr, _("collect: recompiling %s\n"), f->main); if (chdir (f->dir) != 0 - || tlink_execute (c_file_name, argv, NULL, NULL) != 0 + || tlink_execute (c_file_name, argv, NULL, NULL, false) != 0 || chdir (initial_cwd) != 0) return 0; @@ -817,7 +817,8 @@ scan_linker_output (const char *fname) void do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED) { - int ret = tlink_execute ("ld", ld_argv, ldout, lderrout); + int ret = tlink_execute ("ld", ld_argv, ldout, lderrout, + HAVE_GNU_LD && at_file_supplied); tlink_init (); @@ -843,7 +844,8 @@ do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED) break; if (tlink_verbose) fprintf (stderr, _("collect: relinking\n")); - ret = tlink_execute ("ld", ld_argv, ldout, lderrout); + ret = tlink_execute ("ld", ld_argv, ldout, lderrout, + HAVE_GNU_LD && at_file_supplied); } }