aboutsummaryrefslogtreecommitdiff
path: root/gdb/guile
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-04-22 18:17:01 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-04-28 09:56:20 +0100
commit880ae75a2b7106045ed2ae212bbc28e4dc0ad667 (patch)
tree400699c81d144b8186b1b123ca94cf79b60a3ea5 /gdb/guile
parent8e3685bf250d9ecda5058912d6624e77d7a2b07e (diff)
downloadgdb-880ae75a2b7106045ed2ae212bbc28e4dc0ad667.zip
gdb-880ae75a2b7106045ed2ae212bbc28e4dc0ad667.tar.gz
gdb-880ae75a2b7106045ed2ae212bbc28e4dc0ad667.tar.bz2
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.
Diffstat (limited to 'gdb/guile')
-rw-r--r--gdb/guile/guile.c74
-rw-r--r--gdb/guile/scm-arch.c5
-rw-r--r--gdb/guile/scm-block.c5
-rw-r--r--gdb/guile/scm-frame.c5
-rw-r--r--gdb/guile/scm-objfile.c5
-rw-r--r--gdb/guile/scm-progspace.c5
-rw-r--r--gdb/guile/scm-symbol.c5
-rw-r--r--gdb/guile/scm-symtab.c5
-rw-r--r--gdb/guile/scm-type.c11
9 files changed, 78 insertions, 42 deletions
diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 68c4532..9c2a40b 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -81,6 +81,7 @@ static int gdbscm_initialized (const struct extension_language_defn *);
static void gdbscm_eval_from_control_command
(const struct extension_language_defn *, struct command_line *);
static script_sourcer_func gdbscm_source_script;
+static void gdbscm_set_backtrace (int enable);
int gdb_scheme_initialized;
@@ -644,6 +645,40 @@ call_initialize_gdb_module (void *data)
static void
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. */
scm_set_current_module (scm_interaction_environment ());
}
@@ -770,43 +805,4 @@ void
_initialize_guile ()
{
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
}
diff --git a/gdb/guile/scm-arch.c b/gdb/guile/scm-arch.c
index f4f871d..863e502 100644
--- a/gdb/guile/scm-arch.c
+++ b/gdb/guile/scm-arch.c
@@ -650,7 +650,12 @@ gdbscm_initialize_arches (void)
scm_set_smob_print (arch_smob_tag, arscm_print_arch_smob);
gdbscm_define_functions (arch_functions, 1);
+}
+void _initialize_scm_arch ();
+void
+_initialize_scm_arch ()
+{
arch_object_data
= gdbarch_data_register_post_init (arscm_object_data_init);
}
diff --git a/gdb/guile/scm-block.c b/gdb/guile/scm-block.c
index 05263a4..e7a1083 100644
--- a/gdb/guile/scm-block.c
+++ b/gdb/guile/scm-block.c
@@ -799,7 +799,12 @@ gdbscm_initialize_blocks (void)
gdbscm_documentation_symbol,
gdbscm_scm_from_c_string ("\
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
invalidate blocks when an object file is about to be deleted. */
bkscm_objfile_data_key
diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c
index e932c2a..9d5dfa6 100644
--- a/gdb/guile/scm-frame.c
+++ b/gdb/guile/scm-frame.c
@@ -1174,7 +1174,12 @@ gdbscm_initialize_frames (void)
gdbscm_define_functions (frame_functions, 1);
block_keyword = scm_from_latin1_keyword ("block");
+}
+void _initialize_scm_frame ();
+void
+_initialize_scm_frame ()
+{
/* Register an inferior "free" callback so we can properly
invalidate frames when an inferior file is about to be deleted. */
frscm_inferior_data_key
diff --git a/gdb/guile/scm-objfile.c b/gdb/guile/scm-objfile.c
index 44c5f2d..30e63f3 100644
--- a/gdb/guile/scm-objfile.c
+++ b/gdb/guile/scm-objfile.c
@@ -428,7 +428,12 @@ gdbscm_initialize_objfiles (void)
scm_set_smob_print (objfile_smob_tag, ofscm_print_objfile_smob);
gdbscm_define_functions (objfile_functions, 1);
+}
+void _initialize_scm_objfile ();
+void
+_initialize_scm_objfile ()
+{
ofscm_objfile_data_key
= register_objfile_data_with_cleanup (NULL, ofscm_handle_objfile_deleted);
}
diff --git a/gdb/guile/scm-progspace.c b/gdb/guile/scm-progspace.c
index 561a848..d28dba9 100644
--- a/gdb/guile/scm-progspace.c
+++ b/gdb/guile/scm-progspace.c
@@ -417,7 +417,12 @@ gdbscm_initialize_pspaces (void)
scm_set_smob_print (pspace_smob_tag, psscm_print_pspace_smob);
gdbscm_define_functions (pspace_functions, 1);
+}
+void _initialize_scm_progspace ();
+void
+_initialize_scm_progspace ()
+{
psscm_pspace_data_key
= register_program_space_data_with_cleanup (NULL,
psscm_handle_pspace_deleted);
diff --git a/gdb/guile/scm-symbol.c b/gdb/guile/scm-symbol.c
index 3a60d1b..324f64a 100644
--- a/gdb/guile/scm-symbol.c
+++ b/gdb/guile/scm-symbol.c
@@ -817,7 +817,12 @@ gdbscm_initialize_symbols (void)
block_keyword = scm_from_latin1_keyword ("block");
domain_keyword = scm_from_latin1_keyword ("domain");
frame_keyword = scm_from_latin1_keyword ("frame");
+}
+void _initialize_scm_symbol ();
+void
+_initialize_scm_symbol ()
+{
/* Register an objfile "free" callback so we can properly
invalidate symbols when an object file is about to be deleted. */
syscm_objfile_data_key
diff --git a/gdb/guile/scm-symtab.c b/gdb/guile/scm-symtab.c
index 3f4b676..b4edcef 100644
--- a/gdb/guile/scm-symtab.c
+++ b/gdb/guile/scm-symtab.c
@@ -688,7 +688,12 @@ gdbscm_initialize_symtabs (void)
scm_set_smob_print (sal_smob_tag, stscm_print_sal_smob);
gdbscm_define_functions (symtab_functions, 1);
+}
+void _initialize_scm_symtab ();
+void
+_initialize_scm_symtab ()
+{
/* Register an objfile "free" callback so we can properly
invalidate symbol tables, and symbol table and line data
structures when an object file that is about to be deleted. */
diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c
index 1169384..8d9c2c5 100644
--- a/gdb/guile/scm-type.c
+++ b/gdb/guile/scm-type.c
@@ -1505,11 +1505,16 @@ Internal function to assist the type fields iterator."));
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
associated with the objfile when it's about to be deleted. */
tyscm_objfile_data_key
= 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);
}