public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Use ui-out tables in a few spots
@ 2024-03-03 18:43 Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 1/3] Use ui-out in maintenance_print_user_registers Tom Tromey
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Tom Tromey @ 2024-03-03 18:43 UTC (permalink / raw)
  To: gdb-patches

This series changes a few spots to use ui-out tables rather than
hand-aligned printf-based ones.  I think ui-out tables should
generally be preferred:

* They are more flexible and easier to use

* They sometimes provide automatic styling (like addresses in this
  series)

* They allow the possibility of structured reuse via MI

There are still a few such tables left in gdb after this series, but
they are all in code I can't readily test: fbsd-tdep.c,
darwin-nat-info.c, and netbsd-tdep.c.

Regression tested on x86-64 Fedora 38.

---
Changes in v2:
- Rebased
- Fixed test failure pointed out in review
- Link to v1: https://inbox.sourceware.org/gdb-patches/20230809-info-proc-ui-out-v1-0-36d4b1b8f582@tromey.com

---
Tom Tromey (3):
      Use ui-out in maintenance_print_user_registers
      Use ui-out in core_target::info_proc_mappings
      Use ui-out tables in linux-tdep.c

 gdb/corelow.c                         |  54 +++++++---------
 gdb/linux-tdep.c                      | 114 ++++++++++++++--------------------
 gdb/testsuite/gdb.base/completion.exp |   2 +-
 gdb/user-regs.c                       |  14 ++++-
 4 files changed, 81 insertions(+), 103 deletions(-)
---
base-commit: 90f8d97c8efa75f7f019b868eca9c626bc35203d
change-id: 20230809-info-proc-ui-out-ce83b44285ec

Best regards,
-- 
Tom Tromey <tom@tromey.com>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/3] Use ui-out in maintenance_print_user_registers
  2024-03-03 18:43 [PATCH v2 0/3] Use ui-out tables in a few spots Tom Tromey
@ 2024-03-03 18:43 ` Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 2/3] Use ui-out in core_target::info_proc_mappings Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 3/3] Use ui-out tables in linux-tdep.c Tom Tromey
  2 siblings, 0 replies; 4+ messages in thread
From: Tom Tromey @ 2024-03-03 18:43 UTC (permalink / raw)
  To: gdb-patches

This changes maintenance_print_user_registers to use a ui-out table.
---
 gdb/testsuite/gdb.base/completion.exp |  2 +-
 gdb/user-regs.c                       | 14 ++++++++++++--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp
index 3dbdd0f428b..127ec235371 100644
--- a/gdb/testsuite/gdb.base/completion.exp
+++ b/gdb/testsuite/gdb.base/completion.exp
@@ -145,7 +145,7 @@ append regs_output "\n"
 append regs_output [capture_command_output "mt print user-registers" \
 		     ".*Name.*Nr\[^\n]*\n"]
 set all_regs {}
-foreach {- reg} [regexp -all -inline -line {^\s+(\w+)} $regs_output] {
+foreach {- reg} [regexp -all -inline -line {^\s*(\w+)} $regs_output] {
     lappend all_regs $reg
 }
 
diff --git a/gdb/user-regs.c b/gdb/user-regs.c
index d1b510a7927..36661471595 100644
--- a/gdb/user-regs.c
+++ b/gdb/user-regs.c
@@ -223,9 +223,19 @@ maintenance_print_user_registers (const char *args, int from_tty)
   struct gdb_user_regs *regs = get_user_regs (gdbarch);
   regnum = gdbarch_num_cooked_regs (gdbarch);
 
-  gdb_printf (" %-11s %3s\n", "Name", "Nr");
+  struct ui_out *uiout = current_uiout;
+  ui_out_emit_table table_emitter (uiout, 2, -1, "user-registers");
+  uiout->table_header (11, ui_left, "name", "Name");
+  uiout->table_header (3, ui_right, "number", "Nr");
+
+  uiout->table_body ();
   for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
-    gdb_printf (" %-11s %3d\n", reg->name, regnum);
+    {
+      ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+      uiout->field_string ("name", reg->name);
+      uiout->field_signed ("number", regnum);
+      uiout->text ("\n");
+    }
 }
 
 void _initialize_user_regs ();

-- 
2.43.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 2/3] Use ui-out in core_target::info_proc_mappings
  2024-03-03 18:43 [PATCH v2 0/3] Use ui-out tables in a few spots Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 1/3] Use ui-out in maintenance_print_user_registers Tom Tromey
@ 2024-03-03 18:43 ` Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 3/3] Use ui-out tables in linux-tdep.c Tom Tromey
  2 siblings, 0 replies; 4+ messages in thread
