diff options
Diffstat (limited to 'gdb/bfd-target.c')
-rw-r--r-- | gdb/bfd-target.c | 104 |
1 files changed, 59 insertions, 45 deletions
diff --git a/gdb/bfd-target.c b/gdb/bfd-target.c index 99b49aa..7ac8bc3 100644 --- a/gdb/bfd-target.c +++ b/gdb/bfd-target.c @@ -23,36 +23,58 @@ #include "exec.h" #include "gdb_bfd.h" -/* The object that is stored in the target_ops->to_data field has this - type. */ -struct target_bfd_data +/* A target that wraps a BFD. */ +class target_bfd : public target_ops { +public: + explicit target_bfd (struct bfd *bfd); + ~target_bfd () override; + + const char *shortname () override + { return "bfd"; } + + const char *longname () override + { return _("BFD backed target"); } + + const char *doc () override + { return _("You should never see this"); } + + void close () override; + + target_xfer_status + xfer_partial (target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + + target_section_table *get_section_table () override; + +private: /* The BFD we're wrapping. */ - struct bfd *bfd; + struct bfd *m_bfd; /* The section table build from the ALLOC sections in BFD. Note that we can't rely on extracting the BFD from a random section in the table, since the table can be legitimately empty. */ - struct target_section_table table; + struct target_section_table m_table; }; -static enum target_xfer_status -target_bfd_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) +target_xfer_status +target_bfd::xfer_partial (target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) { switch (object) { case TARGET_OBJECT_MEMORY: { - struct target_bfd_data *data = (struct target_bfd_data *) ops->to_data; return section_table_xfer_memory_partial (readbuf, writebuf, offset, len, xfered_len, - data->table.sections, - data->table.sections_end, + m_table.sections, + m_table.sections_end, NULL); } default: @@ -60,44 +82,36 @@ target_bfd_xfer_partial (struct target_ops *ops, } } -static struct target_section_table * -target_bfd_get_section_table (struct target_ops *ops) +target_section_table * +target_bfd::get_section_table () { - struct target_bfd_data *data = (struct target_bfd_data *) ops->to_data; - return &data->table; + return &m_table; } -static void -target_bfd_close (struct target_ops *t) +target_bfd::target_bfd (struct bfd *abfd) { - struct target_bfd_data *data = (struct target_bfd_data *) t->to_data; + this->to_stratum = file_stratum; + m_bfd = abfd; + gdb_bfd_ref (abfd); + m_table.sections = NULL; + m_table.sections_end = NULL; + build_section_table (abfd, &m_table.sections, &m_table.sections_end); +} - gdb_bfd_unref (data->bfd); - xfree (data->table.sections); - xfree (data); - xfree (t); +target_bfd::~target_bfd () +{ + gdb_bfd_unref (m_bfd); + xfree (m_table.sections); } -struct target_ops * +target_ops * target_bfd_reopen (struct bfd *abfd) { - struct target_ops *t; - struct target_bfd_data *data; + return new target_bfd (abfd); +} - data = XCNEW (struct target_bfd_data); - data->bfd = abfd; - gdb_bfd_ref (abfd); - build_section_table (abfd, &data->table.sections, &data->table.sections_end); - - t = XCNEW (struct target_ops); - t->to_shortname = "bfd"; - t->to_longname = _("BFD backed target"); - t->to_doc = _("You should never see this"); - t->to_get_section_table = target_bfd_get_section_table; - t->to_xfer_partial = target_bfd_xfer_partial; - t->to_close = target_bfd_close; - t->to_data = data; - t->to_magic = OPS_MAGIC; - - return t; +void +target_bfd::close () +{ + delete this; } |