On Tue, Aug 31, 2021 at 4:17 AM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > So the main issue here is that some signals are not setup unlike collect2. > So this merges the setting up of the signal handlers to one function in > collect-utils and has collect2 and lto-wrapper call that function. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK. > gcc/ChangeLog: > > PR driver/79181 > * collect-utils.c (setup_signals): New declaration. > * collect-utils.h (setup_signals): New function. > * collect2.c (handler): Delete. > (main): Instead of manually setting up the signals, > just call setup_signals. > * lto-wrapper.c (main): Likewise. > --- > gcc/collect-utils.c | 37 +++++++++++++++++++++++++++++++++++++ > gcc/collect-utils.h | 1 + > gcc/collect2.c | 36 +----------------------------------- > gcc/lto-wrapper.c | 18 +----------------- > 4 files changed, 40 insertions(+), 52 deletions(-) > > diff --git a/gcc/collect-utils.c b/gcc/collect-utils.c > index 6b5d61d5162..19423d31885 100644 > --- a/gcc/collect-utils.c > +++ b/gcc/collect-utils.c > @@ -57,6 +57,43 @@ fatal_signal (int signum) > so its normal effect occurs. */ > kill (getpid (), signum); > } > + > +/* Setup the signal handlers for the utils. */ > +void > +setup_signals (void) > +{ > +#ifdef SIGQUIT > + if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) > + signal (SIGQUIT, fatal_signal); > +#endif > + if (signal (SIGINT, SIG_IGN) != SIG_IGN) > + signal (SIGINT, fatal_signal); > +#ifdef SIGALRM > + if (signal (SIGALRM, SIG_IGN) != SIG_IGN) > + signal (SIGALRM, fatal_signal); > +#endif > +#ifdef SIGHUP > + if (signal (SIGHUP, SIG_IGN) != SIG_IGN) > + signal (SIGHUP, fatal_signal); > +#endif > + if (signal (SIGSEGV, SIG_IGN) != SIG_IGN) > + signal (SIGSEGV, fatal_signal); > + if (signal (SIGTERM, SIG_IGN) != SIG_IGN) > + signal (SIGTERM, fatal_signal); > +#ifdef SIGPIPE > + if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) > + signal (SIGPIPE, fatal_signal); > +#endif > +#ifdef SIGBUS > + if (signal (SIGBUS, SIG_IGN) != SIG_IGN) > + signal (SIGBUS, fatal_signal); > +#endif > +#ifdef SIGCHLD > + /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will > + receive the signal. A different setting is inheritable */ > + signal (SIGCHLD, SIG_DFL); > +#endif > +} > > /* Wait for a process to finish, and exit if a nonzero status is found. */ > > diff --git a/gcc/collect-utils.h b/gcc/collect-utils.h > index 4f0e3ce9832..15f831d778a 100644 > --- a/gcc/collect-utils.h > +++ b/gcc/collect-utils.h > @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see > extern void notice (const char *, ...) > __attribute__ ((format (printf, 1, 2))); > extern void fatal_signal (int); > +extern void setup_signals (void); > > extern struct pex_obj *collect_execute (const char *, char **, > const char *, const char *, > diff --git a/gcc/collect2.c b/gcc/collect2.c > index 07092c2733a..cf04a58ba4d 100644 > --- a/gcc/collect2.c > +++ b/gcc/collect2.c > @@ -301,7 +301,6 @@ const char tool_name[] = "collect2"; > > static symkind is_ctor_dtor (const char *); > > -static void handler (int); > static void maybe_unlink_list (char **); > static void add_to_list (struct head *, const char *); > static int extract_init_priority (const char *); > @@ -408,14 +407,6 @@ collect_atexit (void) > tool_cleanup (false); > } > > -static void > -handler (int signo) > -{ > - tool_cleanup (true); > - > - signal (signo, SIG_DFL); > - raise (signo); > -} > /* Notify user of a non-error, without translating the format string. */ > void > notice_translated (const char *cmsgid, ...) > @@ -907,11 +898,7 @@ main (int argc, char **argv) > COLLECT2_HOST_INITIALIZATION; > #endif > > -#ifdef SIGCHLD > - /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will > - receive the signal. A different setting is inheritable */ > - signal (SIGCHLD, SIG_DFL); > -#endif > + setup_signals (); > > /* Unlock the stdio streams. */ > unlock_std_streams (); > @@ -1051,27 +1038,6 @@ main (int argc, char **argv) > if (argc < 2) > fatal_error (input_location, "no arguments"); > > -#ifdef SIGQUIT > - if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) > - signal (SIGQUIT, handler); > -#endif > - if (signal (SIGINT, SIG_IGN) != SIG_IGN) > - signal (SIGINT, handler); > -#ifdef SIGALRM > - if (signal (SIGALRM, SIG_IGN) != SIG_IGN) > - signal (SIGALRM, handler); > -#endif > -#ifdef SIGHUP > - if (signal (SIGHUP, SIG_IGN) != SIG_IGN) > - signal (SIGHUP, handler); > -#endif > - if (signal (SIGSEGV, SIG_IGN) != SIG_IGN) > - signal (SIGSEGV, handler); > -#ifdef SIGBUS > - if (signal (SIGBUS, SIG_IGN) != SIG_IGN) > - signal (SIGBUS, handler); > -#endif > - > /* Extract COMPILER_PATH and PATH into our prefix list. */ > prefix_from_env ("COMPILER_PATH", &cpath); > prefix_from_env ("PATH", &path); > diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c > index aae48aff100..903c258a03a 100644 > --- a/gcc/lto-wrapper.c > +++ b/gcc/lto-wrapper.c > @@ -2125,23 +2125,7 @@ main (int argc, char *argv[]) > if (atexit (lto_wrapper_cleanup) != 0) > fatal_error (input_location, "%<atexit%> failed"); > > - if (signal (SIGINT, SIG_IGN) != SIG_IGN) > - signal (SIGINT, fatal_signal); > -#ifdef SIGHUP > - if (signal (SIGHUP, SIG_IGN) != SIG_IGN) > - signal (SIGHUP, fatal_signal); > -#endif > - if (signal (SIGTERM, SIG_IGN) != SIG_IGN) > - signal (SIGTERM, fatal_signal); > -#ifdef SIGPIPE > - if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) > - signal (SIGPIPE, fatal_signal); > -#endif > -#ifdef SIGCHLD > - /* We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will > - receive the signal. A different setting is inheritable */ > - signal (SIGCHLD, SIG_DFL); > -#endif > + setup_signals (); > > /* We may be called with all the arguments stored in some file and > passed with @file. Expand them into argv before processing. */ > -- > 2.17.1 >