public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/python: Return None from Progspace.block_for_pc on error
@ 2019-10-24 15:24 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2019-10-24 15:24 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=33d569b709886a1208145806da80b689d9cae9da

commit 33d569b709886a1208145806da80b689d9cae9da
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Wed Oct 23 13:24:02 2019 +0100

    gdb/python: Return None from Progspace.block_for_pc on error
    
    The documentation for Progspace.block_for_pc says:
    
      Return the innermost gdb.Block containing the given pc value. If the
      block cannot be found for the pc value specified, the function will
      return None.
    
    However, the implementation actually throws an error for invalid
    addresses, like this:
    
        (gdb) python print gdb.current_progspace ().block_for_pc (1)
        Traceback (most recent call last):
          File "<string>", line 1, in <module>
        RuntimeError: Cannot locate object file for block.
        Error while executing Python code.
        (gdb)
    
    This has been the behaviour since the command was first added (when
    the documentation was still as above) in this commit:
    
        commit f3e9a8177c41893858fce2bdf339dbe90b3a4ef5
        Date:   Wed Feb 24 21:18:28 2010 +0000
    
    Since that commit the code in question has moved around, but the
    important parts are largely unchanged.  The function in question is
    now in py-progspace.c:pspy_block_for_pc.
    
    Examining the code shows that the real state is more complex than just
    the function throws an error instead of returning None, instead the
    real situation is:
    
      1. If we can't find a compilation unit for the $pc value then we
      throw an error, but
    
      2. If we can find a compilation unit, but can't find a block within
      the compilation unit for the $pc then return None.
    
    I suspect for most users of the Python API this distinction is
    irrelevant, and I propose that we standardise on one single failure
    mechanism.
    
    Given the function can currently return None in some cases, and is
    documented to return None on error, I propose we make that the case
    for all error paths, which is what this patch does.
    
    As the Progspace.block_for_pc method is currently untested, I've added
    some basic tests including for a call with an invalid $pc.
    
    This is potentially an API breaking change, though an undocumented
    part of the API.  Also, users should have been checking and handling a
    None return value anyway, so my hope is that this shouldn't be too
    disruptive.
    
    gdb/ChangeLog:
    
    	* python/py-progspace.c (pspy_block_for_pc): Return None for all
    	error paths.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.python/py-progspace.exp: Add tests for the
    	Progspace.block_for_pc method.
    
    Change-Id: I9cea8d2132902bcad0013d1fd39080dd5423cc57

Diff:
---
 gdb/ChangeLog                             |  5 +++++
 gdb/python/py-progspace.c                 |  6 +-----
 gdb/testsuite/ChangeLog                   |  5 +++++
 gdb/testsuite/gdb.python/py-progspace.exp | 14 ++++++++++++++
 4 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 09adb91..887c7fb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2019-10-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* python/py-progspace.c (pspy_block_for_pc): Return None for all
+	error paths.
+
 2019-10-23  Tom Tromey  <tom@tromey.com>
 
 	* arc-tdep.c: Remove ".." from include.
diff --git a/gdb/python/py-progspace.c b/gdb/python/py-progspace.c
index 4483d03..bdb7072 100644
--- a/gdb/python/py-progspace.c
+++ b/gdb/python/py-progspace.c
@@ -397,11 +397,7 @@ pspy_block_for_pc (PyObject *o, PyObject *args)
     }
 
   if (cust == NULL || COMPUNIT_OBJFILE (cust) == NULL)
-    {
-      PyErr_SetString (PyExc_RuntimeError,
-		       _("Cannot locate object file for block."));
-      return NULL;
-    }
+    Py_RETURN_NONE;
 
   if (block)
     return block_to_block_object (block, COMPUNIT_OBJFILE (cust));
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 0d1fed9..12ef1fe 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-10-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.python/py-progspace.exp: Add tests for the
+	Progspace.block_for_pc method.
+
 2019-10-23  Tom Tromey  <tom@tromey.com>
 
 	* configure: Rebuild.
diff --git a/gdb/testsuite/gdb.python/py-progspace.exp b/gdb/testsuite/gdb.python/py-progspace.exp
index 5394382..d1bcb81 100644
--- a/gdb/testsuite/gdb.python/py-progspace.exp
+++ b/gdb/testsuite/gdb.python/py-progspace.exp
@@ -57,6 +57,20 @@ if {![runto_main]} {
     return
 }
 
+# Check we can get a block for the current $pc.
+set pc_val [get_integer_valueof "\$pc" 0]
+gdb_py_test_silent_cmd "python blk = gdb.current_progspace ().block_for_pc (${pc_val})" \
+    "get block for the current \$pc" 1
+gdb_test "python print blk.start <= ${pc_val}" "True" \
+    "block start is before \$pc"
+gdb_test "python print blk.end >= ${pc_val}" "True" \
+    "block end is after \$pc"
+
+# Check what happens when we ask for a block of an invalid address.
+if ![is_address_zero_readable] {
+    gdb_test "python print gdb.current_progspace ().block_for_pc (0)" "None"
+}
+
 # With a single inferior, progspace.objfiles () and gdb.objfiles () should
 # be identical.
 gdb_test "python print (progspace.objfiles () == gdb.objfiles ())" "True"


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-10-24 15:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-24 15:24 [binutils-gdb] gdb/python: Return None from Progspace.block_for_pc on error Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).