gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / bfd-target.c
CommitLineData
bba2d28d
AC
1/* Very simple "bfd" target, for GDB, the GNU debugger.
2
b811d2c2 3 Copyright (C) 2003-2020 Free Software Foundation, Inc.
bba2d28d
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
bba2d28d
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
bba2d28d
AC
19
20#include "defs.h"
4de283e4 21#include "target.h"
bba2d28d 22#include "bfd-target.h"
348f8c02 23#include "exec.h"
cbb099e8 24#include "gdb_bfd.h"
bba2d28d 25
f6ac5f3d 26/* A target that wraps a BFD. */
d9f719f1
PA
27
28static const target_info target_bfd_target_info = {
29 "bfd",
30 N_("BFD backed target"),
31 N_("You should never see this")
32};
33
f6ac5f3d 34class target_bfd : public target_ops
891e7584 35{
f6ac5f3d
PA
36public:
37 explicit target_bfd (struct bfd *bfd);
38 ~target_bfd () override;
39
d9f719f1
PA
40 const target_info &info () const override
41 { return target_bfd_target_info; }
f6ac5f3d 42
66b4deae
PA
43 strata stratum () const override { return file_stratum; }
44
f6ac5f3d
PA
45 void close () override;
46
47 target_xfer_status
48 xfer_partial (target_object object,
49 const char *annex, gdb_byte *readbuf,
50 const gdb_byte *writebuf,
51 ULONGEST offset, ULONGEST len,
52 ULONGEST *xfered_len) override;
53
54 target_section_table *get_section_table () override;
55
56private:
891e7584 57 /* The BFD we're wrapping. */
ade72a34 58 gdb_bfd_ref_ptr m_bfd;
891e7584
PA
59
60 /* The section table build from the ALLOC sections in BFD. Note
61 that we can't rely on extracting the BFD from a random section in
62 the table, since the table can be legitimately empty. */
f6ac5f3d 63 struct target_section_table m_table;
891e7584
PA
64};
65
f6ac5f3d
PA
66target_xfer_status
67target_bfd::xfer_partial (target_object object,
68 const char *annex, gdb_byte *readbuf,
69 const gdb_byte *writebuf,
70 ULONGEST offset, ULONGEST len,
71 ULONGEST *xfered_len)
bba2d28d
AC
72{
73 switch (object)
74 {
75 case TARGET_OBJECT_MEMORY:
07b82ea5 76 {
891e7584 77 return section_table_xfer_memory_partial (readbuf, writebuf,
9b409511 78 offset, len, xfered_len,
f6ac5f3d
PA
79 m_table.sections,
80 m_table.sections_end,
07b82ea5
PA
81 NULL);
82 }
bba2d28d 83 default:
2ed4b548 84 return TARGET_XFER_E_IO;
bba2d28d
AC
85 }
86}
87
f6ac5f3d
PA
88target_section_table *
89target_bfd::get_section_table ()
07b82ea5 90{
f6ac5f3d 91 return &m_table;
07b82ea5
PA
92}
93
f6ac5f3d 94target_bfd::target_bfd (struct bfd *abfd)
ade72a34 95 : m_bfd (gdb_bfd_ref_ptr::new_reference (abfd))
bba2d28d 96{
f6ac5f3d
PA
97 m_table.sections = NULL;
98 m_table.sections_end = NULL;
99 build_section_table (abfd, &m_table.sections, &m_table.sections_end);
100}
891e7584 101
f6ac5f3d
PA
102target_bfd::~target_bfd ()
103{
f6ac5f3d 104 xfree (m_table.sections);
bba2d28d
AC
105}
106
f6ac5f3d 107target_ops *
ad13d8df 108target_bfd_reopen (struct bfd *abfd)
bba2d28d 109{
f6ac5f3d
PA
110 return new target_bfd (abfd);
111}
07b82ea5 112
f6ac5f3d
PA
113void
114target_bfd::close ()
115{
116 delete this;
bba2d28d 117}
This page took 1.006836 seconds and 4 git commands to generate.