mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
gdb: add gdb_bfd_sections for range-based iteration
I wanted to make a nicer / type-safe interface for bfd_map_over_sections, avoiding the `void *` data parameter. My first shot was to make a wrapper for bfd_map_over_sections, gdb_bfd_map_over_sections that took a gdb::function_view. However, I think that a range adapter gives nicer and simpler code, as a simple for loop is easier to read than a callback / lambda function. So here it is, it uses next_iterator and next_adapter, so it's not much code. As an example, I ported maintenance_info_sections and friends to use it. The maint_print_section_data type could probably be removed now, but I didn't want to do too much in one patch. gdb/ChangeLog: * gdb_bfd.h (gdb_bfd_section_iterator, gdb_bfd_section_range, gdb_bfd_sections): New. * maint.c (print_bfd_section_info): Change param type to maint_print_section_data. (print_objfile_section_info): Likewise. (print_bfd_section_info_maybe_relocated): Likewise. (maintenance_info_sections): Use gdb_bfd_sections. Change-Id: Ib496f6b0a0eb7aadb10da1dd381304014d934ea0
This commit is contained in:
parent
ec10b3bb91
commit
b886559f31
@ -1,3 +1,13 @@
|
||||
2020-08-27 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* gdb_bfd.h (gdb_bfd_section_iterator, gdb_bfd_section_range,
|
||||
gdb_bfd_sections): New.
|
||||
* maint.c (print_bfd_section_info): Change param type to
|
||||
maint_print_section_data.
|
||||
(print_objfile_section_info): Likewise.
|
||||
(print_bfd_section_info_maybe_relocated): Likewise.
|
||||
(maintenance_info_sections): Use gdb_bfd_sections.
|
||||
|
||||
2020-08-25 Shahab Vahedi <shahab@synopsys.com>
|
||||
|
||||
* MAINTAINERS: Add ARC target and maintainer.
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "registry.h"
|
||||
#include "gdbsupport/byte-vector.h"
|
||||
#include "gdbsupport/gdb_ref_ptr.h"
|
||||
#include "gdbsupport/next-iterator.h"
|
||||
|
||||
DECLARE_REGISTRY (bfd);
|
||||
|
||||
@ -193,4 +194,21 @@ int gdb_bfd_requires_relocations (bfd *abfd);
|
||||
bool gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
|
||||
gdb::byte_vector *contents);
|
||||
|
||||
/* Range adapter for a BFD's sections.
|
||||
|
||||
To be used as:
|
||||
|
||||
for (asection *sect : gdb_bfd_all_sections (bfd))
|
||||
... use SECT ...
|
||||
*/
|
||||
|
||||
using gdb_bfd_section_iterator = next_iterator<asection>;
|
||||
using gdb_bfd_section_range = next_adapter<asection, gdb_bfd_section_iterator>;
|
||||
|
||||
static inline
|
||||
gdb_bfd_section_range gdb_bfd_sections (bfd *abfd)
|
||||
{
|
||||
return gdb_bfd_section_range (abfd->sections);
|
||||
}
|
||||
|
||||
#endif /* GDB_BFD_H */
|
||||
|
48
gdb/maint.c
48
gdb/maint.c
@ -266,7 +266,7 @@ struct maint_print_section_data
|
||||
maint_print_section_data (struct objfile *objfile, const char *arg,
|
||||
bfd *abfd)
|
||||
: objfile (objfile),
|
||||
arg(arg)
|
||||
arg (arg)
|
||||
{
|
||||
int section_count = gdb_bfd_count_sections (abfd);
|
||||
index_digits = ((int) log10 ((float) section_count)) + 1;
|
||||
@ -292,21 +292,19 @@ print_section_index (bfd *abfd,
|
||||
printf_filtered ("%-*s", (index_digits + 4), result.c_str ());
|
||||
}
|
||||
|
||||
/* Print information about ASECT from ABFD. DATUM holds a pointer to a
|
||||
maint_print_section_data object. The section will be printed using the
|
||||
VMA's from the bfd, which will not be the relocated addresses for bfds
|
||||
that should be relocated. The information must be printed with the
|
||||
same layout as PRINT_OBJFILE_SECTION_INFO below. */
|
||||
/* Print information about ASECT from ABFD. The section will be printed using
|
||||
the VMA's from the bfd, which will not be the relocated addresses for bfds
|
||||
that should be relocated. The information must be printed with the same
|
||||
layout as PRINT_OBJFILE_SECTION_INFO below. */
|
||||
|
||||
static void
|
||||
print_bfd_section_info (bfd *abfd,
|
||||
asection *asect,
|
||||
void *datum)
|
||||
const maint_print_section_data &print_data)
|
||||
{
|
||||
flagword flags = bfd_section_flags (asect);
|
||||
const char *name = bfd_section_name (asect);
|
||||
maint_print_section_data *print_data = (maint_print_section_data *) datum;
|
||||
const char *arg = print_data->arg;
|
||||
const char *arg = print_data.arg;
|
||||
|
||||
if (arg == NULL || *arg == '\0'
|
||||
|| match_substring (arg, name)
|
||||
@ -318,7 +316,7 @@ print_bfd_section_info (bfd *abfd,
|
||||
|
||||
addr = bfd_section_vma (asect);
|
||||
endaddr = addr + bfd_section_size (asect);
|
||||
print_section_index (abfd, asect, print_data->index_digits);
|
||||
print_section_index (abfd, asect, print_data.index_digits);
|
||||
maint_print_section_info (name, flags, addr, endaddr,
|
||||
asect->filepos, addr_size);
|
||||
}
|
||||
@ -332,11 +330,11 @@ print_bfd_section_info (bfd *abfd,
|
||||
static void
|
||||
print_objfile_section_info (bfd *abfd,
|
||||
struct obj_section *asect,
|
||||
maint_print_section_data *print_data)
|
||||
const maint_print_section_data &print_data)
|
||||
{
|
||||
flagword flags = bfd_section_flags (asect->the_bfd_section);
|
||||
const char *name = bfd_section_name (asect->the_bfd_section);
|
||||
const char *string = print_data->arg;
|
||||
const char *string = print_data.arg;
|
||||
|
||||
if (string == NULL || *string == '\0'
|
||||
|| match_substring (string, name)
|
||||
@ -346,7 +344,7 @@ print_objfile_section_info (bfd *abfd,
|
||||
int addr_size = gdbarch_addr_bit (gdbarch) / 8;
|
||||
|
||||
print_section_index (abfd, asect->the_bfd_section,
|
||||
print_data->index_digits);
|
||||
print_data.index_digits);
|
||||
maint_print_section_info (name, flags,
|
||||
obj_section_addr (asect),
|
||||
obj_section_endaddr (asect),
|
||||
@ -376,24 +374,21 @@ maint_obj_section_from_bfd_section (bfd *abfd,
|
||||
return osect;
|
||||
}
|
||||
|
||||
/* Print information about ASECT from ABFD. DATUM holds a pointer to a
|
||||
maint_print_section_data object. Where possible the information for
|
||||
/* Print information about ASECT from ABFD. Where possible the information for
|
||||
ASECT will print the relocated addresses of the section. */
|
||||
|
||||
static void
|
||||
print_bfd_section_info_maybe_relocated (bfd *abfd,
|
||||
asection *asect,
|
||||
void *datum)
|
||||
print_bfd_section_info_maybe_relocated
|
||||
(bfd *abfd, asection *asect, const maint_print_section_data &print_data)
|
||||
{
|
||||
maint_print_section_data *print_data = (maint_print_section_data *) datum;
|
||||
objfile *objfile = print_data->objfile;
|
||||
objfile *objfile = print_data.objfile;
|
||||
|
||||
gdb_assert (objfile->sections != NULL);
|
||||
obj_section *osect
|
||||
= maint_obj_section_from_bfd_section (abfd, asect, objfile);
|
||||
|
||||
if (osect->the_bfd_section == NULL)
|
||||
print_bfd_section_info (abfd, asect, datum);
|
||||
print_bfd_section_info (abfd, asect, print_data);
|
||||
else
|
||||
print_objfile_section_info (abfd, osect, print_data);
|
||||
}
|
||||
@ -432,9 +427,9 @@ maintenance_info_sections (const char *arg, int from_tty)
|
||||
|
||||
maint_print_section_data print_data (ofile, arg, ofile->obfd);
|
||||
|
||||
bfd_map_over_sections (ofile->obfd,
|
||||
print_bfd_section_info_maybe_relocated,
|
||||
(void *) &print_data);
|
||||
for (asection *sect : gdb_bfd_sections (ofile->obfd))
|
||||
print_bfd_section_info_maybe_relocated (ofile->obfd, sect,
|
||||
print_data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -446,8 +441,9 @@ maintenance_info_sections (const char *arg, int from_tty)
|
||||
printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
|
||||
wrap_here (" ");
|
||||
printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
|
||||
bfd_map_over_sections (core_bfd, print_bfd_section_info,
|
||||
(void *) &print_data);
|
||||
|
||||
for (asection *sect : gdb_bfd_sections (core_bfd))
|
||||
print_bfd_section_info (core_bfd, sect, print_data);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user