[04/13,gdb/symtab] Add parent_map::dump
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
Commit Message
When dumping m_die_range_map using:
...
addrmap_dump (&m_die_range_map, gdb_stdlog, nullptr);
...
I get:
...
0x00000000000000d4 0x355e600
0x00000000000000de 0x355e630
0x00000000000000f5 0x355e600
0x0000000000000101 0x0
0x00000000000001c2 0x355e7b0
0x00000000000001cc 0x355e7e0
0x00000000000001e3 0x355e7b0
0x00000000000001ef 0x0
...
which doesn't make it clear which cooked_die_entries the values refer to.
Add a function parent_map::dump that passes an annotation function
to addrmap_dump such that we have instead:
...
0x00000000000000d4 0x360d300 (0xd3)
0x00000000000000de 0x360d330 (0xdd)
0x00000000000000f5 0x360d300 (0xd3)
0x0000000000000101 0x0
0x00000000000001c2 0x360d4b0 (0x1c1)
0x00000000000001cc 0x360d4e0 (0x1cb)
0x00000000000001e3 0x360d4b0 (0x1c1)
0x00000000000001ef 0x0
...
Tested on x86_64-linux.
---
gdb/addrmap.c | 19 +++++++++++++------
gdb/addrmap.h | 7 +++++--
gdb/dwarf2/cooked-index.h | 18 ++++++++++++++++++
3 files changed, 36 insertions(+), 8 deletions(-)
Comments
On Mon, Oct 2, 2023 at 2:52 PM Tom de Vries via Gdb-patches <
gdb-patches@sourceware.org> wrote:
> When dumping m_die_range_map using:
> ...
> addrmap_dump (&m_die_range_map, gdb_stdlog, nullptr);
> ...
> I get:
> ...
> 0x00000000000000d4 0x355e600
> 0x00000000000000de 0x355e630
> 0x00000000000000f5 0x355e600
> 0x0000000000000101 0x0
> 0x00000000000001c2 0x355e7b0
> 0x00000000000001cc 0x355e7e0
> 0x00000000000001e3 0x355e7b0
> 0x00000000000001ef 0x0
> ...
> which doesn't make it clear which cooked_die_entries the values refer to.
>
> Add a function parent_map::dump that passes an annotation function
> to addrmap_dump such that we have instead:
> ...
> 0x00000000000000d4 0x360d300 (0xd3)
> 0x00000000000000de 0x360d330 (0xdd)
> 0x00000000000000f5 0x360d300 (0xd3)
> 0x0000000000000101 0x0
> 0x00000000000001c2 0x360d4b0 (0x1c1)
> 0x00000000000001cc 0x360d4e0 (0x1cb)
> 0x00000000000001e3 0x360d4b0 (0x1c1)
> 0x00000000000001ef 0x0
> ...
>
> Tested on x86_64-linux.
> ---
> I think is a very useful cahnge. I can confirm this causes no regrissions
> on ppc64le Fedora Rawhide.
>
>>>>> "Tom" == Tom de Vries via Gdb-patches <gdb-patches@sourceware.org> writes:
Tom> void
Tom> -addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload)
Tom> +addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload,
Tom> + void (*annotate_value)(struct ui_file *outfile,
Tom> + const void *value))
I think we prefer function_view in new code.
Tom
@@ -361,7 +361,9 @@ addrmap_mutable::~addrmap_mutable ()
/* See addrmap.h. */
void
-addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload)
+addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload,
+ void (*annotate_value)(struct ui_file *outfile,
+ const void *value))
{
/* True if the previously printed addrmap entry was for PAYLOAD.
If so, we want to print the next one as well (since the next
@@ -380,11 +382,16 @@ addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload)
addr_str = "<ends here>";
if (matches || previous_matched)
- gdb_printf (outfile, " %s%s %s\n",
- payload != nullptr ? " " : "",
- core_addr_to_string (start_addr),
- addr_str);
-
+ {
+ gdb_printf (outfile, " %s%s %s",
+ payload != nullptr ? " " : "",
+ core_addr_to_string (start_addr),
+ addr_str);
+ /* Annotate value. */
+ if (annotate_value != nullptr)
+ annotate_value (outfile, obj);
+ gdb_printf (outfile, "\n");
+ }
previous_matched = matches;
return 0;
@@ -205,8 +205,11 @@ struct addrmap_mutable : public addrmap
/* Dump the addrmap to OUTFILE. If PAYLOAD is non-NULL, only dump any
components that map to PAYLOAD. (If PAYLOAD is NULL, the entire
- map is dumped.) */
+ map is dumped.) If ANNOTATE_VALUE is non-nullptr, call it for each
+ value. */
void addrmap_dump (struct addrmap *map, struct ui_file *outfile,
- void *payload);
+ void *payload,
+ void (*annotate_value)(struct ui_file *outfile,
+ const void *value) = nullptr);
#endif /* ADDRMAP_H */
@@ -266,6 +266,24 @@ class parent_map
gdb_assert (m_parent_map.find (end) == parent_entry);
}
+ /* Dump the parent map. */
+ void dump ()
+ {
+ auto annotate_cooked_index_entry
+ = [] (struct ui_file *outfile, const void *value)
+ {
+ const cooked_index_entry *parent_entry
+ = (const cooked_index_entry *)value;
+ if (parent_entry == nullptr)
+ return;
+ gdb_printf (outfile, " (0x%" PRIx64 ")",
+ to_underlying (parent_entry->die_offset));
+ };
+
+ addrmap_dump (&m_parent_map, gdb_stdlog, nullptr,
+ annotate_cooked_index_entry);
+ }
+
private:
/* An addrmap that maps from section offsets to cooked_index_entry *. */
addrmap_mutable m_parent_map;