gdb: delay python initialisation until gdbpy_finish_initialization

Delay Python initialisation until gdbpy_finish_initialization.

This is mostly about splitting the existing gdbpy_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 gdbpy_initialize_*
functions.

Then the call to do_start_initialization (in python/python.c) is moved
from the _initialize_python function into gdbpy_finish_initialization.

There should be no user visible changes after this commit.

gdb/ChangeLog:

	* python/py-arch.c (_initialize_py_arch): New function.
	(gdbpy_initialize_arch): Move code to _initialize_py_arch.
	* python/py-block.c (_initialize_py_block): New function.
	(gdbpy_initialize_blocks): Move code to _initialize_py_block.
	* python/py-inferior.c (_initialize_py_inferior): New function.
	(gdbpy_initialize_inferior): Move code to _initialize_py_inferior.
	* python/py-objfile.c (_initialize_py_objfile): New function.
	(gdbpy_initialize_objfile): Move code to _initialize_py_objfile.
	* python/py-progspace.c (_initialize_py_progspace): New function.
	(gdbpy_initialize_pspace): Move code to _initialize_py_progspace.
	* python/py-registers.c (_initialize_py_registers): New function.
	(gdbpy_initialize_registers): Move code to
	_initialize_py_registers.
	* python/py-symbol.c (_initialize_py_symbol): New function.
	(gdbpy_initialize_symbols): Move code to _initialize_py_symbol.
	* python/py-symtab.c (_initialize_py_symtab): New function.
	(gdbpy_initialize_symtabs): Move code to _initialize_py_symtab.
	* python/py-type.c (_initialize_py_type): New function.
	(gdbpy_initialize_types): Move code to _initialize_py_type.
	* python/py-unwind.c (_initialize_py_unwind): New function.
	(gdbpy_initialize_unwind): Move code to _initialize_py_unwind.
	* python/python.c (_initialize_python): Move call to
	do_start_initialization to gdbpy_finish_initialization.
	(gdbpy_finish_initialization): Add call to
	do_start_initialization.
This commit is contained in:
Andrew Burgess 2021-04-22 17:11:25 +01:00
parent 913832e99c
commit 8e3685bf25
12 changed files with 125 additions and 48 deletions

View file

@ -1,3 +1,31 @@
2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com>
* python/py-arch.c (_initialize_py_arch): New function.
(gdbpy_initialize_arch): Move code to _initialize_py_arch.
* python/py-block.c (_initialize_py_block): New function.
(gdbpy_initialize_blocks): Move code to _initialize_py_block.
* python/py-inferior.c (_initialize_py_inferior): New function.
(gdbpy_initialize_inferior): Move code to _initialize_py_inferior.
* python/py-objfile.c (_initialize_py_objfile): New function.
(gdbpy_initialize_objfile): Move code to _initialize_py_objfile.
* python/py-progspace.c (_initialize_py_progspace): New function.
(gdbpy_initialize_pspace): Move code to _initialize_py_progspace.
* python/py-registers.c (_initialize_py_registers): New function.
(gdbpy_initialize_registers): Move code to
_initialize_py_registers.
* python/py-symbol.c (_initialize_py_symbol): New function.
(gdbpy_initialize_symbols): Move code to _initialize_py_symbol.
* python/py-symtab.c (_initialize_py_symtab): New function.
(gdbpy_initialize_symtabs): Move code to _initialize_py_symtab.
* python/py-type.c (_initialize_py_type): New function.
(gdbpy_initialize_types): Move code to _initialize_py_type.
* python/py-unwind.c (_initialize_py_unwind): New function.
(gdbpy_initialize_unwind): Move code to _initialize_py_unwind.
* python/python.c (_initialize_python): Move call to
do_start_initialization to gdbpy_finish_initialization.
(gdbpy_finish_initialization): Add call to
do_start_initialization.
2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com> 2021-04-28 Andrew Burgess <andrew.burgess@embecosm.com>
* extension.c (struct scoped_default_signal): New struct. * extension.c (struct scoped_default_signal): New struct.

View file

@ -271,12 +271,18 @@ archpy_register_groups (PyObject *self, PyObject *args)
return gdbpy_new_reggroup_iterator (gdbarch); return gdbpy_new_reggroup_iterator (gdbarch);
} }
void _initialize_py_arch ();
void
_initialize_py_arch ()
{
arch_object_data = gdbarch_data_register_post_init (arch_object_data_init);
}
/* Initializes the Architecture class in the gdb module. */ /* Initializes the Architecture class in the gdb module. */
int int
gdbpy_initialize_arch (void) gdbpy_initialize_arch (void)
{ {
arch_object_data = gdbarch_data_register_post_init (arch_object_data_init);
arch_object_type.tp_new = PyType_GenericNew; arch_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&arch_object_type) < 0) if (PyType_Ready (&arch_object_type) < 0)
return -1; return -1;

View file

