Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Christian Biesinger via gdb-patches" <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Cc: Christian Biesinger <cbiesinger@google.com>
Subject: [PATCH] Add an Objfile.lookup_global_symbol function
Date: Mon, 08 Jul 2019 21:59:00 -0000	[thread overview]
Message-ID: <20190708215906.235110-1-cbiesinger@google.com> (raw)
In-Reply-To: <20190625220832.247935-1-cbiesinger@google.com>

Thanks for the comments and sorry for the late response.

I believe I've made all requested changes except for
using "enum block_enum" as the argument type -- doing that
requires including defs.h from symtab.h which no other header
does, so I wasn't sure if that was OK. Let me know if this
is fine and I'll make the change.
(Why do many other functions use int for block arguments like
this? Even lookup_symbol_in_objfile_symtabs which has the
same gdb_assert for GLOBAL_BLOCK/STATIC_BLOCK)

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-06-25  Christian Biesinger  <cbiesinger@google.com>

	* NEWS: Mention new function Objfile.lookup_global_symbol.
	* compile/compile-object-load.c (compile_object_load): Pass GLOBAL_SCOPE.
	* python/py-objfile.c (objfpy_lookup_global_symbol): New function
	  Objfile.lookup_global_symbol.
	* solib-spu.c (spu_lookup_lib_symbol): Pass GLOBAL_SCOPE.
	* solib-svr4.c (elf_lookup_lib_symbol): Pass GLOBAL_SCOPE.
	* symtab.c (lookup_global_symbol_from_objfile): Add a scope parameter.
	* symtab.h: Add a scope parameter to lookup_global_symbol_from_objfile.

gdb/doc/ChangeLog:

2019-06-25  Christian Biesinger  <cbiesinger@google.com>

  * python.texi (Objfiles In Python): Document new function
    Objfile.lookup_global_symbol.

gdb/testsuite/ChangeLog:

2019-06-25  Christian Biesinger  <cbiesinger@google.com>

	* gdb.python/py-objfile.c: Add global and static vars.
	* gdb.python/py-objfile.exp: Test new function Objfile.
	  lookup_global_symbol.
---
 gdb/NEWS                                |  3 ++
 gdb/compile/compile-object-load.c       |  1 +
 gdb/doc/python.texi                     | 12 +++++++
 gdb/python/py-objfile.c                 | 45 ++++++++++++++++++++++++-
 gdb/solib-spu.c                         |  3 +-
 gdb/solib-svr4.c                        |  3 +-
 gdb/symtab.c                            |  4 ++-
 gdb/symtab.h                            |  2 ++
 gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
 gdb/testsuite/gdb.python/py-objfile.exp |  7 ++++
 10 files changed, 79 insertions(+), 4 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 34c544c3d5..922010ed39 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -36,6 +36,9 @@
   ** gdb.Type has a new property 'objfile' which returns the objfile the
      type was defined in.
 
+  ** gdb.Objfile has a new method 'lookup_global_symbol' to lookup a symbol
+     from this objfile only.
+
 * New commands
 
 | [COMMAND] | SHELL_COMMAND
diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c
index 4e70205195..3a765a345b 100644
--- a/gdb/compile/compile-object-load.c
+++ b/gdb/compile/compile-object-load.c
@@ -639,6 +639,7 @@ compile_object_load (const compile_file_names &file_names,
   objfile = objfile_holder.get ();
 
   func_sym = lookup_global_symbol_from_objfile (objfile,
+						GLOBAL_BLOCK,
 						GCC_FE_WRAPPER_FUNCTION,
 						VAR_DOMAIN).symbol;
   if (func_sym == NULL)
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index f769ad03a2..3e14d9edb4 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4443,6 +4443,18 @@ 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{]})
+Searches 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 the @xref{Symbols In Python} section.  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
+
 @node Frames In Python
 @subsubsection Accessing inferior stack frames from Python
 
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index 199c567a04..8499551ff4 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -406,7 +406,7 @@ objfpy_is_valid (PyObject *self, PyObject *args)
   Py_RETURN_TRUE;
 }
 
-/* Implementation of gdb.Objfile.add_separate_debug_file (self) -> Boolean.  */
+/* Implementation of gdb.Objfile.add_separate_debug_file (self, string) -> None.  */
 
 static PyObject *
 objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
@@ -434,6 +434,44 @@ objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
   Py_RETURN_NONE;
 }
 
