From patchwork Fri Jul 26 01:38:24 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: 33803 Received: (qmail 76615 invoked by alias); 26 Jul 2019 01:38:34 -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 76559 invoked by uid 89); 26 Jul 2019 01:38:34 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=Search, H*f:sk:Q@mail. X-HELO: mail-qk1-f202.google.com Received: from mail-qk1-f202.google.com (HELO mail-qk1-f202.google.com) (209.85.222.202) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 Jul 2019 01:38:31 +0000 Received: by mail-qk1-f202.google.com with SMTP id l14so43888695qke.16 for ; Thu, 25 Jul 2019 18:38: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=/y7DVi9Q6sRh8sMv9kZhpGNqHxQlMYRrrfylHE3sw2o=; b=GF9es/0Nr/Vbnxqaf6mu7Aw2yCZ8ZDxBooZB+ZS9Hgok0RF9FfK3S7jrHnLxrQ2fuA fKrSjkIBAuOqTqj4cF7a/BpLXuSoHYgzcDIEdH9XDCRtBmZcLjNQ8CqxQMr1wO0i+ARJ OnCn2oO/hwW/YcN43gybgXtr/cP+KQMyAW8yBbhEv2wQf0My6yaNgwDx8fCa0ED27Fhn 3uWGSqBFlXGqS4G3H4d3UcP+F3ZSEOHwDwunRe50gdeEG7D/GrmBafVf/Lgt/U41EswJ IeEVeSE9qcT6F1mlPNArFQkC+u7EXxR6jPiqwyLoXRdewGkh7hd/N8jm9ClmBSA9L7UX whNg== Date: Thu, 25 Jul 2019 20:38:24 -0500 In-Reply-To: Message-Id: <20190726013824.230132-1-cbiesinger@google.com> Mime-Version: 1.0 References: Subject: [PATCH v2] Add an Objfile.lookup_global_symbol function 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 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 * 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 * python.texi (Objfiles In Python): Document new function Objfile.lookup_global_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 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 . */ +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"