diff options
author | Kevin Buettner <kevinb@redhat.com> | 2016-09-27 22:45:19 -0700 |
---|---|---|
committer | Kevin Buettner <kevinb@redhat.com> | 2016-11-16 11:38:44 -0700 |
commit | 33cc7d368f420326606695daafd6292e2779c6af (patch) | |
tree | d695614addf8e1c850faad0b5c9bd5d2f8addc60 | |
parent | 41b56feb5063aee4fefb4a991eb796d1e8a7475e (diff) | |
download | gdb-33cc7d368f420326606695daafd6292e2779c6af.zip gdb-33cc7d368f420326606695daafd6292e2779c6af.tar.gz gdb-33cc7d368f420326606695daafd6292e2779c6af.tar.bz2 |
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().
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/python/py-unwind.c | 7 |
2 files changed, 11 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index caad792..5b53dad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 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 comment. Create new VALUE_FRAME_ID which is defined in terms of VALUE_NEXT_FRAME_ID. diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index 52184bd..65c705f 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -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.", |