#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
= (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;
/* 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
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;
/* Close the trace file and generally clean up. */
-static void
-tfile_close (struct target_ops *self)
+void
+tfile_target::close ()
{
int pid;
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;
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. */
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;
/* 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;
}
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)
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;
/* 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;
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 ());
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);
}