[PATCH] Add an Objfile.lookup_global_symbol function

classic Classic list List threaded Threaded
25 messages Options
12
Reply | Threaded
Open this post in threaded view
|

[PATCH] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
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  <[hidden email]>

        * 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  <[hidden email]>

        * python.texi: Document new function Objfile.lookup_global_symbol.

gdb/testsuite/ChangeLog:

2019-06-25  Christian Biesinger  <[hidden email]>

        * 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                            |  3 +-
 gdb/symtab.h                            |  2 ++
 gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
 gdb/testsuite/gdb.python/py-objfile.exp |  5 +++
 10 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index 2cc82e8656..e52af20748 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..01b5813d73 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 by name in this objfile. Optionally, the
+search scope can be restricted with the 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..eeb087eb3a 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))
+    Py_RETURN_NONE;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (!sym) {
+ 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..7ab2f8f473 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2223,13 +2223,14 @@ 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)
 {
   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..1df25fb9b5 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, STATIC_BLOCK, etc.
    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..f90c2f881b 100644
--- a/gdb/testsuite/gdb.python/py-objfile.exp
+++ b/gdb/testsuite/gdb.python/py-objfile.exp
@@ -55,6 +55,11 @@ 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"
+
 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

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
> Date: Tue, 25 Jun 2019 17:08:32 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 2cc82e8656..e52af20748 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

This part is OK.

> +@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
> +Searches for a global symbol by name in this objfile. Optionally, the
                                                       ^^
Two spaces between sentences (here and elsewhere in the patch),
please.

The documentation part is OK with this nit fixed.

Thanks.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
In reply to this post by Sourceware - gdb-patches mailing list
> Date: Tue, 25 Jun 2019 17:08:32 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> gdb/doc/ChangeLog:
>
> 2019-06-25  Christian Biesinger  <[hidden email]>
>
> * python.texi: Document new function Objfile.lookup_global_symbol.

Sorry, forgot to mention one more nit: please name in parentheses the
node in which you make this change.  See the other entries in
gdb/doc/ChangeLog for examples.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Tom Tromey-2
In reply to this post by Eli Zaretskii
>>>>> "Eli" == Eli Zaretskii <[hidden email]> writes:

>> +@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
>> +Searches for a global symbol by name in this objfile. Optionally, the
Eli>                                                        ^^
Eli> Two spaces between sentences (here and elsewhere in the patch),
Eli> please.

I wonder whether the parameter names ought to be wrapped in @var{}.

Tom
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Tom Tromey-2
In reply to this post by Sourceware - gdb-patches mailing list
>>>>> "Christian" == Christian Biesinger via gdb-patches <[hidden email]> writes:

Christian> +static PyObject *
Christian> +objfpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
Christian> +{
...
Christian> +  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
Christian> + &domain))
Christian> +    Py_RETURN_NONE;

Error cases must return NULL.

