From patchwork Tue Jul 30 01:35:02 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: 33849 Received: (qmail 15109 invoked by alias); 30 Jul 2019 01:35:08 -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 15101 invoked by uid 89); 30 Jul 2019 01:35:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=H*F:D*google.com, UD:addr_class, UD:gdb.SYMBOL_LOC_STATIC, sk:gdbsym 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; Tue, 30 Jul 2019 01:35:06 +0000 Received: by mail-qk1-f202.google.com with SMTP id n190so53611605qkd.5 for ; Mon, 29 Jul 2019 18:35:05 -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=/JU+Quabn2jCcUXIzo3clg5qr2qNftm1c5bjoDnhtKM=; b=qPlJ9x58VM+V7eqdQZtJbKVh5nYyAcb3mAsmOi3vBMtHRKJG4mxi83fSssLx594gSH ix/qz3TG0ThftGjIsRU9m35VJw9YgvX1Tknof35YWuhBD/lfczACWOVikFvKREmDRqLK YSCYC/yaAxBP2TDAZ2deWefFqDSDd7zmIhTy8f4YWaLdBfh/SemRAIg58xawa5wU51Zv 6Mkmcp75cmN9ztNsm144AXJzrQhyOxaSSWl+qhd6dvFtENgsI1RvcHmDub6xfYZ19zR+ 5Qi2wq9ObVAYcOnkEI2hFX0qegoTx0vQEUb583m1vAqGj1kQs59AxXYFnjcbJYesEW9C dnQA== Date: Mon, 29 Jul 2019 20:35:02 -0500 In-Reply-To: <896673e7-8b71-c161-f62f-4cc8fc87cb27@simark.ca> Message-Id: <20190730013502.194120-1-cbiesinger@google.com> Mime-Version: 1.0 References: <896673e7-8b71-c161-f62f-4cc8fc87cb27@simark.ca> Subject: [PATCH v3] [PR/24474] Add gdb.lookup_static_symbol to the python API 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 Thanks Simon; I fixed that typo and added a test that lookup_static_symbol doesn't find a global. Similar to lookup_global_symbol, except that it checks the STATIC_SCOPE. gdb/ChangeLog: 2019-07-26 Christian Biesinger PR/24474: Add a function to lookup static variables. * NEWS: Mention this new function. * python/py-symbol.c (gdbpy_lookup_static_symbol): New function. * python/python-internal.h (gdbpy_lookup_static_symbol): New function. * python/python.c (python_GdbMethods): Add new function. gdb/doc/ChangeLog: 2019-07-26 Christian Biesinger * python.texi (Symbols In Python): Document new function gdb.lookup_static_symbol. gdb/testsuite/ChangeLog: 2019-07-26 Christian Biesinger * gdb.python/py-symbol.c: Add a static variable and one in an anonymous namespace. * gdb.python/py-symbol.exp: Test gdb.lookup_static_symbol. --- gdb/NEWS | 3 ++ gdb/doc/python.texi | 19 ++++++++++++ gdb/python/py-symbol.c | 40 ++++++++++++++++++++++++++ gdb/python/python-internal.h | 2 ++ gdb/python/python.c | 4 +++ gdb/testsuite/gdb.python/py-symbol.c | 5 ++++ gdb/testsuite/gdb.python/py-symbol.exp | 24 ++++++++++++++++ 7 files changed, 97 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index a08265cae7..7f8b236ba1 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -41,6 +41,9 @@ there are no filters, or when the 'backtrace' '-no-filters' option is given. + ** The new function gdb.lookup_static_symbol can be used to look up + symbols with static linkage. + * New commands | [COMMAND] | SHELL_COMMAND diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 034623513b..c5da7ad6b6 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -4830,6 +4830,25 @@ The result is a @code{gdb.Symbol} object or @code{None} if the symbol is not found. @end defun +@findex gdb.lookup_static_symbol +@defun gdb.lookup_static_symbol (name @r{[}, domain@r{]}) +This function searches for a global symbol with static linkage by name. +The search scope can be restricted to by the domain argument. + +@var{name} is the name of the symbol. It must be a string. +The optional @var{domain} argument restricts the search to the domain type. +The @var{domain} argument must be a domain constant defined in the @code{gdb} +module and described later in this chapter. + +The result is a @code{gdb.Symbol} object or @code{None} if the symbol +is not found. + +Note that this function will not find function-scoped static variables. To look +up such variables, iterate over the variables of the function's +@code{gdb.Block} and check that @code{block.addr_class} is +@code{gdb.SYMBOL_LOC_STATIC}. +@end defun + A @code{gdb.Symbol} object has the following attributes: @defvar Symbol.type diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index 8605ae71a2..2b10e21d87 100644 --- a/gdb/python/py-symbol.c +++ b/gdb/python/py-symbol.c @@ -471,6 +471,46 @@ gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw) return sym_obj; } +/* Implementation of + gdb.lookup_static_symbol (name [, domain) -> symbol or None. */ + +PyObject * +gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw) +{ + const char *name; + int domain = VAR_DOMAIN; + static const char *keywords[] = { "name", "domain", NULL }; + struct symbol *symbol = NULL; + PyObject *sym_obj; + + if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name, + &domain)) + return NULL; + + try + { + symbol = lookup_static_symbol (name, (domain_enum) domain).symbol; + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + if (symbol) + { + sym_obj = symbol_to_symbol_object (symbol); + if (!sym_obj) + return NULL; + } + else + { + sym_obj = Py_None; + Py_INCREF (Py_None); + } + + return sym_obj; +} + /* This function is called when an objfile is about to be freed. Invalidate the symbol as further actions on the symbol would result in bad data. All access to obj->symbol should be gated by diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index e6a3fe0ec1..c5578430cf 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -424,6 +424,8 @@ PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw); +PyObject *gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, + PyObject *kw); PyObject *gdbpy_start_recording (PyObject *self, PyObject *args); PyObject *gdbpy_current_recording (PyObject *self, PyObject *args); PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args); diff --git a/gdb/python/python.c b/gdb/python/python.c index 96bee7c3b0..162470dcc0 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1978,6 +1978,10 @@ a boolean indicating if name is a field of the current implied argument\n\ METH_VARARGS | METH_KEYWORDS, "lookup_global_symbol (name [, domain]) -> symbol\n\ Return the symbol corresponding to the given name (or None)." }, + { "lookup_static_symbol", (PyCFunction) gdbpy_lookup_static_symbol, + METH_VARARGS | METH_KEYWORDS, + "lookup_static_symbol (name [, domain]) -> symbol\n\ +Return the static-linkage symbol corresponding to the given name (or None)." }, { "lookup_objfile", (PyCFunction) gdbpy_lookup_objfile, METH_VARARGS | METH_KEYWORDS, diff --git a/gdb/testsuite/gdb.python/py-symbol.c b/gdb/testsuite/gdb.python/py-symbol.c index f77c8c8585..06a931bf5d 100644 --- a/gdb/testsuite/gdb.python/py-symbol.c +++ b/gdb/testsuite/gdb.python/py-symbol.c @@ -32,9 +32,14 @@ class SimpleClass return i; /* Break in class. */ } }; + +namespace { + int anon = 10; +}; #endif int qq = 72; /* line of qq */ +static int rr = 42; /* line of rr */ int func (int arg) { diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp index 5b8a2be7c4..ab72a4cb9d 100644 --- a/gdb/testsuite/gdb.python/py-symbol.exp +++ b/gdb/testsuite/gdb.python/py-symbol.exp @@ -48,6 +48,25 @@ gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \ "False" \ "print whether qq needs a frame" +set rr_line [gdb_get_line_number "line of rr"] +gdb_test "python print (gdb.lookup_global_symbol ('rr') is None)" "True" \ + "lookup_global_symbol for static var" + +gdb_test "python print (gdb.lookup_static_symbol ('rr').line)" "$rr_line" \ + "print line number of rr" + +gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "42" \ + "print value of rr" + +gdb_test "python print (gdb.lookup_static_symbol ('rr').needs_frame)" \ + "False" \ + "print whether rr needs a frame" + +gdb_test "python print (gdb.lookup_static_symbol ('nonexistant') is None)" \ + "True" "lookup_static_symbol for nonexistant var" + +gdb_test "python print (gdb.lookup_static_symbol ('qq') is None)" \ + "True" "lookup_static_symbol for global var" if ![runto_main] then { fail "can't run to main" @@ -137,6 +156,11 @@ gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile}-cxx +gdb_test "python print (gdb.lookup_global_symbol ('(anonymous namespace)::anon') is None)" \ + "True" "anon is None" +gdb_test "python print (gdb.lookup_static_symbol ('(anonymous namespace)::anon').value ())" \ + "10" "print value of anon" + if ![runto_main] then { fail "can't run to main" return 0