@ -427,6 +427,17 @@ del_objfile_blocks (struct objfile *objfile, void *datum)
} }
} }
void _initialize_py_block ();
void
_initialize_py_block ()
{
/* Register an objfile "free" callback so we can properly
invalidate blocks when an object file is about to be
deleted. */
blpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_blocks);
}
int int
gdbpy_initialize_blocks (void) gdbpy_initialize_blocks (void)
{ {
@ -438,12 +449,6 @@ gdbpy_initialize_blocks (void)
if (PyType_Ready (&block_syms_iterator_object_type) < 0) if (PyType_Ready (&block_syms_iterator_object_type) < 0)
return -1; return -1;
/* Register an objfile "free" callback so we can properly
invalidate blocks when an object file is about to be
deleted. */
blpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_blocks);
if (gdb_pymodule_addobject (gdb_module, "Block", if (gdb_pymodule_addobject (gdb_module, "Block",
(PyObject *) &block_object_type) < 0) (PyObject *) &block_object_type) < 0)
return -1; return -1;

View file

@ -892,6 +892,14 @@ gdbpy_selected_inferior (PyObject *self, PyObject *args)
inferior_to_inferior_object (current_inferior ()).release ()); inferior_to_inferior_object (current_inferior ()).release ());
} }
void _initialize_py_inferior ();
void
_initialize_py_inferior ()
{
infpy_inf_data_key =
register_inferior_data_with_cleanup (NULL, py_free_inferior);
}
int int
gdbpy_initialize_inferior (void) gdbpy_initialize_inferior (void)
{ {
@ -902,9 +910,6 @@ gdbpy_initialize_inferior (void)
(PyObject *) &inferior_object_type) < 0) (PyObject *) &inferior_object_type) < 0)
return -1; return -1;
infpy_inf_data_key =
register_inferior_data_with_cleanup (NULL, py_free_inferior);
gdb::observers::new_thread.attach (add_thread_object, "py-inferior"); gdb::observers::new_thread.attach (add_thread_object, "py-inferior");
gdb::observers::thread_exit.attach (delete_thread_object, "py-inferior"); gdb::observers::thread_exit.attach (delete_thread_object, "py-inferior");
gdb::observers::normal_stop.attach (python_on_normal_stop, "py-inferior"); gdb::observers::normal_stop.attach (python_on_normal_stop, "py-inferior");

View file

