--- gdb/record.c | 159 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 101 insertions(+), 58 deletions(-) Index: src/gdb/record.c =================================================================== --- src.orig/gdb/record.c 2008-10-20 00:48:50.000000000 +0100 +++ src/gdb/record.c 2008-10-20 13:02:38.000000000 +0100 @@ -497,6 +497,9 @@ record_wait (ptid_t ptid, struct target_ int continue_flag = 1; int first_record_end = 1; struct cleanup *old_cleanups = make_cleanup (record_wait_cleanups, 0); + CORE_ADDR pc; + record_t *curr_record; + int first = 1; record_get_sig = 0; act.sa_handler = record_sig_handler; @@ -512,20 +515,13 @@ record_wait (ptid_t ptid, struct target_ Then set it to terminal_ours to make GDB get the signal. */ target_terminal_ours (); - /* In EXEC_FORWARD mode, record_list point to the tail of prev - instruction. */ - if (execution_direction == EXEC_FORWARD && record_list->next) - { - record_list = record_list->next; - } - /* Loop over the record_list, looking for the next place to stop. */ status->kind = TARGET_WAITKIND_STOPPED; do { /* Check for beginning and end of log. */ - if (execution_direction == EXEC_REVERSE + if (execution_direction == EXEC_REVERSE && record_list == &record_first) { /* Hit beginning of record log in reverse. */ @@ -539,8 +535,51 @@ record_wait (ptid_t ptid, struct target_ break; } + /* Check for breakpoint hits in forward execution. */ + pc = read_pc (); + if (execution_direction == EXEC_FORWARD + && regular_breakpoint_inserted_here_p (pc) + /* && !single-stepping */) + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; + if (software_breakpoint_inserted_here_p (pc)) + pc += gdbarch_decr_pc_after_break (current_gdbarch); + write_pc (pc); + + if (sigaction (SIGALRM, &old_act, NULL)) + perror_with_name (_("Process record: sigaction")); + + discard_cleanups (old_cleanups); + return inferior_ptid; + } + + if (first) + { + first = 0; + /* In EXEC_FORWARD mode, record_list point to the tail of prev + instruction. */ + if (execution_direction == EXEC_FORWARD && record_list->next) + { + record_list = record_list->next; + } + } + + curr_record = record_list; + + if (execution_direction == EXEC_REVERSE) + { + if (record_list->prev) + record_list = record_list->prev; + } + else + { + if (record_list->next) + record_list = record_list->next; + } + /* set ptid, register and memory according to record_list */ - if (record_list->type == record_reg) + if (curr_record->type == record_reg) { /* reg */ gdb_byte reg[MAX_REGISTER_SIZE]; @@ -548,43 +587,43 @@ record_wait (ptid_t ptid, struct target_ { fprintf_unfiltered (gdb_stdlog, "Process record: record_reg 0x%s to inferior num = %d.\n", - paddr_nz ((CORE_ADDR)record_list), - record_list->u.reg.num); + paddr_nz ((CORE_ADDR)curr_record), + curr_record->u.reg.num); } - regcache_cooked_read (regcache, record_list->u.reg.num, reg); - regcache_cooked_write (regcache, record_list->u.reg.num, - record_list->u.reg.val); - memcpy (record_list->u.reg.val, reg, MAX_REGISTER_SIZE); + regcache_cooked_read (regcache, curr_record->u.reg.num, reg); + regcache_cooked_write (regcache, curr_record->u.reg.num, + curr_record->u.reg.val); + memcpy (curr_record->u.reg.val, reg, MAX_REGISTER_SIZE); } - else if (record_list->type == record_mem) + else if (curr_record->type == record_mem) { /* mem */ - gdb_byte *mem = alloca (record_list->u.mem.len); + gdb_byte *mem = alloca (curr_record->u.mem.len); if (record_debug > 1) { fprintf_unfiltered (gdb_stdlog, "Process record: record_mem 0x%s to inferior addr = 0x%s len = %d.\n", - paddr_nz ((CORE_ADDR)record_list), - paddr_nz (record_list->u.mem.addr), - record_list->u.mem.len); + paddr_nz ((CORE_ADDR)curr_record), + paddr_nz (curr_record->u.mem.addr), + curr_record->u.mem.len); } if (target_read_memory - (record_list->u.mem.addr, mem, record_list->u.mem.len)) + (curr_record->u.mem.addr, mem, curr_record->u.mem.len)) { error (_("Process record: read memory addr = 0x%s len = %d error."), - paddr_nz (record_list->u.mem.addr), - record_list->u.mem.len); + paddr_nz (curr_record->u.mem.addr), + curr_record->u.mem.len); } if (target_write_memory - (record_list->u.mem.addr, record_list->u.mem.val, - record_list->u.mem.len)) + (curr_record->u.mem.addr, curr_record->u.mem.val, + curr_record->u.mem.len)) { error (_ ("Process record: write memory addr = 0x%s len = %d error."), - paddr_nz (record_list->u.mem.addr), - record_list->u.mem.len); + paddr_nz (curr_record->u.mem.addr), + curr_record->u.mem.len); } - memcpy (record_list->u.mem.val, mem, record_list->u.mem.len); + memcpy (curr_record->u.mem.val, mem, curr_record->u.mem.len); } else { @@ -596,13 +635,13 @@ record_wait (ptid_t ptid, struct target_ { fprintf_unfiltered (gdb_stdlog, "Process record: record_end 0x%s to inferior need_dasm = %d.\n", - paddr_nz ((CORE_ADDR)record_list), - record_list->u.need_dasm); + paddr_nz ((CORE_ADDR)curr_record), + curr_record->u.need_dasm); } if (execution_direction == EXEC_FORWARD) { - need_dasm = record_list->u.need_dasm; + need_dasm = curr_record->u.need_dasm; } if (need_dasm) { @@ -631,45 +670,48 @@ record_wait (ptid_t ptid, struct target_ continue_flag = 0; } - /* check breakpoint */ - tmp_pc = read_pc (); - for (bl = bp_location_chain; bl; bl = bl->global_next) + if (execution_direction == EXEC_REVERSE) { - b = bl->owner; - gdb_assert (b); - if (b->enable_state != bp_enabled - && b->enable_state != bp_permanent) - continue; - - if (b->type == bp_watchpoint || b->type == bp_catch_fork - || b->type == bp_catch_vfork - || b->type == bp_catch_exec - || b->type == bp_hardware_watchpoint - || b->type == bp_read_watchpoint - || b->type == bp_access_watchpoint) - { - continue; - } - if (bl->address == tmp_pc) + /* check breakpoint */ + tmp_pc = read_pc (); + for (bl = bp_location_chain; bl; bl = bl->global_next) { - if (record_debug) + b = bl->owner; + gdb_assert (b); + if (b->enable_state != bp_enabled + && b->enable_state != bp_permanent) + continue; + + if (b->type == bp_watchpoint || b->type == bp_catch_fork + || b->type == bp_catch_vfork + || b->type == bp_catch_exec + || b->type == bp_hardware_watchpoint + || b->type == bp_read_watchpoint + || b->type == bp_access_watchpoint) + { + continue; + } + if (bl->address == tmp_pc) { - fprintf_unfiltered (gdb_stdlog, - "Process record: break at 0x%s.\n", - paddr_nz (tmp_pc)); + if (record_debug) + { + fprintf_unfiltered (gdb_stdlog, + "Process record: break at 0x%s.\n", + paddr_nz (tmp_pc)); + } + continue_flag = 0; + break; } - continue_flag = 0; - break; } } } if (execution_direction == EXEC_REVERSE) { - need_dasm = record_list->u.need_dasm; + need_dasm = curr_record->u.need_dasm; } } -next: +#if 0 if (continue_flag) { if (execution_direction == EXEC_REVERSE) @@ -683,6 +725,7 @@ next: record_list = record_list->next; } } +#endif } while (continue_flag);