From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by sourceware.org (Postfix) with ESMTP id 364DC3947422 for ; Thu, 18 Jun 2020 04:09:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 364DC3947422 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-245-p6JAere0NxCPRpQW6kqrdQ-1; Thu, 18 Jun 2020 00:09:21 -0400 X-MC-Unique: p6JAere0NxCPRpQW6kqrdQ-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 E1306107ACCA for ; Thu, 18 Jun 2020 04:09:20 +0000 (UTC) Received: from f32-1.lan (ovpn-115-18.phx2.redhat.com [10.3.115.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id AF6F95C1D6; Thu, 18 Jun 2020 04:09:18 +0000 (UTC) From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH v3 3/9] section_table_xfer_memory: Replace section name with callback predicate Date: Wed, 17 Jun 2020 21:08:18 -0700 Message-Id: <20200618040824.3405657-4-kevinb@redhat.com> In-Reply-To: <20200618040824.3405657-1-kevinb@redhat.com> References: <20200618040824.3405657-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=-13.5 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_H3, RCVD_IN_MSPIKE_WL, 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: Thu, 18 Jun 2020 04:09:25 -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 b60010453d..e3bd0bc452 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -617,8 +617,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 a2added5e2..8df2a23bff 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -908,7 +908,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; @@ -922,7 +923,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) { @@ -995,8 +996,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 6982a806e3..516fec78c7 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -1036,11 +1036,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); } } @@ -1058,8 +1064,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