Generalize addrmap dumping
authorTom Tromey <tom@tromey.com>
Fri, 6 Aug 2021 19:52:23 +0000 (13:52 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 10 Aug 2021 21:24:42 +0000 (15:24 -0600)
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
gdb/addrmap.h
gdb/psymtab.c

index 49e51a388e1acbca45138fb0da37f9331b7b0922..d16e0aeca204ddaa7fe60c762e50d10b956f5e9d 100644 (file)
@@ -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 = "<ends here>";
+
+    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 {
 
index 4b1a59684b11abc421377ac33c13b62306449a09..5286a9261b0c43d0de679553d9d3a30780a37864 100644 (file)
@@ -104,4 +104,10 @@ typedef gdb::function_view<int (CORE_ADDR start_addr, void *obj)>
    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 */
index 4c5b10012ce6a535e52c3074324ac4a43e158feb..7ffb7437785a9d7e08dd9e65350c5da532335b35 100644 (file)
@@ -1469,43 +1469,6 @@ psymtab_storage::discard_psymtab (struct partial_symtab *pst)
 
 \f
 
-/* 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 = "<ends here>";
-
-  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);
     }
 }