Guile QUIT processing updates

This commit contains QUIT processing updates for GDB's Guile support.
As with the Python updates, we don't want to permit this code to
swallow the exception, gdb_exception_forced_quit, which is associated
with GDB receiving a SIGTERM.

I've adopted the same solution that I used for Python; whereever
a gdb_exception is caught in try/catch code in the Guile extension
language support, a catch for gdb_exception_forced_quit has been
added; this catch block will simply call quit_force(), which will
cause the necessary cleanups to occur followed by GDB exiting.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26761
Tested-by: Tom de Vries <tdevries@suse.de>
Approved-By: Pedro Alves <pedro@palves.net>
This commit is contained in:
Kevin Buettner 2023-02-27 16:11:37 -07:00
parent b940a061c0
commit 53f1f3d4aa
5 changed files with 21 additions and 1 deletions

View file

@ -29,6 +29,7 @@
#include "symtab.h" #include "symtab.h"
#include "libguile.h" #include "libguile.h"
#include "objfiles.h" #include "objfiles.h"
#include "top.h" /* For quit_force(). */
struct block; struct block;
struct frame_info; struct frame_info;
@ -704,6 +705,10 @@ gdbscm_wrap (Function &&func, Args &&... args)
{ {
result = func (std::forward<Args> (args)...); result = func (std::forward<Args> (args)...);
} }
catch (const gdb_exception_forced_quit &e)
{
quit_force (NULL, 0);
}
catch (const gdb_exception &except) catch (const gdb_exception &except)
{ {
exc = unpack (except); exc = unpack (except);

View file

@ -21,6 +21,7 @@
conventions, et.al. */ conventions, et.al. */
#include "defs.h" #include "defs.h"
#include "top.h" /* For quit_force(). */
#include "charset.h" #include "charset.h"
#include "symtab.h" /* Needed by language.h. */ #include "symtab.h" /* Needed by language.h. */
#include "language.h" #include "language.h"
@ -558,6 +559,10 @@ ppscm_pretty_print_one_value (SCM printer, struct value **out_value,
(_("invalid result from pretty-printer to-string"), result); (_("invalid result from pretty-printer to-string"), result);
} }
} }
catch (const gdb_exception_forced_quit &except)
{
quit_force (NULL, 0);
}
catch (const gdb_exception &except) catch (const gdb_exception &except)
{ {
} }

View file

@ -21,6 +21,7 @@
conventions, et.al. */ conventions, et.al. */
#include "defs.h" #include "defs.h"
#include "top.h" /* For quit_force(). */
#include "arch-utils.h" #include "arch-utils.h"
#include "value.h" #include "value.h"
#include "gdbtypes.h" #include "gdbtypes.h"
@ -132,6 +133,10 @@ tyscm_type_name (struct type *type)
&type_print_raw_options); &type_print_raw_options);
return stb.release (); return stb.release ();
} }
catch (const gdb_exception_forced_quit &except)
{
quit_force (NULL, 0);
}
catch (const gdb_exception &except) catch (const gdb_exception &except)
{ {
excp = gdbscm_scm_from_gdb_exception (unpack (except)); excp = gdbscm_scm_from_gdb_exception (unpack (except));

View file

@ -21,6 +21,7 @@
conventions, et.al. */ conventions, et.al. */
#include "defs.h" #include "defs.h"
#include "top.h" /* For quit_force(). */
#include "arch-utils.h" #include "arch-utils.h"
#include "charset.h" #include "charset.h"
#include "cp-abi.h" #include "cp-abi.h"
@ -416,6 +417,10 @@ gdbscm_value_address (SCM self)
{ {
address = vlscm_scm_from_value (value_addr (value)); address = vlscm_scm_from_value (value_addr (value));
} }
catch (const gdb_exception_forced_quit &except)
{
quit_force (NULL, 0);
}
catch (const gdb_exception &except) catch (const gdb_exception &except)
{ {
} }

View file

@ -235,7 +235,7 @@ extern void read_command_file (FILE *);
extern void init_history (void); extern void init_history (void);
extern void command_loop (void); extern void command_loop (void);
extern int quit_confirm (void); extern int quit_confirm (void);
extern void quit_force (int *, int); extern void quit_force (int *, int) ATTRIBUTE_NORETURN;
extern void quit_command (const char *, int); extern void quit_command (const char *, int);
extern void quit_cover (void); extern void quit_cover (void);
extern void execute_command (const char *, int); extern void execute_command (const char *, int);