X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Frecord-full.c;h=4d8dd61bcaaa9d18108ec840a60df82f742f7335;hb=a6535de1903d9caad8c10c1d81c51a29612456a6;hp=4249c0440adcd71bfe223556e11e0d8ae05d640f;hpb=eb4c3f4aaae2ee1b27c210e951260a7e699133b4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/record-full.c b/gdb/record-full.c index 4249c0440a..4d8dd61bca 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-2017 Free Software Foundation, Inc. + Copyright (C) 2013-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -33,7 +33,7 @@ #include "event-loop.h" #include "inf-loop.h" #include "gdb_bfd.h" -#include "observer.h" +#include "observable.h" #include "infrun.h" #include "common/gdb_unlinker.h" #include "common/byte-vector.h" @@ -168,7 +168,7 @@ struct record_full_core_buf_entry }; /* Record buf with core target. */ -static gdb_byte *record_full_core_regbuf = NULL; +static detached_regcache *record_full_core_regbuf = NULL; static struct target_section *record_full_core_start; static struct target_section *record_full_core_end; static struct record_full_core_buf_entry *record_full_core_buf_list = NULL; @@ -702,8 +702,7 @@ record_full_exec_insn (struct regcache *regcache, /* Nothing to do if the entry is flagged not_accessible. */ if (!entry->u.mem.mem_entry_not_accessible) { - gdb_byte *mem = (gdb_byte *) xmalloc (entry->u.mem.len); - struct cleanup *cleanup = make_cleanup (xfree, mem); + gdb::byte_vector mem (entry->u.mem.len); if (record_debug > 1) fprintf_unfiltered (gdb_stdlog, @@ -714,7 +713,8 @@ record_full_exec_insn (struct regcache *regcache, entry->u.mem.len); if (record_read_memory (gdbarch, - entry->u.mem.addr, mem, entry->u.mem.len)) + entry->u.mem.addr, mem.data (), + entry->u.mem.len)) entry->u.mem.mem_entry_not_accessible = 1; else { @@ -731,7 +731,7 @@ record_full_exec_insn (struct regcache *regcache, } else { - memcpy (record_full_get_loc (entry), mem, + memcpy (record_full_get_loc (entry), mem.data (), entry->u.mem.len); /* We've changed memory --- check if a hardware @@ -748,8 +748,6 @@ record_full_exec_insn (struct regcache *regcache, record_full_stop_reason = TARGET_STOPPED_BY_WATCHPOINT; } } - - do_cleanups (cleanup); } } break; @@ -780,16 +778,16 @@ record_full_core_open_1 (const char *name, int from_tty) /* Get record_full_core_regbuf. */ target_fetch_registers (regcache, -1); - record_full_core_regbuf = (gdb_byte *) xmalloc (MAX_REGISTER_SIZE * regnum); + record_full_core_regbuf = new detached_regcache (regcache->arch (), false); + for (i = 0; i < regnum; i ++) - regcache_raw_collect (regcache, i, - record_full_core_regbuf + MAX_REGISTER_SIZE * i); + record_full_core_regbuf->raw_supply (i, *regcache); /* Get record_full_core_start and record_full_core_end. */ if (build_section_table (core_bfd, &record_full_core_start, &record_full_core_end)) { - xfree (record_full_core_regbuf); + delete record_full_core_regbuf; record_full_core_regbuf = NULL; error (_("\"%s\": Can't find sections: %s"), bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ())); @@ -828,8 +826,6 @@ static void record_full_init_record_breakpoints (void); static void record_full_open (const char *name, int from_tty) { - struct target_ops *t; - if (record_debug) fprintf_unfiltered (gdb_stdlog, "Process record: record_full_open\n"); @@ -853,7 +849,7 @@ record_full_open (const char *name, int from_tty) record_full_init_record_breakpoints (); - observer_notify_record_changed (current_inferior (), 1, "full", NULL); + gdb::observers::record_changed.notify (current_inferior (), 1, "full", NULL); } /* "to_close" target method. Close the process record target. */ @@ -871,7 +867,7 @@ record_full_close (struct target_ops *self) /* Release record_full_core_regbuf. */ if (record_full_core_regbuf) { - xfree (record_full_core_regbuf); + delete record_full_core_regbuf; record_full_core_regbuf = NULL; } @@ -1752,28 +1748,22 @@ record_full_goto_bookmark (struct target_ops *self, const gdb_byte *raw_bookmark, int from_tty) { const char *bookmark = (const char *) raw_bookmark; - struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); if (record_debug) fprintf_unfiltered (gdb_stdlog, "record_full_goto_bookmark receives %s\n", bookmark); + std::string name_holder; if (bookmark[0] == '\'' || bookmark[0] == '\"') { - char *copy; - if (bookmark[strlen (bookmark) - 1] != bookmark[0]) error (_("Unbalanced quotes: %s"), bookmark); - - copy = savestring (bookmark + 1, strlen (bookmark) - 2); - make_cleanup (xfree, copy); - bookmark = copy; + name_holder = std::string (bookmark + 1, strlen (bookmark) - 2); + bookmark = name_holder.c_str (); } record_goto (bookmark); - - do_cleanups (cleanup); } static enum exec_direction_kind @@ -2032,12 +2022,10 @@ record_full_core_fetch_registers (struct target_ops *ops, int i; for (i = 0; i < num; i ++) - regcache_raw_supply (regcache, i, - record_full_core_regbuf + MAX_REGISTER_SIZE * i); + regcache->raw_supply (i, *record_full_core_regbuf); } else - regcache_raw_supply (regcache, regno, - record_full_core_regbuf + MAX_REGISTER_SIZE * regno); + regcache->raw_supply (regno, *record_full_core_regbuf); } /* "to_prepare_to_store" method for prec over corefile. */ @@ -2056,8 +2044,7 @@ record_full_core_store_registers (struct target_ops *ops, int regno) { if (record_full_gdb_operation_disable) - regcache_raw_collect (regcache, regno, - record_full_core_regbuf + MAX_REGISTER_SIZE * regno); + record_full_core_regbuf->raw_supply (regno, *regcache); else error (_("You can't do that without a process to debug.")); } @@ -2756,7 +2743,7 @@ record_full_goto_insn (struct record_full_entry *entry, static void cmd_record_full_start (const char *args, int from_tty) { - execute_command ((char *) "target record-full", from_tty); + execute_command ("target record-full", from_tty); } static void