aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2016-09-27 22:45:19 -0700
committerKevin Buettner <kevinb@redhat.com>2016-11-16 11:38:44 -0700
commit33cc7d368f420326606695daafd6292e2779c6af (patch)
treed695614addf8e1c850faad0b5c9bd5d2f8addc60
parent41b56feb5063aee4fefb4a991eb796d1e8a7475e (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--gdb/python/py-unwind.c7
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.",