aboutsummaryrefslogtreecommitdiff
path: root/gdb/main.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-09-29 09:27:11 -0600
committerTom Tromey <tom@tromey.com>2019-11-26 14:02:57 -0700
commitc3efb9654847822620010922cb7ea61e8901479c (patch)
tree19776ea09f27af39d30ac52c3c53b8f10435a317 /gdb/main.c
parent21987b9c060033d367abc50c29f786df4c21b10c (diff)
downloadfsf-binutils-gdb-c3efb9654847822620010922cb7ea61e8901479c.zip
fsf-binutils-gdb-c3efb9654847822620010922cb7ea61e8901479c.tar.gz
fsf-binutils-gdb-c3efb9654847822620010922cb7ea61e8901479c.tar.bz2
Introduce alternate_signal_stack RAII class
This introduces a new RAII class that temporarily installs an alternate signal stack (on systems that have sigaltstack); then changes the one gdb use of sigaltstack to use this class instead. This will be used in a later patch, when creating new threads that may want to handle SIGSEGV. gdb/ChangeLog 2019-11-26 Tom Tromey <tom@tromey.com> * main.c (setup_alternate_signal_stack): Remove. (captured_main_1): Use gdb::alternate_signal_stack. * gdbsupport/alt-stack.h: New file. Change-Id: I721c047ae9d51a35fd274a6dbc00a58c6440dae6
Diffstat (limited to 'gdb/main.c')
-rw-r--r--gdb/main.c26
1 files changed, 2 insertions, 24 deletions
diff --git a/gdb/main.c b/gdb/main.c
index a051254..1acf53e 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -52,6 +52,7 @@
#ifdef GDBTK
#include "gdbtk/generic/gdbtk.h"
#endif
+#include "gdbsupport/alt-stack.h"
/* The selected interpreter. This will be used as a set command
variable, so it should always be malloc'ed - since
@@ -334,29 +335,6 @@ get_init_files (std::vector<std::string> *system_gdbinit,
*local_gdbinit = localinit;
}
-/* Try to set up an alternate signal stack for SIGSEGV handlers.
- This allows us to handle SIGSEGV signals generated when the
- normal process stack is exhausted. If this stack is not set
- up (sigaltstack is unavailable or fails) and a SIGSEGV is
- generated when the normal stack is exhausted then the program
- will behave as though no SIGSEGV handler was installed. */
-
-static void
-setup_alternate_signal_stack (void)
-{
-#ifdef HAVE_SIGALTSTACK
- stack_t ss;
-
- /* FreeBSD versions older than 11.0 use char * for ss_sp instead of
- void *. This cast works with both types. */
- ss.ss_sp = (char *) xmalloc (SIGSTKSZ);
- ss.ss_size = SIGSTKSZ;
- ss.ss_flags = 0;
-
- sigaltstack(&ss, NULL);
-#endif
-}
-
/* Call command_loop. */
/* Prevent inlining this function for the benefit of GDB's selftests
@@ -898,7 +876,7 @@ captured_main_1 (struct captured_main_args *context)
save_original_signals_state (quiet);
/* Try to set up an alternate signal stack for SIGSEGV handlers. */
- setup_alternate_signal_stack ();
+ gdb::alternate_signal_stack signal_stack;
/* Initialize all files. */
gdb_init (gdb_program_name);