gdb delay guile initialization until gdbscm_finish_initialization
Like with the previous commit, this commit delays the initialisation of the guile extension language until gdbscm_finish_initialization. This is mostly about splitting the existing gdbscm_initialize_* functions in two, all the calls to register_objfile_data_with_cleanup, gdbarch_data_register_post_init, etc are moved into new _initialize_* functions, but everything else is left in the gdbscm_initialize_* functions. Then the call to code previously in _initialize_guile is moved into gdbscm_finish_initialization. There should be no user visible changes after this commit. gdb/ChangeLog: * guile/guile.c (gdbscm_set_backtrace): Add declaration. (gdbscm_finish_initialization): Add code moved from _initialize_guile. (_initialize_guile): Move code to gdbscm_finish_initialization. * guile/scm-arch.c (gdbscm_initialize_arches): Move some code into _initialize_scm_arch. (_initialize_scm_arch): New function. * guile/scm-block.c (gdbscm_initialize_blocks): Move some code into _initialize_scm_block. (_initialize_scm_block): New function. * guile/scm-frame.c (gdbscm_initialize_frames): Move some code into _initialize_scm_frame. (_initialize_scm_frame): New function. * guile/scm-objfile.c (gdbscm_initialize_objfiles): Move some code into _initialize_scm_objfile. (_initialize_scm_objfile): New function. * guile/scm-progspace.c (gdbscm_initialize_pspaces): Move some code into _initialize_scm_progspace. (_initialize_scm_progspace): New function. * guile/scm-symbol.c (gdbscm_initialize_symbols): Move some code into _initialize_scm_symbol. (_initialize_scm_symbol): New function. * guile/scm-symtab.c (gdbscm_initialize_symtabs): Move some code into _initialize_scm_symtab. (_initialize_scm_symtab): New function. * guile/scm-type.c (gdbscm_initialize_types): Move some code into _initialize_scm_type. (_initialize_scm_type): New function.
This commit is contained in:
parent
8e3685bf25
commit
880ae75a2b
10 changed files with 109 additions and 42 deletions
|
@ -1,3 +1,34 @@
|
||||||
|
2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* guile/guile.c (gdbscm_set_backtrace): Add declaration.
|
||||||
|
(gdbscm_finish_initialization): Add code moved from
|
||||||
|
_initialize_guile.
|
||||||
|
(_initialize_guile): Move code to gdbscm_finish_initialization.
|
||||||
|
* guile/scm-arch.c (gdbscm_initialize_arches): Move some code into
|
||||||
|
_initialize_scm_arch.
|
||||||
|
(_initialize_scm_arch): New function.
|
||||||
|
* guile/scm-block.c (gdbscm_initialize_blocks): Move some code
|
||||||
|
into _initialize_scm_block.
|
||||||
|
(_initialize_scm_block): New function.
|
||||||
|
* guile/scm-frame.c (gdbscm_initialize_frames): Move some code
|
||||||
|
into _initialize_scm_frame.
|
||||||
|
(_initialize_scm_frame): New function.
|
||||||
|
* guile/scm-objfile.c (gdbscm_initialize_objfiles): Move some code
|
||||||
|
into _initialize_scm_objfile.
|
||||||
|
(_initialize_scm_objfile): New function.
|
||||||
|
* guile/scm-progspace.c (gdbscm_initialize_pspaces): Move some
|
||||||
|
code into _initialize_scm_progspace.
|
||||||
|
(_initialize_scm_progspace): New function.
|
||||||
|
* guile/scm-symbol.c (gdbscm_initialize_symbols): Move some code
|
||||||
|
into _initialize_scm_symbol.
|
||||||
|
(_initialize_scm_symbol): New function.
|
||||||
|
* guile/scm-symtab.c (gdbscm_initialize_symtabs): Move some code
|
||||||
|
into _initialize_scm_symtab.
|
||||||
|
(_initialize_scm_symtab): New function.
|
||||||
|
* guile/scm-type.c (gdbscm_initialize_types): Move some code into
|
||||||
|
_initialize_scm_type.
|
||||||
|
(_initialize_scm_type): New function.
|
||||||
|
|
||||||
2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com>
|
2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* python/py-arch.c (_initialize_py_arch): New function.
|
* python/py-arch.c (_initialize_py_arch): New function.
|
||||||
|
|
|
@ -81,6 +81,7 @@ static int gdbscm_initialized (const struct extension_language_defn *);
|
||||||
static void gdbscm_eval_from_control_command
|
static void gdbscm_eval_from_control_command
|
||||||
(const struct extension_language_defn *, struct command_line *);
|
(const struct extension_language_defn *, struct command_line *);
|
||||||
static script_sourcer_func gdbscm_source_script;
|
static script_sourcer_func gdbscm_source_script;
|
||||||
|
static void gdbscm_set_backtrace (int enable);
|
||||||
|
|
||||||
int gdb_scheme_initialized;
|
int gdb_scheme_initialized;
|
||||||
|
|
||||||
|
@ -644,6 +645,40 @@ call_initialize_gdb_module (void *data)
|
||||||
static void
|
static void
|
||||||
gdbscm_finish_initialization (const struct extension_language_defn *extlang)
|
gdbscm_finish_initialization (const struct extension_language_defn *extlang)
|
||||||
{
|
{
|
||||||
|
#if HAVE_GUILE
|
||||||
|
/* The Python support puts the C side in module "_gdb", leaving the
|
||||||
|
Python side to define module "gdb" which imports "_gdb". There is
|
||||||
|
evidently no similar convention in Guile so we skip this. */
|
||||||
|
|
||||||
|
#if HAVE_GUILE_MANUAL_FINALIZATION
|
||||||
|
/* Our SMOB free functions are not thread-safe, as GDB itself is not
|
||||||
|
intended to be thread-safe. Disable automatic finalization so that
|
||||||
|
finalizers aren't run in other threads. */
|
||||||
|
scm_set_automatic_finalization_enabled (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Before we initialize Guile, block signals needed by gdb (especially
|
||||||
|
SIGCHLD). This is done so that all threads created during Guile
|
||||||
|
initialization have SIGCHLD blocked. PR 17247. Really libgc and
|
||||||
|
Guile should do this, but we need to work with libgc 7.4.x. */
|
||||||
|
{
|
||||||
|
gdb::block_signals blocker;
|
||||||
|
|
||||||
|
/* scm_with_guile is the most portable way to initialize Guile. Plus
|
||||||
|
we need to initialize the Guile support while in Guile mode (e.g.,
|
||||||
|
called from within a call to scm_with_guile). */
|
||||||
|
scm_with_guile (call_initialize_gdb_module, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set Guile's backtrace to match the "set guile print-stack" default.
|
||||||
|
[N.B. The two settings are still separate.] But only do this after
|
||||||
|
we've initialized Guile, it's nice to see a backtrace if there's an
|
||||||
|
error during initialization. OTOH, if the error is that gdb/init.scm
|
||||||
|
wasn't found because gdb is being run from the build tree, the
|
||||||
|
backtrace is more noise than signal. Sigh. */
|
||||||
|
gdbscm_set_backtrace (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Restore the environment to the user interaction one. */
|
/* Restore the environment to the user interaction one. */
|
||||||
scm_set_current_module (scm_interaction_environment ());
|
scm_set_current_module (scm_interaction_environment ());
|
||||||
}
|
}
|
||||||
|
@ -770,43 +805,4 @@ void
|
||||||
_initialize_guile ()
|
_initialize_guile ()
|
||||||
{
|
{
|
||||||
install_gdb_commands ();
|
install_gdb_commands ();
|
||||||
|
|
||||||
#if HAVE_GUILE
|
|
||||||
{
|
|
||||||
/* The Python support puts the C side in module "_gdb", leaving the Python
|
|
||||||
side to define module "gdb" which imports "_gdb". There is evidently no
|
|
||||||
similar convention in Guile so we skip this. */
|
|
||||||
|
|
||||||
#if HAVE_GUILE_MANUAL_FINALIZATION
|
|
||||||
/* Our SMOB free functions are not thread-safe, as GDB itself is not
|
|
||||||
intended to be thread-safe. Disable automatic finalization so that
|
|
||||||
finalizers aren't run in other threads. */
|
|
||||||
scm_set_automatic_finalization_enabled (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Before we initialize Guile, block signals needed by gdb
|
|
||||||
(especially SIGCHLD).
|
|
||||||
This is done so that all threads created during Guile initialization
|
|
||||||
have SIGCHLD blocked. PR 17247.
|
|
||||||
Really libgc and Guile should do this, but we need to work with
|
|
||||||
libgc 7.4.x. */
|
|
||||||
{
|
|
||||||
gdb::block_signals blocker;
|
|
||||||
|
|
||||||
/* scm_with_guile is the most portable way to initialize Guile.
|
|
||||||
Plus we need to initialize the Guile support while in Guile mode
|
|
||||||
(e.g., called from within a call to scm_with_guile). */
|
|
||||||
scm_with_guile (call_initialize_gdb_module, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set Guile's backtrace to match the "set guile print-stack" default.
|
|
||||||
[N.B. The two settings are still separate.]
|
|
||||||
But only do this after we've initialized Guile, it's nice to see a
|
|
||||||
backtrace if there's an error during initialization.
|
|
||||||
OTOH, if the error is that gdb/init.scm wasn't found because gdb is
|
|
||||||
being run from the build tree, the backtrace is more noise than signal.
|
|
||||||
Sigh. */
|
|
||||||
gdbscm_set_backtrace (0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -650,7 +650,12 @@ gdbscm_initialize_arches (void)
|
||||||
scm_set_smob_print (arch_smob_tag, arscm_print_arch_smob);
|
scm_set_smob_print (arch_smob_tag, arscm_print_arch_smob);
|
||||||
|
|
||||||
gdbscm_define_functions (arch_functions, 1);
|
gdbscm_define_functions (arch_functions, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_arch ();
|
||||||
|
void
|
||||||
|
_initialize_scm_arch ()
|
||||||
|
{
|
||||||
arch_object_data
|
arch_object_data
|
||||||
= gdbarch_data_register_post_init (arscm_object_data_init);
|
= gdbarch_data_register_post_init (arscm_object_data_init);
|
||||||
}
|
}
|
||||||
|
|
|
@ -799,7 +799,12 @@ gdbscm_initialize_blocks (void)
|
||||||
gdbscm_documentation_symbol,
|
gdbscm_documentation_symbol,
|
||||||
gdbscm_scm_from_c_string ("\
|
gdbscm_scm_from_c_string ("\
|
||||||
Internal function to assist the block symbols iterator."));
|
Internal function to assist the block symbols iterator."));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_block ();
|
||||||
|
void
|
||||||
|
_initialize_scm_block ()
|
||||||
|
{
|
||||||
/* Register an objfile "free" callback so we can properly
|
/* Register an objfile "free" callback so we can properly
|
||||||
invalidate blocks when an object file is about to be deleted. */
|
invalidate blocks when an object file is about to be deleted. */
|
||||||
bkscm_objfile_data_key
|
bkscm_objfile_data_key
|
||||||
|
|
|
@ -1174,7 +1174,12 @@ gdbscm_initialize_frames (void)
|
||||||
gdbscm_define_functions (frame_functions, 1);
|
gdbscm_define_functions (frame_functions, 1);
|
||||||
|
|
||||||
block_keyword = scm_from_latin1_keyword ("block");
|
block_keyword = scm_from_latin1_keyword ("block");
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_frame ();
|
||||||
|
void
|
||||||
|
_initialize_scm_frame ()
|
||||||
|
{
|
||||||
/* Register an inferior "free" callback so we can properly
|
/* Register an inferior "free" callback so we can properly
|
||||||
invalidate frames when an inferior file is about to be deleted. */
|
invalidate frames when an inferior file is about to be deleted. */
|
||||||
frscm_inferior_data_key
|
frscm_inferior_data_key
|
||||||
|
|
|
@ -428,7 +428,12 @@ gdbscm_initialize_objfiles (void)
|
||||||
scm_set_smob_print (objfile_smob_tag, ofscm_print_objfile_smob);
|
scm_set_smob_print (objfile_smob_tag, ofscm_print_objfile_smob);
|
||||||
|
|
||||||
gdbscm_define_functions (objfile_functions, 1);
|
gdbscm_define_functions (objfile_functions, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_objfile ();
|
||||||
|
void
|
||||||
|
_initialize_scm_objfile ()
|
||||||
|
{
|
||||||
ofscm_objfile_data_key
|
ofscm_objfile_data_key
|
||||||
= register_objfile_data_with_cleanup (NULL, ofscm_handle_objfile_deleted);
|
= register_objfile_data_with_cleanup (NULL, ofscm_handle_objfile_deleted);
|
||||||
}
|
}
|
||||||
|
|
|
@ -417,7 +417,12 @@ gdbscm_initialize_pspaces (void)
|
||||||
scm_set_smob_print (pspace_smob_tag, psscm_print_pspace_smob);
|
scm_set_smob_print (pspace_smob_tag, psscm_print_pspace_smob);
|
||||||
|
|
||||||
gdbscm_define_functions (pspace_functions, 1);
|
gdbscm_define_functions (pspace_functions, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_progspace ();
|
||||||
|
void
|
||||||
|
_initialize_scm_progspace ()
|
||||||
|
{
|
||||||
psscm_pspace_data_key
|
psscm_pspace_data_key
|
||||||
= register_program_space_data_with_cleanup (NULL,
|
= register_program_space_data_with_cleanup (NULL,
|
||||||
psscm_handle_pspace_deleted);
|
psscm_handle_pspace_deleted);
|
||||||
|
|
|
@ -817,7 +817,12 @@ gdbscm_initialize_symbols (void)
|
||||||
block_keyword = scm_from_latin1_keyword ("block");
|
block_keyword = scm_from_latin1_keyword ("block");
|
||||||
domain_keyword = scm_from_latin1_keyword ("domain");
|
domain_keyword = scm_from_latin1_keyword ("domain");
|
||||||
frame_keyword = scm_from_latin1_keyword ("frame");
|
frame_keyword = scm_from_latin1_keyword ("frame");
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_symbol ();
|
||||||
|
void
|
||||||
|
_initialize_scm_symbol ()
|
||||||
|
{
|
||||||
/* Register an objfile "free" callback so we can properly
|
/* Register an objfile "free" callback so we can properly
|
||||||
invalidate symbols when an object file is about to be deleted. */
|
invalidate symbols when an object file is about to be deleted. */
|
||||||
syscm_objfile_data_key
|
syscm_objfile_data_key
|
||||||
|
|
|
@ -688,7 +688,12 @@ gdbscm_initialize_symtabs (void)
|
||||||
scm_set_smob_print (sal_smob_tag, stscm_print_sal_smob);
|
scm_set_smob_print (sal_smob_tag, stscm_print_sal_smob);
|
||||||
|
|
||||||
gdbscm_define_functions (symtab_functions, 1);
|
gdbscm_define_functions (symtab_functions, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_symtab ();
|
||||||
|
void
|
||||||
|
_initialize_scm_symtab ()
|
||||||
|
{
|
||||||
/* Register an objfile "free" callback so we can properly
|
/* Register an objfile "free" callback so we can properly
|
||||||
invalidate symbol tables, and symbol table and line data
|
invalidate symbol tables, and symbol table and line data
|
||||||
structures when an object file that is about to be deleted. */
|
structures when an object file that is about to be deleted. */
|
||||||
|
|
|
@ -1505,11 +1505,16 @@ Internal function to assist the type fields iterator."));
|
||||||
|
|
||||||
block_keyword = scm_from_latin1_keyword ("block");
|
block_keyword = scm_from_latin1_keyword ("block");
|
||||||
|
|
||||||
|
global_types_map = gdbscm_create_eqable_gsmob_ptr_map (tyscm_hash_type_smob,
|
||||||
|
tyscm_eq_type_smob);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initialize_scm_type ();
|
||||||
|
void
|
||||||
|
_initialize_scm_type ()
|
||||||
|
{
|
||||||
/* Register an objfile "free" callback so we can properly copy types
|
/* Register an objfile "free" callback so we can properly copy types
|
||||||
associated with the objfile when it's about to be deleted. */
|
associated with the objfile when it's about to be deleted. */
|
||||||
tyscm_objfile_data_key
|
tyscm_objfile_data_key
|
||||||
= register_objfile_data_with_cleanup (save_objfile_types, NULL);
|
= register_objfile_data_with_cleanup (save_objfile_types, NULL);
|
||||||
|
|
||||||
global_types_map = gdbscm_create_eqable_gsmob_ptr_map (tyscm_hash_type_smob,
|
|
||||||
tyscm_eq_type_smob);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue