[PATCH 1/2] Use ui-out tables for info proc mappings
Andrew Burgess
aburgess@redhat.com
Mon Oct 7 09:23:42 GMT 2024
Tom Tromey <tom@tromey.com> writes:
> This changes a few implementations of "info proc mappings" to use
> ui-out tables rather than printf.
>
> Note that NetBSD and FreeBSD also use printfs here, but since I can't
> test these, I didn't update them.
LGTM.
Approved-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
> ---
> gdb/corelow.c | 55 ++++------
> gdb/linux-tdep.c | 122 +++++++++------------
> .../gdb.debuginfod/corefile-mapped-file.exp | 2 +-
> 3 files changed, 76 insertions(+), 103 deletions(-)
>
> diff --git a/gdb/corelow.c b/gdb/corelow.c
> index ab2fa746de8e5f51d76bf48fa739215660b3901c..5820ffed3322cc44d5ebc1417db8c78bdac9b015 100644
> --- a/gdb/corelow.c
> +++ b/gdb/corelow.c
> @@ -1698,24 +1698,19 @@ 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;
> +
> + gdb_printf (_("Mapped address spaces:\n\n"));
> + ui_out_emit_table emitter (current_uiout, 5, -1, "ProcMappings");
> +
> + int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
> + current_uiout->table_header (width, ui_left, "start", "Start Addr");
> + current_uiout->table_header (width, ui_left, "end", "End Addr");
> + current_uiout->table_header (width, ui_left, "size", "Size");
> + current_uiout->table_header (width, ui_left, "offset", "Offset");
> + current_uiout->table_header (0, ui_left, "objfile", "File");
> + current_uiout->table_body ();
>
> for (const target_section &tsp : m_core_file_mappings)
> {
> @@ -1724,20 +1719,16 @@ 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 (current_uiout, nullptr);
> + current_uiout->field_core_addr ("start", gdbarch, start);
> + current_uiout->field_core_addr ("end", gdbarch, end);
> + /* These next two aren't really addresses and so shouldn't be
> + styled as such. */
> + current_uiout->field_string ("size", paddress (gdbarch, end - start));
> + current_uiout->field_string ("offset", paddress (gdbarch, file_ofs));
> + current_uiout->field_string ("objfile", filename,
> + file_name_style.style ());
> + current_uiout->text ("\n");
> }
> }
>
> diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
> index 284996106a9734b3d08bcb580ce75a5abbaeec33..65ec221ef48d940427a63330602102d6dd607aa5 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;
> @@ -484,7 +485,8 @@ read_mapping (const char *line)
> const char *permissions_start = p;
> while (*p && !isspace (*p))
> p++;
> - mapping.permissions = {permissions_start, (size_t) (p - permissions_start)};
> + mapping.permissions = std::string (permissions_start,
> + (size_t) (p - permissions_start));
>
> mapping.offset = strtoulst (p, &p, 16);
>
> @@ -897,51 +899,39 @@ linux_info_proc (struct gdbarch *gdbarch, const char *args,
> = target_fileio_read_stralloc (NULL, filename);
> if (map != NULL)
> {
> - 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");
> - }
> + ui_out_emit_table emitter (current_uiout, 6, -1, "ProcMappings");
> +
> + int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
> + current_uiout->table_header (width, ui_left, "start", "Start Addr");
> + current_uiout->table_header (width, ui_left, "end", "End Addr");
> + current_uiout->table_header (width, ui_left, "size", "Size");
> + current_uiout->table_header (width, ui_left, "offset", "Offset");
> + current_uiout->table_header (5, ui_left, "perms", "Perms");
> + current_uiout->table_header (0, ui_left, "objfile", "File");
> + current_uiout->table_body ();
>
> char *saveptr;
> - for (line = strtok_r (map.get (), "\n", &saveptr);
> - line;
> - line = strtok_r (NULL, "\n", &saveptr))
> + for (const char *line = strtok_r (map.get (), "\n", &saveptr);
> + line != nullptr;
> + line = strtok_r (nullptr, "\n", &saveptr))
> {
> 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 (current_uiout, nullptr);
> + current_uiout->field_core_addr ("start", gdbarch, m.addr);
> + current_uiout->field_core_addr ("end", gdbarch, m.endaddr);
> + /* These next two aren't really addresses and so
> + shouldn't be styled as such. */
> + current_uiout->field_string ("size",
> + paddress (gdbarch,
> + m.endaddr - m.addr));
> + current_uiout->field_string ("offset",
> + paddress (gdbarch, m.offset));
> + current_uiout->field_string ("perms", m.permissions);
> + current_uiout->field_string ("objfile", m.filename,
> + file_name_style.style ());
> + current_uiout->text ("\n");
> }
> }
> else
> @@ -1242,42 +1232,34 @@ linux_read_core_file_mappings
> static void
> linux_core_info_proc_mappings (struct gdbarch *gdbarch, const char *args)
> {
> + std::optional<ui_out_emit_table> emitter;
> +
> 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");
> - }
> + emitter.emplace (current_uiout, 5, -1, "ProcMappings");
> + int width = gdbarch_addr_bit (gdbarch) == 32 ? 10 : 18;
> + current_uiout->table_header (width, ui_left, "start", "Start Addr");
> + current_uiout->table_header (width, ui_left, "end", "End Addr");
> + current_uiout->table_header (width, ui_left, "size", "Size");
> + current_uiout->table_header (width, ui_left, "offset", "Offset");
> + current_uiout->table_header (0, ui_left, "objfile", "File");
> + current_uiout->table_body ();
> },
> [=] (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 (current_uiout, nullptr);
> + current_uiout->field_core_addr ("start", gdbarch, start);
> + current_uiout->field_core_addr ("end", gdbarch, end);
> + /* These next two aren't really addresses and so shouldn't be
> + styled as such. */
> + current_uiout->field_string ("size", paddress (gdbarch, end - start));
> + current_uiout->field_string ("offset", paddress (gdbarch, file_ofs));
> + current_uiout->field_string ("objfile", filename,
> + file_name_style.style ());
> + current_uiout->text ("\n");
> });
> }
>
> diff --git a/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp b/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
> index b5dee228ca0091ac2b3f21b8fcdf5dc22c71957e..cf96b41ac9a1ed093de7611193b4a454e1bbb839 100644
> --- a/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
> +++ b/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
> @@ -93,7 +93,7 @@ set ptr_address [get_hexadecimal_valueof "&library_ptr" "unknown"]
>
> set ptr_offset "unknown"
> gdb_test_multiple "info proc mappings" "" {
> - -re "^\\s+($hex)\\s+($hex)\\s+$hex\\s+($hex)\[^\r\n\]+$library_filename\r\n" {
> + -re "^($hex)\\s+($hex)\\s+$hex\\s+($hex)\[^\r\n\]+$library_filename\\s*\r\n" {
> set low_addr $expect_out(1,string)
> set high_addr $expect_out(2,string)
> set file_offset $expect_out(3,string)
>
> --
> 2.46.1
More information about the Gdb-patches
mailing list