diff options
Diffstat (limited to 'gdb/tracefile-tfile.c')
-rw-r--r-- | gdb/tracefile-tfile.c | 120 |
1 files changed, 64 insertions, 56 deletions
diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index d7e9347..af8e3bd 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -38,6 +38,42 @@ #define O_LARGEFILE 0 #endif +/* The tfile target. */ + +class tfile_target final : public tracefile_target +{ + public: + const char *shortname () override + { return "tfile"; } + + const char *longname () override + { return _("Local trace dump file"); } + + const char *doc () override + { + return _("\ +Use a trace file as a target. Specify the filename of the trace file."); + } + + void open (const char *, int) override; + void close () override; + void fetch_registers (struct regcache *, int) override; + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + void files_info () override; + int trace_find (enum trace_find_type type, int num, + CORE_ADDR addr1, CORE_ADDR addr2, int *tpp) override; + int get_trace_state_variable_value (int tsv, LONGEST *val) override; + traceframe_info_up traceframe_info () override; + + void get_tracepoint_status (struct breakpoint *tp, + struct uploaded_tp *utp) override; +}; + /* TFILE trace writer. */ struct tfile_trace_file_writer @@ -275,7 +311,7 @@ tfile_write_tdesc (struct trace_file_writer *self) = (struct tfile_trace_file_writer *) self; gdb::optional<std::string> tdesc - = target_fetch_description_xml (¤t_target); + = target_fetch_description_xml (target_stack); if (!tdesc) return; @@ -378,9 +414,7 @@ tfile_trace_file_writer_new (void) /* target tfile command */ -static struct target_ops tfile_ops; - -/* Fill in tfile_ops with its defined operations and properties. */ +static tfile_target tfile_ops; #define TRACE_HEADER_SIZE 8 @@ -417,8 +451,8 @@ tfile_read (gdb_byte *readbuf, int size) error (_("Premature end of file while reading trace file")); } -static void -tfile_open (const char *arg, int from_tty) +void +tfile_target::open (const char *arg, int from_tty) { int flags; int scratch_chan; @@ -580,8 +614,8 @@ tfile_interp_line (char *line, struct uploaded_tp **utpp, /* Close the trace file and generally clean up. */ -static void -tfile_close (struct target_ops *self) +void +tfile_target::close () { int pid; @@ -592,7 +626,7 @@ tfile_close (struct target_ops *self) inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */ exit_inferior_silent (pid); - close (trace_fd); + ::close (trace_fd); trace_fd = -1; xfree (trace_filename); trace_filename = NULL; @@ -601,15 +635,14 @@ tfile_close (struct target_ops *self) trace_reset_local_state (); } -static void -tfile_files_info (struct target_ops *t) +void +tfile_target::files_info () { printf_filtered ("\t`%s'\n", trace_filename); } -static void -tfile_get_tracepoint_status (struct target_ops *self, - struct breakpoint *tp, struct uploaded_tp *utp) +void +tfile_target::get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp) { /* Other bits of trace status were collected as part of opening the trace files, so nothing to do here. */ @@ -653,9 +686,9 @@ tfile_get_traceframe_address (off_t tframe_offset) both the traceframe and tracepoint number, otherwise -1 for each. */ -static int -tfile_trace_find (struct target_ops *self, enum trace_find_type type, int num, - CORE_ADDR addr1, CORE_ADDR addr2, int *tpp) +int +tfile_target::trace_find (enum trace_find_type type, int num, + CORE_ADDR addr1, CORE_ADDR addr2, int *tpp) { short tpnum; int tfnum = 0, found = 0; @@ -836,9 +869,8 @@ traceframe_find_block_type (char type_wanted, int pos) /* Look for a block of saved registers in the traceframe, and get the requested register from it. */ -static void -tfile_fetch_registers (struct target_ops *ops, - struct regcache *regcache, int regno) +void +tfile_target::fetch_registers (struct regcache *regcache, int regno) { struct gdbarch *gdbarch = regcache->arch (); int offset, regn, regsize, dummy; @@ -883,7 +915,7 @@ tfile_fetch_registers (struct target_ops *ops, } static enum target_xfer_status -tfile_xfer_partial_features (struct target_ops *ops, const char *annex, +tfile_xfer_partial_features (const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) @@ -909,15 +941,15 @@ tfile_xfer_partial_features (struct target_ops *ops, const char *annex, return TARGET_XFER_OK; } -static enum target_xfer_status -tfile_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, gdb_byte *readbuf, - const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, - ULONGEST *xfered_len) +enum target_xfer_status +tfile_target::xfer_partial (enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) { /* We're only doing regular memory and tdesc for now. */ if (object == TARGET_OBJECT_AVAILABLE_FEATURES) - return tfile_xfer_partial_features (ops, annex, readbuf, writebuf, + return tfile_xfer_partial_features (annex, readbuf, writebuf, offset, len, xfered_len); if (object != TARGET_OBJECT_MEMORY) return TARGET_XFER_E_IO; @@ -1001,9 +1033,8 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object, /* Iterate through the blocks of a trace frame, looking for a 'V' block with a matching tsv number. */ -static int -tfile_get_trace_state_variable_value (struct target_ops *self, - int tsvnum, LONGEST *val) +int +tfile_target::get_trace_state_variable_value (int tsvnum, LONGEST *val) { int pos; int found = 0; @@ -1085,10 +1116,10 @@ build_traceframe_info (char blocktype, void *data) return 0; } -static traceframe_info_up -tfile_traceframe_info (struct target_ops *self) +traceframe_info_up +tfile_target::traceframe_info () { - traceframe_info_up info (new traceframe_info); + traceframe_info_up info (new struct traceframe_info); traceframe_walk_blocks (build_traceframe_info, 0, info.get ()); @@ -1105,31 +1136,8 @@ tfile_append_tdesc_line (const char *line) buffer_grow_str (&trace_tdesc, "\n"); } -static void -init_tfile_ops (void) -{ - init_tracefile_ops (&tfile_ops); - - tfile_ops.to_shortname = "tfile"; - tfile_ops.to_longname = "Local trace dump file"; - tfile_ops.to_doc - = "Use a trace file as a target. Specify the filename of the trace file."; - tfile_ops.to_open = tfile_open; - tfile_ops.to_close = tfile_close; - tfile_ops.to_fetch_registers = tfile_fetch_registers; - tfile_ops.to_xfer_partial = tfile_xfer_partial; - tfile_ops.to_files_info = tfile_files_info; - tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status; - tfile_ops.to_trace_find = tfile_trace_find; - tfile_ops.to_get_trace_state_variable_value - = tfile_get_trace_state_variable_value; - tfile_ops.to_traceframe_info = tfile_traceframe_info; -} - void _initialize_tracefile_tfile (void) { - init_tfile_ops (); - add_target_with_completer (&tfile_ops, filename_completer); } |