diff --git a/gdbsupport/common-exceptions.cc b/gdbsupport/common-exceptions.cc index d0dd8081c41..edc1b56181a 100644 --- a/gdbsupport/common-exceptions.cc +++ b/gdbsupport/common-exceptions.cc @@ -184,6 +184,8 @@ throw_exception (gdb_exception &&exception) { if (exception.reason == RETURN_QUIT) throw gdb_exception_quit (std::move (exception)); + else if (exception.reason == RETURN_FORCED_QUIT) + throw gdb_exception_forced_quit (std::move (exception)); else if (exception.reason == RETURN_ERROR) throw gdb_exception_error (std::move (exception)); else @@ -196,6 +198,8 @@ throw_it (enum return_reason reason, enum errors error, const char *fmt, { if (reason == RETURN_QUIT) throw gdb_exception_quit (fmt, ap); + else if (reason == RETURN_FORCED_QUIT) + throw gdb_exception_forced_quit (fmt, ap); else if (reason == RETURN_ERROR) throw gdb_exception_error (error, fmt, ap); else @@ -233,3 +237,13 @@ throw_quit (const char *fmt, ...) throw_vquit (fmt, args); va_end (args); } + +void +throw_forced_quit (const char *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + throw_it (RETURN_FORCED_QUIT, GDB_NO_ERROR, fmt, args); + va_end (args); +} diff --git a/gdbsupport/common-exceptions.h b/gdbsupport/common-exceptions.h index a2a4f5a3892..f9b59ece736 100644 --- a/gdbsupport/common-exceptions.h +++ b/gdbsupport/common-exceptions.h @@ -32,6 +32,8 @@ enum return_reason { + /* SIGTERM sent to GDB. */ + RETURN_FORCED_QUIT = -3, /* User interrupt. */ RETURN_QUIT = -2, /* Any other error. */ @@ -42,9 +44,10 @@ enum return_reason typedef enum { + RETURN_MASK_FORCED_QUIT = RETURN_MASK (RETURN_FORCED_QUIT), RETURN_MASK_QUIT = RETURN_MASK (RETURN_QUIT), RETURN_MASK_ERROR = RETURN_MASK (RETURN_ERROR), - RETURN_MASK_ALL = (RETURN_MASK_QUIT | RETURN_MASK_ERROR) + RETURN_MASK_ALL = (RETURN_MASK_FORCED_QUIT | RETURN_MASK_QUIT | RETURN_MASK_ERROR) } return_mask; /* Describe all exceptions. */ @@ -294,6 +297,21 @@ struct gdb_exception_quit : public gdb_exception } }; +struct gdb_exception_forced_quit : public gdb_exception +{ + gdb_exception_forced_quit (const char *fmt, va_list ap) + ATTRIBUTE_PRINTF (2, 0) + : gdb_exception (RETURN_FORCED_QUIT, GDB_NO_ERROR, fmt, ap) + { + } + + explicit gdb_exception_forced_quit (gdb_exception &&ex) noexcept + : gdb_exception (std::move (ex)) + { + gdb_assert (ex.reason == RETURN_FORCED_QUIT); + } +}; + /* An exception type that inherits from both std::bad_alloc and a gdb exception. This is necessary because operator new can only throw std::bad_alloc, and OTOH, we want exceptions thrown due to memory @@ -336,5 +354,7 @@ extern void throw_error (enum errors error, const char *fmt, ...) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (2, 3); extern void throw_quit (const char *fmt, ...) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2); +extern void throw_forced_quit (const char *fmt, ...) + ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF (1, 2); #endif /* COMMON_COMMON_EXCEPTIONS_H */