This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v4] [PR/24474] Add gdb.lookup_static_symbol to the python API
- From: "Christian Biesinger via gdb-patches" <gdb-patches at sourceware dot org>
- To: Christian Biesinger via gdb-patches <gdb-patches at sourceware dot org>, Eli Zaretskii <eliz at gnu dot org>
- Date: Tue, 30 Jul 2019 10:40:22 -0500
- Subject: Re: [PATCH v4] [PR/24474] Add gdb.lookup_static_symbol to the python API
- References: <767ee122-a024-9615-e78a-1fa05b416daf@simark.ca> <20190730015935.208706-1-cbiesinger@google.com>
- Reply-to: Christian Biesinger <cbiesinger at google dot com>
Hi Eli,
could you take a look at the documentation parts of the below patch
before I push? Thanks!
Christian
On Mon, Jul 29, 2019 at 8:59 PM Christian Biesinger
<cbiesinger@google.com> wrote:
>
> Thanks Simon; fixed the typo. Can I push this or should I wait for Eli
> to review the documentation?
>
> Similar to lookup_global_symbol, except that it checks the
> STATIC_SCOPE.
>
> gdb/ChangeLog:
>
> 2019-07-29 Christian Biesinger <cbiesinger@google.com>
>
> PR/24474: Add a function to lookup static variables.
> * NEWS: Mention this new function.
> * python/py-symbol.c (gdbpy_lookup_static_symbol): New function.
> * python/python-internal.h (gdbpy_lookup_static_symbol): New function.
> * python/python.c (python_GdbMethods): Add new function.
>
> gdb/doc/ChangeLog:
>
> 2019-07-29 Christian Biesinger <cbiesinger@google.com>
>
> * python.texi (Symbols In Python): Document new function
> gdb.lookup_static_symbol.
>
> gdb/testsuite/ChangeLog:
>
> 2019-07-29 Christian Biesinger <cbiesinger@google.com>
>
> * gdb.python/py-symbol.c: Add a static variable and one in an anonymous
> namespace.
> * gdb.python/py-symbol.exp: Test gdb.lookup_static_symbol.
> ---
> gdb/NEWS | 3 ++
> gdb/doc/python.texi | 19 ++++++++++++
> gdb/python/py-symbol.c | 40 ++++++++++++++++++++++++++
> gdb/python/python-internal.h | 2 ++
> gdb/python/python.c | 4 +++
> gdb/testsuite/gdb.python/py-symbol.c | 5 ++++
> gdb/testsuite/gdb.python/py-symbol.exp | 24 ++++++++++++++++
> 7 files changed, 97 insertions(+)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 4e821eab4c..ac44399304 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -41,6 +41,9 @@
> there are no filters, or when the 'backtrace' '-no-filters' option
> is given.
>
> + ** The new function gdb.lookup_static_symbol can be used to look up
> + symbols with static linkage.
> +
> ** gdb.Objfile has new methods 'lookup_global_symbol' and
> 'lookup_static_symbol' to lookup a symbol from this objfile only.
>
> diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
> index bbba519ffc..3fdccd5e43 100644
> --- a/gdb/doc/python.texi
> +++ b/gdb/doc/python.texi
> @@ -4847,6 +4847,25 @@ The result is a @code{gdb.Symbol} object or @code{None} if the symbol
> is not found.
> @end defun
>
> +@findex gdb.lookup_static_symbol
> +@defun gdb.lookup_static_symbol (name @r{[}, domain@r{]})
> +This function searches for a global symbol with static linkage by name.
> +The search scope can be restricted to by the domain argument.
> +
> +@var{name} is the name of the symbol. It must be a string.
> +The optional @var{domain} argument restricts the search to the domain type.
> +The @var{domain} argument must be a domain constant defined in the @code{gdb}
> +module and described later in this chapter.
> +
> +The result is a @code{gdb.Symbol} object or @code{None} if the symbol
> +is not found.
> +
> +Note that this function will not find function-scoped static variables. To look
> +up such variables, iterate over the variables of the function's
> +@code{gdb.Block} and check that @code{block.addr_class} is
> +@code{gdb.SYMBOL_LOC_STATIC}.
> +@end defun
> +
> A @code{gdb.Symbol} object has the following attributes:
>
> @defvar Symbol.type
> diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
> index 8605ae71a2..2b10e21d87 100644
> --- a/gdb/python/py-symbol.c
> +++ b/gdb/python/py-symbol.c
> @@ -471,6 +471,46 @@ gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
> return sym_obj;
> }
>
> +/* Implementation of
> + gdb.lookup_static_symbol (name [, domain) -> symbol or None. */
> +
> +PyObject *
> +gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
> +{
> + const char *name;
> + int domain = VAR_DOMAIN;
> + static const char *keywords[] = { "name", "domain", NULL };
> + struct symbol *symbol = NULL;
> + PyObject *sym_obj;
> +
> + if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
> + &domain))
> + return NULL;
> +
> + try
> + {
> + symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
> + }
> + catch (const gdb_exception &except)
> + {
> + GDB_PY_HANDLE_EXCEPTION (except);
> + }
> +
> + if (symbol)
> + {
> + sym_obj = symbol_to_symbol_object (symbol);
> + if (!sym_obj)
> + return NULL;
> + }
> + else
> + {
> + sym_obj = Py_None;
> + Py_INCREF (Py_None);
> + }
> +
> + return sym_obj;
> +}
> +
> /* This function is called when an objfile is about to be freed.
> Invalidate the symbol as further actions on the symbol would result
> in bad data. All access to obj->symbol should be gated by
> diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
> index e6a3fe0ec1..c5578430cf 100644
> --- a/gdb/python/python-internal.h
> +++ b/gdb/python/python-internal.h
> @@ -424,6 +424,8 @@ PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
> PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw);
> PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args,
> PyObject *kw);
> +PyObject *gdbpy_lookup_static_symbol (PyObject *self, PyObject *args,
> + PyObject *kw);
> PyObject *gdbpy_start_recording (PyObject *self, PyObject *args);
> PyObject *gdbpy_current_recording (PyObject *self, PyObject *args);
> PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args);
> diff --git a/gdb/python/python.c b/gdb/python/python.c
> index 96bee7c3b0..162470dcc0 100644
> --- a/gdb/python/python.c
> +++ b/gdb/python/python.c
> @@ -1978,6 +1978,10 @@ a boolean indicating if name is a field of the current implied argument\n\
> METH_VARARGS | METH_KEYWORDS,
> "lookup_global_symbol (name [, domain]) -> symbol\n\
> Return the symbol corresponding to the given name (or None)." },
> + { "lookup_static_symbol", (PyCFunction) gdbpy_lookup_static_symbol,
> + METH_VARARGS | METH_KEYWORDS,
> + "lookup_static_symbol (name [, domain]) -> symbol\n\
> +Return the static-linkage symbol corresponding to the given name (or None)." },
>
> { "lookup_objfile", (PyCFunction) gdbpy_lookup_objfile,
> METH_VARARGS | METH_KEYWORDS,
> diff --git a/gdb/testsuite/gdb.python/py-symbol.c b/gdb/testsuite/gdb.python/py-symbol.c
> index f77c8c8585..06a931bf5d 100644
> --- a/gdb/testsuite/gdb.python/py-symbol.c
> +++ b/gdb/testsuite/gdb.python/py-symbol.c
> @@ -32,9 +32,14 @@ class SimpleClass
> return i; /* Break in class. */
> }
> };
> +
> +namespace {
> + int anon = 10;
> +};
> #endif
>
> int qq = 72; /* line of qq */
> +static int rr = 42; /* line of rr */
>
> int func (int arg)
> {
> diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp
> index 5b8a2be7c4..5617f127e5 100644
> --- a/gdb/testsuite/gdb.python/py-symbol.exp
> +++ b/gdb/testsuite/gdb.python/py-symbol.exp
> @@ -48,6 +48,25 @@ gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \
> "False" \
> "print whether qq needs a frame"
>
> +set rr_line [gdb_get_line_number "line of rr"]
> +gdb_test "python print (gdb.lookup_global_symbol ('rr') is None)" "True" \
> + "lookup_global_symbol for static var"
> +
> +gdb_test "python print (gdb.lookup_static_symbol ('rr').line)" "$rr_line" \
> + "print line number of rr"
> +
> +gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "42" \
> + "print value of rr"
> +
> +gdb_test "python print (gdb.lookup_static_symbol ('rr').needs_frame)" \
> + "False" \
> + "print whether rr needs a frame"
> +
> +gdb_test "python print (gdb.lookup_static_symbol ('nonexistent') is None)" \
> + "True" "lookup_static_symbol for nonexistent var"
> +
> +gdb_test "python print (gdb.lookup_static_symbol ('qq') is None)" \
> + "True" "lookup_static_symbol for global var"
>
> if ![runto_main] then {
> fail "can't run to main"
> @@ -137,6 +156,11 @@ gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
> gdb_load ${binfile}-cxx
>
> +gdb_test "python print (gdb.lookup_global_symbol ('(anonymous namespace)::anon') is None)" \
> + "True" "anon is None"
> +gdb_test "python print (gdb.lookup_static_symbol ('(anonymous namespace)::anon').value ())" \
> + "10" "print value of anon"
> +
> if ![runto_main] then {
> fail "can't run to main"
> return 0
> --
> 2.22.0.709.g102302147b-goog
>