Add an objfile getter to gdb.Type

This allows users of the Python API to find the objfile where a type
was defined.

gdb/ChangeLog:

gdb/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

	Add objfile property to gdb.Type.
	* gdb/NEWS: Mention Python API addition.
	* gdb/python/py-type.c (typy_get_objfile): New method.

gdb/doc/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

	* gdb/doc/python.texi: Document new gdb.Type.objfile property.

gdb/testsuite/ChangeLog
2019-06-04  Christian Biesinger  <cbiesinger@google.com>

	* gdb/testsuite/gdb.python/py-type.exp: Test for new
	  gdb.Type.objfile property.
This commit is contained in:
Christian Biesinger via gdb-patches 2019-05-23 16:37:29 -05:00 committed by Tom Tromey
parent a9d96ab97e
commit e1f2e1a2da
7 changed files with 41 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2019-06-04 Christian Biesinger <cbiesinger@google.com>
Add objfile property to gdb.Type.
* gdb/NEWS: Mention Python API addition.
* gdb/python/py-type.c (typy_get_objfile): New method.
2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be> 2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* NEWS: Mention the new set|show style [title|highlight]. * NEWS: Mention the new set|show style [title|highlight].

View file

@ -27,6 +27,9 @@
'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects', 'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects',
'static_members', 'max_elements', 'repeat_threshold', and 'format'. 'static_members', 'max_elements', 'repeat_threshold', and 'format'.
** gdb.Type has a new property 'objfile' which returns the objfile the
type was defined in.
* New built-in convenience variables $_shell_exitcode and $_shell_exitsignal * New built-in convenience variables $_shell_exitcode and $_shell_exitsignal
provide the exitcode or exit status of the shell commands launched by provide the exitcode or exit status of the shell commands launched by
GDB commands such as "shell", "pipe" and "make". GDB commands such as "shell", "pipe" and "make".

View file

@ -1,3 +1,7 @@
2019-06-04 Christian Biesinger <cbiesinger@google.com>
* gdb/doc/python.texi: Document new gdb.Type.objfile property.
2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be> 2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.texinfo (Help): Document the new -v apropos flag. * gdb.texinfo (Help): Document the new -v apropos flag.

View file

@ -1087,6 +1087,11 @@ languages have this concept. If this type has no tag name, then
@code{None} is returned. @code{None} is returned.
@end defvar @end defvar
@defvar Type.objfile
The @code{gdb.Objfile} that this type was defined in, or @code{None} if
there is no associated objfile.
@end defvar
The following methods are provided: The following methods are provided:
@defun Type.fields () @defun Type.fields ()

View file

@ -413,6 +413,18 @@ typy_get_tag (PyObject *self, void *closure)
return PyString_FromString (tagname); return PyString_FromString (tagname);
} }
/* Return the type's objfile, or None. */
static PyObject *
typy_get_objfile (PyObject *self, void *closure)
{
struct type *type = ((type_object *) self)->type;
struct objfile *objfile = TYPE_OBJFILE (type);
if (objfile == nullptr)
Py_RETURN_NONE;
return objfile_to_objfile_object (objfile).release ();
}
/* Return the type, stripped of typedefs. */ /* Return the type, stripped of typedefs. */
static PyObject * static PyObject *
typy_strip_typedefs (PyObject *self, PyObject *args) typy_strip_typedefs (PyObject *self, PyObject *args)
@ -1419,6 +1431,8 @@ static gdb_PyGetSetDef type_object_getset[] =
"The size of this type, in bytes.", NULL }, "The size of this type, in bytes.", NULL },
{ "tag", typy_get_tag, NULL, { "tag", typy_get_tag, NULL,
"The tag name for this type, or None.", NULL }, "The tag name for this type, or None.", NULL },
{ "objfile", typy_get_objfile, NULL,
"The objfile this type was defined in, or None.", NULL },
{ NULL } { NULL }
}; };

View file

@ -1,3 +1,8 @@
2019-06-04 Christian Biesinger <cbiesinger@google.com>
* gdb/testsuite/gdb.python/py-type.exp: Test for new
gdb.Type.objfile property.
2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be> 2019-06-03 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* lib/gdb.exp (help_list_trailer): New regexp variable * lib/gdb.exp (help_list_trailer): New regexp variable

View file

@ -98,6 +98,8 @@ proc test_fields {lang} {
gdb_py_test_silent_cmd "print (st)" "print value (st)" 1 gdb_py_test_silent_cmd "print (st)" "print value (st)" 1
gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value (st) from history" 1 gdb_py_test_silent_cmd "python st = gdb.history (0)" "get value (st) from history" 1
gdb_py_test_silent_cmd "python fields = st.type.fields()" "get fields from st.type" 1 gdb_py_test_silent_cmd "python fields = st.type.fields()" "get fields from st.type" 1
gdb_test "python print (st.type.objfile.filename == gdb.current_progspace ().filename)" "True" \
"check type.objfile"
gdb_test "python print (len(fields))" "2" "check number of fields (st)" gdb_test "python print (len(fields))" "2" "check number of fields (st)"
gdb_test "python print (fields\[0\].name)" "a" "check structure field a name" gdb_test "python print (fields\[0\].name)" "a" "check structure field a name"
gdb_test "python print (fields\[1\].name)" "b" "check structure field b name" gdb_test "python print (fields\[1\].name)" "b" "check structure field b name"
@ -269,6 +271,8 @@ if { [build_inferior "${binfile}" "c"] == 0 } {
# Skip all tests if Python scripting is not enabled. # Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue } if { [skip_python_tests] } { continue }
gdb_test "python print (gdb.lookup_type ('char').objfile)" "None"
gdb_test "python print(gdb.lookup_type('char').array(1, 0))" \ gdb_test "python print(gdb.lookup_type('char').array(1, 0))" \
"char \\\[0\\\]" "char \\\[0\\\]"