From 6fc2d0f36223308d21f2347c9b48bc61fed2405c Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 23 Jan 2015 16:28:14 +0000 Subject: [PATCH] PR jit/64721: toplev: don't install signal-handlers when running within libgccjit gcc/ChangeLog: PR jit/64721 * main.c (main): Construct toplev instances with init_signals=true. * toplev.c (general_init): Add param "init_signals", and use it to conditionalize the calls to signal and host_hooks.extra_signals. (toplev::toplev): Add param "init_signals". (toplev::main): When invoking general_init, pass m_init_signals to control whether signal-handlers are installed. * toplev.h (toplev::toplev): Add param "init_signals". (toplev::m_init_signals): New field. gcc/jit/ChangeLog: PR jit/64721 * jit-playback.c (gcc::jit::playback::context::compile): Construct toplev instances with init_signals=false. From-SVN: r220045 --- gcc/ChangeLog | 12 ++++++++++++ gcc/jit/ChangeLog | 6 ++++++ gcc/jit/jit-playback.c | 3 ++- gcc/main.c | 3 ++- gcc/toplev.c | 32 ++++++++++++++++++-------------- gcc/toplev.h | 4 +++- 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a47ca2cecf4..4931136ed64b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2015-01-23 David Malcolm + + PR jit/64721 + * main.c (main): Construct toplev instances with init_signals=true. + * toplev.c (general_init): Add param "init_signals", and use it to + conditionalize the calls to signal and host_hooks.extra_signals. + (toplev::toplev): Add param "init_signals". + (toplev::main): When invoking general_init, pass m_init_signals + to control whether signal-handlers are installed. + * toplev.h (toplev::toplev): Add param "init_signals". + (toplev::m_init_signals): New field. + 2015-01-23 David Malcolm PR jit/64722 diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index e5750749aac8..137245f116fe 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,9 @@ +2015-01-23 David Malcolm + + PR jit/64721 + * jit-playback.c (gcc::jit::playback::context::compile): Construct + toplev instances with init_signals=false. + 2015-01-19 David Malcolm * docs/cp/topics/results.rst: Rename to... diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index b4f20738ae59..d2549a0d38a4 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -1723,7 +1723,8 @@ compile () acquire_mutex (); /* This runs the compiler. */ - toplev toplev (false); + toplev toplev (false, /* use_TV_TOTAL */ + false); /* init_signals */ enter_scope ("toplev::main"); if (get_logger ()) for (unsigned i = 0; i < fake_args.length (); i++) diff --git a/gcc/main.c b/gcc/main.c index 7a02983672aa..79baf0d46314 100644 --- a/gcc/main.c +++ b/gcc/main.c @@ -33,7 +33,8 @@ int main (int argc, char **argv); int main (int argc, char **argv) { - toplev toplev (true); + toplev toplev (true, /* use_TV_TOTAL */ + true /* init_signals */); return toplev.main (argc, argv); } diff --git a/gcc/toplev.c b/gcc/toplev.c index 15b85e1d2e91..508462800531 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -137,7 +137,7 @@ along with GCC; see the file COPYING3. If not see #include -static void general_init (const char *); +static void general_init (const char *, bool); static void do_compile (); static void process_options (void); static void backend_init (void); @@ -1151,7 +1151,7 @@ open_auxiliary_file (const char *ext) options are parsed. Signal handlers, internationalization etc. ARGV0 is main's argv[0]. */ static void -general_init (const char *argv0) +general_init (const char *argv0, bool init_signals) { const char *p; @@ -1190,28 +1190,31 @@ general_init (const char *argv0) global_dc->option_state = &global_options; global_dc->option_name = option_name; - /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ + if (init_signals) + { + /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ #ifdef SIGSEGV - signal (SIGSEGV, crash_signal); + signal (SIGSEGV, crash_signal); #endif #ifdef SIGILL - signal (SIGILL, crash_signal); + signal (SIGILL, crash_signal); #endif #ifdef SIGBUS - signal (SIGBUS, crash_signal); + signal (SIGBUS, crash_signal); #endif #ifdef SIGABRT - signal (SIGABRT, crash_signal); + signal (SIGABRT, crash_signal); #endif #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT) - signal (SIGIOT, crash_signal); + signal (SIGIOT, crash_signal); #endif #ifdef SIGFPE - signal (SIGFPE, crash_signal); + signal (SIGFPE, crash_signal); #endif - /* Other host-specific signal setup. */ - (*host_hooks.extra_signals)(); + /* Other host-specific signal setup. */ + (*host_hooks.extra_signals)(); + } /* Initialize the garbage-collector, string pools and tree type hash table. */ @@ -2059,8 +2062,9 @@ do_compile () } } -toplev::toplev (bool use_TV_TOTAL) - : m_use_TV_TOTAL (use_TV_TOTAL) +toplev::toplev (bool use_TV_TOTAL, bool init_signals) + : m_use_TV_TOTAL (use_TV_TOTAL), + m_init_signals (init_signals) { if (!m_use_TV_TOTAL) start_timevars (); @@ -2097,7 +2101,7 @@ toplev::main (int argc, char **argv) expandargv (&argc, &argv); /* Initialization of GCC's environment, and diagnostics. */ - general_init (argv[0]); + general_init (argv[0], m_init_signals); /* One-off initialization of options that does not need to be repeated when options are added for particular functions. */ diff --git a/gcc/toplev.h b/gcc/toplev.h index 550379573391..6b423be3c51b 100644 --- a/gcc/toplev.h +++ b/gcc/toplev.h @@ -28,7 +28,8 @@ extern unsigned int save_decoded_options_count; class toplev { public: - toplev (bool use_TV_TOTAL); + toplev (bool use_TV_TOTAL, + bool init_signals); ~toplev (); int main (int argc, char **argv); @@ -40,6 +41,7 @@ private: void start_timevars (); bool m_use_TV_TOTAL; + bool m_init_signals; }; extern void rest_of_decl_compilation (tree, int, int); -- 2.39.5