Make gdb.PendingFrame.read_register handle "user" registers.
authorKevin Buettner <kevinb@redhat.com>
Wed, 28 Sep 2016 05:45:19 +0000 (22:45 -0700)
committerKevin Buettner <kevinb@redhat.com>
Wed, 16 Nov 2016 18:38:44 +0000 (11:38 -0700)
The C function, pending_framepy_read_register(), which implements
the python interface gdb.PendingFrame.read_register does not handle
the so called "user" registers like "pc".  An assertion error is
triggered due to the user registers having numbers larger than or
equal to gdbarch_num_regs(gdbarch).

With the VALUE_FRAME_ID tweak in place, the call to
get_frame_register_value() can simply be replaced by a call to
value_of_register(), which handles both real registers as well as the
user registers.

gdb/ChangeLog:

* python/py-unwind.c (pending_framepy_read_register): Use
value_of_register() instead of get_frame_register_value().

gdb/ChangeLog
gdb/python/py-unwind.c

index caad792d62fa0bbee1cb921ae19fd378ec03bd58..5b53dad52d34dc260ed4d454ac6c50b614f18e5b 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-16  Kevin Buettner  <kevinb@redhat.com>
+
+       * python/py-unwind.c (pending_framepy_read_register): Use
+       value_of_register() instead of get_frame_register_value().
+
 2016-11-16  Kevin Buettner  <kevinb@redhat.com>
 
        * value.h (VALUE_FRAME_ID): Rename to VALUE_NEXT_FRAME_ID. Update
index 52184bd4e0d83bfdda406b1c6f229bdcdb95b1de..65c705f04ca66a14f941e9dfb650ccd212608b60 100644 (file)
@@ -407,7 +407,12 @@ pending_framepy_read_register (PyObject *self, PyObject *args)
 
   TRY
     {
-      val = get_frame_register_value (pending_frame->frame_info, regnum);
+      /* Fetch the value associated with a register, whether it's
+        a real register or a so called "user" register, like "pc",
+        which maps to a real register.  In the past,
+        get_frame_register_value() was used here, which did not
+        handle the user register case.  */
+      val = value_of_register (regnum, pending_frame->frame_info);
       if (val == NULL)
         PyErr_Format (PyExc_ValueError,
                       "Cannot read register %d from frame.",