Add Objfile.lookup_{global,static}_symbol functions
authorChristian Biesinger <cbiesinger@google.com>
Tue, 25 Jun 2019 20:45:41 +0000 (15:45 -0500)
committerChristian Biesinger <cbiesinger@google.com>
Tue, 30 Jul 2019 01:44:08 +0000 (20:44 -0500)
This is essentially the inverse of Symbol.objfile. This allows
handling different symbols with the same name (but from different
objfiles) and can also be faster if the objfile is known.

gdb/ChangeLog:

2019-07-29  Christian Biesinger  <cbiesinger@google.com>

* NEWS: Mention new functions Objfile.lookup_{global,static}_symbol.
* python/py-objfile.c (objfpy_lookup_global_symbol): New function.
(objfpy_lookup_static_symbol): New function.
(objfile_object_methods): Add new functions.

gdb/doc/ChangeLog:

2019-07-29  Christian Biesinger  <cbiesinger@google.com>

* python.texi (Objfiles In Python): Document new functions
  Objfile.lookup_{global,static}_symbol.

gdb/testsuite/ChangeLog:

2019-07-29  Christian Biesinger  <cbiesinger@google.com>

* gdb.python/py-objfile.c: Add global and static vars.
* gdb.python/py-objfile.exp: Test new functions Objfile.
  lookup_global_symbol and lookup_static_symbol.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-objfile.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-objfile.c
gdb/testsuite/gdb.python/py-objfile.exp

index dcc6a91b60b3bee8b0301c03fa86f42055cf8ac8..59fb8002e81f7c8c1094f145239324cf3cbf6968 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-29  Christian Biesinger  <cbiesinger@google.com>
+
+       * NEWS: Mention new functions Objfile.lookup_{global,static}_symbol.
+       * python/py-objfile.c (objfpy_lookup_global_symbol): New function.
+       (objfpy_lookup_static_symbol): New function.
+       (objfile_object_methods): Add new functions.
+
 2019-07-29  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * NEWS: Mention 'set|show print frame-info'.  Mention new
index a08265cae7293f7026f54a0651971732e77969bd..4e821eab4c70f01e70096717b130c4ef8f9391e2 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -41,6 +41,9 @@
      there are no filters, or when the 'backtrace' '-no-filters' option
      is given.
 
+  ** gdb.Objfile has new methods 'lookup_global_symbol' and
+     'lookup_static_symbol' to lookup a symbol from this objfile only.
+
 * New commands
 
 | [COMMAND] | SHELL_COMMAND
index c409fe867b92d24658721199fdadd08aaeb88b2a..9b91b998bdda6a161c04b06f196585272dbed64a 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-29  Christian Biesinger  <cbiesinger@google.com>
+
+       * python.texi (Objfiles In Python): Document new functions
+         Objfile.lookup_{global,static}_symbol.
+
 2019-07-29  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * gdb.texinfo (Backtrace): Document the new '-frame-info'
index 034623513b2b92309c3445e8ff2dcebfa8f14768..bbba519ffc08effef851ff91ad00659a4592271f 100644 (file)
@@ -4441,6 +4441,23 @@ searches then this function can be used to add a debug info file
 from a different place.
 @end defun
 
+@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
+Search for a global symbol named @var{name} in this objfile.  Optionally, the
+search scope can be restricted with the @var{domain} argument.
+The @var{domain} argument must be a domain constant defined in the @code{gdb}
+module and described in @ref{Symbols In Python}.  This function is similar to
+@code{gdb.lookup_global_symbol}, except that the search is limited to this
+objfile.
+
+The result is a @code{gdb.Symbol} object or @code{None} if the symbol
+is not found.
+@end defun
+
+@defun Objfile.lookup_static_symbol (name @r{[}, domain@r{]})
+Like @code{Objfile.lookup_global_symbol}, but searches for a global
+symbol with static linkage named @var{name} in this objfile.
+@end defun
+
 @node Frames In Python
 @subsubsection Accessing inferior stack frames from Python
 
index 15735c850152f6aca5e4f1d5c828ebbad79f8938..2c548450b4d0825e33d8a0354a4fac9d33aa9b48 100644 (file)
@@ -434,6 +434,74 @@ objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
   Py_RETURN_NONE;
 }
 
