From patchwork Thu May 23 20:32:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Terekhov, Mikhail via Gdb-patches" X-Patchwork-Id: 32836 Received: (qmail 68723 invoked by alias); 23 May 2019 20:32:33 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 68714 invoked by uid 89); 23 May 2019 20:32:33 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-ua1-f73.google.com Received: from mail-ua1-f73.google.com (HELO mail-ua1-f73.google.com) (209.85.222.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 23 May 2019 20:32:32 +0000 Received: by mail-ua1-f73.google.com with SMTP id a23so1755935uas.17 for ; Thu, 23 May 2019 13:32:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=saE9JTT/4b/PGwXt0xmHIFjMnuKShqCaIXOsqSsr/Jk=; b=gMGK+UrKkY3UfpMsAia0Rw6N/iQfBQAB6T+DnjPOrP1Z19vjeL/x/lD8kBJqXqoH43 664y3lGMfzwhHJcLGgwCToSB/hfCJnIIlrzuGSdpQQg1ChJFTk7DZSFKCaWVzZrchbxe /Vwmq6niZrFvvwpBjcB97qUxNDZRYXrdGYfJBHVRFGWZIJUWnDeNoO5hki15MYrYsVrS i7DPxTb0IId8NiPaW1aqdeBICQDbqYAQmMF8m72Zt9yWrIfhYusEuuWjrkT0fxS7Jbw0 UCrxa5LNINWy74LyXjBuDTk+Vbwffccn+l7lNSz57dBLve+c+K+aFb81+hUJjoYiLQ4W BZIw== Date: Thu, 23 May 2019 15:32:27 -0500 In-Reply-To: <20190523183935.209380-1-cbiesinger@google.com> Message-Id: <20190523203227.260432-1-cbiesinger@google.com> Mime-Version: 1.0 References: <20190523183935.209380-1-cbiesinger@google.com> Subject: [PATCH] Add an objfile getter to gdb.Type X-Patchwork-Original-From: "Christian Biesinger via gdb-patches" From: "Terekhov, Mikhail via Gdb-patches" Reply-To: Christian Biesinger To: gdb-patches@sourceware.org Cc: Christian Biesinger This allows users of the Python API to find the objfile where a type was defined. gdb/ChangeLog: 2019-05-22 Christian Biesinger 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-05-22 Christian Biesinger * gdb/doc/python.texi: Document new gdb.Type.objfile property gdb/testsuite/ChangeLog: 2019-05-22 Christian Biesinger * gdb/testsuite/gdb.python/py-type.exp: Test for new gdb.Type.objfile property --- gdb/NEWS | 3 +++ gdb/doc/python.texi | 5 +++++ gdb/python/py-type.c | 14 ++++++++++++++ gdb/testsuite/gdb.python/py-type.exp | 4 ++++ 4 files changed, 26 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index 792548139e..c715bd6bca 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -27,6 +27,9 @@ 'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects', '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 commands set may-call-functions [on|off] diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 98e52bb770..f769ad03a2 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -1087,6 +1087,11 @@ languages have this concept. If this type has no tag name, then @code{None} is returned. @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: @defun Type.fields () diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 22cc658a8b..379038f8c6 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -413,6 +413,18 @@ typy_get_tag (PyObject *self, void *closure) 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. */ static PyObject * 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 }, { "tag", typy_get_tag, 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 } }; diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp index 734f9b40fd..c299fa3410 100644 --- a/gdb/testsuite/gdb.python/py-type.exp +++ b/gdb/testsuite/gdb.python/py-type.exp @@ -98,6 +98,8 @@ proc test_fields {lang} { 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 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 (fields\[0\].name)" "a" "check structure field a 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. 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))" \ "char \\\[0\\\]"