From 192786c72a36388dcf99e21b0335eca0977f3435 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 6 Aug 2021 13:52:23 -0600 Subject: Generalize addrmap dumping While debugging another patch series, I wanted to dump an addrmap. I came up with this patch, which generalizes the addrmap-dumping code from psymtab.c and moves it to addrmap.c. psymtab.c is changed to use the new code. --- gdb/addrmap.c | 35 +++++++++++++++++++++++++++++++++++ gdb/addrmap.h | 6 ++++++ gdb/psymtab.c | 56 +++++--------------------------------------------------- 3 files changed, 46 insertions(+), 51 deletions(-) (limited to 'gdb') diff --git a/gdb/addrmap.c b/gdb/addrmap.c index 49e51a3..d16e0ae 100644 --- a/gdb/addrmap.c +++ b/gdb/addrmap.c @@ -590,6 +590,41 @@ addrmap_create_mutable (struct obstack *obstack) return (struct addrmap *) map; } +/* See addrmap.h. */ + +void +addrmap_dump (struct addrmap *map, struct ui_file *outfile, void *payload) +{ + /* True if the previously printed addrmap entry was for PAYLOAD. + If so, we want to print the next one as well (since the next + addrmap entry defines the end of the range). */ + bool previous_matched = false; + + auto callback = [&] (CORE_ADDR start_addr, void *obj) + { + QUIT; + + bool matches = payload == nullptr || payload == obj; + const char *addr_str = nullptr; + if (matches) + addr_str = host_address_to_string (obj); + else if (previous_matched) + addr_str = ""; + + if (matches || previous_matched) + fprintf_filtered (outfile, " %s%s %s\n", + payload != nullptr ? " " : "", + core_addr_to_string (start_addr), + addr_str); + + previous_matched = matches; + + return 0; + }; + + addrmap_foreach (map, callback); +} + #if GDB_SELF_TEST namespace selftests { diff --git a/gdb/addrmap.h b/gdb/addrmap.h index 4b1a596..5286a92 100644 --- a/gdb/addrmap.h +++ b/gdb/addrmap.h @@ -104,4 +104,10 @@ typedef gdb::function_view returns 0. */ int addrmap_foreach (struct addrmap *map, addrmap_foreach_fn fn); +/* 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.) */ +void addrmap_dump (struct addrmap *map, struct ui_file *outfile, + void *payload); + #endif /* ADDRMAP_H */ diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 4c5b100..7ffb743 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1469,43 +1469,6 @@ psymtab_storage::discard_psymtab (struct partial_symtab *pst) -/* Helper function for dump_psymtab_addrmap to print an addrmap entry. */ - -static int -dump_psymtab_addrmap_1 (struct objfile *objfile, - struct partial_symtab *psymtab, - struct ui_file *outfile, - int *previous_matched, - CORE_ADDR start_addr, - void *obj) -{ - struct gdbarch *gdbarch = objfile->arch (); - struct partial_symtab *addrmap_psymtab = (struct partial_symtab *) obj; - const char *psymtab_address_or_end = NULL; - - QUIT; - - if (psymtab == NULL - || psymtab == addrmap_psymtab) - psymtab_address_or_end = host_address_to_string (addrmap_psymtab); - else if (*previous_matched) - psymtab_address_or_end = ""; - - if (psymtab == NULL - || psymtab == addrmap_psymtab - || *previous_matched) - { - fprintf_filtered (outfile, " %s%s %s\n", - psymtab != NULL ? " " : "", - paddress (gdbarch, start_addr), - psymtab_address_or_end); - } - - *previous_matched = psymtab == NULL || psymtab == addrmap_psymtab; - - return 0; -} - /* Helper function for maintenance_print_psymbols to print the addrmap of PSYMTAB. If PSYMTAB is NULL print the entire addrmap. */ @@ -1519,20 +1482,11 @@ dump_psymtab_addrmap (struct objfile *objfile, || psymtab->psymtabs_addrmap_supported) && partial_symtabs->psymtabs_addrmap != NULL) { - /* Non-zero if the previously printed addrmap entry was for - PSYMTAB. If so, we want to print the next one as well (since - the next addrmap entry defines the end of the range). */ - int previous_matched = 0; - - auto callback = [&] (CORE_ADDR start_addr, void *obj) - { - return dump_psymtab_addrmap_1 (objfile, psymtab, outfile, - &previous_matched, start_addr, obj); - }; - - fprintf_filtered (outfile, "%sddress map:\n", - psymtab == NULL ? "Entire a" : " A"); - addrmap_foreach (partial_symtabs->psymtabs_addrmap, callback); + if (psymtab == nullptr) + fprintf_filtered (outfile, _("Entire address map:\n")); + else + fprintf_filtered (outfile, _("Address map:\n")); + addrmap_dump (partial_symtabs->psymtabs_addrmap, outfile, psymtab); } } -- cgit v1.1