X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Frecord-full.c;h=d35165b90a705620453b5e17292b59e8b81bef8c;hb=40c1a0073715c1e3f93afc83edac8396eb362a98;hp=5ffa6b73e70140dc9dfbb7c5797ce76822bafb9c;hpb=25ea693b87da84e449d731c609b0fd744092e70d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/record-full.c b/gdb/record-full.c index 5ffa6b73e7..d35165b90a 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -1,6 +1,6 @@ /* Process record and replay target for GDB, the GNU debugger. - Copyright (C) 2013 Free Software Foundation, Inc. + Copyright (C) 2013-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -199,7 +199,7 @@ static int record_full_stop_at_limit = 1; static unsigned int record_full_insn_max_num = DEFAULT_RECORD_FULL_INSN_MAX_NUM; /* Actual count of insns presently in execution log. */ -static int record_full_insn_num = 0; +static unsigned int record_full_insn_num = 0; /* Count of insns logged so far (may be larger than count of insns presently in execution log). */ static ULONGEST record_full_insn_count; @@ -208,6 +208,19 @@ static ULONGEST record_full_insn_count; static struct target_ops record_full_ops; static struct target_ops record_full_core_ops; +/* See record-full.h. */ + +int +record_full_is_used (void) +{ + struct target_ops *t; + + t = find_record_target (); + return (t == &record_full_ops + || t == &record_full_core_ops); +} + + /* Command lists for "set/show record full". */ static struct cmd_list_element *set_record_full_cmdlist; static struct cmd_list_element *show_record_full_cmdlist; @@ -215,43 +228,10 @@ static struct cmd_list_element *show_record_full_cmdlist; /* Command list for "record full". */ static struct cmd_list_element *record_full_cmdlist; -/* The beneath function pointers. */ -static struct target_ops *record_full_beneath_to_resume_ops; -static void (*record_full_beneath_to_resume) (struct target_ops *, ptid_t, int, - enum gdb_signal); -static struct target_ops *record_full_beneath_to_wait_ops; -static ptid_t (*record_full_beneath_to_wait) (struct target_ops *, ptid_t, - struct target_waitstatus *, - int); -static struct target_ops *record_full_beneath_to_store_registers_ops; -static void (*record_full_beneath_to_store_registers) (struct target_ops *, - struct regcache *, - int regno); -static struct target_ops *record_full_beneath_to_xfer_partial_ops; -static LONGEST - (*record_full_beneath_to_xfer_partial) (struct target_ops *ops, - enum target_object object, - const char *annex, - gdb_byte *readbuf, - const gdb_byte *writebuf, - ULONGEST offset, - LONGEST len); -static int - (*record_full_beneath_to_insert_breakpoint) (struct gdbarch *, - struct bp_target_info *); -static int - (*record_full_beneath_to_remove_breakpoint) (struct gdbarch *, - struct bp_target_info *); -static int (*record_full_beneath_to_stopped_by_watchpoint) (void); -static int (*record_full_beneath_to_stopped_data_address) (struct target_ops *, - CORE_ADDR *); -static void - (*record_full_beneath_to_async) (void (*) (enum inferior_event_type, void *), - void *); - static void record_full_goto_insn (struct record_full_entry *entry, enum exec_direction_kind dir); -static void record_full_save (char *recfilename); +static void record_full_save (struct target_ops *self, + const char *recfilename); /* Alloc and free functions for record_full_reg, record_full_mem, and record_full_end entries. */ @@ -557,28 +537,24 @@ record_full_arch_list_add_end (void) static void record_full_check_insn_num (int set_terminal) { - if (record_full_insn_max_num) + if (record_full_insn_num == record_full_insn_max_num) { - gdb_assert (record_full_insn_num <= record_full_insn_max_num); - if (record_full_insn_num == record_full_insn_max_num) + /* Ask user what to do. */ + if (record_full_stop_at_limit) { - /* Ask user what to do. */ - if (record_full_stop_at_limit) - { - int q; - - if (set_terminal) - target_terminal_ours (); - q = yquery (_("Do you want to auto delete previous execution " - "log entries when record/replay buffer becomes " - "full (record full stop-at-limit)?")); - if (set_terminal) - target_terminal_inferior (); - if (q) - record_full_stop_at_limit = 0; - else - error (_("Process record: stopped by user.")); - } + int q; + + if (set_terminal) + target_terminal_ours (); + q = yquery (_("Do you want to auto delete previous execution " + "log entries when record/replay buffer becomes " + "full (record full stop-at-limit)?")); + if (set_terminal) + target_terminal_inferior (); + if (q) + record_full_stop_at_limit = 0; + else + error (_("Process record: stopped by user.")); } } } @@ -659,8 +635,7 @@ record_full_message (struct regcache *regcache, enum gdb_signal signal) record_full_arch_list_head->prev = record_full_list; record_full_list = record_full_arch_list_tail; - if (record_full_insn_num == record_full_insn_max_num - && record_full_insn_max_num) + if (record_full_insn_num == record_full_insn_max_num) record_full_list_release_first (); else record_full_insn_num++; @@ -800,34 +775,6 @@ record_full_exec_insn (struct regcache *regcache, } } -static struct target_ops *tmp_to_resume_ops; -static void (*tmp_to_resume) (struct target_ops *, ptid_t, int, - enum gdb_signal); -static struct target_ops *tmp_to_wait_ops; -static ptid_t (*tmp_to_wait) (struct target_ops *, ptid_t, - struct target_waitstatus *, - int); -static struct target_ops *tmp_to_store_registers_ops; -static void (*tmp_to_store_registers) (struct target_ops *, - struct regcache *, - int regno); -static struct target_ops *tmp_to_xfer_partial_ops; -static LONGEST (*tmp_to_xfer_partial) (struct target_ops *ops, - enum target_object object, - const char *annex, - gdb_byte *readbuf, - const gdb_byte *writebuf, - ULONGEST offset, - LONGEST len); -static int (*tmp_to_insert_breakpoint) (struct gdbarch *, - struct bp_target_info *); -static int (*tmp_to_remove_breakpoint) (struct gdbarch *, - struct bp_target_info *); -static int (*tmp_to_stopped_by_watchpoint) (void); -static int (*tmp_to_stopped_data_address) (struct target_ops *, CORE_ADDR *); -static int (*tmp_to_stopped_data_address) (struct target_ops *, CORE_ADDR *); -static void (*tmp_to_async) (void (*) (enum inferior_event_type, void *), void *); - static void record_full_restore (void); /* Asynchronous signal handle registered as event loop source for when @@ -890,26 +837,6 @@ record_full_open_1 (char *name, int from_tty) error (_("Process record: the current architecture doesn't support " "record function.")); - if (!tmp_to_resume) - error (_("Could not find 'to_resume' method on the target stack.")); - if (!tmp_to_wait) - error (_("Could not find 'to_wait' method on the target stack.")); - if (!tmp_to_store_registers) - error (_("Could not find 'to_store_registers' " - "method on the target stack.")); - if (!tmp_to_insert_breakpoint) - error (_("Could not find 'to_insert_breakpoint' " - "method on the target stack.")); - if (!tmp_to_remove_breakpoint) - error (_("Could not find 'to_remove_breakpoint' " - "method on the target stack.")); - if (!tmp_to_stopped_by_watchpoint) - error (_("Could not find 'to_stopped_by_watchpoint' " - "method on the target stack.")); - if (!tmp_to_stopped_data_address) - error (_("Could not find 'to_stopped_data_address' " - "method on the target stack.")); - push_target (&record_full_ops); } @@ -925,62 +852,7 @@ record_full_open (char *name, int from_tty) if (record_debug) fprintf_unfiltered (gdb_stdlog, "Process record: record_full_open\n"); - /* Check if record target is already running. */ - if (current_target.to_stratum == record_stratum) - error (_("Process record target already running. Use \"record stop\" to " - "stop record target first.")); - - /* Reset the tmp beneath pointers. */ - tmp_to_resume_ops = NULL; - tmp_to_resume = NULL; - tmp_to_wait_ops = NULL; - tmp_to_wait = NULL; - tmp_to_store_registers_ops = NULL; - tmp_to_store_registers = NULL; - tmp_to_xfer_partial_ops = NULL; - tmp_to_xfer_partial = NULL; - tmp_to_insert_breakpoint = NULL; - tmp_to_remove_breakpoint = NULL; - tmp_to_stopped_by_watchpoint = NULL; - tmp_to_stopped_data_address = NULL; - tmp_to_async = NULL; - - /* Set the beneath function pointers. */ - for (t = current_target.beneath; t != NULL; t = t->beneath) - { - if (!tmp_to_resume) - { - tmp_to_resume = t->to_resume; - tmp_to_resume_ops = t; - } - if (!tmp_to_wait) - { - tmp_to_wait = t->to_wait; - tmp_to_wait_ops = t; - } - if (!tmp_to_store_registers) - { - tmp_to_store_registers = t->to_store_registers; - tmp_to_store_registers_ops = t; - } - if (!tmp_to_xfer_partial) - { - tmp_to_xfer_partial = t->to_xfer_partial; - tmp_to_xfer_partial_ops = t; - } - if (!tmp_to_insert_breakpoint) - tmp_to_insert_breakpoint = t->to_insert_breakpoint; - if (!tmp_to_remove_breakpoint) - tmp_to_remove_breakpoint = t->to_remove_breakpoint; - if (!tmp_to_stopped_by_watchpoint) - tmp_to_stopped_by_watchpoint = t->to_stopped_by_watchpoint; - if (!tmp_to_stopped_data_address) - tmp_to_stopped_data_address = t->to_stopped_data_address; - if (!tmp_to_async) - tmp_to_async = t->to_async; - } - if (!tmp_to_xfer_partial) - error (_("Could not find 'to_xfer_partial' method on the target stack.")); + record_preopen (); /* Reset */ record_full_insn_num = 0; @@ -988,21 +860,6 @@ record_full_open (char *name, int from_tty) record_full_list = &record_full_first; record_full_list->next = NULL; - /* Set the tmp beneath pointers to beneath pointers. */ - record_full_beneath_to_resume_ops = tmp_to_resume_ops; - record_full_beneath_to_resume = tmp_to_resume; - record_full_beneath_to_wait_ops = tmp_to_wait_ops; - record_full_beneath_to_wait = tmp_to_wait; - record_full_beneath_to_store_registers_ops = tmp_to_store_registers_ops; - record_full_beneath_to_store_registers = tmp_to_store_registers; - record_full_beneath_to_xfer_partial_ops = tmp_to_xfer_partial_ops; - record_full_beneath_to_xfer_partial = tmp_to_xfer_partial; - record_full_beneath_to_insert_breakpoint = tmp_to_insert_breakpoint; - record_full_beneath_to_remove_breakpoint = tmp_to_remove_breakpoint; - record_full_beneath_to_stopped_by_watchpoint = tmp_to_stopped_by_watchpoint; - record_full_beneath_to_stopped_data_address = tmp_to_stopped_data_address; - record_full_beneath_to_async = tmp_to_async; - if (core_bfd) record_full_core_open_1 (name, from_tty); else @@ -1021,7 +878,7 @@ record_full_open (char *name, int from_tty) /* "to_close" target method. Close the process record target. */ static void -record_full_close (int quitting) +record_full_close (struct target_ops *self) { struct record_full_core_buf_entry *entry; @@ -1126,8 +983,7 @@ record_full_resume (struct target_ops *ops, ptid_t ptid, int step, /* Make sure the target beneath reports all signals. */ target_pass_signals (0, NULL); - record_full_beneath_to_resume (record_full_beneath_to_resume_ops, - ptid, step, signal); + ops->beneath->to_resume (ops->beneath, ptid, step, signal); } /* We are about to start executing the inferior (or simulate it), @@ -1217,8 +1073,7 @@ record_full_wait_1 (struct target_ops *ops, if (record_full_resume_step) { /* This is a single step. */ - return record_full_beneath_to_wait (record_full_beneath_to_wait_ops, - ptid, status, options); + return ops->beneath->to_wait (ops->beneath, ptid, status, options); } else { @@ -1229,8 +1084,7 @@ record_full_wait_1 (struct target_ops *ops, while (1) { - ret = record_full_beneath_to_wait - (record_full_beneath_to_wait_ops, ptid, status, options); + ret = ops->beneath->to_wait (ops->beneath, ptid, status, options); if (status->kind == TARGET_WAITKIND_IGNORE) { if (record_debug) @@ -1275,7 +1129,7 @@ record_full_wait_1 (struct target_ops *ops, struct gdbarch *gdbarch = get_regcache_arch (regcache); CORE_ADDR decr_pc_after_break - = gdbarch_decr_pc_after_break (gdbarch); + = target_decr_pc_after_break (gdbarch); if (decr_pc_after_break) regcache_write_pc (regcache, tmp_pc + decr_pc_after_break); @@ -1314,9 +1168,8 @@ record_full_wait_1 (struct target_ops *ops, "Process record: record_full_wait " "issuing one more step in the " "target beneath\n"); - record_full_beneath_to_resume - (record_full_beneath_to_resume_ops, ptid, step, - GDB_SIGNAL_0); + ops->beneath->to_resume (ops->beneath, ptid, step, + GDB_SIGNAL_0); continue; } } @@ -1348,7 +1201,7 @@ record_full_wait_1 (struct target_ops *ops, tmp_pc = regcache_read_pc (regcache); if (breakpoint_inserted_here_p (aspace, tmp_pc)) { - int decr_pc_after_break = gdbarch_decr_pc_after_break (gdbarch); + int decr_pc_after_break = target_decr_pc_after_break (gdbarch); if (record_debug) fprintf_unfiltered (gdb_stdlog, @@ -1430,7 +1283,7 @@ record_full_wait_1 (struct target_ops *ops, if (breakpoint_inserted_here_p (aspace, tmp_pc)) { int decr_pc_after_break - = gdbarch_decr_pc_after_break (gdbarch); + = target_decr_pc_after_break (gdbarch); if (record_debug) fprintf_unfiltered (gdb_stdlog, @@ -1515,62 +1368,12 @@ record_full_wait (struct target_ops *ops, } static int -record_full_stopped_by_watchpoint (void) +record_full_stopped_by_watchpoint (struct target_ops *ops) { if (RECORD_FULL_IS_REPLAY) return record_full_hw_watchpoint; else - return record_full_beneath_to_stopped_by_watchpoint (); -} - -/* "to_disconnect" method for process record target. */ - -static void -record_full_disconnect (struct target_ops *target, char *args, int from_tty) -{ - if (record_debug) - fprintf_unfiltered (gdb_stdlog, - "Process record: record_full_disconnect\n"); - - unpush_target (&record_full_ops); - target_disconnect (args, from_tty); -} - -/* "to_detach" method for process record target. */ - -static void -record_full_detach (struct target_ops *ops, char *args, int from_tty) -{ - if (record_debug) - fprintf_unfiltered (gdb_stdlog, "Process record: record_full_detach\n"); - - unpush_target (&record_full_ops); - target_detach (args, from_tty); -} - -/* "to_mourn_inferior" method for process record target. */ - -static void -record_full_mourn_inferior (struct target_ops *ops) -{ - if (record_debug) - fprintf_unfiltered (gdb_stdlog, "Process record: " - "record_full_mourn_inferior\n"); - - unpush_target (&record_full_ops); - target_mourn_inferior (); -} - -/* Close process record target before killing the inferior process. */ - -static void -record_full_kill (struct target_ops *ops) -{ - if (record_debug) - fprintf_unfiltered (gdb_stdlog, "Process record: record_full_kill\n"); - - unpush_target (&record_full_ops); - target_kill (); + return ops->beneath->to_stopped_by_watchpoint (ops->beneath); } static int @@ -1579,7 +1382,7 @@ record_full_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) if (RECORD_FULL_IS_REPLAY) return 0; else - return record_full_beneath_to_stopped_data_address (ops, addr_p); + return ops->beneath->to_stopped_data_address (ops->beneath, addr_p); } /* Record registers change (by user or by GDB) to list as an instruction. */ @@ -1623,8 +1426,7 @@ record_full_registers_change (struct regcache *regcache, int regnum) record_full_arch_list_head->prev = record_full_list; record_full_list = record_full_arch_list_tail; - if (record_full_insn_num == record_full_insn_max_num - && record_full_insn_max_num) + if (record_full_insn_num == record_full_insn_max_num) record_full_list_release_first (); else record_full_insn_num++; @@ -1683,8 +1485,7 @@ record_full_store_registers (struct target_ops *ops, record_full_registers_change (regcache, regno); } - record_full_beneath_to_store_registers - (record_full_beneath_to_store_registers_ops, regcache, regno); + ops->beneath->to_store_registers (ops->beneath, regcache, regno); } /* "to_xfer_partial" method. Behavior is conditional on @@ -1692,11 +1493,11 @@ record_full_store_registers (struct target_ops *ops, In replay mode, we cannot write memory unles we are willing to invalidate the record/replay log from this point forward. */ -static LONGEST +static enum target_xfer_status record_full_xfer_partial (struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, - LONGEST len) + ULONGEST len, ULONGEST *xfered_len) { if (!record_full_gdb_operation_disable && (object == TARGET_OBJECT_MEMORY @@ -1728,7 +1529,7 @@ record_full_xfer_partial (struct target_ops *ops, enum target_object object, fprintf_unfiltered (gdb_stdlog, "Process record: failed to record " "execution log."); - return -1; + return TARGET_XFER_E_IO; } if (record_full_arch_list_add_end ()) { @@ -1737,22 +1538,21 @@ record_full_xfer_partial (struct target_ops *ops, enum target_object object, fprintf_unfiltered (gdb_stdlog, "Process record: failed to record " "execution log."); - return -1; + return TARGET_XFER_E_IO; } record_full_list->next = record_full_arch_list_head; record_full_arch_list_head->prev = record_full_list; record_full_list = record_full_arch_list_tail; - if (record_full_insn_num == record_full_insn_max_num - && record_full_insn_max_num) + if (record_full_insn_num == record_full_insn_max_num) record_full_list_release_first (); else record_full_insn_num++; } - return record_full_beneath_to_xfer_partial - (record_full_beneath_to_xfer_partial_ops, object, annex, - readbuf, writebuf, offset, len); + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, + len, xfered_len); } /* This structure represents a breakpoint inserted while the record @@ -1815,7 +1615,8 @@ record_full_init_record_breakpoints (void) when recording. */ static int -record_full_insert_breakpoint (struct gdbarch *gdbarch, +record_full_insert_breakpoint (struct target_ops *ops, + struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { struct record_full_breakpoint *bp; @@ -1832,7 +1633,7 @@ record_full_insert_breakpoint (struct gdbarch *gdbarch, int ret; old_cleanups = record_full_gdb_operation_disable_set (); - ret = record_full_beneath_to_insert_breakpoint (gdbarch, bp_tgt); + ret = ops->beneath->to_insert_breakpoint (ops->beneath, gdbarch, bp_tgt); do_cleanups (old_cleanups); if (ret != 0) @@ -1852,7 +1653,8 @@ record_full_insert_breakpoint (struct gdbarch *gdbarch, /* "to_remove_breakpoint" method for process record target. */ static int -record_full_remove_breakpoint (struct gdbarch *gdbarch, +record_full_remove_breakpoint (struct target_ops *ops, + struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { struct record_full_breakpoint *bp; @@ -1872,7 +1674,8 @@ record_full_remove_breakpoint (struct gdbarch *gdbarch, int ret; old_cleanups = record_full_gdb_operation_disable_set (); - ret = record_full_beneath_to_remove_breakpoint (gdbarch, bp_tgt); + ret = ops->beneath->to_remove_breakpoint (ops->beneath, gdbarch, + bp_tgt); do_cleanups (old_cleanups); if (ret != 0) @@ -1891,7 +1694,7 @@ record_full_remove_breakpoint (struct gdbarch *gdbarch, /* "to_can_execute_reverse" method for process record target. */ static int -record_full_can_execute_reverse (void) +record_full_can_execute_reverse (struct target_ops *self) { return 1; } @@ -1899,9 +1702,9 @@ record_full_can_execute_reverse (void) /* "to_get_bookmark" method for process record and prec over core. */ static gdb_byte * -record_full_get_bookmark (char *args, int from_tty) +record_full_get_bookmark (struct target_ops *self, char *args, int from_tty) { - gdb_byte *ret = NULL; + char *ret = NULL; /* Return stringified form of instruction count. */ if (record_full_list && record_full_list->type == record_full_end) @@ -1916,14 +1719,17 @@ record_full_get_bookmark (char *args, int from_tty) fprintf_unfiltered (gdb_stdlog, "record_full_get_bookmark returns NULL\n"); } - return ret; + return (gdb_byte *) ret; } /* "to_goto_bookmark" method for process record and prec over core. */ static void -record_full_goto_bookmark (gdb_byte *bookmark, int from_tty) +record_full_goto_bookmark (struct target_ops *self, + gdb_byte *raw_bookmark, int from_tty) { + char *bookmark = (char *) raw_bookmark; + if (record_debug) fprintf_unfiltered (gdb_stdlog, "record_full_goto_bookmark receives %s\n", bookmark); @@ -1940,43 +1746,32 @@ record_full_goto_bookmark (gdb_byte *bookmark, int from_tty) /* Pass along to cmd_record_full_goto. */ } - cmd_record_goto ((char *) bookmark, from_tty); + cmd_record_goto (bookmark, from_tty); return; } -static void -record_full_async (void (*callback) (enum inferior_event_type event_type, - void *context), void *context) -{ - /* If we're on top of a line target (e.g., linux-nat, remote), then - set it to async mode as well. Will be NULL if we're sitting on - top of the core target, for "record restore". */ - if (record_full_beneath_to_async != NULL) - record_full_beneath_to_async (callback, context); -} - static int -record_full_can_async_p (void) +record_full_can_async_p (struct target_ops *ops) { /* We only enable async when the user specifically asks for it. */ return target_async_permitted; } static int -record_full_is_async_p (void) +record_full_is_async_p (struct target_ops *ops) { /* We only enable async when the user specifically asks for it. */ return target_async_permitted; } static enum exec_direction_kind -record_full_execution_direction (void) +record_full_execution_direction (struct target_ops *self) { return record_full_execution_dir; } static void -record_full_info (void) +record_full_info (struct target_ops *self) { struct record_full_entry *p; @@ -2008,21 +1803,21 @@ record_full_info (void) pulongest (record_full_insn_count)); /* Display log count. */ - printf_filtered (_("Log contains %d instructions.\n"), + printf_filtered (_("Log contains %u instructions.\n"), record_full_insn_num); } else printf_filtered (_("No instructions have been logged.\n")); /* Display max log size. */ - printf_filtered (_("Max logged instructions is %d.\n"), + printf_filtered (_("Max logged instructions is %u.\n"), record_full_insn_max_num); } /* The "to_record_delete" target method. */ static void -record_full_delete (void) +record_full_delete (struct target_ops *self) { record_full_list_release_following (record_full_list); } @@ -2030,7 +1825,7 @@ record_full_delete (void) /* The "to_record_is_replaying" target method. */ static int -record_full_is_replaying (void) +record_full_is_replaying (struct target_ops *self) { return RECORD_FULL_IS_REPLAY; } @@ -2059,13 +1854,13 @@ record_full_goto_entry (struct record_full_entry *p) registers_changed (); reinit_frame_cache (); - print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } /* The "to_goto_record_begin" target method. */ static void -record_full_goto_begin (void) +record_full_goto_begin (struct target_ops *self) { struct record_full_entry *p = NULL; @@ -2079,7 +1874,7 @@ record_full_goto_begin (void) /* The "to_goto_record_end" target method. */ static void -record_full_goto_end (void) +record_full_goto_end (struct target_ops *self) { struct record_full_entry *p = NULL; @@ -2095,7 +1890,7 @@ record_full_goto_end (void) /* The "to_goto_record" target method. */ static void -record_full_goto (ULONGEST target_insn) +record_full_goto (struct target_ops *self, ULONGEST target_insn) { struct record_full_entry *p = NULL; @@ -2117,10 +1912,10 @@ init_record_full_ops (void) record_full_ops.to_close = record_full_close; record_full_ops.to_resume = record_full_resume; record_full_ops.to_wait = record_full_wait; - record_full_ops.to_disconnect = record_full_disconnect; - record_full_ops.to_detach = record_full_detach; - record_full_ops.to_mourn_inferior = record_full_mourn_inferior; - record_full_ops.to_kill = record_full_kill; + record_full_ops.to_disconnect = record_disconnect; + record_full_ops.to_detach = record_detach; + record_full_ops.to_mourn_inferior = record_mourn_inferior; + record_full_ops.to_kill = record_kill; record_full_ops.to_create_inferior = find_default_create_inferior; record_full_ops.to_store_registers = record_full_store_registers; record_full_ops.to_xfer_partial = record_full_xfer_partial; @@ -2133,7 +1928,6 @@ init_record_full_ops (void) /* Add bookmark target methods. */ record_full_ops.to_get_bookmark = record_full_get_bookmark; record_full_ops.to_goto_bookmark = record_full_goto_bookmark; - record_full_ops.to_async = record_full_async; record_full_ops.to_can_async_p = record_full_can_async_p; record_full_ops.to_is_async_p = record_full_is_async_p; record_full_ops.to_execution_direction = record_full_execution_direction; @@ -2203,7 +1997,8 @@ record_full_core_fetch_registers (struct target_ops *ops, /* "to_prepare_to_store" method for prec over corefile. */ static void -record_full_core_prepare_to_store (struct regcache *regcache) +record_full_core_prepare_to_store (struct target_ops *self, + struct regcache *regcache) { } @@ -2223,12 +2018,12 @@ record_full_core_store_registers (struct target_ops *ops, /* "to_xfer_partial" method for prec over corefile. */ -static LONGEST +static enum target_xfer_status record_full_core_xfer_partial (struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, - LONGEST len) + ULONGEST len, ULONGEST *xfered_len) { if (object == TARGET_OBJECT_MEMORY) { @@ -2258,7 +2053,9 @@ record_full_core_xfer_partial (struct target_ops *ops, { if (readbuf) memset (readbuf, 0, len); - return len; + + *xfered_len = len; + return TARGET_XFER_OK; } /* Get record_full_core_buf_entry. */ for (entry = record_full_core_buf_list; entry; @@ -2274,12 +2071,13 @@ record_full_core_xfer_partial (struct target_ops *ops, xmalloc (sizeof (struct record_full_core_buf_entry)); entry->p = p; - if (!bfd_malloc_and_get_section (p->bfd, - p->the_bfd_section, - &entry->buf)) + if (!bfd_malloc_and_get_section + (p->the_bfd_section->owner, + p->the_bfd_section, + &entry->buf)) { xfree (entry); - return 0; + return TARGET_XFER_EOF; } entry->prev = record_full_core_buf_list; record_full_core_buf_list = entry; @@ -2291,34 +2089,37 @@ record_full_core_xfer_partial (struct target_ops *ops, else { if (!entry) - return record_full_beneath_to_xfer_partial - (record_full_beneath_to_xfer_partial_ops, - object, annex, readbuf, writebuf, - offset, len); + return ops->beneath->to_xfer_partial (ops->beneath, + object, annex, + readbuf, writebuf, + offset, len, + xfered_len); memcpy (readbuf, entry->buf + sec_offset, (size_t) len); } - return len; + *xfered_len = len; + return TARGET_XFER_OK; } } - return -1; + return TARGET_XFER_E_IO; } else error (_("You can't do that without a process to debug.")); } - return record_full_beneath_to_xfer_partial - (record_full_beneath_to_xfer_partial_ops, object, annex, - readbuf, writebuf, offset, len); + return ops->beneath->to_xfer_partial (ops->beneath, object, annex, + readbuf, writebuf, offset, len, + xfered_len); } /* "to_insert_breakpoint" method for prec over corefile. */ static int -record_full_core_insert_breakpoint (struct gdbarch *gdbarch, +record_full_core_insert_breakpoint (struct target_ops *ops, + struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { return 0; @@ -2327,7 +2128,8 @@ record_full_core_insert_breakpoint (struct gdbarch *gdbarch, /* "to_remove_breakpoint" method for prec over corefile. */ static int -record_full_core_remove_breakpoint (struct gdbarch *gdbarch, +record_full_core_remove_breakpoint (struct target_ops *ops, + struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { return 0; @@ -2372,7 +2174,6 @@ init_record_full_core_ops (void) /* Add bookmark target methods. */ record_full_core_ops.to_get_bookmark = record_full_get_bookmark; record_full_core_ops.to_goto_bookmark = record_full_goto_bookmark; - record_full_core_ops.to_async = record_full_async; record_full_core_ops.to_can_async_p = record_full_can_async_p; record_full_core_ops.to_is_async_p = record_full_is_async_p; record_full_core_ops.to_execution_direction @@ -2636,7 +2437,7 @@ record_full_restore (void) if (record_full_insn_num > record_full_insn_max_num) { record_full_insn_max_num = record_full_insn_num; - warning (_("Auto increase record/replay buffer limit to %d."), + warning (_("Auto increase record/replay buffer limit to %u."), record_full_insn_max_num); } @@ -2644,7 +2445,7 @@ record_full_restore (void) printf_filtered (_("Restored records from core file %s.\n"), bfd_get_filename (core_bfd)); - print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } /* bfdcore_write -- write bytes into a core file section. */ @@ -2687,7 +2488,7 @@ record_full_save_cleanups (void *data) format, with an extra section for our data. */ static void -record_full_save (char *recfilename) +record_full_save (struct target_ops *self, const char *recfilename) { struct record_full_entry *cur_record_full_list; uint32_t magic; @@ -2930,8 +2731,7 @@ static void set_record_full_insn_max_num (char *args, int from_tty, struct cmd_list_element *c) { - if (record_full_insn_num > record_full_insn_max_num - && record_full_insn_max_num) + if (record_full_insn_num > record_full_insn_max_num) { /* Count down record_full_insn_num while releasing records from list. */ while (record_full_insn_num > record_full_insn_max_num) @@ -3029,7 +2829,8 @@ delete the oldest recorded instruction to make room for each new one."), _("Set record/replay buffer limit."), _("Show record/replay buffer limit."), _("\ Set the maximum number of instructions to be stored in the\n\ -record/replay buffer. Zero means unlimited. Default is 200000."), +record/replay buffer. A value of either \"unlimited\" or zero means no\n\ +limit. Default is 200000."), set_record_full_insn_max_num, NULL, &set_record_full_cmdlist, &show_record_full_cmdlist);