From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 62921 invoked by alias); 30 Jul 2019 15:41:04 -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 62913 invoked by uid 89); 30 Jul 2019 15:41:03 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-31.4 required=5.0 tests=AWL,BAYES_00,ENV_AND_HDR_SPF_MATCH,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_PASS,USER_IN_DEF_SPF_WL autolearn=ham version=3.3.1 spammy= X-HELO: mail-ot1-f52.google.com Received: from mail-ot1-f52.google.com (HELO mail-ot1-f52.google.com) (209.85.210.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 30 Jul 2019 15:41:01 +0000 Received: by mail-ot1-f52.google.com with SMTP id j11so9460067otp.10 for ; Tue, 30 Jul 2019 08:41:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=Qcb6S2GO/XE+ooO5UwjW1Wv45NdiVDnMdnYzNaG308o=; b=R+KKK0yZqM0D41pyyX0VHZZGnymJqqKqdbEZS61Ceh4vKhl3JZwQEb83IhMw4x9Y5u F+246rckHY6BGkDsLAW1E90jxXOggy8Reqdxkqa+bB0UQN2+ZTjjYEPs2zvxx6nQZOzu NkzmirlFCHKn/RXKEcnBf7276LbakyzaUMtSw085I7CUkC9EVJp0EPRtvIJHEfr90faL LU/pfTaFdbjoQG8uXvdVdHspGQs1E9ThJ6gtx+Whi2/2714cK4TBCG0mq7C54bn2c9hR sVRETqw7CRTSBPJhIza3mnYgSsh542HsxYm0FV3qA2cjRaTpADFOqeRrlG6f6nvuG2oL +SEA== MIME-Version: 1.0 References: <767ee122-a024-9615-e78a-1fa05b416daf@simark.ca> <20190730015935.208706-1-cbiesinger@google.com> In-Reply-To: <20190730015935.208706-1-cbiesinger@google.com> From: "Christian Biesinger via gdb-patches" Reply-To: Christian Biesinger Date: Tue, 30 Jul 2019 15:41:00 -0000 Message-ID: Subject: Re: [PATCH v4] [PR/24474] Add gdb.lookup_static_symbol to the python API To: Christian Biesinger via gdb-patches , Eli Zaretskii Content-Type: text/plain; charset="UTF-8" X-SW-Source: 2019-07/txt/msg00657.txt.bz2 Hi Eli, could you take a look at the documentation parts of the below patch before I push? Thanks! Christian On Mon, Jul 29, 2019 at 8:59 PM Christian Biesinger wrote: > > Thanks Simon; fixed the typo. Can I push this or should I wait for Eli > to review the documentation? > > Similar to lookup_global_symbol, except that it checks the > STATIC_SCOPE. > > gdb/ChangeLog: > > 2019-07-29 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-29 Christian Biesinger > > * python.texi (Symbols In Python): Document new function > gdb.lookup_static_symbol. > > gdb/testsuite/ChangeLog: > > 2019-07-29 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 4e821eab4c..ac44399304 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. > + > ** gdb.Objfile has new methods 'lookup_global_symbol' and > 'lookup_static_symbol' to lookup a symbol from this objfile only. > > diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi > index bbba519ffc..3fdccd5e43 100644 > --- a/gdb/doc/python.texi > +++ b/gdb/doc/python.texi > @@ -4847,6 +4847,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..5617f127e5 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 ('nonexistent') is None)" \ > + "True" "lookup_static_symbol for nonexistent 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 > -- > 2.22.0.709.g102302147b-goog >