diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2020-08-27 08:58:43 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2020-08-27 08:58:43 -0400 |
commit | b886559f31fabb8bf234c1818dd01f8987e3c190 (patch) | |
tree | 3bb438a20bff2ea6e7d2835642fb5b9613dabbab /gdb/maint.c | |
parent | ec10b3bb916cde1203912847e3f5844ab5ab24bd (diff) | |
download | gdb-b886559f31fabb8bf234c1818dd01f8987e3c190.zip gdb-b886559f31fabb8bf234c1818dd01f8987e3c190.tar.gz gdb-b886559f31fabb8bf234c1818dd01f8987e3c190.tar.bz2 |
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
Diffstat (limited to 'gdb/maint.c')
-rw-r--r-- | gdb/maint.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/gdb/maint.c b/gdb/maint.c index 3368769..be0b160 100644 --- a/gdb/maint.c +++ b/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); } } |