From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id C5BB63858D37 for ; Mon, 24 Aug 2020 19:43:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C5BB63858D37 X-ASG-Debug-ID: 1598298213-0c856e180d603d40001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id JPxO1xFq66RlTVQC (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 24 Aug 2020 15:43:33 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.localdomain (173-246-6-90.qc.cable.ebox.net [173.246.6.90]) by smtp.ebox.ca (Postfix) with ESMTP id A40BC441DA2; Mon, 24 Aug 2020 15:43:33 -0400 (EDT) From: Simon Marchi X-Barracuda-RBL-IP: 173.246.6.90 X-Barracuda-Effective-Source-IP: 173-246-6-90.qc.cable.ebox.net[173.246.6.90] X-Barracuda-Apparent-Source-IP: 173.246.6.90 To: gdb-patches@sourceware.org Subject: [PATCH] gdb: add gdb_bfd_all_sections for range-based iteration Date: Mon, 24 Aug 2020 15:43:33 -0400 X-ASG-Orig-Subj: [PATCH] gdb: add gdb_bfd_all_sections for range-based iteration Message-Id: <20200824194333.196744-1-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1598298213 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-Scan-Msg-Size: 6239 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.84136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_QUARANTINE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Aug 2020 19:43:42 -0000 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_all_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_all_sections. Change-Id: Ib496f6b0a0eb7aadb10da1dd381304014d934ea0 --- gdb/gdb_bfd.h | 18 ++++++++++++++++++ gdb/maint.c | 35 ++++++++++++++++------------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/gdb/gdb_bfd.h b/gdb/gdb_bfd.h index a941b79fe734..3cb50e56e8ac 100644 --- a/gdb/gdb_bfd.h +++ b/gdb/gdb_bfd.h @@ -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; +using gdb_bfd_section_range = next_adapter; + +static inline +gdb_bfd_section_range gdb_bfd_all_sections (bfd *abfd) +{ + return gdb_bfd_section_range (abfd->sections); +} + #endif /* GDB_BFD_H */ diff --git a/gdb/maint.c b/gdb/maint.c index 3368769ad96f..8adac24efcb0 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,20 +292,18 @@ 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; if (arg == NULL || *arg == '\0' @@ -332,7 +330,7 @@ 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); @@ -376,16 +374,14 @@ 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) + const maint_print_section_data *print_data) { - maint_print_section_data *print_data = (maint_print_section_data *) datum; objfile *objfile = print_data->objfile; gdb_assert (objfile->sections != NULL); @@ -393,7 +389,7 @@ print_bfd_section_info_maybe_relocated (bfd *abfd, = 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 +428,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_all_sections (ofile->obfd)) + print_bfd_section_info_maybe_relocated (ofile->obfd, sect, + &print_data); } } @@ -446,8 +442,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_all_sections (core_bfd)) + print_bfd_section_info (core_bfd, sect, &print_data); } } -- 2.28.0