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
+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.
2020-08-25 Shahab Vahedi <shahab@synopsys.com>
* MAINTAINERS: Add ARC target and maintainer.
#include "registry.h"
#include "gdbsupport/byte-vector.h"
#include "gdbsupport/gdb_ref_ptr.h"
#include "registry.h"
#include "gdbsupport/byte-vector.h"
#include "gdbsupport/gdb_ref_ptr.h"
+#include "gdbsupport/next-iterator.h"
bool gdb_bfd_get_full_section_contents (bfd *abfd, asection *section,
gdb::byte_vector *contents);
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);
+}
+
maint_print_section_data (struct objfile *objfile, const char *arg,
bfd *abfd)
: objfile (objfile),
maint_print_section_data (struct objfile *objfile, const char *arg,
bfd *abfd)
: objfile (objfile),
{
int section_count = gdb_bfd_count_sections (abfd);
index_digits = ((int) log10 ((float) section_count)) + 1;
{
int section_count = gdb_bfd_count_sections (abfd);
index_digits = ((int) log10 ((float) section_count)) + 1;
printf_filtered ("%-*s", (index_digits + 4), result.c_str ());
}
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,
static void
print_bfd_section_info (bfd *abfd,
asection *asect,
+ const maint_print_section_data &print_data)
{
flagword flags = bfd_section_flags (asect);
const char *name = bfd_section_name (asect);
{
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)
if (arg == NULL || *arg == '\0'
|| match_substring (arg, name)
addr = bfd_section_vma (asect);
endaddr = addr + bfd_section_size (asect);
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);
}
maint_print_section_info (name, flags, addr, endaddr,
asect->filepos, addr_size);
}
static void
print_objfile_section_info (bfd *abfd,
struct obj_section *asect,
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);
{
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)
if (string == NULL || *string == '\0'
|| match_substring (string, name)
int addr_size = gdbarch_addr_bit (gdbarch) / 8;
print_section_index (abfd, asect->the_bfd_section,
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),
maint_print_section_info (name, flags,
obj_section_addr (asect),
obj_section_endaddr (asect),
-/* 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
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)
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);
}
else
print_objfile_section_info (abfd, osect, print_data);
}
maint_print_section_data print_data (ofile, arg, ofile->obfd);
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);
printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
wrap_here (" ");
printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
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);