From patchwork Wed Jan 21 00:28:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 4744 Received: (qmail 31357 invoked by alias); 21 Jan 2015 00:29:00 -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 31347 invoked by uid 89); 21 Jan 2015 00:28:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mail-ig0-f202.google.com Received: from mail-ig0-f202.google.com (HELO mail-ig0-f202.google.com) (209.85.213.202) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 21 Jan 2015 00:28:57 +0000 Received: by mail-ig0-f202.google.com with SMTP id a13so2713606igq.1 for ; Tue, 20 Jan 2015 16:28:55 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:content-type :content-transfer-encoding:message-id:date:to:subject:in-reply-to :references; bh=u7sYy2qbe5VouZCcQHicJ7CkyuEiy3TXTGVmWdVBWeY=; b=m8fndKs1OY8cDcdKSQJXzpDmJivmchwI0CuAwQIqbrwNAaHYO7yHz/JIeyfvwl/pFn YsaRyyxul46cx6D4B2ZR1VhMCgPC8eVu4Nenoab6gFfd8R38+HqAxTHgg3bPAIUC+ZNc m+TjMvKHUspgGBHlFg3ZDXOGADyC7WpYZ4iEgoexo5mIa8ty4iYMjrUwkmvVy7Kxrnxb hNQnNKJwORplPCs4L6AC+eR73tTWFrdfOs2Ot1O02fzW0i2cmAy0fHLRJmjqKrzYT5Kr F3kCor1R62wD46bCrAWzAftDjNeq3EcDJ+aQwRUZwaTpNDHgjFdMheUsb1rZe4fTDmoO EMJw== X-Gm-Message-State: ALoCoQmQF5hqnhbnKf/0qeyE2H4zkSliwVwKOut5n97Bch9ymvYWEz2xCEk9UCGoRfQtjzIWvLLC X-Received: by 10.182.55.99 with SMTP id r3mr28378564obp.8.1421800135578; Tue, 20 Jan 2015 16:28:55 -0800 (PST) Received: from corpmail-nozzle1-2.hot.corp.google.com ([100.108.1.103]) by gmr-mx.google.com with ESMTPS id v10si327823qcd.1.2015.01.20.16.28.54 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Jan 2015 16:28:55 -0800 (PST) Received: from ruffy2.mtv.corp.google.com ([172.17.128.107]) by corpmail-nozzle1-2.hot.corp.google.com with ESMTP id h5eLGROO.1; Tue, 20 Jan 2015 16:28:55 -0800 From: Doug Evans MIME-Version: 1.0 Message-ID: <21694.62150.328539.215415@ruffy2.mtv.corp.google.com> Date: Tue, 20 Jan 2015 16:28:54 -0800 To: gdb-patches@sourceware.org, eliz@gnu.org Subject: Re: [PATCH 2/2] Add objfile.username In-Reply-To: References: X-IsSubscribed: yes Doug Evans writes: > Hi. > > I have a need to expose objfile->original_name to python, > this patch implements the feature. > > 2015-01-20 Doug Evans > > * NEWS: Mention gdb.Objfile.username. > * python/py-objfile.c (objfpy_get_username): New function. > (objfile_getset): Add "username". > > doc/ > * python.texi (Objfiles In Python): Document Objfile.username. > > testsuite/ > * gdb.python/py-objfile.exp: Add tests for objfile.username. Heh. This replaces the previous version. Thinko in assigning username too soon. + const char *username = obj->objfile->original_name; 2015-01-20 Doug Evans * NEWS: Mention gdb.Objfile.username. * python/py-objfile.c (objfpy_get_username): New function. (objfile_getset): Add "username". doc/ * python.texi (Objfiles In Python): Document Objfile.username. testsuite/ * gdb.python/py-objfile.exp: Add tests for objfile.username. Add test for objfile.filename, objfile.username after objfile has been unloaded. diff --git a/gdb/NEWS b/gdb/NEWS index 2d2c941..a6fa35f 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,12 @@ *** Changes since GDB 7.9 +* Python Scripting + + ** gdb.Objfile objects have a new attribute "username", + which is the name of the objfile as specified by the user, + without, for example, resolving symlinks. + *** Changes in GDB 7.9 * GDB now supports hardware watchpoints on x86 GNU Hurd. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index b9a50d0..4389d3e 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3516,6 +3516,13 @@ class. The file name of the objfile as a string. @end defvar +@defvar Objfile.username +The file name of the objfile as specified by the user as a string. + +The value is @code{None} if the objfile is no longer valid. +See the @code{gdb.Objfile.is_valid} method, described below. +@end defvar + @defvar Objfile.owner For separate debug info objfiles this is the corresponding @code{gdb.Objfile} object that debug info is being provided for. diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 378db58..0aecaf6 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -81,6 +81,25 @@ objfpy_get_filename (PyObject *self, void *closure) Py_RETURN_NONE; } +/* An Objfile method which returns the objfile's file name, as specified + by the user, or None. */ + +static PyObject * +objfpy_get_username (PyObject *self, void *closure) +{ + objfile_object *obj = (objfile_object *) self; + + if (obj->objfile) + { + const char *username = obj->objfile->original_name; + + return PyString_Decode (username, strlen (username), + host_charset (), NULL); + } + + Py_RETURN_NONE; +} + /* If SELF is a separate debug-info file, return the "backlink" field. Otherwise return None. */ @@ -613,6 +632,8 @@ static PyGetSetDef objfile_getset[] = "The __dict__ for this objfile.", &objfile_object_type }, { "filename", objfpy_get_filename, NULL, "The objfile's filename, or None.", NULL }, + { "username", objfpy_get_username, NULL, + "The name of the objfile as provided by the user, or None.", NULL }, { "owner", objfpy_get_owner, NULL, "The objfile owner of separate debug info objfiles, or None.", NULL }, diff --git a/gdb/testsuite/gdb.python/py-objfile.exp b/gdb/testsuite/gdb.python/py-objfile.exp index cddbd3d..b53f5e3 100644 --- a/gdb/testsuite/gdb.python/py-objfile.exp +++ b/gdb/testsuite/gdb.python/py-objfile.exp @@ -42,6 +42,9 @@ gdb_py_test_silent_cmd "python objfile = sym\[0\].symtab.objfile" \ gdb_test "python print (objfile.filename)" "${testfile}" \ "Get objfile file name" +gdb_test "python print (objfile.username)" "${testfile}" \ + "Get objfile user name" + gdb_test "python print (gdb.lookup_objfile (\"${testfile}\").filename)" \ "${testfile}" gdb_test "python print (gdb.lookup_objfile (\"junk\"))" \ @@ -78,6 +81,18 @@ gdb_py_test_silent_cmd "python objfile.random_attribute = 42" \ gdb_test "python print (objfile.random_attribute)" "42" \ "Verify set of random attribute in objfile" +# Verify invalid objfile handling. + +if { [gdb_unload] < 0 } { + fail "unload all files" + return -1 +} + +gdb_test "python print objfile.filename" "None" \ + "objfile.filename after objfile is unloaded" +gdb_test "python print objfile.username" "None" \ + "objfile.username after objfile is unloaded" + # Now build another copy of the testcase, this time without debug info. if { [prepare_for_testing ${testfile}.exp ${testfile}2 ${srcfile} {nodebug ldflags=-Wl,--strip-debug}] } { @@ -107,6 +122,9 @@ gdb_py_test_silent_cmd "python sep_objfile = gdb.objfiles()\[0\]" \ gdb_test "python print (sep_objfile.owner.filename)" "${testfile}2" \ "Test owner of separate debug file" +gdb_test "python print (sep_objfile.owner.username)" "${testfile}2" \ + "Test user-name of owner of separate debug file" + gdb_test "p main" "= {int \\(\\)} $hex
" \ "print main with debug info"