diff options
-rw-r--r-- | gdb/arm-tdep.c | 12 | ||||
-rw-r--r-- | gdb/breakpoint.c | 27 |
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); } } |