+/* Implementation of
+  gdb.Objfile.lookup_global_symbol (self, string [, domain]) -> gdb.Symbol.  */
+
+static PyObject *
+objfpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
+{
+  static const char *keywords[] = { "name", "domain", NULL };
+  objfile_object *obj = (objfile_object *) self;
+  const char *symbol_name;
+  int domain = VAR_DOMAIN;
+
+  OBJFPY_REQUIRE_VALID (obj);
+
+  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
+                                       &domain))
+    return nullptr;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (sym == nullptr)
+       Py_RETURN_NONE;
+
+      return symbol_to_symbol_object (sym);
+    }
+  catch (const gdb_exception &except)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+
+  Py_RETURN_NONE;
+}
+
+/* Implementation of
+  gdb.Objfile.lookup_static_symbol (self, string [, domain]) -> gdb.Symbol.  */
+
+static PyObject *
+objfpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
+{
+  static const char *keywords[] = { "name", "domain", NULL };
+  objfile_object *obj = (objfile_object *) self;
+  const char *symbol_name;
+  int domain = VAR_DOMAIN;
+
+  OBJFPY_REQUIRE_VALID (obj);
+
+  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
+                                       &domain))
+    return nullptr;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, STATIC_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (sym == nullptr)
+       Py_RETURN_NONE;
+
+      return symbol_to_symbol_object (sym);
+    }
+  catch (const gdb_exception &except)
+    {
+      GDB_PY_HANDLE_EXCEPTION (except);
+    }
+
+  Py_RETURN_NONE;
+}
+
 /* Implement repr() for gdb.Objfile.  */
 
 static PyObject *
@@ -652,6 +720,16 @@ Return true if this object file is valid, false if not." },
     "add_separate_debug_file (file_name).\n\
 Add FILE_NAME to the list of files containing debug info for the objfile." },
 
+  { "lookup_global_symbol", (PyCFunction) objfpy_lookup_global_symbol,
+    METH_VARARGS | METH_KEYWORDS,
+    "lookup_global_symbol (name [, domain]).\n\
+Look up a global symbol in this objfile and return it." },
+
+  { "lookup_static_symbol", (PyCFunction) objfpy_lookup_static_symbol,
+    METH_VARARGS | METH_KEYWORDS,
+    "lookup_static_symbol (name [, domain]).\n\
+Look up a static-linkage global symbol in this objfile and return it." },
+
   { NULL }
 };
 
index a0b5862dd8bce892295857bbc43bb4fffb94b472..b2551063fe8f90a63cf2bdc08776a264d3a5d857 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-29  Christian Biesinger  <cbiesinger@google.com>
+
+       * gdb.python/py-objfile.c: Add global and static vars.
+       * gdb.python/py-objfile.exp: Test new functions Objfile.
+         lookup_global_symbol and lookup_static_symbol.
+
 2019-07-29  Tom Tromey  <tom@tromey.com>
 
        * lib/tuiterm.exp (Term::_csi_@): New proc.
index ac414912342b4eb9e3c1046bb84c0aa12a53f36a..6d751bddae38aebf2c929d29cd522d38c82c151a 100644 (file)
@@ -15,6 +15,9 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+int global_var = 42;
+static int static_var = 50;
+
 int
 main ()
 {
index b5e0c5e7606d0ca32bf8a6c049a3c5dd4cff26f5..261f6054456404f8c736ad54a85a17e8bc28bc6c 100644 (file)
@@ -55,6 +55,20 @@ gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \
 gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \
     "Objfile not found\\.\r\n${python_error_text}"
 
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"global_var\").name)" \
+    "global_var" "lookup_global_symbol finds a valid symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"static_var\") is None)" \
+    "True" "lookup_global_symbol does not find static symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"stdout\"))" \
+    "None" "lookup_global_symbol doesn't find symbol in other objfile"
+
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"static_var\").name)" \
+    "static_var" "lookup_static_symbol finds a valid symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"global_var\") is None)" \
+    "True" "lookup_static_symbol does not find global symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_static_symbol (\"nonexistant\"))" \
+    "None" "lookup_static_symbol can handle nonexistant symbol"
+
 set binfile_build_id [get_build_id $binfile]
 if [string compare $binfile_build_id ""] {
     verbose -log "binfile_build_id = $binfile_build_id"