@ -693,12 +693,17 @@ objfile_to_objfile_object (struct objfile *objfile)
return gdbpy_ref<>::new_reference (result); return gdbpy_ref<>::new_reference (result);
} }
int void _initialize_py_objfile ();
gdbpy_initialize_objfile (void) void
_initialize_py_objfile ()
{ {
objfpy_objfile_data_key objfpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, py_free_objfile); = register_objfile_data_with_cleanup (NULL, py_free_objfile);
}
int
gdbpy_initialize_objfile (void)
{
if (PyType_Ready (&objfile_object_type) < 0) if (PyType_Ready (&objfile_object_type) < 0)
return -1; return -1;

View file

@ -504,12 +504,17 @@ pspace_to_pspace_object (struct program_space *pspace)
return gdbpy_ref<>::new_reference (result); return gdbpy_ref<>::new_reference (result);
} }
int void _initialize_py_progspace ();
gdbpy_initialize_pspace (void) void
_initialize_py_progspace ()
{ {
pspy_pspace_data_key pspy_pspace_data_key
= register_program_space_data_with_cleanup (NULL, py_free_pspace); = register_program_space_data_with_cleanup (NULL, py_free_pspace);
}
int
gdbpy_initialize_pspace (void)
{
if (PyType_Ready (&pspace_object_type) < 0) if (PyType_Ready (&pspace_object_type) < 0)
return -1; return -1;

View file

@ -423,14 +423,19 @@ gdbpy_parse_register_id (struct gdbarch *gdbarch, PyObject *pyo_reg_id,
return false; return false;
} }
void _initialize_py_registers ();
void
_initialize_py_registers ()
{
gdbpy_register_object_data
= gdbarch_data_register_post_init (gdbpy_register_object_data_init);
}
/* Initializes the new Python classes from this file in the gdb module. */ /* Initializes the new Python classes from this file in the gdb module. */
int int
gdbpy_initialize_registers () gdbpy_initialize_registers ()
{ {
gdbpy_register_object_data
= gdbarch_data_register_post_init (gdbpy_register_object_data_init);
register_descriptor_object_type.tp_new = PyType_GenericNew; register_descriptor_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&register_descriptor_object_type) < 0) if (PyType_Ready (&register_descriptor_object_type) < 0)
return -1; return -1;

View file

@ -619,17 +619,22 @@ del_objfile_symbols (struct objfile *objfile, void *datum)
} }
} }
int void _initialize_py_symbol ();
gdbpy_initialize_symbols (void) void
_initialize_py_symbol ()
{ {
if (PyType_Ready (&symbol_object_type) < 0)
return -1;
/* Register an objfile "free" callback so we can properly /* Register an objfile "free" callback so we can properly
invalidate symbol when an object file that is about to be invalidate symbol when an object file that is about to be
deleted. */ deleted. */
sympy_objfile_data_key sympy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_symbols); = register_objfile_data_with_cleanup (NULL, del_objfile_symbols);
}
int
gdbpy_initialize_symbols (void)
{
if (PyType_Ready (&symbol_object_type) < 0)
return -1;
if (PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF) < 0 if (PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF) < 0
|| PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST", || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST",

View file

@ -511,6 +511,20 @@ del_objfile_sal (struct objfile *objfile, void *datum)
} }
} }
void _initialize_py_symtab ();
void
_initialize_py_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. */
stpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_symtab);
salpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_sal);
}
int int
gdbpy_initialize_symtabs (void) gdbpy_initialize_symtabs (void)
{ {
@ -522,15 +536,6 @@ gdbpy_initialize_symtabs (void)
if (PyType_Ready (&sal_object_type) < 0) if (PyType_Ready (&sal_object_type) < 0)
return -1; return -1;
/* 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. */
stpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_symtab);
salpy_objfile_data_key
= register_objfile_data_with_cleanup (NULL, del_objfile_sal);
if (gdb_pymodule_addobject (gdb_module, "Symtab", if (gdb_pymodule_addobject (gdb_module, "Symtab",
(PyObject *) &symtab_object_type) < 0) (PyObject *) &symtab_object_type) < 0)
return -1; return -1;

View file

@ -1424,14 +1424,19 @@ gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw)
return type_to_type_object (type); return type_to_type_object (type);
} }
void _initialize_py_type ();
void
_initialize_py_type ()
{
typy_objfile_data_key
= register_objfile_data_with_cleanup (save_objfile_types, NULL);
}
int int
gdbpy_initialize_types (void) gdbpy_initialize_types (void)
{ {
int i; int i;
typy_objfile_data_key
= register_objfile_data_with_cleanup (save_objfile_types, NULL);
if (PyType_Ready (&type_object_type) < 0) if (PyType_Ready (&type_object_type) < 0)
return -1; return -1;
if (PyType_Ready (&field_object_type) < 0) if (PyType_Ready (&field_object_type) < 0)

View file

@ -614,12 +614,10 @@ pyuw_on_new_gdbarch (struct gdbarch *newarch)
} }
} }
/* Initialize unwind machinery. */ void _initialize_py_unwind ();
void
int _initialize_py_unwind ()
gdbpy_initialize_unwind (void)
{ {
int rc;
add_setshow_zuinteger_cmd add_setshow_zuinteger_cmd
("py-unwind", class_maintenance, &pyuw_debug, ("py-unwind", class_maintenance, &pyuw_debug,
_("Set Python unwinder debugging."), _("Set Python unwinder debugging."),
@ -630,14 +628,21 @@ gdbpy_initialize_unwind (void)
&setdebuglist, &showdebuglist); &setdebuglist, &showdebuglist);
pyuw_gdbarch_data pyuw_gdbarch_data
= gdbarch_data_register_post_init (pyuw_gdbarch_data_init); = gdbarch_data_register_post_init (pyuw_gdbarch_data_init);
}
/* Initialize unwind machinery. */
int
gdbpy_initialize_unwind (void)
{
gdb::observers::architecture_changed.attach (pyuw_on_new_gdbarch, gdb::observers::architecture_changed.attach (pyuw_on_new_gdbarch,
"py-unwind"); "py-unwind");
if (PyType_Ready (&pending_frame_object_type) < 0) if (PyType_Ready (&pending_frame_object_type) < 0)
return -1; return -1;
rc = gdb_pymodule_addobject (gdb_module, "PendingFrame", int rc = gdb_pymodule_addobject (gdb_module, "PendingFrame",
(PyObject *) &pending_frame_object_type); (PyObject *) &pending_frame_object_type);
if (rc) if (rc != 0)
return rc; return rc;
if (PyType_Ready (&unwind_info_object_type) < 0) if (PyType_Ready (&unwind_info_object_type) < 0)

View file

@ -1881,11 +1881,6 @@ message == an error message without a stack will be printed."),
NULL, NULL, NULL, NULL,
&user_set_python_list, &user_set_python_list,
&user_show_python_list); &user_show_python_list);
#ifdef HAVE_PYTHON
if (!do_start_initialization () && PyErr_Occurred ())
gdbpy_print_stack ();
#endif /* HAVE_PYTHON */
} }
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
@ -1962,6 +1957,9 @@ do_finish_initialization (const struct extension_language_defn *extlang)
static void static void
gdbpy_finish_initialization (const struct extension_language_defn *extlang) gdbpy_finish_initialization (const struct extension_language_defn *extlang)
{ {
if (!do_start_initialization () && PyErr_Occurred ())
gdbpy_print_stack ();
gdbpy_enter enter_py (get_current_arch (), current_language); gdbpy_enter enter_py (get_current_arch (), current_language);
if (!do_finish_initialization (extlang)) if (!do_finish_initialization (extlang))