From patchwork Tue Jul 30 01:03:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 33848 Received: (qmail 58434 invoked by alias); 30 Jul 2019 01:03:40 -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 58426 invoked by uid 89); 30 Jul 2019 01:03:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.1 spammy=junk, UD:gdb.lookup_global_symbol, UD:lookup_global_symbol, UD:Objfile.lookup_static_symbol X-HELO: simark.ca Received: from simark.ca (HELO simark.ca) (158.69.221.121) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 30 Jul 2019 01:03:37 +0000 Received: from [10.0.0.11] (unknown [192.222.164.54]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 194021E05A; Mon, 29 Jul 2019 21:03:34 -0400 (EDT) Subject: Re: [PATCH v4] Add Objfile.lookup_{global,static}_symbol functions To: Christian Biesinger , gdb-patches@sourceware.org References: <838ssjnccp.fsf@gnu.org> <20190727183046.243343-1-cbiesinger@google.com> From: Simon Marchi Message-ID: <39420ba4-a5f2-783b-5a8a-2a10e08cb05a@simark.ca> Date: Mon, 29 Jul 2019 21:03:34 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: <20190727183046.243343-1-cbiesinger@google.com> On 2019-07-27 2:30 p.m., Christian Biesinger via gdb-patches wrote: > Thanks Eli, fixed in this version. > > 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 > > * 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 > > * python.texi (Objfiles In Python): Document new functions > Objfile.lookup_{global,static}_symbol. > > gdb/testsuite/ChangeLog: > > 2019-07-25 Christian Biesinger > > * 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 | 17 ++++++ > 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, 115 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..bbba519ffc 100644 > --- a/gdb/doc/python.texi > +++ b/gdb/doc/python.texi > @@ -4441,6 +4441,23 @@ 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_static_symbol (name @r{[}, domain@r{]}) > +Like @code{Objfile.lookup_global_symbol}, but searches for a global > +symbol with static linkage named @var{name} in this objfile. > +@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..2c548450b4 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_static_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 . */ > > +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" > Hi Christian, I get: $ make check TESTS="gdb.python/py-objfile.exp" ... FAIL: gdb.python/py-objfile.exp: lookup_global_symbol does not find static symbol FAIL: gdb.python/py-objfile.exp: lookup_static_symbol does not find global symbol It's just a typo: --- The patch LGTM, please push with this fixed. Simon diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp index 1b8acf47ed52..5f0ac49cad4d 100644 --- a/gdb/testsuite/gdb.python/py-objfile.exp +++ b/gdb/testsuite/gdb.python/py-objfile.exp @@ -57,14 +57,14 @@ gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \ 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" \ +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" \ +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"