aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/arm-tdep.c12
-rw-r--r--gdb/breakpoint.c27
2 files changed, 28 insertions, 11 deletions
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index ac49054..607d6de 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -574,20 +574,24 @@ arm_is_thumb (struct regcache *regcache)
return (cpsr & t_bit) != 0;
}
-/* Determine if FRAME is executing in Thumb mode. */
+/* Determine if FRAME is executing in Thumb mode. FRAME must be an ARM
+ frame. */
int
arm_frame_is_thumb (struct frame_info *frame)
{
- CORE_ADDR cpsr;
- ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
+ /* Check the architecture of FRAME. */
+ struct gdbarch *gdbarch = get_frame_arch (frame);
+ gdb_assert (gdbarch_bfd_arch_info (gdbarch)->arch == bfd_arch_arm);
/* Every ARM frame unwinder can unwind the T bit of the CPSR, either
directly (from a signal frame or dummy frame) or by interpreting
the saved LR (from a prologue or DWARF frame). So consult it and
trust the unwinders. */
- cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
+ CORE_ADDR cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
+ /* Find and extract the thumb bit. */
+ ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
return (cpsr & t_bit) != 0;
}
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 74f5336..1e524b5 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -124,7 +124,8 @@ static void breakpoint_adjustment_warning (CORE_ADDR, CORE_ADDR, int, int);
static CORE_ADDR adjust_breakpoint_address (struct gdbarch *gdbarch,
CORE_ADDR bpaddr,
- enum bptype bptype);
+ enum bptype bptype,
+ struct program_space *pspace);
static int watchpoint_locations_match (struct bp_location *loc1,
struct bp_location *loc2);
@@ -7103,8 +7104,11 @@ breakpoint_adjustment_warning (CORE_ADDR from_addr, CORE_ADDR to_addr,
static CORE_ADDR
adjust_breakpoint_address (struct gdbarch *gdbarch,
- CORE_ADDR bpaddr, enum bptype bptype)
+ CORE_ADDR bpaddr, enum bptype bptype,
+ struct program_space *pspace)
{
+ gdb_assert (pspace != nullptr);
+
if (bptype == bp_watchpoint
|| bptype == bp_hardware_watchpoint
|| bptype == bp_read_watchpoint
@@ -7129,11 +7133,18 @@ adjust_breakpoint_address (struct gdbarch *gdbarch,
{
CORE_ADDR adjusted_bpaddr = bpaddr;
+ /* Some targets have architectural constraints on the placement
+ of breakpoint instructions. Obtain the adjusted address. */
if (gdbarch_adjust_breakpoint_address_p (gdbarch))
{
- /* Some targets have architectural constraints on the placement
- of breakpoint instructions. Obtain the adjusted address. */
- adjusted_bpaddr = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr);
+ /* Targets that implement this adjustment function will likely
+ inspect either the symbol table, target memory at BPADDR, or
+ even state registers, so ensure a suitable thread (and its
+ associated program space) are currently selected. */
+ scoped_restore_current_pspace_and_thread restore_pspace_thread;
+ switch_to_program_space_and_thread (pspace);
+ adjusted_bpaddr
+ = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr);
}
adjusted_bpaddr = address_significant (gdbarch, adjusted_bpaddr);
@@ -8087,7 +8098,8 @@ code_breakpoint::add_location (const symtab_and_line &sal)
not want its scan of the location chain to find a breakpoint and
location that's only been partially initialized. */
adjusted_address = adjust_breakpoint_address (loc_gdbarch,
- sal.pc, type);
+ sal.pc, type,
+ sal.pspace);
/* Sort the locations by their ADDRESS. */
new_loc = allocate_location ();
@@ -10077,7 +10089,8 @@ watch_command_1 (const char *arg, int accessflag, int from_tty,
scope_breakpoint->loc->address
= adjust_breakpoint_address (scope_breakpoint->loc->gdbarch,
scope_breakpoint->loc->requested_address,
- scope_breakpoint->type);
+ scope_breakpoint->type,
+ current_program_space);
}
}