Message ID | 1348750886-20673-1-git-send-email-meadori@codesourcery.com |
---|---|
State | New |
Headers | show |
On Thu, Sep 27, 2012 at 3:01 PM, Meador Inge <meadori@codesourcery.com> wrote: > Hi All, > > The gcc-[ar|nm|ranlib] LTO utils use 'pex_one' to spawn the wrapped binutils > program. However, currently it is blindly returning the value of the 'err' > parameter for the exit code. According the documentation [1] 'err' is only > set for an error return and 'status' is only set for a successful return. > > This patch fixes the bug by appropriately checking the returned status > and extracting the exit code when needed. Tested on GNU/Linux and Windows. > > OK? Ok. Also for the branches (where applicable). Thanks, Richard. > 2012-09-27 Meador Inge <meadori@codesourcery.com> > > * gcc-ar.c (main): Handle the returning of the sub-process error > code correctly. > > [1] http://gcc.gnu.org/onlinedocs/libiberty/Functions.html#Functions > > Index: gcc/gcc-ar.c > =================================================================== > --- gcc/gcc-ar.c (revision 191792) > +++ gcc/gcc-ar.c (working copy) > @@ -42,6 +42,7 @@ > const char *err_msg; > const char **nargv; > bool is_ar = !strcmp (PERSONALITY, "ar"); > + int exit_code = FATAL_EXIT_CODE; > > exe_name = PERSONALITY; > #ifdef CROSS_DIRECTORY_STRUCTURE > @@ -96,6 +97,20 @@ > NULL,NULL, &status, &err); > if (err_msg) > fprintf(stderr, "Error running %s: %s\n", exe_name, err_msg); > + else if (status) > + { > + if (WIFSIGNALED (status)) > + { > + int sig = WTERMSIG (status); > + fprintf (stderr, "%s terminated with signal %d [%s]%s\n", > + exe_name, sig, strsignal(sig), > + WCOREDUMP(status) ? ", core dumped" : ""); > + } > + else if (WIFEXITED (status)) > + exit_code = WEXITSTATUS (status); > + } > + else > + exit_code = SUCCESS_EXIT_CODE; > > - return err; > + return exit_code; > }
Index: gcc/gcc-ar.c =================================================================== --- gcc/gcc-ar.c (revision 191792) +++ gcc/gcc-ar.c (working copy) @@ -42,6 +42,7 @@ const char *err_msg; const char **nargv; bool is_ar = !strcmp (PERSONALITY, "ar"); + int exit_code = FATAL_EXIT_CODE; exe_name = PERSONALITY; #ifdef CROSS_DIRECTORY_STRUCTURE @@ -96,6 +97,20 @@ NULL,NULL, &status, &err); if (err_msg) fprintf(stderr, "Error running %s: %s\n", exe_name, err_msg); + else if (status) + { + if (WIFSIGNALED (status)) + { + int sig = WTERMSIG (status); + fprintf (stderr, "%s terminated with signal %d [%s]%s\n", + exe_name, sig, strsignal(sig), + WCOREDUMP(status) ? ", core dumped" : ""); + } + else if (WIFEXITED (status)) + exit_code = WEXITSTATUS (status); + } + else + exit_code = SUCCESS_EXIT_CODE; - return err; + return exit_code; }