backport: re PR driver/57652 (collect2 does not clean up temporary files)

Backport from mainline
        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.

From-SVN: r200307
This commit is contained in:
David Edelsohn 2013-06-21 15:14:23 +00:00 committed by David Edelsohn
parent 8e6de76820
commit 68acc08687
4 changed files with 31 additions and 21 deletions

View File

@ -1,3 +1,17 @@
2013-06-21 David Edelsohn <dje.gcc@gmail.com>
Backport from mainline
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-07 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline

View File

@ -1,7 +1,7 @@
/* Collect static initialization info into data structures that can be
traversed by C++ initialization and finalization routines.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2013
Free Software Foundation, Inc.
Contributed by Chris Smith (csmith@convex.com).
Heavily modified by Michael Meissner (meissner@cygnus.com),
@ -384,8 +384,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);
@ -413,13 +413,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);
}
@ -1132,6 +1127,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 ();
@ -1973,7 +1971,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))
@ -1989,7 +1987,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)

View File

@ -1,5 +1,5 @@
/* Header file for collect/tlink routines.
Copyright (C) 1998, 2003, 2004, 2005, 2007, 2010, 2011
Copyright (C) 1998, 2003, 2004, 2005, 2007, 2010, 2011, 2013
Free Software Foundation, Inc.
This file is part of GCC.
@ -26,8 +26,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_file (const char *, FILE *);

View File

@ -2,7 +2,7 @@
them.
Copyright (C) 1995, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008,
2009, 2010, 2011 Free Software Foundation, Inc.
2009, 2010, 2011, 2013 Free Software Foundation, Inc.
Contributed by Jason Merrill (jason@cygnus.com).
This file is part of GCC.
@ -820,18 +820,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)
{
@ -846,7 +846,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);
}
}
@ -854,9 +854,9 @@ do_tlink (char **ld_argv, char **object_lst ATTRIBUTE_UNUSED)
unlink (ldout);
dump_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);
}
}