From: Tom Tromey @ 2024-03-03 18:43 UTC (permalink / raw)
  To: gdb-patches

This changes core_target::info_proc_mappings to use a ui-out table.
It also changes the output to style the file names.
---
 gdb/corelow.c | 54 ++++++++++++++++++++++--------------------------------
 1 file changed, 22 insertions(+), 32 deletions(-)

diff --git a/gdb/corelow.c b/gdb/corelow.c
index f291b2aba19..5c9268efa24 100644
--- a/gdb/corelow.c
+++ b/gdb/corelow.c
@@ -54,6 +54,7 @@
 #include "gdbcmd.h"
 #include "xml-tdesc.h"
 #include "memtag.h"
+#include "cli/cli-style.h"
 
 #ifndef O_LARGEFILE
 #define O_LARGEFILE 0
@@ -1444,25 +1445,21 @@ get_current_core_target ()
 void
 core_target::info_proc_mappings (struct gdbarch *gdbarch)
 {
-  if (!m_core_file_mappings.empty ())
-    {
-      gdb_printf (_("Mapped address spaces:\n\n"));
-      if (gdbarch_addr_bit (gdbarch) == 32)
-	{
-	  gdb_printf ("\t%10s %10s %10s %10s %s\n",
-		      "Start Addr",
-		      "  End Addr",
-		      "      Size", "    Offset", "objfile");
-	}
-      else
-	{
-	  gdb_printf ("  %18s %18s %10s %10s %s\n",
-		      "Start Addr",
-		      "  End Addr",
-		      "      Size", "    Offset", "objfile");
-	}
-    }
+  if (m_core_file_mappings.empty ())
+    return;
 
+  struct ui_out *uiout = current_uiout;
+  uiout->text (_("Mapped address spaces:\n\n"));
+  ui_out_emit_table table_emitter (uiout, 5, -1, "mappings");
+  int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
+  uiout->table_header (width, ui_right, "start", "Start Addr");
+  uiout->table_header (width, ui_right, "end", "End Addr");
+  uiout->table_header (10, ui_right, "size", "Size");
+  uiout->table_header (10, ui_right, "offset", "Offset");
+  uiout->table_header (10, ui_left, "objfile", "objfile");
+
+  uiout->table_body ();
+  ui_file_style filenames = file_name_style.style ();
   for (const target_section &tsp : m_core_file_mappings)
     {
       ULONGEST start = tsp.addr;
@@ -1470,20 +1467,13 @@ core_target::info_proc_mappings (struct gdbarch *gdbarch)
       ULONGEST file_ofs = tsp.the_bfd_section->filepos;
       const char *filename = bfd_get_filename (tsp.the_bfd_section->owner);
 
-      if (gdbarch_addr_bit (gdbarch) == 32)
-	gdb_printf ("\t%10s %10s %10s %10s %s\n",
-		    paddress (gdbarch, start),
-		    paddress (gdbarch, end),
-		    hex_string (end - start),
-		    hex_string (file_ofs),
-		    filename);
-      else
-	gdb_printf ("  %18s %18s %10s %10s %s\n",
-		    paddress (gdbarch, start),
-		    paddress (gdbarch, end),
-		    hex_string (end - start),
-		    hex_string (file_ofs),
-		    filename);
+      ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+      uiout->field_core_addr ("start", gdbarch, start);
+      uiout->field_core_addr ("end", gdbarch, end);
+      uiout->field_string ("size", hex_string (end - start));
+      uiout->field_string ("offset", hex_string (file_ofs));
+      uiout->field_string ("objfile", filename, filenames);
+      uiout->text ("\n");
     }
 }
 

