X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbfd-target.c;h=b75abd7fb0e62952865862503c48f528b95a1c08;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=a7dee242008e7ab4b82aab24e5a8321e77ea4d28;hpb=460014f572f44fe3e8deb146cb92fd312c4c3339;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bfd-target.c b/gdb/bfd-target.c index a7dee24200..b75abd7fb0 100644 --- a/gdb/bfd-target.c +++ b/gdb/bfd-target.c @@ -1,6 +1,6 @@ /* Very simple "bfd" target, for GDB, the GNU debugger. - Copyright (C) 2003-2013 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -23,79 +23,95 @@ #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. */ + +static const target_info target_bfd_target_info = { + "bfd", + N_("BFD backed target"), + N_("You should never see this") +}; + +class target_bfd : public target_ops { +public: + explicit target_bfd (struct bfd *bfd); + ~target_bfd () override; + + const target_info &info () const override + { return target_bfd_target_info; } + + strata stratum () const override { return file_stratum; } + + 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; + gdb_bfd_ref_ptr 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 LONGEST -target_bfd_xfer_partial (struct target_ops *ops, - enum target_object object, - const char *annex, gdb_byte *readbuf, - const gdb_byte *writebuf, - ULONGEST offset, LONGEST 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 = ops->to_data; return section_table_xfer_memory_partial (readbuf, writebuf, - offset, len, - data->table.sections, - data->table.sections_end, + offset, len, xfered_len, + m_table.sections, + m_table.sections_end, NULL); } default: - return -1; + return TARGET_XFER_E_IO; } } -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 = ops->to_data; - return &data->table; + return &m_table; } -static void -target_bfd_xclose (struct target_ops *t) +target_bfd::target_bfd (struct bfd *abfd) + : m_bfd (gdb_bfd_ref_ptr::new_reference (abfd)) { - struct target_bfd_data *data = t->to_data; + 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 () +{ + xfree (m_table.sections); } -struct target_ops * +target_ops * target_bfd_reopen (struct bfd *abfd) { - struct target_ops *t; - struct target_bfd_data *data; - - data = XZALLOC (struct target_bfd_data); - data->bfd = abfd; - gdb_bfd_ref (abfd); - build_section_table (abfd, &data->table.sections, &data->table.sections_end); - - t = XZALLOC (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_xclose = target_bfd_xclose; - t->to_data = data; - - return t; + return new target_bfd (abfd); +} + +void +target_bfd::close () +{ + delete this; }