aboutsummaryrefslogtreecommitdiff
path: root/gdb/tracefile-tfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/tracefile-tfile.c')
-rw-r--r--gdb/tracefile-tfile.c120
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 (&current_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);
}