-- 
2.43.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 3/3] Use ui-out tables in linux-tdep.c
  2024-03-03 18:43 [PATCH v2 0/3] Use ui-out tables in a few spots Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 1/3] Use ui-out in maintenance_print_user_registers Tom Tromey
  2024-03-03 18:43 ` [PATCH v2 2/3] Use ui-out in core_target::info_proc_mappings Tom Tromey
@ 2024-03-03 18:43 ` Tom Tromey
  2 siblings, 0 replies; 4+ messages in thread
From: Tom Tromey @ 2024-03-03 18:43 UTC (permalink / raw)
  To: gdb-patches

This changes a couple of spots in linux-tdep.c to use a ui-out table.
It also changes the output to style the file names.
---
 gdb/linux-tdep.c | 114 ++++++++++++++++++++++---------------------------------
 1 file changed, 46 insertions(+), 68 deletions(-)

diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index 701e3df7a27..4bac4d81abd 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -43,6 +43,7 @@
 #include "gcore-elf.h"
 #include "solib-svr4.h"
 #include "memtag.h"
+#include "cli/cli-style.h"
 
 #include <ctype.h>
 #include <unordered_map>
@@ -457,7 +458,7 @@ struct mapping
 {
   ULONGEST addr;
   ULONGEST endaddr;
-  std::string_view permissions;
+  std::string permissions;
   ULONGEST offset;
   std::string_view device;
   ULONGEST inode;
@@ -899,20 +900,19 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args,
 	{
 	  char *line;
 
-	  gdb_printf (_("Mapped address spaces:\n\n"));
-	  if (gdbarch_addr_bit (gdbarch) == 32)
-	    {
-	      gdb_printf ("\t%10s %10s %10s %10s  %s %s\n",
-			  "Start Addr", "  End Addr", "      Size",
-			  "    Offset", "Perms  ", "objfile");
-	    }
-	  else
-	    {
-	      gdb_printf ("  %18s %18s %10s %10s  %s %s\n",
-			  "Start Addr", "  End Addr", "      Size",
-			  "    Offset", "Perms ", "objfile");
-	    }
-
+	  struct ui_out *uiout = current_uiout;
+	  uiout->text (_("Mapped address spaces:\n\n"));
+	  ui_out_emit_table table_emitter (uiout, 6, -1, "mappings");
+	  int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
+	  uiout->table_header (width, ui_right, "start", "Start Addr");
+	  uiout->table_header (width, ui_right, "end", "End Addr");
+	  uiout->table_header (10, ui_right, "size", "Size");
+	  uiout->table_header (10, ui_right, "offset", "Offset");
+	  uiout->table_header (5, ui_right, "permissions", "Perms");
+	  uiout->table_header (10, ui_left, "objfile", "objfile");
+
+	  uiout->table_body ();
+	  ui_file_style filenames = file_name_style.style ();
 	  char *saveptr;
 	  for (line = strtok_r (map.get (), "\n", &saveptr);
 	       line;
@@ -920,28 +920,14 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args,
 	    {
 	      struct mapping m = read_mapping (line);
 
-	      if (gdbarch_addr_bit (gdbarch) == 32)
-		{
-		  gdb_printf ("\t%10s %10s %10s %10s  %-5.*s  %s\n",
-			      paddress (gdbarch, m.addr),
-			      paddress (gdbarch, m.endaddr),
-			      hex_string (m.endaddr - m.addr),
-			      hex_string (m.offset),
-			      (int) m.permissions.size (),
-			      m.permissions.data (),
-			      m.filename);
-		}
-	      else
-		{
-		  gdb_printf ("  %18s %18s %10s %10s  %-5.*s  %s\n",
-			      paddress (gdbarch, m.addr),
-			      paddress (gdbarch, m.endaddr),
-			      hex_string (m.endaddr - m.addr),
-			      hex_string (m.offset),
-			      (int) m.permissions.size (),
-			      m.permissions.data (),
-			      m.filename);
-		}
+	      ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+	      uiout->field_core_addr ("start", gdbarch, m.addr);
+	      uiout->field_core_addr ("end", gdbarch, m.endaddr);
+	      uiout->field_string ("size", hex_string (m.endaddr - m.addr));
+	      uiout->field_string ("offset", hex_string (m.offset));
+	      uiout->field_string ("permissions", m.permissions);
+	      uiout->field_string ("objfile", m.filename, filenames);
+	      uiout->text ("\n");
 	    }
 	}
       else
@@ -1242,42 +1228,34 @@ linux_read_core_file_mappings
 static void
 linux_core_info_proc_mappings (struct gdbarch *gdbarch, const char *args)
 {
+  struct ui_out *uiout = current_uiout;
+  std::optional<ui_out_emit_table> table_emitter;
+  ui_file_style filenames = file_name_style.style ();
+
   linux_read_core_file_mappings (gdbarch, current_program_space->core_bfd (),
-    [=] (ULONGEST count)
+    [&] (ULONGEST count)
       {
 	gdb_printf (_("Mapped address spaces:\n\n"));
-	if (gdbarch_addr_bit (gdbarch) == 32)
-	  {
-	    gdb_printf ("\t%10s %10s %10s %10s %s\n",
-			"Start Addr",
-			"  End Addr",
-			"      Size", "    Offset", "objfile");
-	  }
-	else
-	  {
-	    gdb_printf ("  %18s %18s %10s %10s %s\n",
-			"Start Addr",
-			"  End Addr",
-			"      Size", "    Offset", "objfile");
-	  }
+	table_emitter.emplace (uiout, 5, -1, "mappings");
+	int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
+	uiout->table_header (width, ui_right, "start", "Start Addr");
+	uiout->table_header (width, ui_right, "end", "End Addr");
+	uiout->table_header (10, ui_right, "size", "Size");
+	uiout->table_header (10, ui_right, "offset", "Offset");
+	uiout->table_header (10, ui_left, "objfile", "objfile");
+
+	uiout->table_body ();
       },
-    [=] (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs,
+    [&] (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs,
 	 const char *filename, const bfd_build_id *build_id)
       {
-	if (gdbarch_addr_bit (gdbarch) == 32)
-	  gdb_printf ("\t%10s %10s %10s %10s %s\n",
-		      paddress (gdbarch, start),
-		      paddress (gdbarch, end),
-		      hex_string (end - start),
-		      hex_string (file_ofs),
-		      filename);
-	else
-	  gdb_printf ("  %18s %18s %10s %10s %s\n",
-		      paddress (gdbarch, start),
-		      paddress (gdbarch, end),
-		      hex_string (end - start),
-		      hex_string (file_ofs),
-		      filename);
+	ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+	uiout->field_core_addr ("start", gdbarch, start);
+	uiout->field_core_addr ("end", gdbarch, end);
+	uiout->field_string ("size", hex_string (end - start));
+	uiout->field_string ("offset", hex_string (file_ofs));
+	uiout->field_string ("objfile", filename, filenames);
+	uiout->text ("\n");
       });
 }
 
@@ -1390,7 +1368,7 @@ parse_smaps_data (const char *data,
 
       /* Decode permissions.  */
       auto has_perm = [&m] (char c)
-	{ return m.permissions.find (c) != std::string_view::npos; };
+	{ return m.permissions.find (c) != std::string::npos; };
       read = has_perm ('r');
       write = has_perm ('w');
       exec = has_perm ('x');

-- 
2.43.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-03-03 18:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-03 18:43 [PATCH v2 0/3] Use ui-out tables in a few spots Tom Tromey
2024-03-03 18:43 ` [PATCH v2 1/3] Use ui-out in maintenance_print_user_registers Tom Tromey
2024-03-03 18:43 ` [PATCH v2 2/3] Use ui-out in core_target::info_proc_mappings Tom Tromey
2024-03-03 18:43 ` [PATCH v2 3/3] Use ui-out tables in linux-tdep.c Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).