+2020-10-12 Tom Tromey <tom@tromey.com>
+
+ * target.h (struct target_ops) <get_section_table>: Update.
+ (target_get_section_table): Update.
+ * target.c (target_get_section_table, target_section_by_addr)
+ (memory_xfer_partial_1): Update.
+ * target-section.h (target_section_table): Now an alias.
+ * target-delegates.c: Rebuild.
+ * target-debug.h (target_debug_print_target_section_table_p):
+ Rename from target_debug_print_struct_target_section_table_p.
+ * symfile.c (build_section_addr_info_from_section_table): Update.
+ * solib.c (solib_map_sections, solib_contains_address_p): Update.
+ * solib-svr4.c (scan_dyntag): Update.
+ * solib-dsbt.c (scan_dyntag): Update.
+ * remote.c (remote_target::remote_xfer_live_readonly_partial):
+ Update.
+ * record-full.c (record_full_core_target::xfer_partial): Update.
+ * progspace.h (struct program_space) <target_sections>: Update.
+ * exec.h (print_section_info): Update.
+ * exec.c (exec_target::close, build_section_table)
+ (add_target_sections, add_target_sections_of_objfile)
+ (remove_target_sections, exec_on_vfork)
+ (section_table_available_memory)
+ (section_table_xfer_memory_partial)
+ (exec_target::get_section_table, exec_target::xfer_partial)
+ (print_section_info, set_section_command)
+ (exec_set_section_address, exec_target::has_memory): Update.
+ * corelow.c (core_target::build_file_mappings)
+ (core_target::xfer_partial, core_target::info_proc_mappings)
+ (core_target::info_proc_mappings): Update.
+ * bfd-target.c (class target_bfd): Update
+
2020-10-12 Tom Tromey <tom@tromey.com>
* progspace.c (program_space::~program_space): Don't call
/* 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_section_table m_table;
};
target_xfer_status
bfd_set_section_alignment (sec, 2);
/* Set target_section fields. */
- m_core_file_mappings.sections.emplace_back ();
- target_section &ts = m_core_file_mappings.sections.back ();
+ m_core_file_mappings.emplace_back ();
+ target_section &ts = m_core_file_mappings.back ();
ts.addr = start;
ts.endaddr = end;
ts.owner = nullptr;
or the like) as this should provide a more accurate
result. If not, check the stratum beneath us, which should
be the file stratum. */
- if (!m_core_file_mappings.sections.empty ())
+ if (!m_core_file_mappings.empty ())
xfer_status = xfer_memory_via_mappings (readbuf, writebuf, offset,
len, xfered_len);
else
void
core_target::info_proc_mappings (struct gdbarch *gdbarch)
{
- if (!m_core_file_mappings.sections.empty ())
+ if (!m_core_file_mappings.empty ())
{
printf_filtered (_("Mapped address spaces:\n\n"));
if (gdbarch_addr_bit (gdbarch) == 32)
}
}
- for (const target_section &tsp : m_core_file_mappings.sections)
+ for (const target_section &tsp : m_core_file_mappings)
{
ULONGEST start = tsp.addr;
ULONGEST end = tsp.endaddr;
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len,
ULONGEST *xfered_len) override;
- struct target_section_table *get_section_table () override;
+ target_section_table *get_section_table () override;
void files_info () override;
bool has_memory () override;
for (struct program_space *ss : program_spaces)
{
set_current_program_space (ss);
- current_target_sections->sections.clear ();
+ current_target_sections->clear ();
exec_close ();
}
}
if (!(aflag & SEC_ALLOC))
continue;
- table.sections.emplace_back ();
- target_section § = table.sections.back ();
+ table.emplace_back ();
+ target_section § = table.back ();
sect.owner = NULL;
sect.the_bfd_section = asect;
sect.addr = bfd_section_vma (asect);
add_target_sections (void *owner,
const target_section_table §ions)
{
- struct target_section_table *table = current_target_sections;
+ target_section_table *table = current_target_sections;
- if (!sections.sections.empty ())
+ if (!sections.empty ())
{
- for (const target_section &s : sections.sections)
+ for (const target_section &s : sections)
{
- table->sections.push_back (s);
- table->sections.back ().owner = owner;
+ table->push_back (s);
+ table->back ().owner = owner;
}
scoped_restore_current_pspace_and_thread restore_pspace_thread;
void
add_target_sections_of_objfile (struct objfile *objfile)
{
- struct target_section_table *table = current_target_sections;
+ target_section_table *table = current_target_sections;
struct obj_section *osect;
gdb_assert (objfile != nullptr);
if (bfd_section_size (osect->the_bfd_section) == 0)
continue;
- table->sections.emplace_back ();
- target_section &ts = table->sections.back ();
+ table->emplace_back ();
+ target_section &ts = table->back ();
ts.addr = obj_section_addr (osect);
ts.endaddr = obj_section_endaddr (osect);
ts.the_bfd_section = osect->the_bfd_section;
void
remove_target_sections (void *owner)
{
- struct target_section_table *table = current_target_sections;
+ target_section_table *table = current_target_sections;
gdb_assert (owner != NULL);
- auto it = std::remove_if (table->sections.begin (),
- table->sections.end (),
+ auto it = std::remove_if (table->begin (),
+ table->end (),
[&] (target_section §)
{
return sect.owner == owner;
});
- table->sections.erase (it, table->sections.end ());
+ table->erase (it, table->end ());
/* If we don't have any more sections to read memory from,
remove the file_stratum target from the stack of each
inferior sharing the program space. */
- if (table->sections.empty ())
+ if (table->empty ())
{
scoped_restore_current_pspace_and_thread restore_pspace_thread;
program_space *curr_pspace = current_program_space;
if (inf->pspace != curr_pspace)
continue;
- if (!inf->pspace->target_sections.sections.empty ())
+ if (!inf->pspace->target_sections.empty ())
continue;
switch_to_inferior_no_thread (inf);
void
exec_on_vfork ()
{
- if (!current_program_space->target_sections.sections.empty ())
+ if (!current_program_space->target_sections.empty ())
push_target (&exec_ops);
}
{
std::vector<mem_range> memory;
- for (const target_section &p : sections.sections)
+ for (const target_section &p : sections)
{
if ((bfd_section_flags (p.the_bfd_section) & SEC_READONLY) == 0)
continue;
gdb_assert (len != 0);
- for (const target_section &p : sections.sections)
+ for (const target_section &p : sections)
{
struct bfd_section *asect = p.the_bfd_section;
bfd *abfd = asect->owner;
return TARGET_XFER_EOF; /* We can't help. */
}
-struct target_section_table *
+target_section_table *
exec_target::get_section_table ()
{
return current_target_sections;
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
{
- struct target_section_table *table = get_section_table ();
+ target_section_table *table = get_section_table ();
if (object == TARGET_OBJECT_MEMORY)
return section_table_xfer_memory_partial (readbuf, writebuf,
\f
void
-print_section_info (struct target_section_table *t, bfd *abfd)
+print_section_info (target_section_table *t, bfd *abfd)
{
struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
/* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64. */
bfd_vma entry_point;
bool found = false;
- for (const target_section &p : t->sections)
+ for (const target_section &p : *t)
{
struct bfd_section *psect = p.the_bfd_section;
printf_filtered (_("\tEntry point: %s\n"),
paddress (gdbarch, entry_point));
}
- for (const target_section &p : t->sections)
+ for (const target_section &p : *t)
{
struct bfd_section *psect = p.the_bfd_section;
bfd *pbfd = psect->owner;
unsigned long secaddr;
char secprint[100];
long offset;
- struct target_section_table *table;
if (args == 0)
error (_("Must specify section name and its virtual address"));
/* Parse out new virtual address. */
secaddr = parse_and_eval_address (args);
- table = current_target_sections;
- for (target_section &p : table->sections)
+ for (target_section &p : *current_target_sections)
{
if (!strncmp (secname, bfd_section_name (p.the_bfd_section), seclen)
&& bfd_section_name (p.the_bfd_section)[seclen] == '\0')
void
exec_set_section_address (const char *filename, int index, CORE_ADDR address)
{
- struct target_section_table *table;
-
- table = current_target_sections;
- for (target_section &p : table->sections)
+ for (target_section &p : *current_target_sections)
{
if (filename_cmp (filename,
bfd_get_filename (p.the_bfd_section->owner)) == 0
{
/* We can provide memory if we have any file/target sections to read
from. */
- return !current_target_sections->sections.empty ();
+ return !current_target_sections->empty ();
}
char *
special cased --- it's filename is omitted; if it is the executable
file, its entry point is printed. */
-extern void print_section_info (struct target_section_table *table,
+extern void print_section_info (target_section_table *table,
bfd *abfd);
extern void exec_close (void);
/* The set of target sections matching the sections mapped into
this program space. Managed by both exec_ops and solib.c. */
- struct target_section_table target_sections {};
+ target_section_table target_sections;
/* List of shared objects mapped into this space. Managed by
solib.c. */
{
if (record_full_gdb_operation_disable || !writebuf)
{
- for (target_section &p : record_full_core_sections.sections)
+ for (target_section &p : record_full_core_sections)
{
if (offset >= p.addr)
{
ULONGEST *xfered_len)
{
struct target_section *secp;
- struct target_section_table *table;
secp = target_section_by_addr (this, memaddr);
if (secp != NULL
{
ULONGEST memend = memaddr + len;
- table = target_get_section_table (this);
-
- for (target_section &p : table->sections)
+ target_section_table *table = target_get_section_table (this);
+ for (target_section &p : *table)
{
if (memaddr >= p.addr)
{
return 0;
bool found = false;
- for (target_section &target_section : current_target_sections->sections)
+ for (target_section &target_section : *current_target_sections)
if (sect == target_section.the_bfd_section)
{
dyn_addr = target_section.addr;
return 0;
bool found = false;
- for (target_section &target_section : current_target_sections->sections)
+ for (target_section &target_section : *current_target_sections)
if (sect == target_section.the_bfd_section)
{
dyn_addr = target_section.addr;
so->sections = new target_section_table;
*so->sections = build_section_table (so->abfd);
- for (target_section &p : so->sections->sections)
+ for (target_section &p : *so->sections)
{
/* Relocate the section binding addresses as recorded in the shared
object's file by the base address to which the object was actually
solib_contains_address_p (const struct so_list *const solib,
CORE_ADDR address)
{
- for (target_section &p : solib->sections->sections)
+ for (target_section &p : *solib->sections)
if (p.addr <= address && address < p.endaddr)
return true;
{
section_addr_info sap;
- for (const target_section &stp : table.sections)
+ for (const target_section &stp : table)
{
struct bfd_section *asect = stp.the_bfd_section;
bfd *abfd = asect->owner;
if (bfd_section_flags (asect) & (SEC_ALLOC | SEC_LOAD)
- && sap.size () < table.sections.size ())
+ && sap.size () < table.size ())
sap.emplace_back (stp.addr,
bfd_section_name (asect),
gdb_bfd_section_index (abfd, asect));
target_debug_do_print (host_address_to_string (X))
#define target_debug_print_struct_ui_file_p(X) \
target_debug_do_print (host_address_to_string (X))
-#define target_debug_print_struct_target_section_table_p(X) \
+#define target_debug_print_target_section_table_p(X) \
target_debug_do_print (host_address_to_string (X))
#define target_debug_print_async_callback_ftype_p(X) \
target_debug_do_print (host_address_to_string (X))
void rcmd (const char *arg0, struct ui_file *arg1) override;
char *pid_to_exec_file (int arg0) override;
void log_command (const char *arg0) override;
- struct target_section_table *get_section_table () override;
+ target_section_table *get_section_table () override;
thread_control_capabilities get_thread_control_capabilities () override;
bool attach_no_wait () override;
bool can_async_p () override;
void rcmd (const char *arg0, struct ui_file *arg1) override;
char *pid_to_exec_file (int arg0) override;
void log_command (const char *arg0) override;
- struct target_section_table *get_section_table () override;
+ target_section_table *get_section_table () override;
thread_control_capabilities get_thread_control_capabilities () override;
bool attach_no_wait () override;
bool can_async_p () override;
fputs_unfiltered (")\n", gdb_stdlog);
}
-struct target_section_table *
+target_section_table *
target_ops::get_section_table ()
{
return this->beneath ()->get_section_table ();
}
-struct target_section_table *
+target_section_table *
dummy_target::get_section_table ()
{
return NULL;
}
-struct target_section_table *
+target_section_table *
debug_target::get_section_table ()
{
- struct target_section_table * result;
+ target_section_table * result;
fprintf_unfiltered (gdb_stdlog, "-> %s->get_section_table (...)\n", this->beneath ()->shortname ());
result = this->beneath ()->get_section_table ();
fprintf_unfiltered (gdb_stdlog, "<- %s->get_section_table (", this->beneath ()->shortname ());
fputs_unfiltered (") = ", gdb_stdlog);
- target_debug_print_struct_target_section_table_p (result);
+ target_debug_print_target_section_table_p (result);
fputs_unfiltered ("\n", gdb_stdlog);
return result;
}
/* Holds an array of target sections. */
-struct target_section_table
-{
- std::vector<struct target_section> sections;
-};
+using target_section_table = std::vector<target_section>;
#endif /* GDB_TARGET_SECTION_H */
return gdb::unique_xmalloc_ptr<char> ((char *) buffer.release ());
}
-struct target_section_table *
+target_section_table *
target_get_section_table (struct target_ops *target)
{
return target->get_section_table ();
struct target_section *
target_section_by_addr (struct target_ops *target, CORE_ADDR addr)
{
- struct target_section_table *table = target_get_section_table (target);
+ target_section_table *table = target_get_section_table (target);
if (table == NULL)
return NULL;
- for (target_section &secp : table->sections)
+ for (target_section &secp : *table)
{
if (addr >= secp.addr && addr < secp.endaddr)
return &secp;
if (pc_in_unmapped_range (memaddr, section))
{
- struct target_section_table *table
- = target_get_section_table (ops);
+ target_section_table *table = target_get_section_table (ops);
const char *section_name = section->the_bfd_section->name;
memaddr = overlay_mapped_address (memaddr, section);
if (readbuf != NULL && trust_readonly)
{
struct target_section *secp;
- struct target_section_table *table;
secp = target_section_by_addr (ops, memaddr);
if (secp != NULL
&& (bfd_section_flags (secp->the_bfd_section) & SEC_READONLY))
{
- table = target_get_section_table (ops);
+ target_section_table *table = target_get_section_table (ops);
return section_table_xfer_memory_partial (readbuf, writebuf,
memaddr, len, xfered_len,
*table);
struct bp_location;
struct bp_target_info;
struct regcache;
-struct target_section_table;
struct trace_state_variable;
struct trace_status;
struct uploaded_tsv;
TARGET_DEFAULT_RETURN (NULL);
virtual void log_command (const char *)
TARGET_DEFAULT_IGNORE ();
- virtual struct target_section_table *get_section_table ()
+ virtual target_section_table *get_section_table ()
TARGET_DEFAULT_RETURN (NULL);
/* Provide default values for all "must have" methods. */
/* Return the target section table this target (or the targets
beneath) currently manipulate. */
-extern struct target_section_table *target_get_section_table
+extern target_section_table *target_get_section_table
(struct target_ops *target);
/* From mem-break.c */