summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/collect2.c16
-rw-r--r--gcc/collect2.h2
-rw-r--r--gcc/tlink.c14
4 files changed, 25 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8973cb9e2fc..6d2d7c915e6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2013-06-19 David Edelsohn <dje.gcc@gmail.com>
+
+ PR driver/57652
+ * collect2.c (collect_atexit): New.
+ (collect_exit): Delete.
+ (main): Register collect_atexit with atexit.
+ (collect_wait): Change collect_exit to exit.
+ (do_wait): Same.
+ * collect2.h (collect_exit): Delete.
+ * tlink.c (do_tlink): Rename exit to ret. Change collect_exit to exit.
+
2013-06-19 Wei Mi <wmi@google.com>
PR rtl-optimization/57518
diff --git a/gcc/collect2.c b/gcc/collect2.c
index b1eafb84b5b..43b9defafd8 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -366,8 +366,8 @@ static void scan_prog_file (const char *, scanpass, scanfilter);
/* Delete tempfiles and exit function. */
-void
-collect_exit (int status)
+static void
+collect_atexit (void)
{
if (c_file != 0 && c_file[0])
maybe_unlink (c_file);
@@ -395,13 +395,8 @@ collect_exit (int status)
maybe_unlink (lderrout);
}
- if (status != 0 && output_file != 0 && output_file[0])
- maybe_unlink (output_file);
-
if (response_file)
maybe_unlink (response_file);
-
- exit (status);
}
@@ -970,6 +965,9 @@ main (int argc, char **argv)
signal (SIGCHLD, SIG_DFL);
#endif
+ if (atexit (collect_atexit) != 0)
+ fatal_error ("atexit failed");
+
/* Unlock the stdio streams. */
unlock_std_streams ();
@@ -1816,7 +1814,7 @@ collect_wait (const char *prog, struct pex_obj *pex)
error ("%s terminated with signal %d [%s]%s",
prog, sig, strsignal(sig),
WCOREDUMP(status) ? ", core dumped" : "");
- collect_exit (FATAL_EXIT_CODE);
+ exit (FATAL_EXIT_CODE);
}
if (WIFEXITED (status))
@@ -1832,7 +1830,7 @@ do_wait (const char *prog, struct pex_obj *pex)
if (ret != 0)
{
error ("%s returned %d exit status", prog, ret);
- collect_exit (ret);
+ exit (ret);
}
if (response_file)
diff --git a/gcc/collect2.h b/gcc/collect2.h
index 1765bc438ef..2385e4a9813 100644
--- a/gcc/collect2.h
+++ b/gcc/collect2.h
@@ -25,8 +25,6 @@ extern void do_tlink (char **, char **);
extern struct pex_obj *collect_execute (const char *, char **, const char *,
const char *, int flags);
-extern void collect_exit (int) ATTRIBUTE_NORETURN;
-
extern int collect_wait (const char *, struct pex_obj *);
extern void dump_ld_file (const char *, FILE *);
diff --git a/gcc/tlink.c b/gcc/tlink.c
index 7a64c79db7c..8365bd3cfa1 100644
--- a/gcc/tlink.c
+++ b/gcc/tlink.c
@@ -817,18 +817,18 @@ scan_linker_output (const char *fname)
void
do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
{
- int exit = tlink_execute ("ld", ld_argv, ldout, lderrout);
+ int ret = tlink_execute ("ld", ld_argv, ldout, lderrout);
tlink_init ();
- if (exit)
+ if (ret)
{
int i = 0;
/* Until collect does a better job of figuring out which are object
files, assume that everything on the command line could be. */
if (read_repo_files (ld_argv))
- while (exit && i++ < MAX_ITERATIONS)
+ while (ret && i++ < MAX_ITERATIONS)
{
if (tlink_verbose >= 3)
{
@@ -843,7 +843,7 @@ do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
break;
if (tlink_verbose)
fprintf (stderr, _("collect: relinking\n"));
- exit = tlink_execute ("ld", ld_argv, ldout, lderrout);
+ ret = tlink_execute ("ld", ld_argv, ldout, lderrout);
}
}
@@ -851,10 +851,10 @@ do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
unlink (ldout);
dump_ld_file (lderrout, stderr);
unlink (lderrout);
- if (exit)
+ if (ret)
{
- error ("ld returned %d exit status", exit);
- collect_exit (exit);
+ error ("ld returned %d exit status", ret);
+ exit (ret);
}
else
{