[04/13,gdb/symtab] Add parent_map::dump

Message ID 20231002125051.29911-5-tdevries@suse.de
State Superseded
Headers
Series Fix gdb.cp/breakpoint-locs.exp |

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

Tom de Vries Oct. 2, 2023, 12:50 p.m. UTC
  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

Alexandra Petlanova Hajkova Oct. 10, 2023, 9:05 a.m. UTC | #1
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 Tromey Oct. 20, 2023, 7:51 p.m. UTC | #2
>>>>> "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
  

Patch

diff --git a/gdb/addrmap.c b/gdb/addrmap.c
index d16775d49d4..4c58427903b 100644
--- a/gdb/addrmap.c
+++ b/gdb/addrmap.c
@@ -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;
diff --git a/gdb/addrmap.h b/gdb/addrmap.h
index e00dda6e711..f67cd32df1d 100644
--- a/gdb/addrmap.h
+++ b/gdb/addrmap.h
@@ -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 */
diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h
index b51128d1f58..396c25b0718 100644
--- a/gdb/dwarf2/cooked-index.h
+++ b/gdb/dwarf2/cooked-index.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;