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:
Simon Marchi 2020-08-27 08:58:43 -04:00
parent ec10b3bb91
commit b886559f31
3 changed files with 50 additions and 26 deletions

View File

@ -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.

View File

@ -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 */

View File

@ -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);
}
}