[backport gcc-4.8.2 r200257 ] gcc/ 2013-06-20 David Edelsohn Backport from mainline 2013-06-19 David Edelsohn 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. --- gcc-4.7.3/gcc/collect2.c.~1~ 2013-02-05 17:41:08.000000000 +0100 +++ gcc-4.7.3/gcc/collect2.c 2013-06-21 12:14:42.914125893 +0200 @@ -384,8 +384,8 @@ static void scan_prog_file (const char * /* 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 p 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_ob if (ret != 0) { error ("%s returned %d exit status", prog, ret); - collect_exit (ret); + exit (ret); } if (response_file) --- gcc-4.7.3/gcc/collect2.h.~1~ 2011-05-19 18:25:12.000000000 +0200 +++ gcc-4.7.3/gcc/collect2.h 2013-06-21 12:14:42.914125893 +0200 @@ -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 *); --- gcc-4.7.3/gcc/tlink.c.~1~ 2012-02-11 09:50:23.000000000 +0100 +++ gcc-4.7.3/gcc/tlink.c 2013-06-21 12:14:42.914125893 +0200 @@ -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_ 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_ 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); } }