X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbfd-target.c;h=b75abd7fb0e62952865862503c48f528b95a1c08;hb=030a2e78acf66c5c12e073ec3887a167da7a7195;hp=ffaa4ffe440c34f0d417af32d0255cca9c8f51ac;hpb=07b82ea5f9396811815e8085a4cce5ca03f50fb5;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bfd-target.c b/gdb/bfd-target.c index ffaa4ffe44..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, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -21,63 +21,97 @@ #include "target.h" #include "bfd-target.h" #include "exec.h" +#include "gdb_bfd.h" -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) +/* 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. */ + 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 m_table; +}; + +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_section_table *table = ops->to_data; - return section_table_xfer_memory_partial (readbuf, writebuf, offset, len, - table->sections, - table->sections_end, + return section_table_xfer_memory_partial (readbuf, writebuf, + 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 () +{ + return &m_table; +} + +target_bfd::target_bfd (struct bfd *abfd) + : m_bfd (gdb_bfd_ref_ptr::new_reference (abfd)) +{ + m_table.sections = NULL; + m_table.sections_end = NULL; + build_section_table (abfd, &m_table.sections, &m_table.sections_end); +} + +target_bfd::~target_bfd () { - return ops->to_data; + xfree (m_table.sections); } -static void -target_bfd_xclose (struct target_ops *t, int quitting) +target_ops * +target_bfd_reopen (struct bfd *abfd) { - struct target_section_table *table = t->to_data; - if (table->sections) - bfd_close (table->sections->bfd); - xfree (table->sections); - xfree (table); - xfree (t); + return new target_bfd (abfd); } -struct target_ops * -target_bfd_reopen (struct bfd *bfd) +void +target_bfd::close () { - struct target_ops *t; - struct target_section_table *table; - - table = XZALLOC (struct target_section_table); - build_section_table (bfd, &table->sections, &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 = table; - - return t; + delete this; }