[3/4] Make gdb.PendingFrame.read_register handle "user" registers
Commit Message
Make gdb.PendingFrame.read_register handle "user" registers.
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/python/py-unwind.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
Comments
On 09/28/2016 09:56 AM, Kevin Buettner wrote:
> Make gdb.PendingFrame.read_register handle "user" registers.
>
> 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().
OK.
Thanks,
Pedro Alves
@@ -412,7 +412,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.",