From 2906593ffecef89f8d64e0f1ca21494be71d0ebd Mon Sep 17 00:00:00 2001 From: Christian Biesinger Date: Tue, 30 Jul 2019 11:04:37 -0500 Subject: [PATCH 1/1] [PR/24474] Add gdb.lookup_static_symbol to the python API Similar to lookup_global_symbol, except that it checks the STATIC_SCOPE. gdb/ChangeLog: 2019-07-30 Christian Biesinger 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-30 Christian Biesinger * python.texi (Symbols In Python): Document new function gdb.lookup_static_symbol. gdb/testsuite/ChangeLog: 2019-07-30 Christian Biesinger * 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/ChangeLog | 8 ++++++ gdb/NEWS | 3 ++ gdb/doc/ChangeLog | 5 ++++ gdb/doc/python.texi | 19 ++++++++++++ gdb/python/py-symbol.c | 40 ++++++++++++++++++++++++++ gdb/python/python-internal.h | 2 ++ gdb/python/python.c | 4 +++ gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.python/py-symbol.c | 5 ++++ gdb/testsuite/gdb.python/py-symbol.exp | 24 ++++++++++++++++ 10 files changed, 116 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 59fb8002e8..00e681938e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2019-07-30 Christian Biesinger + + 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. + 2019-07-29 Christian Biesinger * NEWS: Mention new functions Objfile.lookup_{global,static}_symbol. 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/ChangeLog b/gdb/doc/ChangeLog index 9b91b998bd..e469b6057d 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-30 Christian Biesinger + + * python.texi (Symbols In Python): Document new function + gdb.lookup_static_symbol. + 2019-07-29 Christian Biesinger * python.texi (Objfiles In Python): Document new functions 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/ChangeLog b/gdb/testsuite/ChangeLog index 669b943b4b..8dde64d4b0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-07-30 Christian Biesinger + + * 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. + 2019-07-30 Tom de Vries * lib/read1.c (read): Don't use unsetenv (v), use setenv (v, "", 1) 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.34.1