mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-24 12:35:55 +08:00
66b4deae03
Given that a target's stratum is a property of the type, and not of an instance of the type, get rid of to_stratum data field and replace it with a virtual method. I.e., when we have e.g., 10 target remote instances active, there's no need for each of the instances to have their own to_stratum copy. gdb/ChangeLog: 2018-11-30 Pedro Alves <palves@redhat.com> * aix-thread.c (aix_thread_target) <aix_thread_target>: Delete. <stratum>: New override. * bfd-target.c (aix_thread_target) <aix_thread_target>: Delete. <stratum>: New override. * bsd-uthread.c (bsd_uthread_target) <bsd_uthread_target>: Delete. <stratum>: New override. * exec.c (exec_target) <exec_target>: Delete. <stratum>: New override. * gdbarch-selftests.c (register_to_value_test): Adjust to use the stratum method instead of the to_stratum field. * linux-thread-db.c (thread_db_target) <thread_db_target>: Delete. <stratum>: New override. (thread_db_target::thread_db_target): Delete. * make-target-delegates (print_class): Don't print a ctor declaration. Print a stratum method override declaration. * process-stratum-target.h (process_stratum_target) <process_stratum_target>: Delete. <stratum>: New override. * ravenscar-thread.c (ravenscar_thread_target) <ravenscar_thread_target>: Delete. <stratum>: New override. * record-btrace.c (record_btrace_target) <record_btrace_target>: Delete. <stratum>: New override. * record-full.c (record_full_base_target) <record_full_base_target>: Delete. <stratum>: New override. * record.c (record_disconnect, record_detach) (record_mourn_inferior, record_kill): Adjust to use the stratum method instead of the to_stratum field. * regcache.c (cooked_read_test, cooked_write_test): Likewise. * sol-thread.c (sol_thread_target) <sol_thread_target>: Delete. <stratum>: New override. * spu-multiarch.c (spu_multiarch_target) <spu_multiarch_target>: Delete. <stratum>: New override. * target-delegates.c: Regenerate. * target.c (target_stack::push, target_stack::unpush) (pop_all_targets_above, pop_all_targets_at_and_above) (info_target_command, target_require_runnable) (target_stack::find_beneath): Adjust to use the stratum method instead of the to_stratum field. (dummy_target::dummy_target): Delete. (dummy_target::stratum): New. (debug_target::debug_target): Delete. (debug_target::stratum): New. (maintenance_print_target_stack): Adjust to use the stratum method instead of the to_stratum field. * target.h (struct target_ops) <stratum>: New method. <to_stratum>: Delete. <is_pushed>: Adjust to use the stratum method instead of the to_stratum field.
118 lines
2.8 KiB
C
118 lines
2.8 KiB
C
/* Very simple "bfd" target, for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "target.h"
|
|
#include "bfd-target.h"
|
|
#include "exec.h"
|
|
#include "gdb_bfd.h"
|
|
|
|
/* 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:
|
|
{
|
|
return section_table_xfer_memory_partial (readbuf, writebuf,
|
|
offset, len, xfered_len,
|
|
m_table.sections,
|
|
m_table.sections_end,
|
|
NULL);
|
|
}
|
|
default:
|
|
return TARGET_XFER_E_IO;
|
|
}
|
|
}
|
|
|
|
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 ()
|
|
{
|
|
xfree (m_table.sections);
|
|
}
|
|
|
|
target_ops *
|
|
target_bfd_reopen (struct bfd *abfd)
|
|
{
|
|
return new target_bfd (abfd);
|
|
}
|
|
|
|
void
|
|
target_bfd::close ()
|
|
{
|
|
delete this;
|
|
}
|