+/* Implementation of gdb.Objfile.lookup_global_symbol (self, string [, int]) -> 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 NULL;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (sym == NULL) {
+	sym = lookup_global_symbol_from_objfile
+	  (obj->objfile, STATIC_BLOCK, symbol_name, (domain_enum) domain)
+	  .symbol;
+	if (!sym)
+	  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 +690,11 @@ 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\
+Looks up a global symbol in this objfile and returns it." },
+
   { NULL }
 };
 
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index c5dc8639f1..faa4ac3956 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -392,7 +392,8 @@ spu_lookup_lib_symbol (struct objfile *objfile,
 		       const domain_enum domain)
 {
   if (bfd_get_arch (objfile->obfd) == bfd_arch_spu)
-    return lookup_global_symbol_from_objfile (objfile, name, domain);
+    return lookup_global_symbol_from_objfile (objfile, GLOBAL_BLOCK, name,
+					      domain);
 
   if (svr4_so_ops.lookup_lib_global_symbol != NULL)
     return svr4_so_ops.lookup_lib_global_symbol (objfile, name, domain);
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 8cd5b7d8e7..c0c505acaa 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -3226,7 +3226,8 @@ elf_lookup_lib_symbol (struct objfile *objfile,
   if (abfd == NULL || scan_dyntag (DT_SYMBOLIC, abfd, NULL, NULL) != 1)
     return {};
 
-  return lookup_global_symbol_from_objfile (objfile, name, domain);
+  return lookup_global_symbol_from_objfile (objfile, GLOBAL_BLOCK, name,
+					    domain);
 }
 
 void
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 4920d94a24..958d2b510f 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2223,13 +2223,15 @@ lookup_symbol_in_block (const char *name, symbol_name_match_type match_type,
 
 struct block_symbol
 lookup_global_symbol_from_objfile (struct objfile *main_objfile,
+				   int block_index,
 				   const char *name,
 				   const domain_enum domain)
 {
+  gdb_assert (block_index == GLOBAL_BLOCK || block_index == STATIC_BLOCK);
   for (objfile *objfile : main_objfile->separate_debug_objfiles ())
     {
       struct block_symbol result
-        = lookup_symbol_in_objfile (objfile, GLOBAL_BLOCK, name, domain);
+        = lookup_symbol_in_objfile (objfile, block_index, name, domain);
 
       if (result.symbol != NULL)
 	return result;
diff --git a/gdb/symtab.h b/gdb/symtab.h
index e4ee7271a1..a8ae8d359e 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -2051,10 +2051,12 @@ extern enum language main_language (void);
 /* Lookup symbol NAME from DOMAIN in MAIN_OBJFILE's global blocks.
    This searches MAIN_OBJFILE as well as any associated separate debug info
    objfiles of MAIN_OBJFILE.
+   block_index can be GLOBAL_BLOCK or STATIC_BLOCK.
    Upon success fixes up the symbol's section if necessary.  */
 
 extern struct block_symbol
   lookup_global_symbol_from_objfile (struct objfile *main_objfile,
+				     int block_index,
 				     const char *name,
 				     const domain_enum domain);
 
diff --git a/gdb/testsuite/gdb.python/py-objfile.c b/gdb/testsuite/gdb.python/py-objfile.c
index ac41491234..6d751bddae 100644
--- a/gdb/testsuite/gdb.python/py-objfile.c
+++ b/gdb/testsuite/gdb.python/py-objfile.c
@@ -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 ()
 {
diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp
index b5e0c5e760..3009d0711e 100644
--- a/gdb/testsuite/gdb.python/py-objfile.exp
+++ b/gdb/testsuite/gdb.python/py-objfile.exp
@@ -55,6 +55,13 @@ 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 find a valid symbol"
+gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"static_var\").name)" \
+    "static_var" "lookup_global_symbol find a valid 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"
+
 set binfile_build_id [get_build_id $binfile]
 if [string compare $binfile_build_id ""] {
     verbose -log "binfile_build_id = $binfile_build_id"
-- 
2.22.0.410.gd8fdbe21b5-goog


  parent reply	other threads:[~2019-07-08 21:59 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-25 22:09 Christian Biesinger via gdb-patches
2019-06-26 15:37 ` Eli Zaretskii
2019-06-26 21:05   ` Tom Tromey
2019-06-27  2:36     ` Eli Zaretskii
2019-06-26 15:38 ` Eli Zaretskii
2019-06-26 21:12 ` Tom Tromey
2019-07-08 21:59 ` Christian Biesinger via gdb-patches [this message]
2019-07-09 15:42   ` Eli Zaretskii
2019-07-09 18:44 ` Christian Biesinger via gdb-patches
2019-07-09 19:16   ` Eli Zaretskii
2019-07-22 20:51 ` Christian Biesinger via gdb-patches
2019-07-23  1:30   ` Simon Marchi
2019-07-23 14:47     ` Eli Zaretskii
2019-07-26  1:38     ` Christian Biesinger via gdb-patches
2019-07-26  1:38       ` [PATCH v2] " Christian Biesinger via gdb-patches
2019-07-26  6:19         ` Eli Zaretskii
2019-07-27  0:31         ` [PATCH v3] Add Objfile.lookup_{global,static}_symbol functions Christian Biesinger via gdb-patches
2019-07-27  7:52           ` Eli Zaretskii
2019-07-27 18:31             ` [PATCH v4] " Christian Biesinger via gdb-patches
2019-07-27 18:38               ` Eli Zaretskii
2019-07-30  1:03               ` Simon Marchi
2019-07-30  1:51                 ` [PATCH v5] " Christian Biesinger via gdb-patches
2019-07-30 14:59                   ` Eli Zaretskii
2019-07-26 15:40       ` [PATCH] Add an Objfile.lookup_global_symbol function Simon Marchi
2019-07-23 14:54   ` Eli Zaretskii

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=20190708215906.235110-1-cbiesinger@google.com \
    --to=gdb-patches@sourceware.org \
    --cc=cbiesinger@google.com \
    /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