From cf77c34ea71c27c3cb6dd31c9448249276e8a8a6 Mon Sep 17 00:00:00 2001 From: Markus Metzger Date: Fri, 20 Jan 2017 09:05:03 +0100 Subject: [PATCH] thread: add can_access_registers_ptid Add a function can_access_registers_ptid that behaves like validate_registers_access but returns a boolean value instead of throwing an exception. gdb/ * gdbthread.h (can_access_registers_ptid): New. * thread.c (can_access_registers_ptid): New. --- gdb/ChangeLog | 5 +++++ gdb/gdbthread.h | 4 ++++ gdb/thread.c | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 710b181578e..5ce89125cb4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-02-01 Markus Metzger + + * gdbthread.h (can_access_registers_ptid): New. + * thread.c (can_access_registers_ptid): New. + 2017-02-01 Pedro Alves * i386-tdep.c (i386_fast_tracepoint_valid_at): Use gdb_insn_length. diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 455cfd8e937..06ed78f5681 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -625,6 +625,10 @@ extern void thread_cancel_execution_command (struct thread_info *thr); executing). */ extern void validate_registers_access (void); +/* Check whether it makes sense to access a register of PTID at this point. + Returns true if registers may be accessed; false otherwise. */ +extern bool can_access_registers_ptid (ptid_t ptid); + /* Returns whether to show which thread hit the breakpoint, received a signal, etc. and ended up causing a user-visible stop. This is true iff we ever detected multiple threads. */ diff --git a/gdb/thread.c b/gdb/thread.c index e45b25750eb..99fe4247178 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1141,6 +1141,26 @@ validate_registers_access (void) error (_("Selected thread is running.")); } +/* See gdbthread.h. */ + +bool +can_access_registers_ptid (ptid_t ptid) +{ + /* No thread, no registers. */ + if (ptid_equal (ptid, null_ptid)) + return false; + + /* Don't try to read from a dead thread. */ + if (is_exited (ptid)) + return false; + + /* ... or from a spinning thread. FIXME: see validate_registers_access. */ + if (is_executing (ptid)) + return false; + + return true; +} + int pc_in_thread_step_range (CORE_ADDR pc, struct thread_info *thread) { -- 2.30.2