[1/2] Use ui-out tables for info proc mappings

Message ID 20241006-more-use-of-ui-table-v1-1-baf53ee69161@tromey.com
State New
Headers
Series More use of ui-out tables |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Test passed

Commit Message

Tom Tromey Oct. 6, 2024, 7:02 p.m. UTC
  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.
---
 gdb/corelow.c                                      |  55 ++++------
 gdb/linux-tdep.c                                   | 122 +++++++++------------
 .../gdb.debuginfod/corefile-mapped-file.exp        |   2 +-
 3 files changed, 76 insertions(+), 103 deletions(-)
  

Comments

Andrew Burgess Oct. 7, 2024, 9:23 a.m. UTC | #1
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
  

Patch

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)