Christian> +      if (!sym) {

gdb style is an explicit check, like sym != nullptr.
Also the brace is misplaced.

Christian>  struct block_symbol
Christian>  lookup_global_symbol_from_objfile (struct objfile *main_objfile,
Christian> +   int block_index,
Christian>     const char *name,
Christian>     const domain_enum domain)

I suspect the new parameter should probably have type `enum block_enum'.

Christian> +   block_index can be GLOBAL_BLOCK, STATIC_BLOCK, etc.

Does the "etc" case really work?  If not it should just assert that the
value is one of GLOBAL_BLOCK or STATIC_BLOCK.

Christian> +gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"global_var\").name)" \
Christian> +    "global_var" "lookup_global_symbol find a valid symbol"
Christian> +gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").lookup_global_symbol (\"static_var\").name)" \
Christian> +    "static_var" "lookup_global_symbol find a valid static symbol"

Perhaps this ought to test a case where it returns None.

Tom
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
In reply to this post by Tom Tromey-2
> From: Tom Tromey <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>,  [hidden email]
> Date: Wed, 26 Jun 2019 15:05:34 -0600
>
> >>>>> "Eli" == Eli Zaretskii <[hidden email]> writes:
>
> >> +@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
> >> +Searches for a global symbol by name in this objfile. Optionally, the
> Eli>                                                        ^^
> Eli> Two spaces between sentences (here and elsewhere in the patch),
> Eli> please.
>
> I wonder whether the parameter names ought to be wrapped in @var{}.

It should, thanks for catching that.
Reply | Threaded
Open this post in threaded view
|

[PATCH] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
In reply to this post by Sourceware - gdb-patches mailing list
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  <[hidden email]>

        * 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  <[hidden email]>

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

gdb/testsuite/ChangeLog:

2019-06-25  Christian Biesinger  <[hidden email]>

        * 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

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
> Date: Mon,  8 Jul 2019 16:59:06 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> 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.
> +

This part is OK.

> +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

@ref, not @xref.  The latter produces a capitalized "See", which is
inappropriate in the middle of a sentence.  Also, please remove the
"section" part after the closing brace; it's redundant.

The documentation parts are OK with these nits fixed.

Thanks.
Reply | Threaded
Open this post in threaded view
|

[PATCH] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
In reply to this post by Sourceware - gdb-patches mailing list
As discussed on IRC, moved the declaration of the enum before
the gdbarch.h include so that this compiles. Also changed NULL
to nullptr and fixed the documentation issue noted by Eli.

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  <[hidden email]>

        * NEWS: Mention new function Objfile.lookup_global_symbol.
        * compile/compile-object-load.c (compile_object_load): Pass GLOBAL_SCOPE.
        * defs.h (enum block_enum): Move before the gdbarch.h include so that
    symtab.h can use this enum.
        * 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  <[hidden email]>

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

gdb/testsuite/ChangeLog:

2019-06-25  Christian Biesinger  <[hidden email]>

        * 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/defs.h                              | 18 +++++-----
 gdb/doc/python.texi                     | 12 +++++++
 gdb/python/py-objfile.c                 | 45 ++++++++++++++++++++++++-
 gdb/solib-spu.c                         |  3 +-
 gdb/solib-svr4.c                        |  3 +-
 gdb/symtab.c                            |  7 ++--
 gdb/symtab.h                            |  2 ++
 gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
 gdb/testsuite/gdb.python/py-objfile.exp |  7 ++++
 11 files changed, 90 insertions(+), 14 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/defs.h b/gdb/defs.h
index 81ab74c27f..4702f44afa 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -519,6 +519,15 @@ enum symbol_needs_kind
   SYMBOL_NEEDS_FRAME
 };
 
+/* * Special block numbers */
+
+enum block_enum
+{
+  GLOBAL_BLOCK = 0,
+  STATIC_BLOCK = 1,
+  FIRST_LOCAL_BLOCK = 2
+};
+
 /* Dynamic target-system-dependent parameters for GDB.  */
 #include "gdbarch.h"
 
@@ -628,15 +637,6 @@ extern int (*deprecated_ui_load_progress_hook) (const char *section,
 extern void initialize_progspace (void);
 extern void initialize_inferiors (void);
 
-/* * Special block numbers */
-
-enum block_enum
-{
-  GLOBAL_BLOCK = 0,
-  STATIC_BLOCK = 1,
-  FIRST_LOCAL_BLOCK = 2
-};
-
 /* User selection used in observable.h and multiple print functions.  */
 
 enum user_selected_what_flag
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index f769ad03a2..320f583bbb 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 @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
+
 @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..a34b68dc49 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 nullptr;
+
+  try
+    {
+      struct symbol *sym = lookup_global_symbol_from_objfile
+        (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
+      if (sym == nullptr) {
+ 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..4e8c58f272 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2223,15 +2223,18 @@ 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,
+   enum block_enum 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)
+      if (result.symbol != nullptr)
  return result;
     }
 
diff --git a/gdb/symtab.h b/gdb/symtab.h
index e4ee7271a1..0e808a68c2 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,
+     enum block_enum 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

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
> Date: Tue,  9 Jul 2019 13:44:04 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> As discussed on IRC, moved the declaration of the enum before
> the gdbarch.h include so that this compiles. Also changed NULL
> to nullptr and fixed the documentation issue noted by Eli.

Thanks, the documentation parts are OK.
Reply | Threaded
Open this post in threaded view
|

[PATCH] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
In reply to this post by Sourceware - gdb-patches mailing list
Per the discussion in the thread about my gdb.lookup_global_symbol
patch, I've changed this patch to only look in GLOBAL_SCOPE.

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  <[hidden email]>

        * NEWS: Mention new function Objfile.lookup_global_symbol.
        * python/py-objfile.c (objfpy_lookup_global_symbol): New function
          Objfile.lookup_global_symbol.

gdb/doc/ChangeLog:

2019-06-25  Christian Biesinger  <[hidden email]>

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

gdb/testsuite/ChangeLog:

2019-06-25  Christian Biesinger  <[hidden email]>

        * 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/doc/python.texi                     | 12 ++++++++
 gdb/python/py-objfile.c                 | 40 ++++++++++++++++++++++++-
 gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
 gdb/testsuite/gdb.python/py-objfile.exp |  7 +++++
 5 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index cc1d58520d..c57cb4576e 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/doc/python.texi b/gdb/doc/python.texi
index 034623513b..80da607824 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4441,6 +4441,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 @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
+
 @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..a9a6ae6725 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,39 @@ 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, 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 +685,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/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..2e8358bd76 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 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 symbols"
+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.657.g960e92d24f-goog

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Simon Marchi-4
Hi Christian,

What did you end up deciding, to let Python code search for static symbols?

I just have a few nits on the patch below (and some questions about the doc,
which is why I added Eli in CC).

On 2019-07-22 4:51 p.m., Christian Biesinger via gdb-patches wrote:

> Per the discussion in the thread about my gdb.lookup_global_symbol
> patch, I've changed this patch to only look in GLOBAL_SCOPE.
>
> 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  <[hidden email]>
>
> * NEWS: Mention new function Objfile.lookup_global_symbol.
> * python/py-objfile.c (objfpy_lookup_global_symbol): New function
>  Objfile.lookup_global_symbol.
>
> gdb/doc/ChangeLog:
>
> 2019-06-25  Christian Biesinger  <[hidden email]>
>
> * python.texi (Objfiles In Python): Document new function
>  Objfile.lookup_global_symbol.
>
> gdb/testsuite/ChangeLog:
>
> 2019-06-25  Christian Biesinger  <[hidden email]>
>
> * 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/doc/python.texi                     | 12 ++++++++
>  gdb/python/py-objfile.c                 | 40 ++++++++++++++++++++++++-
>  gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
>  gdb/testsuite/gdb.python/py-objfile.exp |  7 +++++
>  5 files changed, 64 insertions(+), 1 deletion(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index cc1d58520d..c57cb4576e 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/doc/python.texi b/gdb/doc/python.texi
> index 034623513b..80da607824 100644
> --- a/gdb/doc/python.texi
> +++ b/gdb/doc/python.texi
> @@ -4441,6 +4441,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 @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
> +
>  @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..a9a6ae6725 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.  */

This appears to be an unrelated (but valid) change.  Can you please make a separate patch
and push it as obvious?  Just mind the 80 columns.  If the function returns None, I think
we could just omit the return type and say:

/* Implementation of gdb.Objfile.add_separate_debug_file (self, string).  */

... and it will fit.

So just push a patch with this (including the ChangeLog entry), and post it to the list
with the "PATCH obvious" prefix, or something like that, to let people know.

>  static PyObject *
>  objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
> @@ -434,6 +434,39 @@ 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, 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 +685,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." },
> +

To be consistent with the rest of the Python function help strings, I think it should
be

  "Look up a global symbol in this objfile and return it."

i.e. not at the third person of the singular.  Eli, could you tell which form is preferred?
The change to python.texi might also need to be changed to that form as well.

>    { NULL }
>  };
>  
> 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..2e8358bd76 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 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 symbols"

Please add parentheses to this print so it works with Python 3.

> +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"
>

Simon
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
> From: Simon Marchi <[hidden email]>
> Date: Mon, 22 Jul 2019 21:30:08 -0400
>
> > +  { "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." },
> > +
>
> To be consistent with the rest of the Python function help strings, I think it should
> be
>
>   "Look up a global symbol in this objfile and return it."
>
> i.e. not at the third person of the singular.  Eli, could you tell which form is preferred?

Your (Simon's) suggestion is the preferred form.

Thanks.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
In reply to this post by Sourceware - gdb-patches mailing list
> Date: Mon, 22 Jul 2019 15:51:21 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> +@defun Objfile.lookup_global_symbol (name @r{[}, domain@r{]})
> +Searches for a global symbol named @var{name} in this objfile.  Optionally, the

As mentioned elsewhere, our convention is to say "Search for a global
symbol named ...".

Otherwise, the documentation parts are OK.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
In reply to this post by Simon Marchi-4
On Mon, Jul 22, 2019 at 6:30 PM Simon Marchi <[hidden email]> wrote:
> What did you end up deciding, to let Python code search for static symbols?

I decided to follow your suggestion and add a lookup_static_symbol
function (to Objfile and gdb). I haven't had time to implement it yet
but hopefully I can do that in the next couple of days. Would you like
me to do Objfile.lookup_static_symbol as part of this patch or
together with gdb.lookup_static_symbol?

> I just have a few nits on the patch below (and some questions about the doc,
> which is why I added Eli in CC).

Will send a new patch momentarily.

> On 2019-07-22 4:51 p.m., Christian Biesinger via gdb-patches wrote:
> > Per the discussion in the thread about my gdb.lookup_global_symbol
> > patch, I've changed this patch to only look in GLOBAL_SCOPE.
> >
> > 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  <[hidden email]>
> >
> >       * NEWS: Mention new function Objfile.lookup_global_symbol.
> >       * python/py-objfile.c (objfpy_lookup_global_symbol): New function
> >         Objfile.lookup_global_symbol.
> >
> > gdb/doc/ChangeLog:
> >
> > 2019-06-25  Christian Biesinger  <[hidden email]>
> >
> >       * python.texi (Objfiles In Python): Document new function
> >         Objfile.lookup_global_symbol.
> >
> > gdb/testsuite/ChangeLog:
> >
> > 2019-06-25  Christian Biesinger  <[hidden email]>
> >
> >       * 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/doc/python.texi                     | 12 ++++++++
> >  gdb/python/py-objfile.c                 | 40 ++++++++++++++++++++++++-
> >  gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
> >  gdb/testsuite/gdb.python/py-objfile.exp |  7 +++++
> >  5 files changed, 64 insertions(+), 1 deletion(-)
> >
> > diff --git a/gdb/NEWS b/gdb/NEWS
> > index cc1d58520d..c57cb4576e 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/doc/python.texi b/gdb/doc/python.texi
> > index 034623513b..80da607824 100644
> > --- a/gdb/doc/python.texi
> > +++ b/gdb/doc/python.texi
> > @@ -4441,6 +4441,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 @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
> > +
> >  @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..a9a6ae6725 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.  */
>
> This appears to be an unrelated (but valid) change.  Can you please make a separate patch
> and push it as obvious?  Just mind the 80 columns.  If the function returns None, I think
> we could just omit the return type and say:
>
> /* Implementation of gdb.Objfile.add_separate_debug_file (self, string).  */
>
> ... and it will fit.
>
> So just push a patch with this (including the ChangeLog entry), and post it to the list
> with the "PATCH obvious" prefix, or something like that, to let people know.

OK, done. (Oops, I see you already answered my question here that I
asked you again on IRC)

> >  static PyObject *
> >  objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
> > @@ -434,6 +434,39 @@ 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, 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 +685,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." },
> > +
>
> To be consistent with the rest of the Python function help strings, I think it should
> be
>
>   "Look up a global symbol in this objfile and return it."
>
> i.e. not at the third person of the singular.  Eli, could you tell which form is preferred?
> The change to python.texi might also need to be changed to that form as well.
>
> >    { NULL }
> >  };
> >
> > 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..2e8358bd76 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 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 symbols"
>
> Please add parentheses to this print so it works with Python 3.
>
> > +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"
> >
>
> Simon
Reply | Threaded
Open this post in threaded view
|

[PATCH v2] Add an Objfile.lookup_global_symbol function

Sourceware - gdb-patches mailing list
Per the discussion in the thread about my gdb.lookup_global_symbol
patch, I've changed this patch to only look in GLOBAL_SCOPE.

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-25  Christian Biesinger  <[hidden email]>

        * NEWS: Mention new function Objfile.lookup_global_symbol.
        * python/py-objfile.c (objfpy_lookup_global_symbol): New function
          Objfile.lookup_global_symbol.

gdb/doc/ChangeLog:

2019-07-25  Christian Biesinger  <[hidden email]>

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

gdb/testsuite/ChangeLog:

2019-07-25  Christian Biesinger  <[hidden email]>

        * 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/doc/python.texi                     | 12 ++++++++
 gdb/python/py-objfile.c                 | 39 +++++++++++++++++++++++++
 gdb/testsuite/gdb.python/py-objfile.c   |  3 ++
 gdb/testsuite/gdb.python/py-objfile.exp |  7 +++++
 5 files changed, 64 insertions(+)

diff --git a/gdb/NEWS b/gdb/NEWS
index cc1d58520d..c57cb4576e 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/doc/python.texi b/gdb/doc/python.texi
index 034623513b..fc7cc45260 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4441,6 +4441,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{]})
+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
+
 @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 15735c8501..b27f180d34 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -434,6 +434,40 @@ 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, 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 +686,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\
+Look up a global symbol in this objfile and returns it." },
+
   { NULL }
 };
 
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..5ce8665e8c 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 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 symbols"
+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.709.g102302147b-goog

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2] Add an Objfile.lookup_global_symbol function

Eli Zaretskii
> Date: Thu, 25 Jul 2019 20:38:24 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> Per the discussion in the thread about my gdb.lookup_global_symbol
> patch, I've changed this patch to only look in GLOBAL_SCOPE.
>
> 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-25  Christian Biesinger  <[hidden email]>
>
> * NEWS: Mention new function Objfile.lookup_global_symbol.
> * python/py-objfile.c (objfpy_lookup_global_symbol): New function
>  Objfile.lookup_global_symbol.
>
> gdb/doc/ChangeLog:
>
> 2019-07-25  Christian Biesinger  <[hidden email]>
>
> * python.texi (Objfiles In Python): Document new function
>  Objfile.lookup_global_symbol.
>
> gdb/testsuite/ChangeLog:
>
> 2019-07-25  Christian Biesinger  <[hidden email]>
>
> * gdb.python/py-objfile.c: Add global and static vars.
> * gdb.python/py-objfile.exp: Test new function Objfile.
>  lookup_global_symbol.

Thanks, the documentation parts are OK.
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Add an Objfile.lookup_global_symbol function

Simon Marchi-4
In reply to this post by Sourceware - gdb-patches mailing list
On 2019-07-25 9:37 p.m., Christian Biesinger wrote:
> I decided to follow your suggestion and add a lookup_static_symbol
> function (to Objfile and gdb). I haven't had time to implement it yet
> but hopefully I can do that in the next couple of days. Would you like
> me to do Objfile.lookup_static_symbol as part of this patch or
> together with gdb.lookup_static_symbol?

I would say a separate patch for each would be good, if it doesn't incur
more work.  They can be in the same series though.

Simon
Reply | Threaded
Open this post in threaded view
|

[PATCH v3] Add Objfile.lookup_{global,static}_symbol functions

Sourceware - gdb-patches mailing list
In reply to this post by Sourceware - gdb-patches mailing list
In this version of the patch, I also added lookup_static_symbol,
similar to https://sourceware.org/ml/gdb-patches/2019-07/msg00599.html

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-25  Christian Biesinger  <[hidden email]>

        * 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-25  Christian Biesinger  <[hidden email]>

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

gdb/testsuite/ChangeLog:

2019-07-25  Christian Biesinger  <[hidden email]>

        * 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/NEWS                                |  3 +
 gdb/doc/python.texi                     | 25 ++++++++
 gdb/python/py-objfile.c                 | 78 +++++++++++++++++++++++++
 gdb/testsuite/gdb.python/py-objfile.c   |  3 +
 gdb/testsuite/gdb.python/py-objfile.exp | 14 +++++
 5 files changed, 123 insertions(+)

diff --git a/gdb/NEWS b/gdb/NEWS
index cc1d58520d..d8fb4cfe7f 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 new methods 'lookup_global_symbol' and
+     'lookup_static_symbol' to lookup a symbol from this objfile only.
+
 * New commands
 
 | [COMMAND] | SHELL_COMMAND
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index 034623513b..0a86ea2431 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -4441,6 +4441,31 @@ 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_global_symbol (name @r{[}, domain@r{]})
+Search for a global symbol with static linkage 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
+
 @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 15735c8501..89e23bf4ff 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -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_global_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 }
 };
 
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..1b8acf47ed 100644
--- a/gdb/testsuite/gdb.python/py-objfile.exp
+++ b/gdb/testsuite/gdb.python/py-objfile.exp
@@ -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"
--
2.22.0.709.g102302147b-goog

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v3] Add Objfile.lookup_{global,static}_symbol functions

Eli Zaretskii
> Date: Fri, 26 Jul 2019 19:30:56 -0500
> From: "Christian Biesinger via gdb-patches" <[hidden email]>
> Cc: Christian Biesinger <[hidden email]>
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index cc1d58520d..d8fb4cfe7f 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 new methods 'lookup_global_symbol' and
> +     'lookup_static_symbol' to lookup a symbol from this objfile only.
> +

This part is OK.

> +@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_global_symbol (name @r{[}, domain@r{]})

I guess you meant lookup_static_symbol here?

> +Search for a global symbol with static linkage 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

As the description of both methods is almost identical, I wonder
whether it wouldn't be better to have the second method be described
as "Like @code{lookup_global_symbol}, but ..." and tell the
differences between them.

Thanks.
12