From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83308 invoked by alias); 27 Jul 2019 00:31:13 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 83260 invoked by uid 89); 27 Jul 2019 00:31:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.7 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= X-HELO: mail-yb1-f201.google.com Received: from mail-yb1-f201.google.com (HELO mail-yb1-f201.google.com) (209.85.219.201) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 27 Jul 2019 00:31:06 +0000 Received: by mail-yb1-f201.google.com with SMTP id i70so42126533ybg.5 for ; Fri, 26 Jul 2019 17:31:06 -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=rQZwskXZtGVA7MdpBzGueSuihCdmaWq2a+0GpG59/gk=; b=GY1SXd2bd3pXNGlUn+psxYu9uJZftrEnjByHc/66Aqi5vKTToP6Ej79ZZ9OYoXt70R 2rKmKbJl2K6RwkcHKMwwEux6CP80Fn0XdnINO3BBu1isApr4D3YfuXFX2qPhl17n3EVb 0l8MskkWSKJfubLZRLATvgj6tYc/SNABd+PqtwGOQ4AS3EZAjQB9T7497AGope3oEZPD 32cXurq6gdNZbCT1x3V33zq7b1xz/8uMnK96LLmlq+QQ3uIgjyHVHvpVEaqHE/E4djJs nZgnoA+DL9ujkkJFgbLk1Q2aG8Kf+XF5BBGNXTEomnWaYdtSM26N640J36TecqZs9iev SLSA== Date: Sat, 27 Jul 2019 00:31:00 -0000 In-Reply-To: <20190726013824.230132-1-cbiesinger@google.com> Message-Id: <20190727003056.41789-1-cbiesinger@google.com> Mime-Version: 1.0 References: <20190726013824.230132-1-cbiesinger@google.com> Subject: [PATCH v3] Add Objfile.lookup_{global,static}_symbol functions From: "Christian Biesinger via gdb-patches" Reply-To: Christian Biesinger To: gdb-patches@sourceware.org Cc: Christian Biesinger Content-Type: text/plain; charset="UTF-8" X-SW-Source: 2019-07/txt/msg00601.txt.bz2 In this version of the patch, I also added lookup_static_symbol, similar to https://sourceware.org/ml/gdb-patches/2019-07/msg00599.html 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 | 25 ++++++++ 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, 123 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..0a86ea2431 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -4441,6 +4441,31 @@ 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_global_symbol (name @r{[}, domain@r{]}) +Search for a global symbol with static linkage 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..89e23bf4ff 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_global_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" -- 2.22.0.709.g102302147b-goog