From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by sourceware.org (Postfix) with ESMTP id D2499383F869 for ; Wed, 22 Jul 2020 00:59:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D2499383F869 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-146-szaovFtqNOKe6CmOGKZAUg-1; Tue, 21 Jul 2020 20:59:17 -0400 X-MC-Unique: szaovFtqNOKe6CmOGKZAUg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DB4FE1932481 for ; Wed, 22 Jul 2020 00:59:16 +0000 (UTC) Received: from f32-1.lan (ovpn-112-21.phx2.redhat.com [10.3.112.21]) by smtp.corp.redhat.com (Postfix) with ESMTP id AD4DA69314; Wed, 22 Jul 2020 00:59:16 +0000 (UTC) From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH v5 03/14] section_table_xfer_memory: Replace section name with callback predicate Date: Tue, 21 Jul 2020 17:58:21 -0700 Message-Id: <20200722005832.863276-4-kevinb@redhat.com> In-Reply-To: <20200722005832.863276-1-kevinb@redhat.com> References: <20200722005832.863276-1-kevinb@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, 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: Wed, 22 Jul 2020 00:59:21 -0000 This patch is motivated by the need to be able to select sections that section_table_xfer_memory_partial should consider for memory transfers. I'll use this facility in the next patch in this series. section_table_xfer_memory_partial() can currently be passed a section name which may be used to make name-based selections. This is similar to what I want to do, except that I want to be able to consider section flags instead of the name. I'm replacing the section name parameter with a predicate that, when passed a pointer to a target_section struct, will return true if that section should be further considered, or false which indicates that it shouldn't. I've converted the one existing use where a non-NULL section name is passed to section_table_xfer_memory_partial(). Instead of passing the section name, it now looks like this: auto match_cb = [=] (const struct target_section *s) { return (strcmp (section_name, s->the_bfd_section->name) == 0); }; return section_table_xfer_memory_partial (readbuf, writebuf, memaddr, len, xfered_len, table->sections, table->sections_end, match_cb); The other callers all passed NULL; they've been simplified somewhat in that they no longer need to pass NULL. gdb/ChangeLog: * exec.h (section_table_xfer_memory): Revise declaration, replacing section name parameter with an optional callback predicate. * exec.c (section_table_xfer_memory): Likewise. * bfd-target.c, exec.c, target.c, corelow.c: Adjust all callers of section_table_xfer_memory. --- gdb/bfd-target.c | 3 +-- gdb/corelow.c | 3 +-- gdb/exec.c | 8 ++++---- gdb/exec.h | 13 ++++++++++--- gdb/target.c | 11 ++++++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/gdb/bfd-target.c b/gdb/bfd-target.c index b75abd7fb0..3d266951c5 100644 --- a/gdb/bfd-target.c +++ b/gdb/bfd-target.c @@ -77,8 +77,7 @@ target_bfd::xfer_partial (target_object object, return section_table_xfer_memory_partial (readbuf, writebuf, offset, len, xfered_len, m_table.sections, - m_table.sections_end, - NULL); + m_table.sections_end); } default: return TARGET_XFER_E_IO; diff --git a/gdb/corelow.c b/gdb/corelow.c index b6a12c0818..f4a5fdee12 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -615,8 +615,7 @@ core_target::xfer_partial (enum target_object object, const char *annex, (readbuf, writebuf, offset, len, xfered_len, m_core_section_table.sections, - m_core_section_table.sections_end, - NULL)); + m_core_section_table.sections_end)); case TARGET_OBJECT_AUXV: if (readbuf) diff --git a/gdb/exec.c b/gdb/exec.c index 2ff5846c0e..e50f38899d 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -956,7 +956,8 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST *xfered_len, struct target_section *sections, struct target_section *sections_end, - const char *section_name) + gdb::function_view match_cb) { int res; struct target_section *p; @@ -970,7 +971,7 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, struct bfd_section *asect = p->the_bfd_section; bfd *abfd = asect->owner; - if (section_name && strcmp (section_name, asect->name) != 0) + if (match_cb != nullptr && !match_cb (p)) continue; /* not the section we need. */ if (memaddr >= p->addr) { @@ -1043,8 +1044,7 @@ exec_target::xfer_partial (enum target_object object, return section_table_xfer_memory_partial (readbuf, writebuf, offset, len, xfered_len, table->sections, - table->sections_end, - NULL); + table->sections_end); else return TARGET_XFER_E_IO; } diff --git a/gdb/exec.h b/gdb/exec.h index 54e6ff4d9b..82eb39c55d 100644 --- a/gdb/exec.h +++ b/gdb/exec.h @@ -65,8 +65,13 @@ extern enum target_xfer_status Request to transfer up to LEN 8-bit bytes of the target sections defined by SECTIONS and SECTIONS_END. The OFFSET specifies the starting address. - If SECTION_NAME is not NULL, only access sections with that same - name. + + The MATCH_CB predicate is optional; when provided it will be called + for each section under consideration. When MATCH_CB evaluates as + true, the section remains under consideration; a false result + removes it from consideration for performing the memory transfers + noted above. See memory_xfer_partial_1() in target.c for an + example. Return the number of bytes actually transfered, or zero when no data is available for the requested range. @@ -83,7 +88,9 @@ extern enum target_xfer_status ULONGEST, ULONGEST, ULONGEST *, struct target_section *, struct target_section *, - const char *); + gdb::function_view match_cb + = nullptr); /* Read from mappable read-only sections of BFD executable files. Similar to exec_read_partial_read_only, but return diff --git a/gdb/target.c b/gdb/target.c index cd66675e8a..d03f0d5f38 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -980,11 +980,17 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, const char *section_name = section->the_bfd_section->name; memaddr = overlay_mapped_address (memaddr, section); + + auto match_cb = [=] (const struct target_section *s) + { + return (strcmp (section_name, s->the_bfd_section->name) == 0); + }; + return section_table_xfer_memory_partial (readbuf, writebuf, memaddr, len, xfered_len, table->sections, table->sections_end, - section_name); + match_cb); } } @@ -1002,8 +1008,7 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, return section_table_xfer_memory_partial (readbuf, writebuf, memaddr, len, xfered_len, table->sections, - table->sections_end, - NULL); + table->sections_end); } } -- 2.26.2