From: Jan Vrany <jan.vrany@labware.com>
To: gdb-patches@sourceware.org
Cc: Jan Vrany <jan.vrany@labware.com>
Subject: [RFC 2/9] gdb/python: preserve identity for gdb.Symbol objects
Date: Mon, 27 Jan 2025 10:44:28 +0000 [thread overview]
Message-ID: <20250127104435.823519-3-jan.vrany@labware.com> (raw)
In-Reply-To: <20250127104435.823519-1-jan.vrany@labware.com>
This commit changes symbol_to_symbol_object() so that each it is called
with a particular struct symbol * it returns the very same gdb.Symbol
object.
This is done in the same way as for gdb.Symtab objects in earlier commit
("gdb/python: preserve identity for gdb.Symtab objects") except that
symbols may be either objfile-owned or arch-owned.
Prior this commit, arch-owned objects we not put into any list (like
objfile-owned ones) so they could not be easily looked up. This commit
changes the code so arch-owned list are put into per-architecture list
which is then used (solely) for looking up arch-owned gdb.Symbol.
---
gdb/python/py-symbol.c | 64 ++++++++++++++++++++++++++++++++++--------
1 file changed, 52 insertions(+), 12 deletions(-)
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index f1ba0ba00e0..2abac6553a0 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -70,6 +70,8 @@ struct symbol_object_deleter
static const registry<objfile>::key<symbol_object, symbol_object_deleter>
sympy_objfile_data_key;
+static const registry<gdbarch>::key<symbol_object, symbol_object_deleter>
+ sympy_gdbarch_data_key;
static PyObject *
sympy_str (PyObject *self)
@@ -334,19 +336,29 @@ static void
set_symbol (symbol_object *obj, struct symbol *symbol)
{
obj->symbol = symbol;
- obj->prev = NULL;
- if (symbol->is_objfile_owned ()
- && symbol->symtab () != NULL)
+ obj->prev = nullptr;
+ if (symbol->is_objfile_owned ())
{
- struct objfile *objfile = symbol->objfile ();
+ /* Can it really happen that symbol->symtab () is NULL? */
+ if (symbol->symtab () != nullptr)
+ {
+ struct objfile *objfile = symbol->objfile ();
+
+ obj->next = sympy_objfile_data_key.get (objfile);
+ if (obj->next)
+ obj->next->prev = obj;
+ sympy_objfile_data_key.set (objfile, obj);
+ }
+ }
+ else
+ {
+ struct gdbarch *arch = symbol->arch ();
- obj->next = sympy_objfile_data_key.get (objfile);
+ obj->next = sympy_gdbarch_data_key.get (arch);
if (obj->next)
obj->next->prev = obj;
- sympy_objfile_data_key.set (objfile, obj);
+ sympy_gdbarch_data_key.set (arch, obj);
}
- else
- obj->next = NULL;
}
/* Create a new symbol object (gdb.Symbol) that encapsulates the struct
@@ -356,6 +368,23 @@ symbol_to_symbol_object (struct symbol *sym)
{
symbol_object *sym_obj;
+ /* Look if there's already a gdb.Symtab object for given SYMTAB
+ and if so, return it. */
+ if (sym->is_objfile_owned ())
+ sym_obj = sympy_objfile_data_key.get (sym->objfile ());
+ else
+ sym_obj = sympy_gdbarch_data_key.get (sym->arch ());
+
+ while (sym_obj != nullptr)
+ {
+ if (sym_obj->symbol == sym)
+ {
+ Py_INCREF (sym_obj);
+ return (PyObject*)sym_obj;
+ }
+ sym_obj = sym_obj->next;
+ }
+
sym_obj = PyObject_New (symbol_object, &symbol_object_type);
if (sym_obj)
set_symbol (sym_obj, sym);
@@ -379,10 +408,21 @@ sympy_dealloc (PyObject *obj)
if (sym_obj->prev)
sym_obj->prev->next = sym_obj->next;
- else if (sym_obj->symbol != NULL
- && sym_obj->symbol->is_objfile_owned ()
- && sym_obj->symbol->symtab () != NULL)
- sympy_objfile_data_key.set (sym_obj->symbol->objfile (), sym_obj->next);
+ else if (sym_obj->symbol != nullptr)
+ {
+ if (sym_obj->symbol->is_objfile_owned ())
+ {
+ /* Can it really happen that symbol->symtab () is NULL? */
+ if (sym_obj->symbol->symtab () != nullptr)
+ sympy_objfile_data_key.set (sym_obj->symbol->objfile (),
+ sym_obj->next);
+ }
+ else
+ {
+ sympy_gdbarch_data_key.set (sym_obj->symbol->arch (),
+ sym_obj->next);
+ }
+ }
if (sym_obj->next)
sym_obj->next->prev = sym_obj->prev;
sym_obj->symbol = NULL;
--
2.45.2
next prev parent reply other threads:[~2025-01-27 10:47 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-27 10:44 [RFC 0/9] Attempt to unify Python object's lifecycle Jan Vrany
2025-01-27 10:44 ` [RFC 1/9] gdb/python: preserve identity for gdb.Symtab objects Jan Vrany
2025-01-27 10:44 ` Jan Vrany [this message]
2025-02-20 19:22 ` [RFC 2/9] gdb/python: preserve identity for gdb.Symbol objects Tom Tromey
2025-01-27 10:44 ` [RFC 3/9] gdb/python: do not hold on gdb.Symtab object from gdb.Symtab_and_line Jan Vrany
2025-01-27 10:44 ` [RFC 4/9] gdb/python: preserve identity for gdb.Type objects Jan Vrany
2025-01-27 10:44 ` [RFC 5/9] gdb/python: introduce gdbpy_registry Jan Vrany
2025-02-20 19:28 ` Tom Tromey
2025-01-27 10:44 ` [RFC 6/9] gdb/python: convert gdb.Symbol to use gdbpy_registry Jan Vrany
2025-01-27 10:44 ` [RFC 7/9] gdb/python: convert gdb.Type " Jan Vrany
2025-01-27 10:44 ` [RFC 8/9] gdb/python: convert gdb.Symtab " Jan Vrany
2025-01-27 10:44 ` [RFC 9/9] gdb/python: convert gdb.Symtab_and_line " Jan Vrany
2025-02-18 11:15 ` [PING] Re: [RFC 0/9] Attempt to unify Python object's lifecycle Jan Vraný
2025-02-19 21:00 ` Simon Marchi
2025-02-20 17:50 ` Jan Vraný
2025-02-20 19:18 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250127104435.823519-3-jan.vrany@labware.com \
--to=jan.vrany@labware.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox