Add an Objfile.lookup_global_symbol function
Commit Message
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: 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 | 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(-)
Comments
> Date: Tue, 25 Jun 2019 17:08:32 -0500
> From: "Christian Biesinger via gdb-patches" <gdb-patches@sourceware.org>
> Cc: Christian Biesinger <cbiesinger@google.com>
>
> 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.
> Date: Tue, 25 Jun 2019 17:08:32 -0500
> From: "Christian Biesinger via gdb-patches" <gdb-patches@sourceware.org>
> Cc: Christian Biesinger <cbiesinger@google.com>
>
> gdb/doc/ChangeLog:
>
> 2019-06-25 Christian Biesinger <cbiesinger@google.com>
>
> * 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.
>>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> 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
>>>>> "Christian" == Christian Biesinger via gdb-patches <gdb-patches@sourceware.org> 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
> From: Tom Tromey <tom@tromey.com>
> Cc: Christian Biesinger <cbiesinger@google.com>, gdb-patches@sourceware.org
> Date: Wed, 26 Jun 2019 15:05:34 -0600
>
> >>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> 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.
@@ -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
@@ -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)
@@ -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
@@ -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 }
};
@@ -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);
@@ -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
@@ -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;
@@ -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);
@@ -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 ()
{
@@ -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"