From: Kevin Buettner Date: Thu, 5 Mar 2020 00:42:41 +0000 (-0700) Subject: section_table_xfer_memory: Replace section name with callback predicate X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e56cb451c9ca63bdafc11cc3d3ee14b74e409fa9;p=binutils-gdb.git section_table_xfer_memory: Replace section name with callback predicate 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6fc88bdfb48..aaba31821a5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2020-07-22 Kevin Buettner + + * 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. + 2020-07-22 Tom Tromey * mi/mi-cmd-stack.c (list_args_or_locals): Use diff --git a/gdb/bfd-target.c b/gdb/bfd-target.c index b75abd7fb0e..3d266951c5a 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 3958af1e67a..5697a02dc14 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -618,8 +618,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 2ff5846c0e7..e50f38899d6 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 54e6ff4d9ba..82eb39c55d8 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 cd66675e8a4..d03f0d5f384 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); } }